Skip to content

bug: Anthropic 类型供应商输出 token 计数错误 #312

@ding113

Description

@ding113

问题描述:
当前 v0.3.27 版本中,引入了 5m/1h 缓存区别计费功能。因此修改了提取 Anthropic 类型供应商的计费提取逻辑。
当前版本使用请求体的消息开始字段提取 token 用量数据,如:

event:message_start
data:{"type":"message_start","message":{"model":"claude-opus-4-5-20251101","id":"msg_01K63dMRtugrT9KH6hURm3Vv","type":"message","role":"assistant","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":8,"cache_creation_input_tokens":800,"cache_read_input_tokens":77249,"cache_creation":{"ephemeral_5m_input_tokens":800,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard"}}          }

这导致了输出 token 计数错误。因为这一字段位于流式输出响应体开头,此时主要的输出内容还未完成输出。

正确的方式是,提取流式输出响应体末尾字段,如:


event:message_delta
data:{"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"input_tokens":8,"cache_creation_input_tokens":800,"cache_read_input_tokens":77249,"output_tokens":356}       }

event:message_stop
data:{"type":"message_stop"    }

中的output_tokens字段作为输出 token 计数依据。
同时,保留使用message_start提取输入 token 的逻辑,因为只有message_start字段包含了 5m/1h 区分计费所需的分时缓存创建计数字段。

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingoncallCritical blocking issue requiring immediate oncall attention

Projects

Status

Done

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions