From 8921665127150bf225c8af5dc00d7d4d45b2de0a Mon Sep 17 00:00:00 2001 From: sususu98 Date: Fri, 12 Dec 2025 13:30:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=81=A2=E5=A4=8D=20Codex=20=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E7=AB=AF=E7=82=B9=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - base_url: 恢复动态测试 api2.xcodecli.com 和 api.xcodecli.com - model: 恢复为 gpt-5.1-codex - 保留其他新配置项 (disable_response_storage, requires_openai_auth 等) - 保留 XCODECLI_OAI_KEY 环境变量 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- codex/setup-codex.ps1 | 86 +++++++++++++++++++++++++++------------ codex/setup-codex.sh | 94 ++++++++++++++++++++++++++++++------------- 2 files changed, 125 insertions(+), 55 deletions(-) diff --git a/codex/setup-codex.ps1 b/codex/setup-codex.ps1 index 7c92fc4..711c07f 100644 --- a/codex/setup-codex.ps1 +++ b/codex/setup-codex.ps1 @@ -14,6 +14,7 @@ param( if (-not $ApiKey -and (Test-Path Variable:key)) { $ApiKey = $key } # Configuration +$DefaultBaseUrl = "https://api2.xcodecli.com" $CodexConfigDir = "$env:USERPROFILE\.codex" $CodexConfigFile = "$CodexConfigDir\config.toml" @@ -127,31 +128,74 @@ function Test-ApiKey { } } +# Function to test API connection and return working base URL +function Test-ApiConnection { + param([string]$ApiKey) + + $testUrls = @( + "https://api2.xcodecli.com", + "https://api.xcodecli.com" + ) + + Write-Info "Testing API connections..." + + foreach ($baseUrl in $testUrls) { + Write-Info "Testing $baseUrl..." + + try { + $headers = @{ + "Content-Type" = "application/json" + "Authorization" = "Bearer $ApiKey" + } + + $testEndpoint = "$baseUrl/v1/models" + $response = Invoke-RestMethod -Uri $testEndpoint -Method Get -Headers $headers -ErrorAction Stop + + if ($response.data) { + $modelCount = $response.data.Count + Write-Success "API connection successful! Found $modelCount models at $baseUrl" + return $baseUrl + } else { + Write-Warning "API responded but no models found at $baseUrl" + } + } + catch { + if ($_.Exception.Response -and $_.Exception.Response.StatusCode -eq 401) { + Write-Warning "API key authentication failed for $baseUrl" + } elseif ($_.Exception.Message -like "*Unable to connect*" -or $_.Exception.Message -like "*could not be resolved*") { + Write-Warning "Cannot connect to $baseUrl" + } else { + Write-Warning "API test failed for $baseUrl`: $($_.Exception.Message)" + } + } + } + + Write-Error "All API connections failed. Please check your API key and internet connection." + return $null +} + # Function to create Codex configuration function New-Settings { param( + [string]$BaseUrl, [string]$ApiKey ) $config = @" model_provider = "xcodecli" -model = "gpt-5-codex" +model = "gpt-5.1-codex" model_reasoning_effort = "high" disable_response_storage = true preferred_auth_method = "apikey" [model_providers.xcodecli] name = "xcodecli" -base_url = "https://www.xcodecli.com/openai" +base_url = "$BaseUrl/v1" wire_api = "responses" requires_openai_auth = true env_key = "XCODECLI_OAI_KEY" "@ - $authJson = @{ - OPENAI_API_KEY = $null - } - try { Set-Content -Path $CodexConfigFile -Value $config -Encoding UTF8 Write-Success "Codex configuration written to: $CodexConfigFile" @@ -258,34 +302,24 @@ function Main { Write-Info "API Key: $maskedKey" Write-Host "" - # Test API connection with fixed URL - $testUrl = "https://www.xcodecli.com/openai" - Write-Info "Testing API connection to $testUrl..." - - try { - $headers = @{ - "Content-Type" = "application/json" - "Authorization" = "Bearer $ApiKey" - } - $response = Invoke-RestMethod -Uri "$testUrl/models" -Method Get -Headers $headers -ErrorAction Stop - Write-Success "API connection successful!" - } - catch { - if ($_.Exception.Response -and $_.Exception.Response.StatusCode -eq 401) { - Write-Warning "API key authentication failed" - } else { - Write-Warning "API test failed: $($_.Exception.Message)" - } + # Test API connection and get working base URL + $BaseUrl = Test-ApiConnection -ApiKey $ApiKey + if (-not $BaseUrl) { if ($Test) { exit 1 } - $continue = Read-Host "Continue anyway? (y/N)" + $continue = Read-Host "All API tests failed. Continue anyway? (y/N)" if ($continue -notmatch '^[Yy]$') { Write-Info "Setup cancelled" exit 1 } + + $BaseUrl = $DefaultBaseUrl + Write-Warning "Using default URL: $BaseUrl" + } else { + Write-Info "Selected working base URL: $BaseUrl" } # Exit if test only @@ -301,7 +335,7 @@ function Main { Backup-Settings # Create new settings - if (New-Settings -ApiKey $ApiKey) { + if (New-Settings -BaseUrl $BaseUrl -ApiKey $ApiKey) { Write-Host "" Write-Success "Codex has been configured successfully!" Write-Info "You can now use Codex with your XCodeCLI API router." diff --git a/codex/setup-codex.sh b/codex/setup-codex.sh index 6d876d7..fd323a2 100644 --- a/codex/setup-codex.sh +++ b/codex/setup-codex.sh @@ -25,6 +25,7 @@ print_error() { # Default values TEST_ONLY=false SHOW_SETTINGS=false +DEFAULT_BASE_URL="https://api2.xcodecli.com" # ========== Shell 环境变量配置 ========== # 检测当前 shell 配置文件 @@ -179,9 +180,59 @@ backup_config() { fi } +# Function to test API connection and return working base URL +test_api_connection() { + local api_key="$1" + + local test_urls=( + "https://api2.xcodecli.com" + "https://api.xcodecli.com" + ) + + print_info "Testing API connections..." >&2 + + for base_url in "${test_urls[@]}"; do + print_info "Testing $base_url..." >&2 + + local test_endpoint="$base_url/v1/models" + + local response + response=$(curl -s -w "%{http_code}" -o /tmp/codex_test_response \ + -X GET "$test_endpoint" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $api_key" \ + 2>/dev/null || echo "000") + + if [ "$response" = "200" ]; then + if grep -qE '"data".*\[|"object"' /tmp/codex_test_response 2>/dev/null; then + local model_count + model_count=$(grep -oE '"id"[[:space:]]*:' /tmp/codex_test_response | wc -l | tr -d ' ') + print_success "API connection successful! Found $model_count models at $base_url" >&2 + rm -f /tmp/codex_test_response + echo "$base_url" + return 0 + else + print_warning "API responded but no models found at $base_url" >&2 + fi + elif [ "$response" = "401" ]; then + print_warning "API key authentication failed for $base_url" >&2 + elif [ "$response" = "000" ]; then + print_warning "Cannot connect to $base_url" >&2 + else + print_warning "API test failed for $base_url with HTTP status: $response" >&2 + fi + + rm -f /tmp/codex_test_response + done + + print_error "All API connections failed. Please check your API key and internet connection." >&2 + return 1 +} + # Function to create Codex configuration create_codex_config() { - local api_key="$1" + local base_url="$1" + local api_key="$2" # Create config directory if it doesn't exist mkdir -p "$HOME/.codex" @@ -189,14 +240,14 @@ create_codex_config() { # Create config.toml cat >"$HOME/.codex/config.toml" </dev/null || echo "000") - - if [ "$response" = "200" ]; then - print_success "API connection successful!" - elif [ "$response" = "401" ]; then - print_warning "API key authentication failed" + if [ $? -ne 0 ] || [ -z "$BASE_URL" ]; then if [ "$TEST_ONLY" = true ]; then - rm -f /tmp/codex_test_response exit 1 fi - read -p "Continue anyway? (y/N): " -n 1 -r + + read -p "All API tests failed. Continue anyway? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then print_info "Setup cancelled" - rm -f /tmp/codex_test_response - exit 1 - fi - elif [ "$response" = "000" ]; then - print_warning "Cannot connect to API endpoint" - if [ "$TEST_ONLY" = true ]; then - rm -f /tmp/codex_test_response exit 1 fi + + BASE_URL="$DEFAULT_BASE_URL" + print_warning "Using default URL: $BASE_URL" else - print_warning "API test returned HTTP status: $response" + print_info "Selected working base URL: $BASE_URL" fi - rm -f /tmp/codex_test_response # Exit if test only if [ "$TEST_ONLY" = true ]; then @@ -349,7 +385,7 @@ main() { backup_config # Create Codex configuration - if ! create_codex_config "$API_KEY"; then + if ! create_codex_config "$BASE_URL" "$API_KEY"; then print_error "Failed to create Codex configuration" exit 1 fi