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

  1. 中国站的 Key 是否配了国际站地址,或反过来。两站账号、余额、Key 完全独立。
  2. 是否混用了不同产品线的 Key,例如开放平台、Kimi Code 和会员。
  3. Key 前后是否有空格、换行或多余引号。
  4. 环境变量是否真的加载,可以只打印前缀确认。
  5. Key 是否被删除、轮换或没有当前项目的权限。
  6. 请求头是否为 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 最容易遇到超时。处理顺序是:

  1. 把非流式改成 stream=True,让连接持续有数据返回。
  2. 设置合理的连接超时和读取超时,不要沿用 SDK 默认值。
  3. 检查公司代理、网关和本地路由工具是否提前断开连接,这类情况可能表现为 499。
  4. 用 max_completion_tokens 控制单次输出长度,超长任务分段处理。
  5. 记录每次超时的请求 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="")

流式不会降低单价,但能显著减少“等到超时再重试”的浪费。连接超时可以设短一些,读取超时要按最长生成时间设置;流式场景不要沿用非流式的读取超时,否则连接会在正常生成时被客户端自己切断。

六、一张排查顺序表

  1. 记录状态码、error.type、request_id、模型名和发生时间。
  2. 401、403 查区域、Key、产品线、权限和余额。
  3. 404 查 base_url、模型名和账号权限,用模型列表验证。
  4. 400 查上下文长度、输出上限、文件格式和内容安全。
  5. 429 按 error.type 分成过载、限流、欠费三类处理。
  6. 499、504 查流式、超时、代理和连接保持。
  7. 500、503 退避重试,持续出现再附 request_id 找服务方。
  8. 每次故障后补监控和告警,不要等用户反馈才发现。

常见问题

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 和超时各演练一次,再接入生产监控。模型可用性与价格以模型价格为准。

相关阅读: