Test-AnthropicProxy.ps1

function Test-AnthropicProxy {
    <#
    .SYNOPSIS
        Validates that ANTHROPIC_BASE_URL or ANTHROPIC_API_KEY is set before starting Claude.
    .DESCRIPTION
        Priority order:
          1. ANTHROPIC_BASE_URL already set → tests reachability; fails if proxy is down
          2. ANTHROPIC_API_KEY set → no-op (direct Anthropic access), returns $null
          3. -Login specified → no-op (interactive login flow), returns $null
          else → logs error with setup suggestions, exits 1
    .PARAMETER Login
        Skip proxy setup — the user will authenticate interactively via claude login.
    .OUTPUTS
        Always $null — proxy lifecycle is managed externally (e.g. ClaudeProxy scheduled task).
    #>

    [CmdletBinding()]
    param(
        [switch]$Login
    )

    if ($Login -and ((Test-Path env:ANTHROPIC_API_KEY) -or (Test-Path env:ANTHROPIC_BASE_URL) -or (Test-Path env:DISABLE_LOGIN_COMMAND))) {
        Write-Error "-Login was specified but ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, or DISABLE_LOGIN_COMMAND is already set. Unset them or omit -Login."
        exit 1
    }

    if (Test-Path env:ANTHROPIC_BASE_URL) {
        Write-Verbose "Pre-configured proxy at $env:ANTHROPIC_BASE_URL — checking reachability."
        $httpClient = [System.Net.Http.HttpClient]::new()
        $httpClient.Timeout = [System.TimeSpan]::FromSeconds(5)
        try {
            $null = $httpClient.GetAsync($env:ANTHROPIC_BASE_URL).GetAwaiter().GetResult()
            Write-Verbose "Proxy is reachable."
        } catch {
            Write-Error "ANTHROPIC_BASE_URL is '$env:ANTHROPIC_BASE_URL' but the proxy is not reachable: $_"
            if (Test-Path env:ANTHROPIC_BASE_URL_DIAG_CMD) {
                Write-Host " To diagnose, run: $env:ANTHROPIC_BASE_URL_DIAG_CMD" -ForegroundColor Cyan
            }
            exit 1
        } finally {
            $httpClient.Dispose()
        }
        return $null
    }

    if (Test-Path env:ANTHROPIC_API_KEY) {
        Write-Verbose "ANTHROPIC_API_KEY set; connecting directly to Anthropic."
        return $null
    }

    if ($Login) {
        Write-Verbose "-Login specified; skipping proxy setup."
        return $null
    }

    $onWindows = $IsWindows -or $env:OS -eq 'Windows_NT'
    Write-Error "No API key or proxy configured and -Login was not specified."
    Write-Host ""
    Write-Host "Choose one of:" -ForegroundColor Yellow
    Write-Host " 1. Set ANTHROPIC_API_KEY to connect directly to Anthropic:"
    if ($onWindows) {
        Write-Host " setx ANTHROPIC_API_KEY <your-key>" -ForegroundColor Cyan
    } else {
        Write-Host " export ANTHROPIC_API_KEY=<your-key> # add to ~/.bashrc or ~/.zshrc" -ForegroundColor Cyan
    }
    Write-Host " 2. Set ANTHROPIC_BASE_URL to point to a running proxy:"
    if ($onWindows) {
        Write-Host " setx ANTHROPIC_BASE_URL http://127.0.0.1:11211/api/anthropic" -ForegroundColor Cyan
    } else {
        Write-Host " export ANTHROPIC_BASE_URL=http://127.0.0.1:11211/api/anthropic" -ForegroundColor Cyan
    }
    Write-Host " 3. Run with -Login to authenticate interactively:"
    Write-Host " claude -Login" -ForegroundColor Cyan
    Write-Host ""
    exit 1
}