Claude Code 报错的时候,最浪费时间的不是修,是不知道该修哪一层。
十几个人同时喊「连不上」,可能是同一个原因,也可能是十几个不同的原因。而绝大多数人的第一反应是重装——重装几乎解决不了任何问题,因为问题基本不在安装那一层。
这篇给一套分层定位法,加一张十二种报错的对照表:每一条都写明这是谁的问题,以及怎么在两分钟内验证。
排错的第一原则是别猜,先缩小范围。Claude Code 到模型之间有四层,从下往上排查:
你的机器 → 网络 → 服务端点 → 认证 → 模型
第一条:服务端点通不通?
curl -sS -o /dev/null -w "http=%{http_code} time=%{time_total}\n" \
https://你配置的地址/v1/messages连接被拒绝或超时 → 网络层或地址写错了。
返回任何 HTTP 状态码(哪怕是 401、404)→ 网络层是通的,问题在上面。
第二条:认证和协议对不对?
curl -i -s https://你配置的地址/v1/messages \
-H "x-api-key: $KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-4-5","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}'这一条命令能区分出后面表里的大半情况,看的是状态码和响应体的格式。
第三条:Claude Code 到底读到了哪份配置?
env | grep -i anthropic
cat ~/.claude/settings.json 2>/dev/null这一步经常被跳过,但它是「配置明明改了却没生效」这类问题的唯一解释来源。环境变量和 settings.json 同时存在时,实际生效的可能不是你以为的那份。
现象 | 大概率原因 | 谁的问题 | |
|---|---|---|---|
1 |
| 没装或 PATH 没生效 | 你 |
2 | 启动正常,一发消息就卡住不动 | 网络到不了服务端点 | 网络 |
3 |
| Key 写错、带了空格或换行 | 你 |
4 |
| Key 有效但无该模型权限 | 服务端 |
5 |
| 权限或地区限制 | 服务端 |
6 |
| 该地址没有 Anthropic 格式接口 | 服务端 |
7 |
| 正常限流 | 服务端(合理) |
8 |
| 限流实现不规范 | 服务端(不合理) |
9 |
| 服务端故障或上游异常 | 服务端 |
10 | 返回的是一段 HTML 不是 JSON | 请求打到了网页层 | 服务端 |
11 | 长任务跑到一半断开 | 超时设置太短 | 你(可配) |
12 | 能用,但回答明显不像你指定的模型 | 实际调用的模型与指定的不一致 | 服务端 |
下面挑几个最容易误判的展开。
404 不是「地址写错了」,多半是接口格式不对这是最容易误判的一条。很多人看到 404 就去反复检查地址有没有敲错,其实地址完全正确——只是那个地址上没有 Anthropic 格式的接口。
Claude Code 发出的是 Anthropic 协议的请求,路径是 /v1/messages。而相当一部分服务只提供 OpenAI 格式接口,路径是 /v1/chat/completions。你把 Claude Code 指向后者,它请求 /v1/messages,服务端当然说没有这个路径。
怎么确认:拿同一个地址分别打两条路径。
# Anthropic 格式
curl -s -o /dev/null -w "messages: %{http_code}\n" \
-X POST https://地址/v1/messages \
-H "x-api-key: $KEY" -H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-4-5","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}'
# OpenAI 格式
curl -s -o /dev/null -w "chat/completions: %{http_code}\n" \
-X POST https://地址/v1/chat/completions \
-H "Authorization: Bearer $KEY" \
-H "content-type: application/json" \
-d '{"model":"gpt-4o","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}'第一条 404、第二条 200 或 401 → 这个服务只有 OpenAI 格式。这种情况下 Claude Code 接不上是必然的,跟你的配置无关。解法是加一层协议适配,或者换用原生支持 OpenAI 格式的其他 Agent 工具。
下单前用第一条命令测一次,就能避开这整类问题。 宣传页写「兼容 Claude Code」但实际只有 OpenAI 格式接口的情况并不少见。
如果 curl 拿回来的是 <!DOCTYPE html> 开头的一段东西,说明你的请求根本没到 API 层,而是被网页层接住了。常见的三种情况:
第一种是你的问题,改地址就好。后两种是服务端的问题——一个正经的 API 端点不应该对合法的 API 请求返回 HTML。
顺带一个排查技巧:如果同样的请求,curl 能通而你的程序不通,先比较两边实际发出的请求头。有些防护会根据请求头的完整性和顺序来判定,头部写得太少反而更像脚本。
这一条最难自查,因为它不报错——请求成功、有返回、看着一切正常,只是回答质量和你预期的对不上。
响应体里的 model 字段是服务端自己填的,不能作为验证依据。要判断实际执行的是不是你指定的模型,得用行为特征,而不是它的自述。
方法一:问它自己是谁(弱证据)
curl -s https://地址/v1/messages \
-H "x-api-key: $KEY" -H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-4-5","max_tokens":100,
"messages":[{"role":"user","content":"你是哪个公司训练的哪个模型?只回答型号。"}]}'这只是弱证据——模型的自我认知可能被系统提示词覆盖。但如果它明确回答了另一家公司的模型名,那基本可以确定了。
方法二:用有标准答案的题测(强证据)
准备五到十道有唯一正确答案、且不同能力档位的模型正确率差异明显的题目。多位数乘法、需要多步推导的逻辑题、特定的边界条件代码题都可以。同一套题分别打你自己的地址和一个你信任的对照地址,比较正确率。
关键在于用同一套题、同样的温度参数、跑足够多次。单次结果没有意义,模型输出本来就有随机性。
方法三:看行为特征(最实用)
不同模型在长上下文处理、工具调用编排、拒答边界上的行为差异很明显,日常用久了自然能感觉到。如果你的直觉说「这不像」,那通常值得认真测一次,别不好意思。
429 带不带 retry-after,是判断服务质量的免费指标限流本身是正常的,任何服务都有限流。但限流响应的规范程度,能免费告诉你这家服务的工程水平。
规范的实现:
HTTP/1.1 429 Too Many Requests
retry-after: 3
{"type":"error","error":{"type":"rate_limit_error","message":"..."}}有 retry-after,客户端就知道等多久再试,可以自动重试。不规范的实现只丢一个 429 甚至一个 500 过去,客户端只能盲目重试,反而加重拥塞。
这一条可以在下单前就测出来:连续快速打十几次请求,看触发限流时返回什么。这比任何宣传页上的可用性数字都有信息量——那些数字你没法复现,这个你现在就能测。
配置改了但没生效
环境变量和 ~/.claude/settings.json 同时存在时,实际生效的未必是你刚改的那份。先把两边都打印出来看,再谈别的。这一步能解释掉相当一部分「明明改对了却还是报错」。
Key 里混进了不可见字符
从网页复制 Key 时很容易带上尾部空格或换行。表现是 401,但你怎么看都觉得 Key 是对的。
echo -n "$ANTHROPIC_AUTH_TOKEN" | wc -c # 和官方给的长度对一下长任务被超时切断
Claude Code 处理大任务时单次请求可能跑很久,默认超时不一定够:
{ "env": { "API_TIMEOUT_MS": "600000" } }别一上来就重装
「装好了、能启动、一发消息就报错」是最典型的现象——卡住的不是安装,是模型调用。重装动的是前者,问题在后者。这条看着像废话,但它确实是排错时被浪费掉的时间里最大的一块。
前面所有排查都做完,仍然不正常,那么问题大概率在服务端。这时候有三个可核实的判断依据:
1. 错误信息是否可判断。 上游出问题时,返回明确状态码和错误体的,说明错误处理是认真做的;返回一个含糊的 500 或者一段 HTML 的,你连「是我的问题还是它的问题」都判断不了。这一条在下单前就能测——故意用一个错误的 Key 打一次,看它返回什么。
2. 同样的请求换个地址还有没有问题。 手上留一个对照地址(国产模型的官方套餐是个成本很低的对照组),同一个请求两边都打一次,能立刻区分是你的代码问题还是那家服务的问题。
3. 故障时有没有说法。 有没有状态页?有没有公告?出问题时找不到人、也没有任何信息的,日常使用会很被动。
利益披露:本文作者本人也在做 Claude Code 接入服务(code2ai.codes),所以第八节这三条标准同样适用于本文作者——上面每一条都请照样对我们测一遍。这三条之所以值得写出来,正是因为它们不依赖任何一方的自述,你自己就能验证。
为什么 curl 能通,Claude Code 却连不上?
先确认 Claude Code 读到的是哪份配置(第一节第三条命令)。如果配置没问题,再比较两边实际发出的请求头——有些防护层会根据请求头判定来源。
403 和 401 有什么区别?
401 是「我不知道你是谁」——认证没过,通常是 Key 的问题。403 是「我知道你是谁,但你不能做这个」——认证过了,权限或地区限制没过。两者的修法完全不同,别混着排。
报错里说模型不存在,但我确认那个模型是存在的?
模型名的写法各家不完全一致,尤其是版本后缀。以你所用服务方的模型列表页当天显示的名称为准,别照抄文章里的(包括本文里的示例)。
多久应该怀疑是服务商的问题?
第一节那三条命令跑完还定位不到,就可以怀疑了。不要花两小时反复重装和改配置——那三条命令五分钟能跑完,跑完还不明白的,继续折腾本地也不会明白。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。