Skip to main content
Kimi 大模型收到问题后会先进行推理,再逐个 Token 生成回答;流式输出(Streaming)让模型每生成一定数量的 Tokens(通常是 1 个 Token)就立即发送给客户端,而不是等全部生成完毕再一次性返回。等待完整回复通常要数秒,问题复杂、回复较长时可能拉长到 10 秒甚至 20 秒;开启流式输出后,用户能第一时间看到第一个 Token,显著减少等待时间。当你与 Kimi 智能助手 对话时,回复逐字“跳”出来,就是流式输出的效果。

开启流式输出

在请求中设置 stream=True 即可开启流式输出。此时 SDK 返回一个可迭代对象,用循环逐个读取数据块(chunk):每个 chunk 的结构与 completion 相似,但 message 字段被替换为 delta 字段。
本页示例默认使用最新模型 kimi-k3。K3 使用请求顶层 reasoning_effort 配置推理强度(支持 "low" / "high" / "max",默认 "max")。换用 kimi-k2.6kimi-k2.5 等其他模型时,只需替换 model 字段,但各模型的参数配置存在差异,详见模型参数参考

解析 SSE 响应体

开启流式输出后,接口不再返回 JSON 格式的响应(Content-Type: application/json),而是返回 Content-Type: text/event-stream(SSE),服务端得以源源不断地向客户端传输 Tokens。SSE 的响应体如下所示:
响应体中的每个数据块均以 data: 为前缀,紧跟一个合法的 JSON 对象,并以两个换行符 \n\n 结束。所有数据块传输完成后,服务端发送 data: [DONE] 标识传输结束,此时可断开网络连接。 注意:请始终使用 data: [DONE] 判断数据是否传输完成,而不是使用 finish_reason 或其他方式。如果未收到 data: [DONE],即使已经获取了 finish_reason=stop,也不应视作传输完成;换句话说,在收到 data: [DONE] 之前,都应视作 消息是不完整的 流式输出过程中会有 content 字段会逐块下发;roleusage 不会在每个数据块中重复出现——role 仅出现在第一个数据块,usage 仅出现在最后一个数据块。

统计 Tokens 用量

计算 Tokens 有两种方式。最直接、最准确的一种,是等所有数据块传输完毕后,读取最后一个数据块中的 usage 字段,查看本次请求产生的 prompt_tokens/completion_tokens/total_tokens
注意 usage 嵌套在最后一个数据块的 choices[0] 内(即 choices[0].usage),而非数据块顶层。使用 OpenAI SDK 时 chunk.usageNone,请读取 chunk.choices[0].usage,或自行解析原始 SSE 数据块。
但流式输出可能因网络连接中断、客户端程序错误等不可控因素被打断,此时最后一个数据块尚未到达,也就无从得知本次请求消耗的 Tokens。为避免统计失败,建议保存已收到的每个数据块的内容,并在请求结束后(无论是否成功结束)调用 Tokens 计算接口统计实际消耗量:

终止流式输出

需要提前终止输出时,直接关闭 HTTP 网络连接或丢弃后续数据块即可,例如在循环中 break

不用 SDK 直接处理 SSE

在没有 SDK 的语言环境,或 SDK 无法满足你的业务逻辑时,可以直接对接 HTTP 接口来处理流式输出。以下示例演示如何逐行读取并解析 SSE 响应体,详细说明见代码注释:
无论使用哪种语言,处理流式输出的基本步骤相同:
  1. 发起 HTTP 请求,并在请求体中将 stream 参数设置为 true
  2. 检查响应 Headers 中的 Content-Type,为 text/event-stream 即表示当前响应是流式输出;
  3. 逐行读取响应内容并解析数据块(JSON 格式),通过 data: 前缀和换行符 \n 判断数据块的起止位置;
  4. 数据块内容为 [DONE] 时表示传输完成。

多个回复(n 参数)

当前模型(kimi-k3kimi-k2.7-codekimi-k2.6)的 n 固定为 1,暂不支持一次请求返回多个回复;传入大于 1 的 n 会返回 400 错误(invalid n: only 1 is allowed for this model),流式与非流式请求均如此。各模型的参数约束详见模型参数参考