Grok API 的报错大致分四类:凭证与权限、路径与模型名、限流与配额、网络与超时。处理顺序应该是先看 HTTP 状态码和错误类型,再看请求 ID,最后才改提示词或模型参数。顺序反了,很容易把配置问题当成模型问题。
本文按 401、404、429、超时四类拆开,给出原因、排查步骤和可复用的退避代码。模型与价格以站内模型价格为准。
说明:xAI、Grok 是其权利人的商标,本文仅作技术介绍。错误类型和接口行为可能随版本调整,本文以 2026 年 10 月的常见情况为例,最终以 xAI 官方文档为准。
一、先看状态码,不要先改提示词
| 状态码 | 常见含义 | 是否重试 |
|---|---|---|
| 400 | 参数、格式或上下文长度有问题 | 修改请求后再试 |
| 401 | Key 缺失、错误、失效或与地址不匹配 | 不重试,先修凭证 |
| 403 | 账号或 Key 没有权限,或受地区与条款限制 | 不重试,查权限与账号状态 |
| 404 | 路径错误、模型名不存在 | 不重试,查地址和模型名 |
| 429 | 请求频率、并发或 Token 超限 | 退避后重试 |
| 500 | 上游服务内部错误 | 退避后重试 |
| 502 或 503 | 网关或上游暂时不可用 | 退避后重试 |
| 504 | 网关等待上游超时 | 降低负载并重试 |
响应里的请求 ID 要保留。找服务方排查时,一个请求 ID 比十张截图有用。日志至少记录时间、状态码、错误类型、模型名和请求 ID,不要记录完整 Key 和敏感内容。
二、401:先查请求头,再查 Key
401 表示身份没有通过验证,和余额、模型能力无关。按下面顺序排查:
- 鉴权头是否写成
Authorization: Bearer <Key>。Grok 的 OpenAI 兼容入口不是x-api-key。 - Key 前后是否有空格、换行或多余引号。从聊天窗口复制最常见这个问题。
- Key 与 Base URL 是否来自同一家。官方 Key 配网关地址,或网关 Key 配官方地址,都会失败。
- Key 是否被吊销、过期,或所属项目没有调用权限。
- 环境变量是否真的加载。只打印 Key 的前几位确认,不要把完整值写进日志。
- Base URL 是否指向正确环境,路径是否为
/v1/chat/completions。
export GROK_API_KEY="sk-你的密钥"
curl "https://ai.zhongshangqihang.com/v1/chat/completions" \
-H "Authorization: Bearer $GROK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "grok-4",
"messages": [{"role": "user", "content": "只回复 OK"}],
"max_tokens": 16
}'
返回 200 说明 Key、地址和模型名三项都通。如果仍报 401,把同一把 Key 换到另一个入口测试,可以区分是 Key 本身的问题,还是网关配置或网络层的问题。
三、404:路径和模型名各查一遍
404 通常不是 Key 的问题,而是“你请求的东西不存在”。常见原因有四类:
- Base URL 已经包含
/v1,代码里又拼了一次,变成/v1/v1/chat/completions。 - 端点写成了
/completions或/responses,但当前入口只提供 Chat Completions。 - 模型名拼错,或账号、分组没有开通该模型。
- Base URL 末尾多了斜杠,拼接后出现双斜杠或错误路径。
排查顺序:先用 curl 请求官方文档给出的标准路径,再用控制台或模型价格复制模型名。不要凭记忆写模型名,也不要把其他平台的模型名直接搬过来。
四、429:限流不是余额不足
429 表示请求超过了速率或配额限制。常见触发场景:
- 每分钟请求数或 Token 数超限。
- 并发突增,短时间打满配额。
- 多个服务共用一把 Key,互相挤占额度。
- 重试没有退避,越失败越发,形成重试风暴。
- 长输出占用较多输出 Token,留给并发的空间变小。
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 高峰期集中 429 | 流量脉冲 | 排队削峰,平滑发送 |
| 单 Key 多服务 429 | 配额被共享 | 按项目拆 Key |
| 重试后更严重 | 无退避重试 | 指数退避加随机抖动 |
| 长请求先 429 | 输出 Token 占用高 | 降低 max_tokens 或并发 |
先看响应里的 retry-after(如果有),再决定等多久。用 SDK 的错误类型判断,不要用字符串匹配错误消息:
import random
import time
from openai import OpenAI, APIStatusError, RateLimitError
client = OpenAI(
api_key="sk-你的密钥",
base_url="https://ai.zhongshangqihang.com/v1",
)
def ask(prompt: str, retries: int = 4) -> str:
for attempt in range(retries):
try:
resp = client.chat.completions.create(
model="grok-4",
messages=[{"role": "user", "content": prompt}],
max_tokens=1024,
)
return resp.choices[0].message.content
except RateLimitError:
wait = min(2 ** attempt, 20) + random.random()
print(f"429,第 {attempt + 1} 次重试,等待 {wait:.1f}s")
time.sleep(wait)
except APIStatusError as exc:
if exc.status_code >= 500:
wait = min(2 ** attempt, 20) + random.random()
print(f"{exc.status_code},{wait:.1f}s 后重试")
time.sleep(wait)
continue
raise
raise RuntimeError("重试次数已用完")
重试只适合瞬时错误。已经产生副作用的业务,先用幂等键或状态检查确认是否执行过,再决定要不要重发。
五、超时和连接错误
超时要区分连接超时和读取超时。连接超时通常是网络、DNS 或代理问题;读取超时可能是模型生成时间长、流式响应中断,或代理的空闲超时太短。
排查顺序:
- 用 curl 记录
time_namelookup、time_connect、time_appconnect、time_starttransfer,看时间花在哪一段。 - 确认代理是否设置了过短的连接或空闲超时。
- 长输出改用流式返回,边生成边读取,避免等待完整响应。
- 客户端设置独立的连接超时与读取超时,不要用一个很大的总超时兜底。
- 超时后的重试要判断请求是否已执行,避免重复扣费或重复写入。
export GROK_API_KEY="sk-你的密钥"
curl -o /dev/null -s \
-w "code=%{http_code} dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n" \
--max-time 120 \
"https://ai.zhongshangqihang.com/v1/chat/completions" \
-H "Authorization: Bearer $GROK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"grok-4","messages":[{"role":"user","content":"只回复 OK"}],"max_tokens":8}'
如果 DNS 和连接很快、首字节很慢,问题多半在生成或上游;如果连接阶段就超时,先查出口和代理,不要改业务代码。
六、一张排查顺序表
- 记录状态码、错误类型、请求 ID、模型名和发生时间。
- 401、403 查凭证、账号状态和权限;404 查路径和模型名。
- 400 查参数、上下文长度、图片格式和请求体大小。
- 429 查配额、并发、共享 Key 和重试风暴。
- 超时先分层看 DNS、连接、TLS、首字节和总耗时。
- 5xx 先退避重试,持续出现再找服务方并附请求 ID。
- 每次故障后补监控和告警,不要靠用户反馈才发现。
常见问题
429 和余额不足有什么区别?
429 是请求超过了速率或配额限制,充值不一定能解决;余额不足通常返回额度或计费相关错误。先看错误类型和账单,再决定是等、降并发还是充值。
为什么加了重试,429 反而更多?
可能没有退避、并发太高,或多个服务共用一把 Key。固定间隔猛重试会把小限流放大成重试风暴,应该使用指数退避加随机抖动,并设置最大重试次数。
模型明明存在,为什么还报 404?
先检查 Base URL 是否重复拼接 /v1,再确认端点是否为 /chat/completions。如果路径没问题,可能是账号或分组没有开通该模型,或模型名大小写、版本后缀不一致。
超时后可以直接重发吗?
要先判断请求是否已经执行。只读查询通常可以重试;有写入、扣费或外部副作用的操作,应使用幂等键或先查询状态,避免重复执行。
怎么区分网关报错和上游报错?
先看错误类型和请求 ID,再用同一条请求分别打网关入口和官方入口。能快速区分是 Key、网络、网关配置还是上游服务的问题。
下一步
先在中商起航 AI 网关创建测试 Key,把 401、404、429 和超时各演练一次,再接入生产监控。模型可用性与价格以模型价格为准。
相关阅读:
