From 465da6f818d9765a2809c637fe62171582e51906 Mon Sep 17 00:00:00 2001 From: fawney19 Date: Mon, 5 Jan 2026 12:50:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20OpenAI=20=E6=B5=81=E5=BC=8F=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E8=A7=A3=E6=9E=90=E5=99=A8=E6=94=AF=E6=8C=81=E6=8F=90?= =?UTF-8?q?=E5=8F=96=20usage=20=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 部分 OpenAI 兼容 API(如豆包)会在最后一个 chunk 中发送 usage 信息, 现在可以正确提取 prompt_tokens 和 completion_tokens。 --- src/api/handlers/base/parsers.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/api/handlers/base/parsers.py b/src/api/handlers/base/parsers.py index 42fc3ee..f263df7 100644 --- a/src/api/handlers/base/parsers.py +++ b/src/api/handlers/base/parsers.py @@ -98,6 +98,17 @@ class OpenAIResponseParser(ResponseParser): chunk.is_done = True stats.has_completion = True + # 提取 usage 信息(某些 OpenAI 兼容 API 如豆包会在最后一个 chunk 中发送 usage) + # 这个 chunk 通常 choices 为空数组,但包含完整的 usage 信息 + usage = parsed.get("usage") + if usage and isinstance(usage, dict): + chunk.input_tokens = usage.get("prompt_tokens", 0) + chunk.output_tokens = usage.get("completion_tokens", 0) + + # 更新 stats + stats.input_tokens = chunk.input_tokens + stats.output_tokens = chunk.output_tokens + stats.chunk_count += 1 stats.data_count += 1