Claude Provider 故障切换与会话恢复#
这是完整实操指南,解决以下问题:
- 报
Improperly formed request后对话无法恢复 - 自动切换供应商后仍持续报错
- 需要把当前失败现场保存下来,换新会话继续
- API 代理频繁返回 502/500 错误
- Stream 中断导致响应不完整
核心原理#
1. 故障切换机制#
Claude Code 的 Provider 切换机制:
| 触发条件 | 行为 | 日志标识 |
|---|---|---|
| API 返回错误 | 自动切换到备用 Provider | FO-001 |
手动执行 cc-switch | 立即切换 Provider | FWD-001 |
| 切换失败 | 回退到原 Provider | FWD-002 |
重要:
- 切换对下一次请求生效,不会修复当前正在失败的请求
- 单次请求会执行重试链(
attempt 1/11 ... 11/11) - 重试期间不会触发 Provider 切换
2. 常见错误类型#
| 错误 | 原因 | 解决方案 |
|---|---|---|
Improperly formed request | API 请求格式错误 | 切换 Provider 或检查配置 |
502 Bad Gateway | 代理服务器故障 | 更换代理或直连 |
500 Internal Server Error | 上游服务错误 | 等待恢复或切换 Provider |
Stream completed without message_start | 流式响应中断 | 重试或切换 Provider |
Connection error | 网络连接失败 | 检查网络或代理 |
快速诊断(5 步检查)#
步骤 1:检查配置文件中的 Provider 设置#
$cfgPath = Join-Path $HOME '.claude/settings.json'
$cfg = Get-Content $cfgPath -Raw | ConvertFrom-Json
$e = $cfg.env
[pscustomobject]@{
BASE_URL = $e.ANTHROPIC_BASE_URL
MODEL = $e.ANTHROPIC_MODEL
TOKEN_SET = [bool]($e.ANTHROPIC_AUTH_TOKEN -and $e.ANTHROPIC_AUTH_TOKEN.Length -gt 0)
} | Format-Table -AutoSize预期输出:
BASE_URL MODEL TOKEN_SET
-------- ----- ---------
https://api.example.com/v1 claude-opus-4-6 True步骤 2:检查环境变量(可能覆盖配置)#
[pscustomobject]@{
ENV_BASE_URL = $env:ANTHROPIC_BASE_URL
ENV_MODEL = $env:ANTHROPIC_MODEL
ENV_TOKEN_SET = [bool]($env:ANTHROPIC_AUTH_TOKEN)
} | Format-Table -AutoSize注意:环境变量优先级高于配置文件,如果设置了环境变量会覆盖配置。
步骤 3:测试 Provider 连通性#
$u = [uri]$e.ANTHROPIC_BASE_URL
Test-NetConnection -ComputerName $u.Host -Port $u.Port |
Select-Object ComputerName, RemotePort, TcpTestSucceeded |
Format-Table -AutoSize预期输出:
ComputerName RemotePort TcpTestSucceeded
------------ ---------- ----------------
api.example.com 443 True步骤 4:定位最新日志文件#
$log = Get-ChildItem "$HOME/.claude/debug/*.txt" -ErrorAction SilentlyContinue |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1
$log.FullName步骤 5:分析错误日志#
Get-Content $log.FullName -Tail 160 |
Select-String 'API error|Improperly formed request|request id|non-streaming fallback|Connection error|attempt [0-9]+/11|FO-001|FWD-001|FWD-002|502|500'关键日志标识:
FO-001: 自动故障切换FWD-001: 手动切换成功FWD-002: 切换失败回退attempt 11/11: 重试耗尽502 Bad Gateway: 代理故障Stream completed without message_start: 流式响应中断
故障恢复流程#
场景 1:切换后仍然报错#
症状:执行 cc-switch 后,下一次请求仍然失败。
原因:
- 环境变量覆盖了配置文件
- 新 Provider 也存在问题
- 当前终端会话缓存了旧配置
解决步骤:
立即中断当前请求(不要等
11/11跑完)Ctrl+C清理环境变量
Remove-Item Env:ANTHROPIC_BASE_URL -ErrorAction SilentlyContinue Remove-Item Env:ANTHROPIC_MODEL -ErrorAction SilentlyContinue Remove-Item Env:ANTHROPIC_AUTH_TOKEN -ErrorAction SilentlyContinue重启 Claude Code CLI
exit # 退出当前会话 claude # 重新启动发送探针测试
ping等待响应成功后再继续长任务。
场景 2:频繁出现 502 错误#
症状:日志中大量 502 Bad Gateway 错误。
原因:API 代理服务不稳定。
解决方案:
更换代理服务
# 编辑配置文件 $cfgPath = Join-Path $HOME '.claude/settings.json' $cfg = Get-Content $cfgPath -Raw | ConvertFrom-Json # 更新 BASE_URL $cfg.env.ANTHROPIC_BASE_URL = "https://new-proxy.example.com/v1" # 保存配置 $cfg | ConvertTo-Json -Depth 10 | Set-Content $cfgPath或使用直连(如果有官方 API Key)
$cfg.env.ANTHROPIC_BASE_URL = "https://api.anthropic.com" $cfg.env.ANTHROPIC_AUTH_TOKEN = "sk-ant-your-api-key" $cfg | ConvertTo-Json -Depth 10 | Set-Content $cfgPath
场景 3:Stream 中断#
症状:Stream completed without receiving message_start event
原因:网络不稳定或代理超时。
解决方案:
检查网络稳定性
# 测试延迟 Test-Connection -ComputerName api.anthropic.com -Count 10切换到更稳定的网络
- 更换 VPN 节点
- 使用有线网络代替 WiFi
增加超时时间(如果使用自定义代理)
会话现场保存#
当会话无法恢复时,保存现场以便在新会话中继续。
1. 导出会话记录#
# 查找当前项目的会话文件
$projectPath = (Get-Location).Path -replace '\\', '-' -replace ':', '--'
$sessionDir = Join-Path $HOME ".claude/projects/$projectPath"
# 复制到桌面
$backupDir = Join-Path ([Environment]::GetFolderPath('Desktop')) "claude-backup-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
New-Item -ItemType Directory -Path $backupDir -Force
Copy-Item "$sessionDir/*.jsonl" $backupDir -ErrorAction SilentlyContinue2. 导出 Transcript#
# 查找最近的 transcript
$transcript = Get-ChildItem "$HOME/.claude/transcripts/ses_*.jsonl" |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1
Copy-Item $transcript.FullName $backupDir3. 导出 Debug 日志#
# 复制最新的 debug 日志
$debugLog = Get-ChildItem "$HOME/.claude/debug/*.txt" |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1
Copy-Item $debugLog.FullName $backupDir4. 保存代码状态#
# 导出 git 状态
git status > "$backupDir/git-status.txt"
git diff > "$backupDir/git-diff.txt"
git log --oneline -10 > "$backupDir/git-log.txt"5. 生成交接文档#
@"
# Claude Code 会话恢复信息
**时间**: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')
**项目**: $(Split-Path -Leaf (Get-Location))
**Provider**: $($cfg.env.ANTHROPIC_BASE_URL)
## 问题描述
[在此描述遇到的问题]
## 已完成的工作
[列出已完成的任务]
## 待继续的工作
[列出需要继续的任务]
## 附件
- 会话记录: *.jsonl
- Transcript: ses_*.jsonl
- Debug 日志: *.txt
- Git 状态: git-*.txt
"@ | Out-File "$backupDir/README.md" -Encoding UTF86. 在新会话中恢复#
# 1. 启动新的 Claude Code 会话
claude
# 2. 提供上下文
# 将 README.md 和相关文件内容粘贴给 Claude
# 或使用文件路径让 Claude 读取自动化脚本#
仓库提供了 3 个 PowerShell 脚本简化操作:
1. claude-provider-check.ps1#
快速检查 Provider 状态和连通性。
.\scripts\windows\claude-provider-check.ps1输出示例:
✓ 配置文件: BASE_URL=https://api.example.com/v1
✓ 连通性测试: 成功
✓ 最新日志: 无错误2. claude-provider-recover.ps1#
自动执行恢复流程(清理环境变量、重启会话)。
.\scripts\windows\claude-provider-recover.ps13. claude-provider-oneclick-direct.ps1#
一键切换到官方 API(需要 API Key)。
.\scripts\windows\claude-provider-oneclick-direct.ps1 -ApiKey "sk-ant-your-key"详细说明见:claude-provider-switch-scripts.md
预防措施#
1. 配置多个备用 Provider#
在 settings.json 中配置备用 Provider:
{
"env": {
"ANTHROPIC_BASE_URL": "https://primary.example.com/v1",
"ANTHROPIC_AUTH_TOKEN": "token1"
},
"backup_providers": [
{
"base_url": "https://backup1.example.com/v1",
"auth_token": "token2"
},
{
"base_url": "https://backup2.example.com/v1",
"auth_token": "token3"
}
]
}2. 定期清理日志#
避免日志文件过大影响性能:
# 清理 7 天前的日志
Get-ChildItem "$HOME/.claude/debug/*.txt" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } |
Remove-Item3. 监控 Provider 健康状态#
定期检查 Provider 可用性:
# 添加到 Windows 任务计划,每小时执行一次
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 1)
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\path\to\claude-provider-check.ps1"
Register-ScheduledTask -TaskName "Claude Provider Health Check" -Trigger $trigger -Action $action故障排查清单#
遇到问题时,按此清单逐项检查:
- 检查配置文件中的 Provider 设置
- 检查环境变量是否覆盖配置
- 测试 Provider 连通性
- 查看最新 debug 日志
- 清理环境变量
- 重启 Claude Code CLI
- 发送探针测试
- 如仍失败,保存现场并切换 Provider
- 在新会话中恢复工作
相关文档#
最后更新: 2026-02-18