Для SSE передайте stream: true. Kimi кладёт usage внутрь завершающего элемента choices[0] рядом с finish_reason, даже если stream_options.include_usage не запрошен.
json
{
"model": "k3",
"messages": [{"role": "user", "content": "Привет!"}],
"max_tokens": 128,
"stream": true,
"stream_options": {"include_usage": true}
}- Завершающий choice-кадр содержит
finish_reasonиchoices[0].usage. Он приходит всегда. - Только при
include_usage: trueпосле него приходит отдельный верхнеуровневый кадр сchoices: []иusage. - Это одна и та же статистика. Клиент не должен складывать её дважды.
Почему usage нельзя сложить дважды
Kimi через GUARD API
stream: trueЧасти ответа
delta.contentЗавершающий choiceПриходит всегда
finish_reason: "stop"choices[0].usageДополнительный кадрinclude_usage: true
choices: []usageОдна и та же статистикаУчитывать один раз
12 + 8 = 20Конец потока
data: [DONE]text
data: {"choices":[{"finish_reason":"stop","usage":{"prompt_tokens":12,"completion_tokens":8,"total_tokens":20}}]}
data: {"choices":[],"usage":{"prompt_tokens":12,"completion_tokens":8,"total_tokens":20}}
data: [DONE]