Skip to content

fix(instrumentation): support mapping-based usage metadata in TokenUsageExtractor - #1475

Open
Tyagiquamar wants to merge 1 commit into
AgentOps-AI:mainfrom
Tyagiquamar:fix/token-usage-mapping-support
Open

Tyagiquamar wants to merge 1 commit into
AgentOps-AI:mainfrom
Tyagiquamar:fix/token-usage-mapping-support

Conversation

@Tyagiquamar

Copy link
Copy Markdown

Fixes #1432
Addresses #1418

Description

TokenUsageExtractor.extract_from_response() was previously using getattr() on usage_data and response. When providers (e.g. Google ADK, Anthropic, or streaming chunks) return usage or usage_metadata as a dict / Mapping, all fields returned None, resulting in empty token usage span attributes.

Furthermore, providers like Google ADK emit standard OTel GenAI convention names (input_tokens / output_tokens) and omit total_tokens.

Changes

  1. Mapping-aware extraction: Updated _extract_from_usage_object and _extract_from_attributes to safely access fields from both Mapping (e.g. dict) and attribute-based objects.
  2. OTel convention normalization: Support input_tokens and output_tokens alongside prompt_tokens and completion_tokens.
  3. Calculated total tokens: When total_tokens is absent, automatically compute it from prompt/input and completion/output tokens.
  4. CrewAI format enhancement: Accept dictionary format in addition to space-separated string format.
  5. Unit test coverage: Added comprehensive regression tests in tests/unit/instrumentation/common/test_token_counting.py covering dict usage, usage_metadata mappings, raw dict responses, OTel field names, CrewAI formats, and None handling.

…ize OTel token fields in TokenUsageExtractor

When providers expose usage or usage_metadata as a dictionary/mapping
rather than an attribute-based object, TokenUsageExtractor._extract_from_usage_object
previously attempted getattr() access on all fields and returned None.

This update:
- Adds mapping-aware field access to extract token counts from dicts or objects
- Supports input_tokens and output_tokens alongside prompt_tokens and completion_tokens
- Computes total_tokens when absent if prompt/input and completion/output tokens exist
- Adds full regression coverage for mappings, dict responses, CrewAI formats, and OTel conventions

This branch has not been deployed

No deployments
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.

TokenUsageExtractor drops mapping-based usage metadata

1 participant