202607202100
问题定位到了,不是bug,是claude code本身的逻辑,修复后的效果如下
这是claude code 发给cpa的

这是cpa转回responses api的

这次问题的整体链路是
【第 N 轮 · 请求】
Claude Code
客户端 model:claude-fable-5(或 fable)
↓
CC Switch(请求映射)
claude-fable-5 → grok-4.5
↓
CPA
↓
上游(grok-4.5 / Responses API)
【第 N 轮 · 响应】
上游
返回 reasoning / encrypted_content …
↓
CPA(协议转换)
将 Responses 的 encrypted_content 等写入 Anthropic thinking.signature
组装:thinking + signature(如 vnj4o7S3…)
message.model = grok-4.5-build-free(上游真实名)
↓
CC Switch(透传)
↓
Claude Code
写入内存 / jsonl ✅ 此时jsonl中有 thinking、有 signature,但是model name是grok-4.5-build-free,不是claude-fable-5
【第 N+1 轮 · 组请求】
Claude Code 内部检查(wad)
本轮请求 model = claude-fable-5
历史 message.model = grok-4.5-build-free
历史 thinking.signature 非空
判定:当前 model ≠ 历史 message.model
→ 静默删除历史 thinking ❌
→ 出站 /v1/messages 不再携带思考过程
修复的办法就是通过代理将Responses中的model覆写掉,我是改了ccswitch的代码,直接通过路由模式将Respons中的model name覆写成claude code原本请求的模型名称
【第 N 轮 · 响应 · 修复后】
上游 / CPA
· message.model = grok-4.5-build-free
· thinking + signature
↓
CC Switch(响应 model 覆写)
· message.model → claude-fable-5
· thinking / signature 原样
↓
Claude Code jsonl
· message.model = claude-fable-5 ✅
【第 N+1 轮】
· 请求 model = claude-fable-5
· 历史 message.model = claude-fable-5
· 一致 → 保留历史 thinking ✅
202607200100
没辙了 定位不到原因

环境是 Claude Code Cli/Desktop → CPA → 实际的模型,比如gpt sol或者 gork
现象
响应里明明带 thinking 和 signature:
{
"type": "thinking",
"thinking": "The user is asking me to tell a joke...",
"signature": "tACLpqn//lNsjZ30P4OYWdnvHf1ovMrenSQ/k3uB/..."
}
但是下一轮 /v1/messages 的请求体里,messages 数组里一个 thinking 块都没有。

CPA 请求/响应协议互转
CC 说的是 Anthropic /v1/messages 那套,后端 grok 说的是另一套(Codex/Responses 风格),CPA 负责两头翻译:
后端 grok 响应: reasoning.encrypted_content
↓ CPA 响应翻译
CC 收到: thinking.signature ✅ 有(transcript 86 个全在)
↓ CC 存进会话
CC 内存: thinking + signature ✅ 有
↓ CC 组装下一轮请求 ← ❌ 这里没了
CC 发出的请求: messages[] 里 0 个 thinking ❌ 签名跟着一起没发
↓ CPA 请求翻译
CPA 收到: 没有 thinking 块可翻译 (appendReasoningContent 根本没被调用)
↓
后端 grok: 收不到任何 reasoning 状态
glm5.2没有加密的think,所以正常,手上也没有现成的Claude Api可以测试,来问问有是新bug还是我配的不对?
难道是claude code有新的机制了?
