
CLIProxyAPI 的 Claude→OpenAI chat completions 翻译只搬四个计数,思考 token 在入口处就丢了;补丁开出四分钟后按仓库贡献规则自关,实现搬进 issue。文里给了一分钟判定与三处改法。
/v1/chat/completions,usage 里没有 completion_tokens_details.reasoning_tokens,流式与非流式都一样。1usage.output_tokens_details.thinking_tokens。执行器侧的解析写得清楚:注释写明思考是 output_tokens 的子集,回落链先读嵌套字段、再读旧别名。4
internal/translator/claude/openai/responses/claude_openai-responses_response.go 第 1362–1380 行:第 1371 行把思考文本长度除以 4 得到 reasoningTokens,第 1378 行写进 response.usage.output_tokens_details.reasoning_tokens;非流式的同一算法在第 1765–1776 行。Merge 也只认这四个键。9
internal/translator/claude/openai/chat-completions/claude_openai_response.go 第 36–68 行:claudeUsageTokens 只有 input、output、两个缓存计数与 HasUsage,第 52–68 行的 Merge 只读这四个键,output_tokens_details.thinking_tokens 没有落点。
message_delta 分支里,第 255–260 行依次写 prompt、completion、total、cached、cached_creation、cache_write 六个键,全部来自那四个计数;同样的六行在 message_stop 尾部块与非流式各重复一次。thoughtsTokenCount 大于 0 时直接写这个字段。10
internal/translator/gemini/openai/chat-completions/gemini_openai_response.go 第 356–372 行:第 364 行取 thoughtsTokenCount,第 367–369 行在它大于 0 时写 usage.completion_tokens_details.reasoning_tokens。AGENTS.md 第 50–51 行:默认不要单独改 internal/translator/;确实只需要改这一处时,先确认自己有 WRITE、MAINTAIN 或 ADMIN 权限,没有就开一张 issue,写明目标、理由与实现代码,然后停下。14claude-sonnet-5 走原生 /v1/messages 并开思考,output_tokens 52、thinking_tokens 32;同一个模型走 chat completions 带 reasoning_effort: high,思考确实跑了,completion_tokens 从 17 涨到 46–53,usage 里却没有 completion_tokens_details。1/v1/chat/completions,请求里带 reasoning_effort——这条链会把档位翻成 Claude 的 thinking 配置。17 看响应 usage 里有没有 completion_tokens_details,流式与非流式各试一次。Merge 读 output_tokens_details.thinking_tokens;三处写出各补一行 completion_tokens_details.reasoning_tokens。上游没报时留空,写 0 会让下游以为那次没思考。验收用作者分支上的三个用例。github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.claude.com
status.cloud.google.com
codex-reset.com
community.openai.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.