Skip to content

fix(SUBCON-444): return proper usage statistics at end of request#8

Closed
pint-drinker wants to merge 1 commit into
mainfrom
dana/subcon-444-return-proper-usage-statistics-at-end-of-request
Closed

fix(SUBCON-444): return proper usage statistics at end of request#8
pint-drinker wants to merge 1 commit into
mainfrom
dana/subcon-444-return-proper-usage-statistics-at-end-of-request

Conversation

@pint-drinker
Copy link
Copy Markdown
Contributor

Summary

  • Bug: _parse_run() was storing raw API dicts in Usage.models and Usage.platform_tools instead of converting them to ModelUsage / PlatformToolUsage dataclass instances — so run.usage.models[0].input_tokens raised AttributeError at runtime
  • Fix: Deserialize each model/tool dict into its dataclass, mapping camelCase API keys (inputTokens, outputTokens, totalTokens, toolId, durationMs) to snake_case Python fields
  • Added duration_ms field to Usage dataclass (documented in API but was missing from SDK)

Closes SUBCON-444

Test plan

  • New TestParseRunUsage tests cover camelCase API responses, snake_case fallback, multiple models, missing/empty usage, and missing duration
  • Full test suite passes (22/22)

🤖 Generated with Claude Code

_parse_run() was passing raw API dicts directly into Usage.models and
Usage.platform_tools instead of converting them to ModelUsage and
PlatformToolUsage instances. This meant attribute access (e.g.
run.usage.models[0].input_tokens) failed at runtime. Also maps
camelCase API keys (inputTokens, outputTokens, etc.) to snake_case
and adds the missing duration_ms field to Usage.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@pint-drinker pint-drinker requested a review from jfobrien29 April 7, 2026 11:58
@pint-drinker pint-drinker marked this pull request as draft April 13, 2026 22:05
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.

1 participant