kimik3.io/错误速查

Kimi K3 错误与失败模式

下面每一个响应体,都是 2026-07-16 我们故意把调用写错之后从线上原样抓回来的。没有一条是照着文档重新拼出来的。

真正会坑到你的那一个,并不在常规错误的行列里:当 max_completion_tokens 低到不够推理跑完时,K3 会返回 HTTP 200 加一个空的 content——并且照全额扣费。它是静默的,看上去像成功,也是第一次接入最容易翻车的地方。完整分析 →

实测环境为 api.moonshot.ai,模型 kimi-k3——测量方法

错误长什么样

错误以单个 error 对象返回,带 messagetypecode 三个字段:

{
  "error": {
    "message": "API key is missing or invalid",
    "type": "invalid_authentication_error",
    "code": null
  }
}

不要用 code 做分支判断。它可以为 null,而且在我们对月之暗面(Moonshot AI)官方直连触发的每一个错误里,它干脆整个缺失。每次都有值的字段是 type——按它来匹配。

走网关时,下面的鉴权错误和「模型不存在」响应体不会逐字节一致。错误的 key 会被网关自己的鉴权层直接拒掉,根本到不了月之暗面,所以你拿到的是网关的措辞,不是月之暗面的。但症状、成因和修法两边都成立。本页的行为层结论——空 content 陷阱、不做校验的参数——是模型本身的属性,在任何承载 K3 的地方都适用

{
  "error": {
    "message": "Invalid Authentication",
    "type": "invalid_authentication_error"
  }
}

错误一览,按症状分

2026-07-16 对 kimi-k3 逐条复现。
症状你实际拿到的成因与修法
content 为空,
照样扣费

最高发
HTTP 200
finish_reason: "length"
content: ""
reasoning_content 有内容
推理吃光了整个 token 预算。调高 max_completion_tokens,或保持 131,072 的默认值。六组实测 →
401
鉴权失败
{"error": {
  "message": "Invalid Authentication",
  "type": "invalid_authentication_error"
}}
key 缺失、敲错、被吊销,或者 Bearer 前缀被弄丢了。先确认你的 shell 真的导出了那个环境变量。没有 code 字段可供匹配。
404
模型不存在
{"error": {
  "message": "Not found the model kimi-k3-chat
              or Permission denied",
  "type": "resource_not_found_error"
}}
模型 ID 就是 kimi-k3,一字不差。注意这条 message 把「名字写错」和「没有权限」混为一谈——如果拼写没问题,那就是权限或上架问题,不是手误。确认你的网关承载了 K3。
400
messages 为空
{"error": {
  "message": "Invalid request: messages
              must not be empty",
  "type": "invalid_request_error"
}}
你的消息数组在上游被过滤成了空的——通常是裁剪对话历史的 bug。发送前先做校验。
429
被限流
{"error": {
  "message": "Rate limit exceeded",
  "type": "...",
  "code": null
}}
引自 EvoLink 文档给出的 schema——这一条我们没有实际触发。
你所在档位的每分钟请求数或 token 数超了。指数退避——1s、2s、4s,再加抖动。把自己的并发请求串行化:重试风暴在服务端看来只是更大的负载。
超时 /
请求挂起
几十秒没有任何响应 长上下文下属于正常现象:我们实测 498k token 的提示词要 52 秒。客户端超时按分钟设,不要按秒,并使用 stream: true
流式输出
没有 usage
流式跑完了,没有 usage 块 stream_options: {"include_usage": true}。不传的话你对这次花了多少钱一无所知——包括推理 token。
余额
不足
取决于服务商 去后台看余额。长上下文烧钱很快:一次 498k token 的调用,光输入就是 $1.49。

不报错的失败

这一类才值得刻进脑子里。K3 不校验你的参数——我们发现两种明显不合法的请求,都返回了干干净净的 HTTP 200:

两条都返回 HTTP 200 和一段正常的补全。2026-07-16。
我们发了什么为什么本该报错实际结果
reasoning_effort: "low" 文档写明只支持 max HTTP 200——静默接受,零警告
max_completion_tokens: 2000000 几乎是 1,048,576 上下文窗口的两倍 HTTP 200——静默接受,零警告

教训不止于这两条:K3 返回 200,不代表它按你的意图理解了请求。如果你指望某个参数改变行为,就去验证行为真的变了——不要因为没报错就默认生效。再叠上空 content 陷阱,规则就一句话:断言响应内容,别断言状态码

上线前自检清单

  1. 响应里的 model 回显为 kimi-k3——没有被网关静默换掉。
  2. finish_reason == "stop",而不是 "length"
  3. content 非空。
  4. usage.total_tokens 非零,并且把 reasoning_tokens 记进日志。
  5. 会碰长上下文的话,客户端超时按分钟设。
  6. 所有你依赖的参数,都用观察到的行为验证过,而不是靠一个 200。

值得写进代码的那条断言,在 API 指南里。

亲手复现这一切

本页每个案例,一条 curl 加一把 key,几秒就能复现。EvoLink 在 OpenAI 兼容接口上承载 kimi-k3——注册即送 10 个免费额度。

获取 EvoLink API key