Public/Test-PCProvider.ps1

function Test-PCProvider {
    <#
    .SYNOPSIS
        Verify an AI provider is reachable and the API key is valid.
    .EXAMPLE
        Test-PCProvider -Name openai
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateSet('openai', 'gemini', 'anthropic')]
        [string]$Name
    )

    $apiKey = Resolve-PCApiKey -Provider $Name
    if (-not $apiKey) {
        Write-Warning "No API key configured for '$Name'."
        return $false
    }

    try {
        switch ($Name) {
            'openai' {
                $response = Invoke-RestMethod `
                    -Uri $script:Providers.openai.ModelsEndpoint `
                    -Headers @{ 'Authorization' = "Bearer $apiKey" } `
                    -TimeoutSec 15

                $models = $response.data | Select-Object -ExpandProperty id | Sort-Object
                Write-Verbose "OpenAI models available: $($models.Count)"
                Write-Verbose ($models -join ', ')
                return $true
            }
            'gemini' {
                $uri = "$($script:Providers.gemini.ModelsEndpoint)?key=$apiKey"
                $response = Invoke-RestMethod -Uri $uri -TimeoutSec 15

                $models = $response.models | Select-Object -ExpandProperty name | Sort-Object
                Write-Verbose "Gemini models available: $($models.Count)"
                Write-Verbose ($models -join ', ')
                return $true
            }
            'anthropic' {
                # Anthropic doesn't have a models list endpoint, do a minimal completion
                $headers = @{
                    'x-api-key'         = $apiKey
                    'anthropic-version' = '2023-06-01'
                    'Content-Type'      = 'application/json'
                }
                $body = @{
                    model      = $script:Providers.anthropic.DefaultModel
                    max_tokens = 10
                    messages   = @(@{ role = 'user'; content = 'Say "ok"' })
                } | ConvertTo-Json -Depth 5

                $null = Invoke-RestMethod `
                    -Uri $script:Providers.anthropic.MessagesEndpoint `
                    -Method POST `
                    -Headers $headers `
                    -Body $body `
                    -TimeoutSec 15

                Write-Verbose "Anthropic API key valid, model $($script:Providers.anthropic.DefaultModel) responding"
                return $true
            }
        }
    }
    catch {
        Write-Warning "Provider '$Name' test failed: $($_.Exception.Message)"
        return $false
    }
}