Error from provider (Console Go): Upstream request failed - cc-switch
Quick fix
检查模型映射是否被正确应用,若映射目标模型已下线或请求体含上游不支持的 tool_choice/图片格式,需调整配置或等待 cc-switch 修复翻译层。
Symptom
Section titled “Symptom”{"error":{"param":null,"code":"invalid_request_error","type":"invalid_request_error","message":"Error from provider (Console Go): Upstream request failed: [invalid_request_error] Thinking mode does not support this tool_choice"}}该错误是 OpenCode Go(Console Go)网关返回的通用上游失败提示,在 cc-switch 本地代理链路中出现时有多种根因。第一种是模型映射被静默跳过:技能重新导入后代理内部状态重载,导致 session 上下文丢失,原始模型名(如 `claude-sonnet-4-6`)被直接透传给上游,上游无法识别而返回 400(#5312)。第二种是请求体中的 `tool_choice` 或工具定义不符合上游严格校验:Claude Code 内置 WebSearch 强制发送 Anthropic 风格 `server_tool`,而上游只接受 `auto` 或 `{"type":"web_search"}`(#6367);Codex 原生 Responses 透传时,grok-* 模型对 `custom`/`tool_search`/缺失 `parameters` 的 function 工具一律 422(#7138)。第三种是模型能力声明与实际网关能力不匹配:DeepSeek 声明支持图片,但 Console Go 网关只认 `text` 内容块,粘贴图片即 400(#6450)。第四种是 failover 目标模型已下线,cc-switch 的 `categorize_proxy_error()` 将这类 400 一律归为 NonRetryable,不熔断不转移,导致请求反复失败(#6821)。
确认本地代理版本:技能重导入导致映射丢失的问题已在 4.0 重写本地路由接管方式后修复,请升级到最新版 cc-switch 并重新导入技能后验证。
若报错含 'Thinking mode does not support this tool_choice',请检查模型映射配置,确保 `claude-*` 模型名已映射到上游实际支持的模型名(如 `deepseek-v4-flash`),而非直接透传原始名。
若 failover 队列中某供应商映射的目标模型已下线(如 `deepseek-v4-flash-free`),请将该供应商的模型映射改为存活模型名(如 `hy3-free`),或从队列中移除该供应商。
若粘贴图片即 400,说明当前链路不支持 `image_url` 内容块,请避免在 Claude Code 中直接粘贴图片,或改用支持视觉的供应商/协议,等待 Vision Proxy 功能落地。
若 Codex 经 OpenCode Zen Go 使用 grok-* 模型返回 422,目前无配置层解法,需等待 cc-switch 扩展 sanitize gate 或自行在客户端与代理间加前置转换层。
Affected Versions
Section titled “Affected Versions”Source Issues
Section titled “Source Issues”本页汇总自 5 个真实 issue
- #5312Model name mapping silently dropped after skill re-import, causing 400 errors from upstream
- #6367[Bug] Claude Code 内置 WebSearch 经 DeepSeek(OpenCode Go) Responses 路由时报 400: Thinking mode does not support this tool_choice
- #6450[Feature] Vision Proxy:图片自动注入视觉描述,且注入开关需独立于模型能力声明(附代码定位)
- #6821[Bug] 上游 400 "Model is unavailable"(failover 目标模型已下线)被归为 NonRetryable:不熔断、不转移,分类器请求反复挂起 / Upstream 400 for dead failover target model treated as NonRetryable — no circuit breaker, no failover
- #7138Codex 原生 Responses 透传遇严格第三方 Responses 网关(OpenCode Zen Go)时 422:清洗器 gate 限于 xai_oauth,且 tools 转换缺失
- 为什么重新导入技能后 Claude Code 突然全部 400?
- 这是 cc-switch 3.16.5 的已知问题:技能重导入触发代理内部状态重载,清除了 session 到供应商的关联,导致模型映射被静默跳过,原始模型名直接透传给上游。4.0 已重写本地路由接管方式,请升级验证。
- WebSearch 一用就报 Thinking mode does not support this tool_choice,普通对话却正常?
- Claude Code 对内置 WebSearch 强制发送 Anthropic 风格 `server_tool` tool_choice,而上游 DeepSeek Responses API 只接受 `auto` 或 `{"type":"web_search"}`。这是 cc-switch 翻译层未做适配所致,需等待修复。
- 为什么模型声明支持图片,粘贴图片还是 400?
- 模型能力声明(如 DeepSeek 支持图片)不等于实际转发网关能力。Console Go 网关只认 `text` 内容块,serde 反序列化遇到 `image_url` 直接拒绝。cc-switch 的 media_sanitizer 因能力判定为 Supported 而跳过剥离,导致图片原样转发。
- 上游 400 提示 Model is unavailable,为什么不自动切到下一个供应商?
- cc-switch 的 `categorize_proxy_error()` 将所有 400 一律归为 NonRetryable,不触发熔断也不参与故障转移。即使响应体明确是模型已下线,也不会自动跳过坏供应商。需要手动调整 failover 队列或等待分类器改进。
这是一个非官方社区 wiki,与 cc-switch 作者及项目本身无隶属关系。内容整理自项目公开的 GitHub issues。本站不分发任何软件。