feat: support openai codex subscription as the LLM provider

This commit is contained in:
Richard Tang
2026-02-24 17:52:14 -08:00
parent 10d9e54857
commit 585a7186d4
4 changed files with 476 additions and 21 deletions
+95 -17
View File
@@ -633,7 +633,7 @@ prompt_model_selection() {
}
# Function to save configuration
# Args: provider_id env_var model max_tokens [use_claude_code_sub] [api_base]
# Args: provider_id env_var model max_tokens [use_claude_code_sub] [api_base] [use_codex_sub]
save_configuration() {
local provider_id="$1"
local env_var="$2"
@@ -641,6 +641,7 @@ save_configuration() {
local max_tokens="$4"
local use_claude_code_sub="${5:-}"
local api_base="${6:-}"
local use_codex_sub="${7:-}"
# Fallbacks if not provided
if [ -z "$model" ]; then
@@ -667,6 +668,10 @@ if '$use_claude_code_sub' == 'true':
config['llm']['use_claude_code_subscription'] = True
# No api_key_env_var needed for Claude Code subscription
config['llm'].pop('api_key_env_var', None)
if '$use_codex_sub' == 'true':
config['llm']['use_codex_subscription'] = True
# No api_key_env_var needed for Codex subscription
config['llm'].pop('api_key_env_var', None)
if '$api_base':
config['llm']['api_base'] = '$api_base'
with open('$HIVE_CONFIG_FILE', 'w') as f:
@@ -690,7 +695,7 @@ SELECTED_PROVIDER_ID="" # Will hold the chosen provider ID
SELECTED_ENV_VAR="" # Will hold the chosen env var
SELECTED_MODEL="" # Will hold the chosen model ID
SELECTED_MAX_TOKENS=8192 # Will hold the chosen max_tokens
SUBSCRIPTION_MODE="" # "claude_code" | "zai_code" | ""
SUBSCRIPTION_MODE="" # "claude_code" | "codex" | "zai_code" | ""
# ── Subscription mode detection ──────────────────────────────
# Claude Code subscription: default when ~/.claude/.credentials.json exists
@@ -710,6 +715,36 @@ if [ -f "$CLAUDE_CRED_FILE" ]; then
fi
fi
# Codex (OpenAI) subscription: check macOS Keychain and ~/.codex/auth.json
if [ -z "$SUBSCRIPTION_MODE" ]; then
CODEX_DETECTED=false
# Try macOS Keychain first
if command -v security &>/dev/null; then
if security find-generic-password -s "Codex Auth" &>/dev/null 2>&1; then
CODEX_DETECTED=true
fi
fi
# Fallback: check auth file
if [ "$CODEX_DETECTED" = false ] && [ -f "$HOME/.codex/auth.json" ]; then
CODEX_DETECTED=true
fi
if [ "$CODEX_DETECTED" = true ]; then
echo -e " ${GREEN}${NC} OpenAI Codex subscription detected"
echo -e " ${DIM}~/.codex/auth.json${NC}"
echo -e " ${DIM}Default: gpt-5.3-codex | max_tokens: 16384${NC}"
echo ""
if prompt_yes_no "Use Codex subscription? (no API key needed)"; then
SUBSCRIPTION_MODE="codex"
SELECTED_PROVIDER_ID="openai"
SELECTED_MODEL="gpt-5.3-codex"
SELECTED_MAX_TOKENS=16384
echo ""
echo -e "${GREEN}${NC} Using OpenAI Codex subscription"
fi
fi
fi
# ZAI Code subscription: check for ZAI_API_KEY
if [ -z "$SUBSCRIPTION_MODE" ] && [ -n "${ZAI_API_KEY:-}" ]; then
echo -e " ${GREEN}${NC} Found ZAI Code API key"
@@ -758,7 +793,7 @@ if [ ${#FOUND_PROVIDERS[@]} -gt 0 ]; then
done
echo ""
# Show all found providers + ZAI subscription + Other
# Show all found providers + subscription options + Other
echo -e "${BOLD}Select your default LLM provider:${NC}"
echo ""
@@ -771,6 +806,9 @@ if [ ${#FOUND_PROVIDERS[@]} -gt 0 ]; then
if [ -n "${ZAI_API_KEY:-}" ]; then
ZAI_CHOICE=$i
echo -e " ${CYAN}$i)${NC} ZAI Code Subscription ${DIM}(use your ZAI Code plan)${NC}"
i=$((i + 1))
CODEX_CHOICE=$i
echo -e " ${CYAN}$i)${NC} OpenAI Codex Subscription ${DIM}(use your Codex/ChatGPT Plus plan)${NC}"
i=$((i + 1))
else
ZAI_CHOICE=-1 # invalid choice, won't match
@@ -796,6 +834,15 @@ if [ ${#FOUND_PROVIDERS[@]} -gt 0 ]; then
echo -e "${GREEN}${NC} Using ZAI Code subscription"
echo -e " ${DIM}Model: glm-5 | API: api.z.ai${NC}"
break
elif [ "$choice" -eq "$CODEX_CHOICE" ]; then
# OpenAI Codex Subscription
SUBSCRIPTION_MODE="codex"
SELECTED_PROVIDER_ID="openai"
SELECTED_MODEL="gpt-5.3-codex"
SELECTED_MAX_TOKENS=16384
echo ""
echo -e "${GREEN}${NC} Using OpenAI Codex subscription"
break
fi
idx=$((choice - 1))
SELECTED_ENV_VAR="${FOUND_ENV_VARS[$idx]}"
@@ -818,22 +865,23 @@ if [ -z "$SELECTED_PROVIDER_ID" ]; then
echo -e " ${CYAN}${BOLD}Subscription modes (no API key purchase needed):${NC}"
echo -e " ${CYAN}1)${NC} Claude Code Subscription ${DIM}(use your Claude Max/Pro plan)${NC}"
echo -e " ${CYAN}2)${NC} ZAI Code Subscription ${DIM}(use your ZAI Code plan)${NC}"
echo -e " ${CYAN}3)${NC} OpenAI Codex Subscription ${DIM}(use your Codex/ChatGPT Plus plan)${NC}"
echo ""
echo -e " ${CYAN}${BOLD}API key providers:${NC}"
echo -e " ${CYAN}3)${NC} Anthropic (Claude) - Recommended"
echo -e " ${CYAN}4)${NC} OpenAI (GPT)"
echo -e " ${CYAN}5)${NC} Google Gemini - Free tier available"
echo -e " ${CYAN}6)${NC} Groq - Fast, free tier"
echo -e " ${CYAN}7)${NC} Cerebras - Fast, free tier"
echo -e " ${CYAN}8)${NC} Skip for now"
echo -e " ${CYAN}4)${NC} Anthropic (Claude) - Recommended"
echo -e " ${CYAN}5)${NC} OpenAI (GPT)"
echo -e " ${CYAN}6)${NC} Google Gemini - Free tier available"
echo -e " ${CYAN}7)${NC} Groq - Fast, free tier"
echo -e " ${CYAN}8)${NC} Cerebras - Fast, free tier"
echo -e " ${CYAN}9)${NC} Skip for now"
echo ""
while true; do
read -r -p "Enter choice (1-8): " choice || true
if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le 8 ]; then
read -r -p "Enter choice (1-9): " choice || true
if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le 9 ]; then
break
fi
echo -e "${RED}Invalid choice. Please enter 1-8${NC}"
echo -e "${RED}Invalid choice. Please enter 1-9${NC}"
done
case $choice in
@@ -867,36 +915,64 @@ if [ -z "$SELECTED_PROVIDER_ID" ]; then
echo -e " ${DIM}Model: glm-5 | API: api.z.ai${NC}"
;;
3)
# OpenAI Codex Subscription
CODEX_FOUND=false
if command -v security &>/dev/null; then
if security find-generic-password -s "Codex Auth" &>/dev/null 2>&1; then
CODEX_FOUND=true
fi
fi
if [ "$CODEX_FOUND" = false ] && [ -f "$HOME/.codex/auth.json" ]; then
CODEX_FOUND=true
fi
if [ "$CODEX_FOUND" = false ]; then
echo ""
echo -e "${YELLOW} Codex credentials not found.${NC}"
echo -e " Run ${CYAN}codex${NC} first to authenticate with your ChatGPT Plus/Pro subscription,"
echo -e " then run this quickstart again."
echo ""
SELECTED_PROVIDER_ID=""
else
SUBSCRIPTION_MODE="codex"
SELECTED_PROVIDER_ID="openai"
SELECTED_MODEL="gpt-5.3-codex"
SELECTED_MAX_TOKENS=16384
echo ""
echo -e "${GREEN}${NC} Using OpenAI Codex subscription"
fi
;;
4)
SELECTED_ENV_VAR="ANTHROPIC_API_KEY"
SELECTED_PROVIDER_ID="anthropic"
PROVIDER_NAME="Anthropic"
SIGNUP_URL="https://console.anthropic.com/settings/keys"
;;
4)
5)
SELECTED_ENV_VAR="OPENAI_API_KEY"
SELECTED_PROVIDER_ID="openai"
PROVIDER_NAME="OpenAI"
SIGNUP_URL="https://platform.openai.com/api-keys"
;;
5)
6)
SELECTED_ENV_VAR="GEMINI_API_KEY"
SELECTED_PROVIDER_ID="gemini"
PROVIDER_NAME="Google Gemini"
SIGNUP_URL="https://aistudio.google.com/apikey"
;;
6)
7)
SELECTED_ENV_VAR="GROQ_API_KEY"
SELECTED_PROVIDER_ID="groq"
PROVIDER_NAME="Groq"
SIGNUP_URL="https://console.groq.com/keys"
;;
7)
8)
SELECTED_ENV_VAR="CEREBRAS_API_KEY"
SELECTED_PROVIDER_ID="cerebras"
PROVIDER_NAME="Cerebras"
SIGNUP_URL="https://cloud.cerebras.ai/"
;;
8)
9)
echo ""
echo -e "${YELLOW}Skipped.${NC} An LLM API key is required to test and use worker agents."
echo -e "Add your API key later by running:"
@@ -966,6 +1042,8 @@ if [ -n "$SELECTED_PROVIDER_ID" ]; then
echo -n " Saving configuration... "
if [ "$SUBSCRIPTION_MODE" = "claude_code" ]; then
save_configuration "$SELECTED_PROVIDER_ID" "" "$SELECTED_MODEL" "$SELECTED_MAX_TOKENS" "true" "" > /dev/null
elif [ "$SUBSCRIPTION_MODE" = "codex" ]; then
save_configuration "$SELECTED_PROVIDER_ID" "" "$SELECTED_MODEL" "$SELECTED_MAX_TOKENS" "" "" "true" > /dev/null
elif [ "$SUBSCRIPTION_MODE" = "zai_code" ]; then
save_configuration "$SELECTED_PROVIDER_ID" "$SELECTED_ENV_VAR" "$SELECTED_MODEL" "$SELECTED_MAX_TOKENS" "" "https://api.z.ai/api/coding/paas/v4" > /dev/null
else