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 } } |