Skip to content

feat: add token metering across the full stack#19

Open
skokaina wants to merge 2 commits intomainfrom
feature/token-metering
Open

feat: add token metering across the full stack#19
skokaina wants to merge 2 commits intomainfrom
feature/token-metering

Conversation

@skokaina
Copy link
Copy Markdown
Contributor

@skokaina skokaina commented Apr 1, 2026

Add in-process token usage aggregation that flows from agent process through heartbeat push to CRD status and VS Code plugin.

SDK (TypeScript):

  • UsageLedger class: O(1) record(), snapshot with window reset
  • Reporter heartbeat payload now includes usage field
  • Exported UsageLedger, UsageSnapshot, ModelUsageEntry from @agentspec/sdk

Sidecar:

  • GET /usage endpoint aggregates modelCalls from the audit ring

Control Plane (Python):

  • HeartbeatRequest accepts optional usage field
  • Heartbeat DB model stores usage (nullable JSON column)
  • build_status_patch forwards usage to CRD status
  • GET /agents/{name}/usage endpoint
  • Extracted _get_validated_field helper to deduplicate endpoint pattern

Operator:

  • AgentObservation CRD: status.usage object + Tokens printer column

sdk-langgraph (Python):

  • UsageLedger class (thread-safe, mirrors TypeScript API)
  • instrument_call_model accepts optional ledger parameter
  • Negative token values clamped to 0, snapshot copies are immutable

Tests: 32 new tests across SDK, sidecar, control-plane, sdk-langgraph

Add in-process token usage aggregation that flows from agent process
through heartbeat push to CRD status and VS Code plugin.

SDK (TypeScript):
- UsageLedger class: O(1) record(), snapshot with window reset
- Reporter heartbeat payload now includes usage field
- Exported UsageLedger, UsageSnapshot, ModelUsageEntry from @agentspec/sdk

Sidecar:
- GET /usage endpoint aggregates modelCalls from the audit ring

Control Plane (Python):
- HeartbeatRequest accepts optional usage field
- Heartbeat DB model stores usage (nullable JSON column)
- build_status_patch forwards usage to CRD status
- GET /agents/{name}/usage endpoint
- Extracted _get_validated_field helper to deduplicate endpoint pattern

Operator:
- AgentObservation CRD: status.usage object + Tokens printer column

sdk-langgraph (Python):
- UsageLedger class (thread-safe, mirrors TypeScript API)
- instrument_call_model accepts optional ledger parameter
- Negative token values clamped to 0, snapshot copies are immutable

Tests: 32 new tests across SDK, sidecar, control-plane, sdk-langgraph
@@ -0,0 +1,101 @@
"""Tests for UsageLedger — in-process token usage counter."""

from datetime import datetime, timezone

from datetime import datetime, timezone

import pytest
- README: add "Track token usage" to feature list, mention /usage
  sidecar endpoint, add kubectl token column example
- operating-modes.md: add GET /usage to sidecar and operator endpoint
  tables
- runtime-introspection.md: new "Token Usage Tracking" section covering
  UsageLedger API, data flow, sidecar/operator query endpoints, CRD
  visibility, and VS Code rendering
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.

2 participants