CC Switch 显示错误模型名的排查与解决

CC Switch 显示错误模型名的排查与解决

2026/6/8

问题描述

我用 CC Switch + 自建代理(DeepSeek Web Agent Proxy)给 Claude Code 做中转,代理后端是通义千问(Qwen)。代理本身没问题 --- 响应里每个 SSE chunk 都返回 "model": "qwen3.7-max",但 CC Switch 的用量面板里一直显示 claude-opus-4-8。

其他中转站没这个问题,只有自建代理会出现。

排查过程

1. 确认代理侧没问题

抓包确认,我们代理的响应每个 chunk 都带了正确的 model:

json 复制代码
data: {"id":"...","object":"chat.completion.chunk","model":"qwen3.7-max","choices":[...],"usage":{...}}

非流式响应也一样:

json 复制代码
{"id":"...","model":"qwen3.7-max","choices":[...],"usage":{...}}

响应 100% 正确,问题不在我们这边。

2. 查 CC Switch 日志

翻 CC Switch 的日志文件 ~/.cc-switch/logs/cc-switch.log,发现转发时 model 已经被正确替换了:

复制代码
[Claude] >>> 请求 URL: http://127.0.0.1:48391/v1/chat/completions (model=qwen3.7-max)

日志显示 CC Switch 知道 实际转发的是 qwen3.7-max。

3. 查 CC Switch 数据库

CC Switch 用 SQLite 存请求日志。查 proxy_request_logs 表:

sql 复制代码
SELECT model, request_model FROM proxy_request_logs 
WHERE app_type='claude' ORDER BY created_at DESC LIMIT 5;

结果:

model request_model
claude-opus-4-8 claude-opus-4-8
claude-opus-4-8 claude-opus-4-8
claude-opus-4-8 claude-opus-4-8

model 和 request_model 都是 claude-opus-4-8。CC Switch 转发时用了 qwen3.7-max,但写数据库时没记录转发后的 model。

4. 定位根因

搜 CC Switch 的 GitHub Issues,找到了 Issue #3846:

Bug: Streaming timeout causes wrong model name and zero tokens in usage logs

当流式响应的 model 提取失败时,claude_model_extractor 回退到 request_model(请求体的原始 model)。

根本原因在 CC Switch 的 Rust 代码里。CC Switch 做 Anthropic → OpenAI 格式转换时,转发器会把 model 替换成配置的模型名(qwen3.7-max),但写数据库的 usage 收集器 从 SSE 事件中提取 model 名时失败了,回退到了 request_model(Claude Code 发过来的 claude-opus-4-8)。

流程是这样的:

复制代码
Claude Code 发请求 → body.model = "claude-opus-4-8"
    ↓
CC Switch 转发 → 替换为 model = "qwen3.7-max",发给我们的代理
    ↓
我们的代理返回 → 响应 model = "qwen3.7-max"(正确)
    ↓
CC Switch 收到响应 → 转回 Anthropic 格式给 Claude Code
    ↓
CC Switch 写数据库 → model_extractor 从 SSE 事件中提取 model 失败
    ↓
回退到 request_model = "claude-opus-4-8"(错误)

5. 为什么其他中转站没问题?

其他中转站(如 pie-xian)用的是 Anthropic 原生格式 (apiFormat: "anthropic"),CC Switch 不需要做格式转换,直接透传。这种情况下 model 提取是正常的。

我们用的是 OpenAI Chat Completions 格式 (apiFormat: "openai_chat"),CC Switch 需要做 Anthropic ↔ OpenAI 的双向转换。格式转换路径上的 model 提取逻辑有 bug。

解决方案

CC Switch v3.16.3(2026-06-14 发布)修复了这个问题。

更新日志关键内容

路由接管流量按真实上游模型计费

当请求被路由到了不同的上游时,代理过去会按上游回显的模型来归因和计价...现在转发器会捕获真实的出站模型,按「上游回显 → 出站模型 → 客户端别名」的顺序归因,并在每行持久化实际使用的定价依据(schema v11)。
PR #2774:修复 Completions 转 Anthropic 时不记录实际返回模型、input token 计算错误。

升级方法

  1. 从 GitHub Releases 下载 v3.16.3 的 MSI 安装包
  2. 安装后重启 CC Switch
  3. 发一个请求验证

验证

升级后查数据库:

sql 复制代码
SELECT model, request_model FROM proxy_request_logs 
WHERE app_type='claude' ORDER BY created_at DESC LIMIT 5;

应该能看到:

model request_model
qwen3.7-max claude-opus-4-8

model 变成了实际转发的 qwen3.7-max,request_model 保留了 Claude Code 发来的 claude-opus-4-8。

关键文件路径

文件 说明
~/.cc-switch/cc-switch.db SQLite 数据库,proxy_request_logs 表存请求日志
~/.cc-switch/logs/cc-switch.log CC Switch 运行日志
~/.cc-switch/settings.json 全局设置

总结

  • 问题出在 CC Switch 的格式转换路径(OpenAI → Anthropic)上,model 提取逻辑有 bug
  • 不是代理的问题,代理响应完全正确
  • 升级到 CC Switch v3.16.3 即可解决
  • 其他中转站用 Anthropic 原生格式不受影响,只有用 OpenAI Chat Completions 格式的自建代理会遇到
相关推荐
狂师8 小时前
Agent 测评指标怎么选、怎么算?
人工智能·agent·测试
莪_幻尘8 小时前
当 AI 拿到工牌:WorkBuddy 打通企微背后的 AI 工作流之争
人工智能·agent
Deng桑9 小时前
SpringAI的Advisors-用拦截器的思维管Agent
agent·spring ai·advisor·横切逻辑
miofly10 小时前
GitHub 日榜趋势速报 | 2026-11-06
开源·github
vjmap21 小时前
AI 智能体调用绘图工具画矢量地图:唯杰 AI 地图绘制上线,支持 MCP 接入 Cursor、Claude Code
gis·agent·mcp
review445431 天前
Codex Hooks 入门实战:生命周期事件、matcher 与5分钟跑通一个钩子
前端·agent·vibecoding
Bayze1 天前
开源了一个 MCP 工具:让 Cherry Studio 里的 AI 助理调度多家模型交叉复核
开源
GoodTime1 天前
一件一屏:用 AIUI 把「快递上门」做成一条会自己往下走的任务线
agent
SL_staff1 天前
从文档工具到知识中枢:基于JVS数字底座构建企业级统一内容管理平台的技术实践
java·开源·全栈
武子康1 天前
Agent 说“3 passed”就算修好了?先检查是谁判的通过
人工智能·agent