Skip to content

fix: 支持多种 SSE 流式格式的 Token 估算 (message_delta, content_block_start, OpenAI)#85

Merged
bigmanBass666 merged 3 commits into
mainfrom
worktree-fix-streaming-output-tokens
Jul 18, 2026
Merged

fix: 支持多种 SSE 流式格式的 Token 估算 (message_delta, content_block_start, OpenAI)#85
bigmanBass666 merged 3 commits into
mainfrom
worktree-fix-streaming-output-tokens

Conversation

@bigmanBass666

Copy link
Copy Markdown
Contributor

问题

streamSSEAndEstimateTokens 函数只处理 content_block_delta 一种 SSE 事件来累积文本,导致:

  • 如果 API 使用其他 SSE 格式(如 content_block_start 带初始文本、OpenAI 流式格式),输出 tokens 总是 0
  • 不解析 message_delta 事件中的 usage.output_tokens(API 返回的真实 token 计数)
  • 导致大量流式请求的 output_tokens 显示为 0

修复

重构 streamSSEAndEstimateTokens 函数,支持三种 SSE 格式:

  1. Anthropic 格式(增强):

    • content_block_delta 累积 delta.text(原有逻辑)
    • content_block_start 累积 content_block.text(新增)
    • message_delta 提取 usage.output_tokens(新增,API 真实计数优先)
  2. OpenAI 流式格式(新增):

    • 解析 choices[].delta.content 累积文本
  3. 优先级:

    • message_delta.usage.output_tokens(API 真实值)> tiktoken 估算

测试

新增 5 个测试用例覆盖所有新格式,全部通过:

  • TestStreamSSE_MessageDeltaOutputTokens
  • TestStreamSSE_MessageDeltaNoUsage
  • TestStreamSSE_ContentBlockStartText
  • TestStreamSSE_OpenAIFormat
  • TestStreamSSE_MessageDeltaTakesPrecedence

原有 7 个测试不变,全部通过。

@bigmanBass666
bigmanBass666 marked this pull request as ready for review July 18, 2026 16:21
@bigmanBass666
bigmanBass666 enabled auto-merge (squash) July 18, 2026 16:23
@bigmanBass666
bigmanBass666 merged commit e2d921e into main Jul 18, 2026
4 checks passed
@bigmanBass666
bigmanBass666 deleted the worktree-fix-streaming-output-tokens branch July 18, 2026 16:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant