Track prompt cache write token usage (#33454)

## What changed

- Parse `cache_write_tokens` from response input token details and carry it through token usage aggregation.
- Expose `cache_write_input_tokens` in protocol, app-server, exec, and TypeScript SDK usage events, defaulting it to zero for compatibility with older payloads.
- Report cache-write usage in analytics, metrics, traces, and rollout data alongside existing cache-read usage.

## Testing

- Add coverage for response parsing, usage event output, aggregation, analytics, metrics, and telemetry fields.

GitOrigin-RevId: 634e4fbe3086a8923c0ee13b622573e7d9d221bd
This commit is contained in:
Eric Traut
2026-07-16 00:22:53 +00:00
committed by copyberry
parent 78d4a563f9
commit 2edad72de3
46 changed files with 207 additions and 31 deletions
+1
View File
@@ -3713,6 +3713,7 @@ impl Session {
info.last_token_usage = TokenUsage {
input_tokens: 0,
cached_input_tokens: 0,
cache_write_input_tokens: 0,
output_tokens: 0,
reasoning_output_tokens: 0,
total_tokens: estimated_total_tokens.max(0),
+7
View File
@@ -2212,6 +2212,7 @@ async fn record_initial_history_seeds_token_info_from_rollout() {
total_token_usage: TokenUsage {
input_tokens: 10,
cached_input_tokens: 0,
cache_write_input_tokens: 0,
output_tokens: 20,
reasoning_output_tokens: 0,
total_tokens: 30,
@@ -2219,6 +2220,7 @@ async fn record_initial_history_seeds_token_info_from_rollout() {
last_token_usage: TokenUsage {
input_tokens: 3,
cached_input_tokens: 0,
cache_write_input_tokens: 0,
output_tokens: 4,
reasoning_output_tokens: 0,
total_tokens: 7,
@@ -2229,6 +2231,7 @@ async fn record_initial_history_seeds_token_info_from_rollout() {
total_token_usage: TokenUsage {
input_tokens: 100,
cached_input_tokens: 50,
cache_write_input_tokens: 0,
output_tokens: 200,
reasoning_output_tokens: 25,
total_tokens: 375,
@@ -2236,6 +2239,7 @@ async fn record_initial_history_seeds_token_info_from_rollout() {
last_token_usage: TokenUsage {
input_tokens: 10,
cached_input_tokens: 0,
cache_write_input_tokens: 0,
output_tokens: 20,
reasoning_output_tokens: 5,
total_tokens: 35,
@@ -2404,6 +2408,7 @@ async fn record_token_usage_info_notifies_extension_contributors() {
let first_usage = TokenUsage {
input_tokens: 10,
cached_input_tokens: 2,
cache_write_input_tokens: 0,
output_tokens: 20,
reasoning_output_tokens: 3,
total_tokens: 33,
@@ -2411,6 +2416,7 @@ async fn record_token_usage_info_notifies_extension_contributors() {
let second_usage = TokenUsage {
input_tokens: 7,
cached_input_tokens: 1,
cache_write_input_tokens: 0,
output_tokens: 8,
reasoning_output_tokens: 5,
total_tokens: 20,
@@ -2530,6 +2536,7 @@ async fn turn_start_lifecycle_exposes_turn_metadata_and_token_baseline() {
let token_usage_at_turn_start = TokenUsage {
input_tokens: 100,
cached_input_tokens: 40,
cache_write_input_tokens: 0,
output_tokens: 25,
reasoning_output_tokens: 5,
total_tokens: 130,
+1
View File
@@ -2025,6 +2025,7 @@ async fn try_run_sampling_request(
codex.request.reasoning_effort = %reasoning_effort,
gen_ai.usage.input_tokens = field::Empty,
gen_ai.usage.cache_read.input_tokens = field::Empty,
gen_ai.usage.cache_write.input_tokens = field::Empty,
gen_ai.usage.output_tokens = field::Empty,
codex.usage.reasoning_output_tokens = field::Empty,
codex.usage.total_tokens = field::Empty,