用国产模型跑 Claude Code:两家官方配置与静默降级
照着官方文档接上,并在第一时间验证“到底是谁在回答你”
这是全课最“划算”的一节:你不用换工具,不用重新学界面,不用放弃已经写好的项目规则和护栏——只换掉后面那台发动机。
原理一句话:Claude Code 通过两个环境变量决定“把请求发到哪、用哪把钥匙”。把这两个值指向国内厂商提供的兼容接口,工具本身照旧。
但这一节真正要教的不是那两行配置——那两行任何一篇教程都有,而且抄错的人很多。要教的是配完之后的第一件事:验证到底是谁在回答你。因为这条路上最阴的一个坑,是你用着一个便宜的小模型,却以为自己在用大的,而且全程没有任何报错。
给车换燃料,加油口是通用的,但不同的油品对应不同的标号,加错了车照样能开一段,只是动力不对、积碳变多——它不会在仪表盘上给你亮一个灯说“你加错了”。
兼容接口就是这个加油口。它让你能接上,但接上不等于接对。唯一靠谱的办法是打开发动机盖看看:你请求的型号,和实际给你干活的型号,是不是同一个。
两家的官方写法(以及一个必须说清的差异)
截至 2026 年 8 月,本课核实过官方文档、确认提供 Anthropic 兼容接口的有两家——注意措辞:是“核实过两家”,不是“只有两家”。厂商在陆续增加,你用别家之前自己去它的官方文档确认一次。
| DeepSeek | 智谱 | |
|---|---|---|
| 接口地址 | https://api.deepseek.com/anthropic | https://open.bigmodel.cn/api/anthropic |
| 官方文档里写的密钥变量 | ANTHROPIC_API_KEY | ANTHROPIC_AUTH_TOKEN |
| 模型名 | 自动映射,也可直接写自家模型名 | 可在配置里逐档指定 |
这里有个容易让人绕进去的地方,必须说清楚。两家官方文档写的环境变量名不一样;而主课 6.3「安装 Claude Code」那一节给 DeepSeek 的示例用的是 ANTHROPIC_AUTH_TOKEN。到底谁对?
我们实测了一次:拿一把假密钥,分别用 x-api-key 和 Authorization: Bearer 两种鉴权头去打这两个地址。结果是四种组合全部返回“密钥无效”而不是“缺少鉴权头”——也就是说,这两个端点对两种写法都认。
所以结论是:先按你选的那家官方文档写,写成另一种大概率也能通;真遇到 401 时,别急着换变量名,先用下面的办法分清是“缺头”还是“key 不对”。
智谱官方给出的配置文件形态是这样(放在用户目录的 .claude/settings.json):
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "你的密钥",
"ANTHROPIC_BASE_URL": "https://open.bigmodel.cn/api/anthropic",
"API_TIMEOUT_MS": "3000000",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": 1
}
}
它还支持把三档模型分别指定成自家的型号,并配合更大的上下文窗口设置。具体型号名会随版本变化,以官方文档当时的写法为准——这也是为什么本节把型号名留给你去文档里抄,而不是写死在课里。
那个不报错的坑:静默降级
DeepSeek 的官方文档里写了一句很关键的话:当你传入一个它不认识的模型名时,后端会自动把它映射到自家的轻量模型。
请把这句话读第二遍。它的意思是:
- 你在配置里写了个拼错的型号,或者写了个它这边没有的型号;
- 请求成功,有回答,没有任何报错;
- 而实际干活的是一个更小更便宜的模型。
于是你会得出一个错误结论:“这家不行,写复杂点的代码就乱。”——其实你从来没用上你以为在用的那个模型。
这和本站另一门课讲的“假绿灯”是同一种东西:失败没有以失败的形式出现。区别只在于,那次是退出码被吞掉,这次是模型被悄悄换掉。
还有一件事:不是所有能力都跟着过来
兼容不等于等价。DeepSeek 文档明确列出了几项不支持的能力,其中包括 MCP、文档输入、搜索结果、代码执行结果等。
对照主课的进阶内容,这意味着:你围绕 MCP 建起来的那套东西,换到这条路上可能直接失效。 这不是缺点,是边界——提前知道边界,好过用到一半发现某个功能莫名其妙不响应。
🔧 动手做:接上,然后立刻验一次“是谁在答”(6 分钟)
- 先探端点。 不带密钥,按 K4.1 的命令打一次目标地址,确认拿到 401 而不是超时。我们在 2026 年 8 月 24 日探过上表两个地址,都是 401(那台机器在新加坡,不能替你证明你的网络可达)。
- 再配。 按你选的那家的官方文档填地址和密钥变量——特别注意别把两家的变量名搞混。
- 然后验。 这是最关键的一步。先
export YOUR_KEY=你的真实密钥,再带上它发一个最小请求,把响应里的模型字段抠出来:
curl -s -m 20 -X POST "$ANTHROPIC_BASE_URL/v1/messages" \
-H "content-type: application/json" -H "anthropic-version: 2023-06-01" \
-H "authorization: Bearer $YOUR_KEY" \
-d '{"model":"你配置里写的那个型号","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}' \
| grep -o '"model"[^,}]*'
你会看到:grep 出来的那一行形如 "model": "...",里面那个型号要么和你请求的一致(接对了),要么是另一个名字(发生了映射或降级)。
这里的匹配写法故意写得松一点(
[^,}]*而不是死抠":")。原因很实际:有的服务返回紧凑 JSON、有的带空格,写死冒号后面不带空格的话,遇到带空格的响应会一条都匹配不到,而且不报错——那就又是一次假绿灯。不一致本身不一定是错——有的平台就是按档位映射的——但你必须知道它换成了什么,否则你后面对“这家行不行”的所有判断都建立在错误前提上。
为什么:这一步花不到一分钟,却挡住了这条路上最贵的一类误判。没做这一步就下结论说某家模型不行,和没验红就说护栏装好了,是同一种错误。
接之前先想好怎么退回去
换发动机这件事有个容易被忽略的前提:你得能随时切回来。上游限流、余额用完、服务临时不可用,这些都会发生,而它们通常发生在你赶进度的时候。
退路本身很简单,关键是提前确认过一次:
- 如果你是用环境变量接的,退回去就是把那两个变量取消设置(
unset ANTHROPIC_BASE_URL ANTHROPIC_AUTH_TOKEN),开个新终端确认它们真的没了。 - 如果你是写进
~/.claude/settings.json的,先把原文件备份一份再改(cp settings.json settings.json.bak),要退回去就把备份换回来。 - 无论哪种,改完立刻按上面的办法验一次“是谁在答”——切回去之后同样要验,否则你不知道自己切没切干净。
一句实话:这一步大多数人都会跳过,直到某天线上要交东西而工具连不上。花两分钟备份,省的是那天的两小时。
看到 401 的第一反应常常是换变量名、换写法、来回试。省事的做法是让报错自己说话——这两种失败的报错文本是不一样的:
- 完全不带鉴权头时,平台会明说缺什么。我们实测时,某国内平台直接用中文回“Header 中未收到 Authorization 参数”。
- 带了头但密钥不对时,报错会变成“密钥无效”这一类,还常常把你的 key 打码回显给你看。
先跑一次不带密钥的请求对照一下,再决定要改什么。读完报错再动手,比试十遍快。
换模型不换工具,是这门课性价比最高的一条路:项目规则、护栏、提示词模板全都留着,只改接口地址和密钥。两家官方文档写的密钥变量名不一样,但实测显示两个端点对两种鉴权头都认——所以按官方文档写,遇到 401 先分清是“缺头”还是“key 不对”,别急着换写法。这条路上最阴的坑是静默降级——传了不认识的型号,请求照样成功,回答你的却是个小模型,全程无报错。所以配完的第一件事永远是同一件:发一个最小请求,把响应里的模型字段抠出来看看,到底是谁在回答你。退路要提前备好:环境变量记得能 unset,改配置文件之前先备份一份,切回去之后同样要验一次“是谁在答”。到这里,四道门、三条路、三样通用资产和两种接法都齐了。最后一节不讲新东西,只做一件事:把这十四节收成一页纸——一份你三个月后看得懂、同事能照着走、合规问起来能直接给的方案。
🔎 来源与核验· 6 条,点开核对
