Claude Code 接 DeepSeek 一直刷 unrecognized_model?4 组对照实验,一次讲清

29 阅读3分钟

30 秒解决

在 ~/.claude/settings.json 里加一段:

{
  "modelOverrides": {
    "claude-opus-5-5": "deepseek-v4-pro",
    "claude-sonnet-5-5": "deepseek-flash",
    "claude-haiku-5-5": "deepseek-flash"
  }
}

重新跑一次 claude -p "回复ok",那行告警就没了。

下面解释为什么,以及我踩过的坑。

现象:一行看起来像报错的"告警"

用 Claude Code 通过 ANTHROPIC_BASE_URL 接 DeepSeek 跑非交互模式时,stderr 会多出一行:

[claude-code:unrecognized_model] {"model":"deepseek-v4-pro[1m]","query_source":"sdk"}
ok

注意下面的 ok——请求是成功的。这行不是错误,是"诊断信息":Claude Code 不认识这个模型 ID,所以每次请求都记一笔。

几个特征:

  • 每个进程只写一次(子代理的模型会各写一行)
  • 交互模式下不显示,写进 ~/.claude/debug/ 日志
  • query_source 是 sdk(-p 模式)或以 agent: 开头(子代理)

我的实验:4 组配置对照

为了确定"到底哪个配置项能消掉它",我在同一台机器上做了对照实验(Claude Code 2.1.308 + DeepSeek 官方 Anthropic 端点):

配置结果
空配置 {}❌ 告警出现
只有 modelSettings❌ 告警仍在
只有 modelOverrides✅ 告警消失
有 modelOverrides,同时直接设第三方模型 ID✅ 告警消失

结论:只有 modelOverrides 有效。 modelSettings、[1m] 后缀都消不掉它。

顺便验证:[1m] 后缀确实没用

[1m] 只告诉 Claude Code"这个模型是 1M 上下文",用来校正上下文窗口。即使模型 ID 写成 deepseek-v4-pro[1m],unrecognized_model 照刷不误——因为"上下文多大"和"模型认不认识"是两件事。

为什么

Claude Code 内部维护一份"已知模型注册表"(Anthropic 的模型 ID)。你把 ANTHROPIC_MODEL 或 ANTHROPIC_DEFAULT_*_MODEL 设成第三方 ID(deepseek-v4-pro、glm-5.3 这类)时:

  1. Claude Code 不认识这个 ID
  2. 也找不到映射把它"翻译"成已知模型
  3. 于是每次请求写一行诊断

modelOverrides 的作用就是做"别名登记":告诉 Claude Code"把 deepseek-v4-pro 当作 claude-opus-5-5 处理"。这样它既认识了这个模型,上下文窗口、价格口径也一并继承。

修法的三个细节

① key 必须是 Anthropic 模型 ID,不能写家族别名

// ✅ 对
"claude-opus-5-5": "deepseek-v4-pro"
// ❌ 错(claude 不认这种写法)
"opus": "deepseek-v4-pro"

② key 必须是你的 Claude Code 版本认识的 ID

claude-opus-5-5 需要较新版本。老版本要换成它认识的老 ID(比如 claude-opus-4-8、claude-opus-4-6),否则映射不生效。

③ 按模型档位选 key,上下文窗口自动对上

第三方模型档位建议 key
deepseek-v4-proOpus 档(复杂推理)claude-opus-5-5
deepseek-flashSonnet/Haiku 档(轻量、视觉)claude-sonnet-5-5 / claude-haiku-5-5

别搞混:两个长得很像的告警

告警含义处置
[claude-code:unrecognized_model] {...,"query_source":...}模型 ID 未被识别(不影响请求)modelOverrides;或升级版本;或检查拼写
Model "xxx" isn't recognized · context assumed to be 200k tokens识别不了 → 上下文窗口被假定 200KmodelOverrides;或给 ID 加 [1m](只修窗口)

第一个是"诊断行",第二个是"上下文窗口提示"——不是同一件事,处置方式也不同。

完整操作步骤

第 0 步:复现确认

claude -p "回复ok" 2>&1 | head
# 看到 [claude-code:unrecognized_model] ... 即为复现

第 1 步:备份(改前必须)

mkdir -p ~/.claude/backups
cp ~/.claude/settings.json ~/.claude/backups/settings.json.pre-fix
cp ~/.claude.json          ~/.claude/backups/.claude.json.pre-fix

第 2 步:加 modelOverrides

编辑 ~/.claude/settings.json,注意 JSON 逗号。

第 3 步:冒烟验证

claude -p "回复ok" 2>&1
# 期望:只输出 ok,不再有 unrecognized_model

第 4 步:失败回滚

cp ~/.claude/backups/settings.json.pre-fix ~/.claude/settings.json
cp ~/.claude/backups/.claude.json.pre-fix  ~/.claude.json

附:DeepSeek 官方推荐的 env 配置

export ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic
export ANTHROPIC_AUTH_TOKEN=<你的 DeepSeek API Key>
export ANTHROPIC_MODEL=deepseek-flash[1m]
export ANTHROPIC_DEFAULT_OPUS_MODEL=deepseek-flash[1m]
export ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-flash[1m]
export ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-flash
export CLAUDE_CODE_SUBAGENT_MODEL=deepseek-flash
export CLAUDE_CODE_AUTO_COMPACT_WINDOW=786432

提醒:这份官方配置的 [1m] 是为了 1M 上下文,它本身不消除 unrecognized_model,要彻底消掉还是要加 modelOverrides。

参考