AgentOps-AI / AgentOps-AI/agentops

TokenUsageExtractor drops mapping-based usage metadata

Offen
#1,432 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Python
Sterne
5.8k
Forks
619
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

## 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.

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.