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 表示身份没有通过验证,和余额、模型能力无关。按下面顺序排查:

  1. 鉴权头是否写成 Authorization: Bearer <Key>。Grok 的 OpenAI 兼容入口不是 x-api-key。
  2. Key 前后是否有空格、换行或多余引号。从聊天窗口复制最常见这个问题。
  3. Key 与 Base URL 是否来自同一家。官方 Key 配网关地址,或网关 Key 配官方地址,都会失败。
  4. Key 是否被吊销、过期,或所属项目没有调用权限。
  5. 环境变量是否真的加载。只打印 Key 的前几位确认,不要把完整值写进日志。
  6. 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 或代理问题;读取超时可能是模型生成时间长、流式响应中断,或代理的空闲超时太短。

排查顺序:

  1. 用 curl 记录 time_namelookup、time_connect、time_appconnect、time_starttransfer,看时间花在哪一段。
  2. 确认代理是否设置了过短的连接或空闲超时。
  3. 长输出改用流式返回,边生成边读取,避免等待完整响应。
  4. 客户端设置独立的连接超时与读取超时,不要用一个很大的总超时兜底。
  5. 超时后的重试要判断请求是否已执行,避免重复扣费或重复写入。
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 和连接很快、首字节很慢,问题多半在生成或上游;如果连接阶段就超时,先查出口和代理,不要改业务代码。

六、一张排查顺序表

  1. 记录状态码、错误类型、请求 ID、模型名和发生时间。
  2. 401、403 查凭证、账号状态和权限;404 查路径和模型名。
  3. 400 查参数、上下文长度、图片格式和请求体大小。
  4. 429 查配额、并发、共享 Key 和重试风暴。
  5. 超时先分层看 DNS、连接、TLS、首字节和总耗时。
  6. 5xx 先退避重试,持续出现再找服务方并附请求 ID。
  7. 每次故障后补监控和告警,不要靠用户反馈才发现。

常见问题

429 和余额不足有什么区别?

429 是请求超过了速率或配额限制,充值不一定能解决;余额不足通常返回额度或计费相关错误。先看错误类型和账单,再决定是等、降并发还是充值。

为什么加了重试,429 反而更多?

可能没有退避、并发太高,或多个服务共用一把 Key。固定间隔猛重试会把小限流放大成重试风暴,应该使用指数退避加随机抖动,并设置最大重试次数。

模型明明存在,为什么还报 404?

先检查 Base URL 是否重复拼接 /v1,再确认端点是否为 /chat/completions。如果路径没问题,可能是账号或分组没有开通该模型,或模型名大小写、版本后缀不一致。

超时后可以直接重发吗?

要先判断请求是否已经执行。只读查询通常可以重试;有写入、扣费或外部副作用的操作,应使用幂等键或先查询状态,避免重复执行。

怎么区分网关报错和上游报错?

先看错误类型和请求 ID,再用同一条请求分别打网关入口和官方入口。能快速区分是 Key、网络、网关配置还是上游服务的问题。

下一步

先在中商起航 AI 网关创建测试 Key,把 401、404、429 和超时各演练一次,再接入生产监控。模型可用性与价格以模型价格为准。

相关阅读: