# 磐石 API · Claude Code 一键配置(Windows) # 用法:右键「使用 PowerShell 运行」,或在 PowerShell 里执行 .\install-win.ps1 # 只在本机写配置文件,不上传任何数据。 param([string]$Key) $ErrorActionPreference = 'Stop' $BaseUrl = 'https://api.panshiapi.com' # Claude Code 要求不带 /v1 $Dir = Join-Path $env:USERPROFILE '.claude' $Cfg = Join-Path $Dir 'settings.json' function Info($m){ Write-Host " $m" } function Ok($m) { Write-Host " $m" -ForegroundColor Green } function Warn($m){ Write-Host " $m" -ForegroundColor Yellow } function Err($m) { Write-Host " $m" -ForegroundColor Red } Write-Host "" Write-Host " 磐石 API · Claude Code 配置工具" Write-Host " 只修改本机配置文件,不会上传任何信息" -ForegroundColor DarkGray Write-Host "" if (-not $Key) { $Key = Read-Host ' 请粘贴你的 API Key(sk- 开头)' } $Key = ($Key -replace '\s','') if (-not $Key) { Err '没有输入 Key,已退出'; exit 1 } if ($Key -notlike 'sk-*') { Warn '提示:Key 通常以 sk- 开头,请确认没复制错' } New-Item -ItemType Directory -Force -Path $Dir | Out-Null # 备份并读取原配置 $backup = $null if (Test-Path $Cfg) { $backup = "$Cfg.bak.$(Get-Date -Format yyyyMMdd-HHmmss)" Copy-Item $Cfg $backup Info "已备份原配置 → $backup" try { $data = Get-Content $Cfg -Raw -Encoding UTF8 | ConvertFrom-Json } catch { Err '原配置不是合法 JSON,已停止,未做修改'; exit 2 } } else { Info '未发现已有配置,将新建' $data = [pscustomobject]@{} } # 只改 env 里这两项,其余原样保留 if (-not $data.PSObject.Properties['env']) { $data | Add-Member -NotePropertyName env -NotePropertyValue ([pscustomobject]@{}) } foreach ($pair in @{ANTHROPIC_BASE_URL=$BaseUrl; ANTHROPIC_AUTH_TOKEN=$Key}.GetEnumerator()) { if ($data.env.PSObject.Properties[$pair.Key]) { $data.env.($pair.Key) = $pair.Value } else { $data.env | Add-Member -NotePropertyName $pair.Key -NotePropertyValue $pair.Value } } ($data | ConvertTo-Json -Depth 20) | Set-Content $Cfg -Encoding UTF8 Ok "配置已写入 $Cfg" # 真实请求验证 Write-Host "" Info '正在验证连接…' $body = @{ model='claude-sonnet-5'; max_tokens=8; messages=@(@{role='user'; content='hi'}) } | ConvertTo-Json -Depth 5 $status = 0; $respText = '' try { $r = Invoke-WebRequest -Uri "$BaseUrl/v1/messages" -Method Post -TimeoutSec 60 ` -Headers @{ 'x-api-key'=$Key; 'anthropic-version'='2023-06-01'; 'user-agent'='claude-cli/2.1.0 (external, cli)' } ` -ContentType 'application/json' -Body $body -UseBasicParsing $status = [int]$r.StatusCode } catch { if ($_.Exception.Response) { $status = [int]$_.Exception.Response.StatusCode try { $respText = (New-Object IO.StreamReader($_.Exception.Response.GetResponseStream())).ReadToEnd() } catch {} } } Write-Host "" switch ($status) { 200 { Ok '✓ 配置成功,现在可以直接使用 claude 命令了' } 401 { Err '✗ Key 无效'; Info '检查有没有复制漏字符,或去后台重新生成一个 Key' } 403 { if ($respText -match 'balance') { Err '✗ 账户余额不足'; Info '请先到 https://panshiapi.com 充值' } else { Err '✗ 访问被拒绝'; Info $respText.Substring(0,[Math]::Min(160,$respText.Length)) } } 404 { Warn '! 默认模型不可用'; Info '配置已写好,但你的 Key 所在分组没有 claude-sonnet-5' Info '登录 https://panshiapi.com 查看可用模型,用 /model 切换' } 429 { Warn '! 上游限流,稍后重试(配置本身没问题)' } 0 { Err '✗ 连不上服务器'; Info '检查网络,或确认能否打开 https://panshiapi.com' } default { Warn "! 返回 HTTP $status"; Info $respText } } Write-Host "" Write-Host " 接入地址 : $BaseUrl" -ForegroundColor DarkGray if ($backup) { Write-Host " 如需还原 : Copy-Item '$backup' '$Cfg' -Force" -ForegroundColor DarkGray } Write-Host ""