Skip to content

fix: 流式 usage 帧取最大值而非累加,避免输入侧计数被放大 (#105) - #107

Open
ghshhf wants to merge 2 commits into
LAGcomcom:masterfrom
ghshhf:fix/usage-absorb
Open

ghshhf wants to merge 2 commits into
LAGcomcom:masterfrom
ghshhf:fix/usage-absorb

Conversation

@ghshhf

@ghshhf ghshhf commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

问题

有些上游会在每个 chunk 重复上报累计 usage(prompt_tokens 不变、completion_tokens 递增),而 readSSE 与 internal/relay 两处都把每一帧 Merge(逐字段相加)。

后果:一次几百帧的流式回答,输入侧 token 被累加成 30~1400 倍的假数字 —— 1.2k 能变成六位数。面板数字随之失真,压缩阈值的判断也被推着走。

修复

Usage 新增 Absorb(*Usage):逐字段取较大值。

上游形态 为什么取 max 是对的
OpenAI 单终帧 只有一帧,取 max 等于取该帧
Anthropic 累计 message_delta 后一帧已含前面全部,取 max 即终值
每帧重复累计(最坏情形) 逐帧单调递增,max 恰为真实终值

Merge(相加)保留原语义,只用于跨请求聚合(截断续写时 prompt 确实要付两次)。

改动点:internal/lane/http.go(readSSE)、internal/relay/relay.go。

测试

新增 internal/lane/usage_absorb_test.go:三次重复累计帧喂进去,断言输入仍是 1200 而不是 3600;同时钉住 Merge 的可加语义没有被顺手改坏。

go build ./... / go vet ./... 通过;go test ./... 全绿(internal/lane 30.8s、internal/relay 13.2s、internal/gateway 23.9s)。

Closes #105

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.

流式响应里重复的 usage 块被逐帧相加,input 被放大 30-1400 倍,客户端每轮都触发压缩

1 participant