CC Switch 只解决"切换",不解决"兼容"。真正的故障面在协议字段、工具调用和模型能力三层,绝大多数以静默降级的形式出现——不报错,但一直变差。
Claude Code 不是一个通用 LLM 客户端,而是深度耦合 Anthropic API 的专用客户端。它的系统提示词、工具描述、Beta Headers、缓存与思考字段全部按 Claude 模型能力定制。中转站只要在协议上是"子集",或后端模型不是 Claude,客户端的一整套优化就失效——这是架构耦合的必然结果,不是所谓"官方投毒"。
中转站只实现 /v1/messages 的基本字段,对 thinking、cache_control、Beta Headers、server_tool_use 等做 schema 校验后丢弃或直接 400。
客户端靠模型名字符串与 Provider 判断能力。第三方模型名匹配不上 claude-* 规则,能力检测要么全 false、要么误判为 true,两种都出错。
Function Calling 在各家实现差异很大:并行调用、严格 JSON、长参数逐字复现、思考态下能否调工具,都不一致。工具越多,弱模型越容易崩。
上两层报错明确、一次配对就好;下两层通常不报错,只是"感觉变笨了"。
/v1/v1、model ID 与中转命名不符、shell 里的 export ANTHROPIC_* 优先级压过 settings.json 导致"切了没生效"。按失效机制分组,而不是按工具名罗列——同一类机制坏掉,整组工具一起坏。
Edit 做的是精确字符串替换:old_string 必须与文件内容逐字节一致,不做正则、不做模糊匹配,一个空格或缩进差异就失败。第三方模型在生成长参数时容易"顺手整理"空白、转义引号、把全角标点归一化、丢掉行尾空格。
整文件写入要求模型一次性输出全部内容。中转站的 max_tokens 上限往往低于官方(尤其按次计费的分组会隐藏单次输出上限),流式细粒度传参时参数不做 JSON 校验,截断即产生非法 JSON。
stop_reason 若被中转统一成 end_turn,客户端还会以为"写完了"。参数是对象数组 + 严格枚举(status / activeForm)。对嵌套数组 schema 支持弱的模型经常给错结构或漏字段。
cell_id + 编辑模式的组合语义复杂,弱模型基本靠猜。
WebSearch 是 Anthropic 服务端工具:搜索由 Anthropic 服务器调用搜索引擎完成,客户端只收结果。中转站只做协议转换,没有搜索服务;Bedrock / Vertex 同样不支持。这是判断"你连的是不是官方通道"的最快方法——反代通道只能 Fetch,不能 Search。
抓取在本机执行,但正文摘要会调用小模型(claude-haiku-4-5)。中转站若没有这个 model ID,整条链路直接失败。
粘贴截图、读取图片走多模态 content block。纯文本中转或非视觉模型不接受该 block。
cache_control、defer_loading(工具描述延迟加载)、eager_input_streaming 等字段被严格校验的中转直接拒绝或剥离。
Claude Code 大量依赖一轮内并发多个 tool_use(同时读多个文件、并发 Grep)。不少 OpenAI→Anthropic 转换层只透传第一个 tool call。
每个 tool_result 必须回带对应的 tool_use_id。转换过程重写消息时容易错配或丢失,历史一旦不一致就整个会话卡死。
/rewind 或重开会话。典型如 DeepSeek:进入 Reasoner 模式后底层不支持 function calling,而历史里又必须携带 thinking 块。Claude Code 的高强度思考提示恰好会触发这个模式。
thinking: adaptive 而报错。缺少 thinking_delta / server_tool_use / input_json_delta 等事件类型。
MCP 会一次性注入几十个工具定义(名称形如 mcp__server__tool)。工具越多,选择空间越大,弱模型选错工具、编造参数的概率显著上升;schema 体积也直接吃掉上下文和成本。
子代理是"再开一个完整会话",每个子代理自带全套系统提示与工具。第三方模型往往不理解委派语义,自己动手而不派发;无缓存时成本按 N 倍叠加。
技能本质是长指令遵循。第三方模型对"先读 SKILL.md 再执行"这类元指令的服从度低。
这几个纯本地执行、参数结构简单,是接第三方模型后仍然稳定的部分。剩下的问题只是模型本身写不写得对命令、会不会读超长输出。
工具之外,客户端本身有一整套依赖官方 API 的能力,接第三方后大多数不会报错,只是悄悄消失。
官方缓存能把 Claude Code 实际成本降 50–70%。中转不支持 cache_control 时,每轮都要重新处理数万 token 的系统提示与工具定义。
cache_read_input_tokens,客户端的缓存命中监控同时失效。思考预算、adaptive thinking、interleaved thinking 都靠专有字段。能力探测还会误判:模型名匹配不上但 Provider 仍被当作 firstParty,于是照发 thinking 字段。
ultrathink 一类用法完全无效。客户端会发十余个实验性 header(如 interleaved-thinking、fine-grained-tool-streaming)。第三方端不认识,静默忽略是好结果,返回错误是坏结果。
中转标称的上下文与实际透传上限常常不一致,逆向与按次计费分组尤其容易隐藏上限,超出部分被服务端悄悄截断。
服务端上下文清理不可用,只能靠本地 compact,且压缩本身也由第三方模型执行。
/compact 触发更频繁、摘要质量更差,长会话信息丢失加剧。逆向类通道的 stop_reason、流式结束标记常与官方不一致。
/cost、状态栏 token 计数、上下文占用百分比全部依赖响应里的 usage 字段。中转返回不全或干脆不返回。
Plan Mode 会抬高思考预算并依赖 ExitPlanMode 工具的严格流程。思考不可用时退化成普通对话;某些平台还会因思考预算超过输出上限而直接报错。
会话标题生成、命令建议、WebFetch 摘要、部分补全都会调用 haiku 级模型。
/model 列表与官方模型别名绑定;各中转对同一模型的 ID 命名不统一(claude-sonnet-4-6 vs anthropic/claude-sonnet-4.6)。
客户端按官方状态码语义重试。中转把上游超时统一成 502/504、把余额不足返回 402、限流返回 429 的时机也各不相同。
同一时刻只有一个 Provider 处于 Active,不支持自动 failover;shell 里手工 export 的 ANTHROPIC_* 优先级高于 settings.json。
所有请求经中转服务器明文过境,运营方技术上可完整记录对话、代码与密钥。多数中转不公开数据处理政策。
CC Switch 与 settings.json 以明文保存 Key,容易被 git commit、截屏、云盘同步带出去。
低价分组把请求路由到更小的模型或更低的思考档位,返回的 model 字段照旧。价格越低,掉包概率越高。
逆向、Kiro、Antigravity 类通道随官方策略调整随时失效;预充值余额掌握在运营方手里;共享账号池被限流或封禁会牵连所有用户。
Claude Code 迭代很快,新版本引入的新字段/新 Beta 会先于中转适配。社区多次出现"升级后第三方通道工具调用集体报错"。
按顺序做,每一步的结论决定下一步——这里的编号是真实的执行序列。
Claude Code 只发 POST /v1/messages(Anthropic schema)。中转若只有 /v1/chat/completions,两者完全不兼容,需要 Router 之类的转换层。
curl -s $ANTHROPIC_BASE_URL/v1/messages \
-H "x-api-key: $KEY" -H "anthropic-version: 2023-06-01" \
-d '{"model":"你的模型ID","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}'
# 期望:200 且返回体含 content 数组。404 → 检查 BASE_URL 是否已含 /v1(会拼成 /v1/v1)
不要照抄官方文档的模型名,以中转实际列表为准,大小写敏感。
curl -s $ANTHROPIC_BASE_URL/v1/models -H "x-api-key: $KEY"
分别带上 thinking 和 cache_control 各发一次,看是被接受、被忽略还是 400。响应 usage 里有没有 cache_creation_input_tokens 是缓存能力的直接证据。
在测试仓库里让它读一个文件 → 精确 Edit 一行 → 再 Grep 验证。这条链路同时覆盖并行调用、tool_use_id 配对和逐字精度三个高危点。再问一句需要联网的问题,看 WebSearch 是否存在。
与其让客户端发出会被拒绝或被忽略的字段,不如主动关掉——能减少一大批莫名其妙的 400 和空转。
# 仅在上一步确认不支持时才设置;支持的能力不要关 export DISABLE_PROMPT_CACHING=1 export DISABLE_INTERLEAVED_THINKING=1 export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 # 清掉残留的手工变量,避免 CC Switch "切了没生效" unset ANTHROPIC_AUTH_TOKEN ANTHROPIC_API_KEY ANTHROPIC_BASE_URL
单文件问答、写测试、翻译注释、生成样板代码、跑脚本。工具链短、上下文小、不依赖缓存与思考。
跨文件重构、长会话调试、需要子代理与 MCP 的编排、任何依赖精确 Edit 的大改动。这些正好踩在全部高危点上。
官转 / Max 池 > Vertex、Bedrock、Kiro、Antigravity(底层正版,字段有差异)> 逆向与按次计费(能力因站而异,掉包概率最高)。
锁客户端版本;敏感仓库不走中转;Key 不进 git;把中转当成本优化选项而非唯一通道,保留一个可随时切回的官方 Provider。