From 383708e74e42ac09b473633019d5f1498c18fbea Mon Sep 17 00:00:00 2001 From: rhan-oai Date: Wed, 10 Jun 2026 22:47:22 -0700 Subject: [PATCH] [codex-analytics] report cached input tokens for v2 compaction (#27103) ## Summary - add nullable `cached_input_tokens` to the compaction analytics event - populate it from response usage for compaction v2 - leave it `null` for other compaction implementations This adds visibility into prompt-cache usage for v2 compaction without changing compaction behavior. ## Testing - `just test -p codex-analytics` - `just test -p codex-core collect_compaction_output_accepts_additional_output_items` --- codex-rs/analytics/src/analytics_client_tests.rs | 4 ++++ codex-rs/analytics/src/events.rs | 2 ++ codex-rs/analytics/src/facts.rs | 1 + codex-rs/core/src/compact.rs | 3 +++ codex-rs/core/src/compact_remote_v2.rs | 1 + 5 files changed, 11 insertions(+) diff --git a/codex-rs/analytics/src/analytics_client_tests.rs b/codex-rs/analytics/src/analytics_client_tests.rs index 429c89a60..1a1c7d2d5 100644 --- a/codex-rs/analytics/src/analytics_client_tests.rs +++ b/codex-rs/analytics/src/analytics_client_tests.rs @@ -1283,6 +1283,7 @@ fn compaction_event_serializes_expected_shape() { active_context_tokens_after: 18_000, retained_image_count: None, compaction_summary_tokens: None, + cached_input_tokens: None, started_at: 100, completed_at: 106, duration_ms: Some(6543), @@ -1333,6 +1334,7 @@ fn compaction_event_serializes_expected_shape() { "active_context_tokens_after": 18000, "retained_image_count": null, "compaction_summary_tokens": null, + "cached_input_tokens": null, "started_at": 100, "completed_at": 106, "duration_ms": 6543 @@ -1855,6 +1857,7 @@ async fn compaction_event_ingests_custom_fact() { active_context_tokens_after: 131_000, retained_image_count: None, compaction_summary_tokens: None, + cached_input_tokens: None, started_at: 100, completed_at: 101, duration_ms: Some(1200), @@ -2781,6 +2784,7 @@ async fn subagent_events_use_inherited_connection_unless_turn_connection_is_expl active_context_tokens_after: 64_000, retained_image_count: None, compaction_summary_tokens: None, + cached_input_tokens: None, started_at: 100, completed_at: 101, duration_ms: Some(1200), diff --git a/codex-rs/analytics/src/events.rs b/codex-rs/analytics/src/events.rs index 4c7277b22..5213bf070 100644 --- a/codex-rs/analytics/src/events.rs +++ b/codex-rs/analytics/src/events.rs @@ -767,6 +767,7 @@ pub(crate) struct CodexCompactionEventParams { pub(crate) active_context_tokens_after: i64, pub(crate) retained_image_count: Option, pub(crate) compaction_summary_tokens: Option, + pub(crate) cached_input_tokens: Option, pub(crate) started_at: u64, pub(crate) completed_at: u64, pub(crate) duration_ms: Option, @@ -1004,6 +1005,7 @@ pub(crate) fn codex_compaction_event_params( active_context_tokens_after: input.active_context_tokens_after, retained_image_count: input.retained_image_count, compaction_summary_tokens: input.compaction_summary_tokens, + cached_input_tokens: input.cached_input_tokens, started_at: input.started_at, completed_at: input.completed_at, duration_ms: input.duration_ms, diff --git a/codex-rs/analytics/src/facts.rs b/codex-rs/analytics/src/facts.rs index 560c86b2d..62ce7f9a9 100644 --- a/codex-rs/analytics/src/facts.rs +++ b/codex-rs/analytics/src/facts.rs @@ -413,6 +413,7 @@ pub struct CodexCompactionEvent { pub active_context_tokens_after: i64, pub retained_image_count: Option, pub compaction_summary_tokens: Option, + pub cached_input_tokens: Option, pub started_at: u64, pub completed_at: u64, pub duration_ms: Option, diff --git a/codex-rs/core/src/compact.rs b/codex-rs/core/src/compact.rs index f611059f8..abfac7ddd 100644 --- a/codex-rs/core/src/compact.rs +++ b/codex-rs/core/src/compact.rs @@ -343,6 +343,7 @@ pub(crate) struct CompactionAnalyticsDetails { pub(crate) active_context_tokens_before: Option, pub(crate) retained_image_count: Option, pub(crate) compaction_summary_tokens: Option, + pub(crate) cached_input_tokens: Option, } impl CompactionAnalyticsAttempt { @@ -379,6 +380,7 @@ impl CompactionAnalyticsAttempt { active_context_tokens_before, retained_image_count, compaction_summary_tokens, + cached_input_tokens, } = details; let active_context_tokens_before = active_context_tokens_before.unwrap_or(self.active_context_tokens_before); @@ -399,6 +401,7 @@ impl CompactionAnalyticsAttempt { active_context_tokens_after, retained_image_count, compaction_summary_tokens, + cached_input_tokens, started_at: self.started_at, completed_at: now_unix_seconds(), duration_ms: Some( diff --git a/codex-rs/core/src/compact_remote_v2.rs b/codex-rs/core/src/compact_remote_v2.rs index 56056130c..d25484910 100644 --- a/codex-rs/core/src/compact_remote_v2.rs +++ b/codex-rs/core/src/compact_remote_v2.rs @@ -281,6 +281,7 @@ async fn run_remote_compact_task_inner_impl( if let Some(token_usage) = token_usage { analytics_details.active_context_tokens_before = Some(token_usage.input_tokens); analytics_details.compaction_summary_tokens = Some(token_usage.output_tokens); + analytics_details.cached_input_tokens = Some(token_usage.cached_input_tokens); } let (compacted_history, retained_images) = build_v2_compacted_history(&prompt_input, compaction_output);