AgentOps-AI / AgentOps-AI/agentops

TokenUsageExtractor drops mapping-based usage metadata

未关闭
#1,432 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Python
星标
5.8k
派生
619
PR 合并指标
30 天内没有已合并 PR

描述

## Description

`TokenUsageExtractor.extract_from_response()` silently drops all token counts when a provider exposes `usage` or `usage_metadata` as a mapping instead of an attribute-based object.

The shared streaming wrapper explicitly accepts chunks with `usage_metadata`, and the existing test fixture uses a dictionary shape, but `_extract_from_usage_object()` reads every field with `getattr()`. As a result, dictionary-backed usage produces a `TokenUsage` whose fields are all `None`, so the span receives no token usage attributes.

## Minimal reproduction

```python
from types import SimpleNamespace

from agentops.instrumentation.common.token_counting import TokenUsageExtractor

response = SimpleNamespace(
usage_metadata={
prompt_tokens: 10,
completion_tokens: 5,
total_tokens: 15,
}
)

print(TokenUsageExtractor.extract_from_response(response))
```

Current output on `main`:

```text
TokenUsage(prompt_tokens=None, completion_tokens=None, total_tokens=None, cached_prompt_tokens=None, cached_read_tokens=None, reasoning_tokens=None)
```

## Expected behavior

Dictionary and attribute-based usage containers should be normalized consistently, including the cache and reasoning token fields already supported by `TokenUsage`.

## Suggested fix

Use a small mapping-aware field accessor in `_extract_from_usage_object()` and add regression coverage for both `usage` and `usage_metadata` mappings. The existing object behavior should remain unchanged.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。