Skip to content

release(0.13.11): vendor-extractor fields on v3 /track#69

Merged
maltsev-dev merged 2 commits into
masterfrom
release/0.13.11
Jul 14, 2026
Merged

release(0.13.11): vendor-extractor fields on v3 /track#69
maltsev-dev merged 2 commits into
masterfrom
release/0.13.11

Conversation

@maltsev-dev

Copy link
Copy Markdown
Member

Release 0.13.11 — vendor-extractor fields on v3 /track

Bump version 0.13.10 -> 0.13.11. Two commits on top of origin/master:

eb1bb6f — fix(sdk): forward vendor-extractor fields through v3 /track payload

Pre-fix (0.13.10) the vendor-specific extractors surfaced cache_read_tokens, cache_write_tokens, reasoning_tokens, finish_reason, and tool_names onto wire_event correctly. The legacy /track/batch path serializes the event as-is and preserved them. The v3 single-event path builds an explicit payload dict via _build_v3_track_payload — and that mapper didn't opt the five fields in, so v3 /track events landed on the backend with all five columns = None.

Effect on the backend: migration 220 added the five columns to cost_events, the v3 /track handler deserialised None for every column on every LLM call routed through the v3 path, and the dashboard's reasoning / cache / finish_reason metrics returned zero for every event on the v3 single-event path.

Fix: append a second opt-in pass for the five vendor-extractor fields in runtime._build_v3_track_payload, using the existing if k in wire_event and wire_event[k] is not None: payload[k] = wire_event[k] pattern that already opts in agent_id / environment / agent_type / attempt_index / is_retry. Backend defaults all five to None on missing keys, so legacy events that land on the v3 path without these fields still parse cleanly.

7f29f4c — chore(release): 0.13.11

  • Bump __version__ to 0.13.11 in src/nullrun/__version__.py.
  • Bump version to 0.13.11 in pyproject.toml.
  • Prepend v3.25 / 0.13.11 changelog entry to __version__.py.
  • Extend the inline pyproject.toml comment block for 0.13.10 / 0.13.11.

Verification

  • pytest tests/test_extractors.py tests/test_crewai_patch.py tests/test_runtime.py tests/test_runtime_branches.py tests/test_track_batch_retry.py tests/test_track_span_context.py tests/test_v3_wire_contract.py tests/test_release_polish.py185 passed, 1 skipped (no regression vs 0.13.10).
  • ruff check src/nullrun/__version__.py pyproject.tomlAll checks passed!
  • mypy src/nullrunSuccess: no issues found in 34 source files.
  • Pre-existing ruff I001 errors (7) in tests/test_drift_fixes_2026_07_04.py are unchanged from origin/master — not a regression of this release.

Wire format / API

  • No on-wire change (the five fields were already wire-additive on 0.13.10; the v3 mapper just dropped them).
  • No public API change.
  • No SDK_MIN_VERSION bump.
  • Backends on 1.0.0 keep working unchanged.
  • Recommended upgrade path: 0.13.10 -> 0.13.11.

The 0.13.9 vendor-specific extractors (Cohere v2 tool_calls,
Mistral num_cached_tokens, Gemini thoughtsTokenCount,
Anthropic 4.5+ extended-thinking, Bedrock Mistral/Llama
finish_reason) extract cache_read_tokens, cache_write_tokens,
reasoning_tokens, finish_reason, and tool_names into
wire_event. The legacy /track/batch path serializes the event
as-is, so those fields ride through correctly.

The v3 single-event path builds an explicit payload dict via
_build_v3_track_payload. Pre-fix that mapper didn't opt the
five fields in, so v3 /track events landed on the backend with
all five columns = None — the migration-220 wireup received
empty values and the dashboard's reasoning/cache metrics
returned zero for every LLM call on the v3 path.

Fix: forward non-None values for the five keys, matching the
existing opt-in pattern for agent_id / environment / agent_type
/ attempt_index / is_retry. Backend defaults to None on
missing keys, so a legacy event that lands on the v3 path
without these fields still parses cleanly.

Verified: pytest tests/test_v3_wire_contract.py +
test_extractors.py + test_runtime.py + test_runtime_branches.py
= 146 passed, 1 skipped, 0 regression. ruff + mypy clean.
Bump version 0.13.10 -> 0.13.11. Prepends the v3.25 /
0.13.11 changelog entry to __version__.py and extends the
inline pyproject.toml comment block for 0.13.10 / 0.13.11.
The actual fix — forwarding cache_read_tokens /
cache_write_tokens / reasoning_tokens / finish_reason /
tool_names through _build_v3_track_payload — ships in the
preceding commit eb1bb6f on this branch.

No on-wire change. No SDK_MIN_VERSION bump. Backends on
1.0.0 keep working unchanged. Recommended upgrade path:
0.13.10 -> 0.13.11.
@codecov

codecov Bot commented Jul 14, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 0% with 4 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/nullrun/runtime.py 0.00% 3 Missing ⚠️
src/nullrun/__version__.py 0.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@maltsev-dev
maltsev-dev merged commit e9a4ec1 into master Jul 14, 2026
4 of 5 checks passed
@maltsev-dev
maltsev-dev deleted the release/0.13.11 branch July 24, 2026 11:58
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