简短回答
Claude API 的每个错误都以 JSON 返回,包含 HTTP 状态码和 error.type:400 invalid_request_error(请求体有问题)、401 authentication_error(缺少密钥或密钥错误)、403 permission_error、404 not_found_error(路径或模型 ID 错误)、413 request_too_large、429 rate_limit_error、500 api_error 和 529 overloaded_error。4xx 错误要通过修改请求来解决,原样重发只会再次失败;429、500、503 和 529 则应使用指数退避重试,并在响应带有 retry-after 头时遵守它。APIVAI 使用相同的错误码,另外在密钥预算用完时返回 402 insufficient_quota,默认限制为每个密钥每分钟 60 次请求。大多数 404 来自 Base URL:Anthropic 格式用 https://api.apivai.com,OpenAI 格式用 https://api.apivai.com/v1。
Claude API 的错误响应长什么样?
按照官方 Claude API 错误文档,Anthropic API 以 JSON 返回错误,顶层的 error 对象始终包含 type 和 message。APIVAI 返回的格式相同:
{
"type": "error",
"error": {
"type": "not_found_error",
"message": "Not found. Check the model name and the endpoint path."
}
}OpenAI 格式(POST /v1/chat/completions 和 /v1/responses)传统上使用 {"error": {"message": "...", "type": "...", "param": null, "code": "..."}}。在 APIVAI 上,这些端点的错误也使用上面的结构。OpenAI 的 SDK 和工具读取的是 error.message 和 error.type,这两个字段始终存在;对于 400、404 和 413 错误,如果能说明是哪个字段出错,响应体里还可能带有 code 和 param。
排查时先看 error.message。对于请求问题(400、404、413),它通常会直接指出出错的字段或模型。
Claude API 各个错误码是什么意思?
| HTTP | error.type | 含义 | 怎么处理 | 是否重试 |
|---|---|---|---|---|
| 400 | invalid_request_error | 请求体或参数错误 | 修正消息里指出的字段 | 否 |
| 401 | authentication_error | 缺少密钥或密钥无效 | 检查密钥和请求头 | 否 |
| 402 | insufficient_quota | 密钥预算已用完(APIVAI) | 在控制台给该密钥追加预算 | 否 |
| 403 | permission_error | 账户已停用或无权访问该资源 | 联系客服 | 否 |
| 404 | not_found_error | 路径、Base URL 或模型 ID 错误 | 检查 /v1 和模型 ID | 否 |
| 413 | request_too_large | 请求体过大 | 减少发送的数据 | 否 |
| 429 | rate_limit_error | 每分钟请求过多,或密钥预算用完 | 退避等待;查看消息内容 | 是,需退避 |
| 500 | api_error | 服务器意外错误 | 退避重试 | 是 |
| 503 / 529 | overloaded_error | 暂时过载 | 退避重试 | 是 |
Anthropic 官方列表中还有 402 billing_error(Anthropic 账户的付款问题)、409 conflict_error 和 504 timeout_error。对于长时间生成,官方建议使用流式输出来避免超时。在 APIVAI 上,402 始终表示你正在使用的密钥预算已用完。
为什么会出现 401「invalid x-api-key」或「Invalid API key」?
401 authentication_error 表示请求已经到达 API,但密钥未被接受。完全没有传密钥时,APIVAI 返回「Missing API key.」;密钥不属于你的账户时,返回「Invalid API key.」。
按顺序检查:
- 请求头。 Anthropic 格式通常发送
x-api-key: <key>,OpenAI 格式发送Authorization: Bearer <key>。APIVAI 在两种格式下都接受这两种请求头,所以这里的 401 是密钥本身的问题,与用哪个请求头无关。 - 密钥文本。 从控制台重新复制一次;少复制一个字符、带上空格或引号都很常见。
- 实际发送的是另一个密钥。 旧的
ANTHROPIC_API_KEY或OPENAI_API_KEY环境变量可能会覆盖你在工具设置里填写的密钥。Claude Code 会读取哪些变量,见 Claude Code 配置指南。 - 密钥已删除或重新生成。 重新生成的密钥会替换旧密钥,所有用到它的工具都要更新。
如果是 403 permission_error 并提示「This account is disabled. Contact support.」,说明密钥有效但账户已停用;换密钥没有用,请联系客服。
如何解决 429 rate_limit_error 和 402 insufficient_quota?
在 APIVAI 上,每个密钥有两个限制:
- 请求频率。 默认每个密钥每分钟 60 次请求。大量并发调用的 Agent 可能会超过这个限制。降低并发、退避重试,或联系客服提高限额。
- 预算。 每个密钥都有自己的预算,在创建密钥或追加预算时从账户余额中划入。预算用完后,请求会返回 402
insufficient_quota(「This key has no budget left. Add budget to the key in the dashboard.」),或者返回消息里写明密钥预算已用完的 429。
预算类错误重试也不会消失。打开控制台,给这个密钥追加预算。如果账户余额也是空的,先充值($10 起)。账户余额有钱而某个密钥没有预算的情况是可能的:这个密钥的请求只看它自己的预算。当前每 token 价格见价格页面。
overloaded_error(529)是什么?应该怎么重试?
overloaded_error 表示服务暂时过载。它不是由你的请求引起的,同一个请求稍后通常就能成功。APIVAI 会以 529 返回它,或以类型同为 overloaded_error 的 503 返回。500 api_error 的处理方式相同。
正确做法是指数退避:先等约 1 秒,然后 2、4、8 秒,加上一点随机抖动(jitter),尝试几次后停止。如果响应带有 retry-after 头,至少等待这么久;只要有设置,APIVAI 就会把 retry-after 和 retry-after-ms 透传给你。
Anthropic 官方 SDK 已经内置了这一机制:默认对连接错误、429 和 5xx 响应重试两次,使用指数退避并遵守 retry-after。你只需调大 max_retries:
import anthropic
client = anthropic.Anthropic(
base_url="https://api.apivai.com",
api_key="YOUR_APIVAI_KEY",
max_retries=5, # default is 2
)
try:
msg = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
messages=[{"role": "user", "content": "Hello"}],
)
print("".join(b.text for b in msg.content if b.type == "text"))
except anthropic.APIStatusError as e:
print(e.status_code, e.response.headers.get("request-id"), e.message)不用 SDK 时,一个小循环就够了。它只重试临时性错误码,遇到与预算有关的 429 就停止:
import random, time, requests
RETRY = {429, 500, 503, 529}
def post_with_backoff(url, headers, body, attempts=5):
for i in range(attempts):
r = requests.post(url, headers=headers, json=body, timeout=600)
if r.status_code not in RETRY or "budget" in r.text:
return r
wait = float(r.headers.get("retry-after", 2 ** i))
time.sleep(wait + random.random())
return r为什么会出现 404 not_found_error?
几乎总是 Base URL 或模型 ID 的问题:
- Anthropic 格式: Base URL 填
https://api.apivai.com,不带/v1。Anthropic SDK 和 Claude Code 会自己加上/v1/messages,所以填https://api.apivai.com/v1会变成/v1/v1/messages而失败。 - OpenAI 格式: Base URL 填
https://api.apivai.com/v1,/v1只出现一次。少了它,请求会发到/chat/completions,APIVAI 返回「Unknown endpoint」。 - 主机名错误: 请求发到
apivai.com而不是api.apivai.com时,会收到 404,消息为「Wrong base URL」并列出两个正确地址。 - 模型 ID: 使用精确的 ID,例如
claude-sonnet-4-6,而不是显示名称。列出你的密钥可用的 ID:
curl https://api.apivai.com/v1/models \ -H "Authorization: Bearer YOUR_APIVAI_KEY"
Claude 模型两种格式都能用;GPT 模型(例如 gpt-5.5)只能用 OpenAI 格式。两种格式的详细说明见 Claude API 代理和 OpenAI 兼容 API。
为什么会出现 400 invalid_request_error?
400 表示 API 理解了请求,但拒绝了其中的内容。消息里会写明原因。常见情况:
- Anthropic 格式的请求缺少
max_tokens(这是必填参数)。 - 对话以 assistant 消息结尾(prefill)。Claude 4.6 及更新的模型会拒绝它,最后一条必须是 user 消息。
- 使用了旧的 thinking 设置:较新的模型,例如
claude-opus-5-5,会拒绝thinking: {"type": "enabled"},要求改用 adaptive thinking。删除thinking字段即可使用默认设置。 - 在工具调用循环中,thinking 块在回传前被修改或删掉。请按收到时的原样传回。
还有一个相关问题根本不报错:回复为空或被截断。 thinking 默认开启,其 token 计为输出 token,所以 max_tokens 太小可能在出现任何文本之前就被用完。此时响应以 stop_reason: "max_tokens" 结束(OpenAI 格式为 finish_reason: "length")。把 max_tokens 提高到 4096 或以上。
413 request_too_large 表示请求体本身太大。Anthropic 对 Messages API 的限制是 32 MB。常见原因是大的 base64 文件和过长的历史记录:少发或发更小的文件,或者裁掉早期的对话轮次。
流式响应中的错误是怎样出现的?
使用 "stream": true 时,流一开始 HTTP 状态就是 200,之后的失败无法再改变它,错误会作为流中的一个事件到达。Anthropic 流式文档给出的示例如下:
event: error
data: {"type": "error", "error": {"type": "overloaded_error", "message": "Overloaded"}}如果经过 APIVAI 的流在完成前中断,APIVAI 会发送一个 event: error,类型为 api_error,消息为「The response was interrupted. Please retry.」,而不是悄无声息地结束,因此 SDK 会抛出异常,而不是返回半截回答。按 500 处理即可:重试整个请求。
如何找到 request ID?
响应可能带有 request-id 头(有些服务用 x-request-id);只要存在,APIVAI 就会透传。用 curl 打印响应头:
curl -sS -D - https://api.apivai.com/v1/messages \
-H "x-api-key: YOUR_APIVAI_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model": "claude-sonnet-4-6", "max_tokens": 1024, "messages": [{"role": "user", "content": "Hi"}]}'在 Python SDK 中,成功的响应有 msg._request_id,异常对象有 e.response.headers。联系客服时请附上 ID、时间和错误消息。
最常见的原因一览
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 每个请求都是 404 | /v1 缺失、多余或重复 | Anthropic:https://api.apivai.com;OpenAI:https://api.apivai.com/v1 |
| 密钥看起来没错却 401 | 旧的环境变量发送了另一个密钥 | 删除它或换成 APIVAI 密钥 |
| 404 或 400 提到模型名 | 拼写错误或用了显示名称 | 从 GET /v1/models 复制 ID |
| 回复为空或被截断 | 开启 thinking 时 max_tokens 太小 | 4096 或以上 |
| 413 | 请求体中有大文件 | 减少发送的数据 |
| Agent 运行时出现 429 | 每分钟超过 60 次请求 | 降低并发,退避重试 |
| 402,或提到预算的 429 | 密钥预算用完 | 给密钥追加预算 |
| 529 / 503 | 暂时过载 | 退避重试 |
各工具的具体配置见文档,以及 Cline 配置 Claude 和 GPT 等教程。
常见问题
400 或 401 错误需要重试吗?
不需要。除 429 以外的 4xx 错误说明请求或密钥有问题,同样的请求会以同样的方式失败。先解决原因。
429 和 529 有什么区别?
429 与你自己的限制有关:每分钟请求数,在 APIVAI 上还包括密钥预算。529 overloaded_error 是与你的用量无关的暂时过载;频率导致的 429 和 529 都应退避重试。
Anthropic SDK 会自动重试吗?
会。默认对连接错误、429 和 5xx 响应重试两次,使用指数退避并遵守 retry-after。在客户端上设置 max_retries 即可修改,设为 0 则关闭重试。
为什么回复是空的却没有报错?
thinking 在输出可见文本之前就用完了全部 max_tokens。把 max_tokens 提高到 4096 或以上;thinking token 按输出 token 计费。
账户里有余额,为什么还会收到 402?
账户余额和密钥预算是分开的。每个密钥只消耗自己的预算;在控制台给这个密钥追加预算即可。
注册账户,充值 $10 起,创建一个密钥即可通过同一个 API 调用 Claude 和 GPT。