通过 Anthropic 进行的同一缓存 Claude 调用与基岩包发出的不同 gen_ai.usage.input_tokens — 这是有意的吗?
在审计缓存令牌计费时,发现了与 OTel GenAI 规范不一致的跨包含义问题。 **观察结果** 对于同一缓存的 Claude 调用,此仓库中的两个仪器包发出了不同的 `gen_ai.usage.input_tokens`: - **Anthropic 包将缓存包含在内**:`packages/opentelemetry-instrumentation-Anthropic/.../Anthropic/__init__.py`(~L226-234):`input_tokens = prompt_tokens + cache_read_tokens + cache_creation_tokens`,并附带了缓存子集属性(流式路径匹配,`streaming.py` ~L85-105)。 - **bedrock 包不包含**:`packages/opentelemetry-instrumentation-bedrock/.../bedrock/span_utils.py`(`converse_usage_record`,~L1071-1099):`input_tokens = usage.inputTokens` 如原样,仅将 `cacheReadInputTokens` / `cacheWriteInputTokens` 发出为单独属性。 对于通过 Converse 使用 Claude-on-Bedrock,提供者的 `inputTokens` 将缓存排除在外(与直接使用 Anthropic API 的原生语义相同),因此具有提示缓存的 Claude 会话报告 `gen_ai.usage.input_tokens` - 以及 `total_tokens` - 根据缓存读取 + 缓存写入而有所不同,具体取决于哪个包进行仪器化。 **裁决问题** Anthropic 的 OTel GenAI 规范(`semantic-conventions-genai`,`docs/gen-ai/Anthropic.md`)规定,必须将缓存读写令牌添加到原生输入令牌中,以计算 `gen_ai.usage.input_tokens`。根据此阅读,Anthropic 包遵循该规则,而 bedrock 路径(对于 Claude 模型)则不遵循该规则,但 bedrock 还提供了不符合此规则的非 Anthropic 模型,这可能是分歧的原因。 对于 Claude-via-Bedrock,预期的语义是什么?如果 Anthropic.md 规则是针对每个模型而非针对每个 SDK 包,是否将 bedrock Claude 路径保持在 token 和成本数字的交叉入口可比性上?我很乐意发送一个最小的 repro(相同的系统提示 + 缓存点,通过 `Anthropic.messages.create` 和通过 `bedrock Converse` 调用,断言输入令牌差异)或一个小的 PR,用于 Claude-on-Bedrock 分支。 上下文:我维护 AgentMeasure,这是一个测量符合性项目;这是对代理远程监测计费语义的 30 个项目 / 30 天检查的一部分。 我不是在声称缺陷,而是在询问预期的边界。
内容来源: traceloop/openllmetry