Kimi API 的报错先看三样东西:HTTP 状态码、error.type 和 request_id。同样是 429,可能是服务端过载、组织限流,也可能是余额不足;同样是 401,可能是 Key 写错,也可能是中国站和国际站混用。先分类,再改代码。
本文按 401、404、429、超时四类拆开,给出原因、排查步骤和可复用的退避代码。模型与价格以站内模型价格为准。
说明:Moonshot、Kimi 是其权利人的商标。错误类型、限流规则和接口行为可能调整,本文以 2026 年 10 月的常见情况为例,最终以官方文档为准。
一、状态码速查
| 状态码 | 错误类型 | 常见含义 | 处理方向 |
|---|---|---|---|
| 400 | invalid_request_error |
参数错误、上下文超长、输出上限越界 | 改请求 |
| 400 | content_filter |
输入或输出触发内容安全 | 调整提示词 |
| 401 | invalid_authentication_error |
Key 无效、区域不匹配 | 修凭证 |
| 401 | incorrect_api_key_error |
Key 缺失或错误 | 修凭证 |
| 403 | permission_denied_error |
接口未开放、IP 白名单、余额或权限问题 | 查权限与余额 |
| 404 | resource_not_found_error |
模型名或路径错误 | 查模型列表 |
| 429 | engine_overloaded_error |
服务端过载 | 退避重试 |
| 429 | rate_limit_reached_error |
并发、RPM、TPM 或 TPD 超限 | 降速或提额 |
| 429 | exceeded_current_quota_error |
欠费、余额不足、代金券失效 | 充值 |
| 499 | client_closed_request |
客户端或代理提前断开 | 查超时与流式 |
| 500 | server_error |
服务端内部错误 | 退避重试 |
| 503 | server_unavailable |
服务暂不可用 | 退避重试 |
| 504 | Gateway Time-out |
长请求等待过久 | 改流式 |
余额不足在不同入口可能表现为 403 或 429,不能只按状态码判断,要以 error.type 为准。日志里至少记录时间、状态码、错误类型、模型名和 request_id,不要记录完整 Key 和敏感内容。
二、401:先查区域,再查 Key
- 中国站的 Key 是否配了国际站地址,或反过来。两站账号、余额、Key 完全独立。
- 是否混用了不同产品线的 Key,例如开放平台、Kimi Code 和会员。
- Key 前后是否有空格、换行或多余引号。
- 环境变量是否真的加载,可以只打印前缀确认。
- Key 是否被删除、轮换或没有当前项目的权限。
- 请求头是否为
Authorization: Bearer <key>,路径是否为/v1/chat/completions。
export MOONSHOT_API_KEY="你的密钥"
curl "https://api.moonshot.cn/v1/chat/completions" \
-H "Authorization: Bearer $MOONSHOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kimi-k2.6",
"max_completion_tokens": 64,
"messages": [{"role": "user", "content": "只回复 OK"}]
}'
这条命令返回 200,说明 Key、区域、模型名三项都通。如果仍报 401,换一个已知可用的 Key 再测,区分是 Key 本身还是网关配置的问题。
三、404:模型名和 base_url 最常错
404 不一定是模型下线,常见原因有四类:
- 使用 OpenAI SDK 时没有设置
base_url,请求发到了默认的 OpenAI 地址,返回模型不存在。 - 模型名拼写错误,或用了账号当前无权访问的型号。
- 路径多了或少了
/v1,或把聊天接口写成了其他路径。 - 中国站和国际站的模型名与权限不同。
先用同一个 Key 拉模型列表,确认账号能看到什么:
curl "https://api.moonshot.cn/v1/models" \
-H "Authorization: Bearer $MOONSHOT_API_KEY"
列表里没有的型号,不要靠猜。模型是否可用,以账号实际返回和站内模型价格为准。如果模型列表能返回,但聊天接口仍然 404,检查路径是否少了 /v1,以及客户端是否把 base_url 和完整路径拼重了。
四、429:三种类型,处理方式不同
error.type |
含义 | 能否重试 | 处理 |
|---|---|---|---|
engine_overloaded_error |
服务端过载 | 可以 | 按 Retry-After 退避,降低并发 |
rate_limit_reached_error |
组织级并发、RPM、TPM、TPD 超限 | 部分可以 | 降速、拆 Key、提升等级 |
exceeded_current_quota_error |
欠费、余额不足、券失效 | 不要重试 | 充值或检查账单 |
TPD 超限通常只能等到次日或提升额度,继续重试没有意义。被 429 中断的请求通常不计费,但重试成功后会正常计费;不要因为怕花钱就无限重试,也不要看到 429 就以为账户已经被扣款。OpenAI SDK 默认会自动重试,可能把一次 429 放大成多次请求,生产环境要显式设置 max_retries,并用自己的退避逻辑。
import random
import time
from openai import OpenAI, RateLimitError
client = OpenAI(
api_key="你的密钥",
base_url="https://api.moonshot.cn/v1",
max_retries=0,
)
def ask(prompt: str, retries: int = 4) -> str:
for attempt in range(retries):
try:
resp = client.chat.completions.create(
model="kimi-k2.6",
messages=[{"role": "user", "content": prompt}],
max_completion_tokens=1024,
)
return resp.choices[0].message.content
except RateLimitError as exc:
body = exc.body or {}
etype = (body.get("error") or {}).get("type", "")
if etype == "exceeded_current_quota_error":
raise RuntimeError("余额或额度不足,先充值")
wait = min(2 ** attempt, 20) + random.random()
print(etype, "等待", round(wait, 1), "秒")
time.sleep(wait)
raise RuntimeError("重试次数已用完")
重试只适合瞬时错误。已经产生副作用的业务,先用幂等键或状态检查确认是否执行过,再决定要不要重发。
五、超时与 504
长文生成、长文档分析和代码 Agent 最容易遇到超时。处理顺序是:
- 把非流式改成
stream=True,让连接持续有数据返回。 - 设置合理的连接超时和读取超时,不要沿用 SDK 默认值。
- 检查公司代理、网关和本地路由工具是否提前断开连接,这类情况可能表现为 499。
- 用
max_completion_tokens控制单次输出长度,超长任务分段处理。 - 记录每次超时的请求 ID 和耗时,区分模型慢、网络慢还是网关慢。
stream = client.chat.completions.create(
model="kimi-k2.6",
messages=[{"role": "user", "content": "写一份部署检查清单"}],
max_completion_tokens=2048,
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
流式不会降低单价,但能显著减少“等到超时再重试”的浪费。连接超时可以设短一些,读取超时要按最长生成时间设置;流式场景不要沿用非流式的读取超时,否则连接会在正常生成时被客户端自己切断。
六、一张排查顺序表
- 记录状态码、
error.type、request_id、模型名和发生时间。 - 401、403 查区域、Key、产品线、权限和余额。
- 404 查
base_url、模型名和账号权限,用模型列表验证。 - 400 查上下文长度、输出上限、文件格式和内容安全。
- 429 按
error.type分成过载、限流、欠费三类处理。 - 499、504 查流式、超时、代理和连接保持。
- 500、503 退避重试,持续出现再附
request_id找服务方。 - 每次故障后补监控和告警,不要等用户反馈才发现。
常见问题
429 和 503 有什么区别?
429 既可能是服务端过载,也可能是账号配额或余额问题,要先看 error.type;503 表示服务暂时不可用,通常退避后重试。两者的共同点是都不要固定间隔猛重试。
充值后还是 401 怎么办?
先确认充值和 Key 属于同一个区域、同一个产品线。换一个新建的 Key 测试,排除旧 Key 被删除或环境变量缓存的问题。
上下文超长会报什么错?
通常是 400 invalid_request_error,错误消息里提到输入 Token 过长。缩短输入、裁剪历史,或换用上下文更大的型号。
SDK 自动重试应该开吗?
可以开,但要设上限。默认重试可能放大 429,生产环境建议关闭 SDK 自动重试,自己按错误类型做指数退避和告警。
网关报错和官方报错怎么区分?
用同一条请求分别打直连和网关,比较状态码、error.type 和 request_id。能快速判断是上游、网络、Key 还是网关配置。
下一步
先在中商起航 AI 网关创建测试 Key,把 401、404、429 和超时各演练一次,再接入生产监控。模型可用性与价格以模型价格为准。
相关阅读:
