From 2536d74dce9c36ccde72b57c8571f64b713d4cb3 Mon Sep 17 00:00:00 2001 From: Roy Han Date: Mon, 8 Jun 2026 18:29:11 -0700 Subject: [PATCH] [codex-analytics] report cached input tokens for v2 compaction --- 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 e94d69ed5be8..2aeafe979dc9 100644 --- a/codex-rs/analytics/src/analytics_client_tests.rs +++ b/codex-rs/analytics/src/analytics_client_tests.rs @@ -1255,6 +1255,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), @@ -1305,6 +1306,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 @@ -1827,6 +1829,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), @@ -2751,6 +2754,7 @@ async fn subagent_thread_started_inherits_parent_connection_for_new_thread() { 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 0b6c9a012292..dc90d8b4a9f8 100644 --- a/codex-rs/analytics/src/events.rs +++ b/codex-rs/analytics/src/events.rs @@ -760,6 +760,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, @@ -973,6 +974,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 a035bc98b983..845d3be0c4aa 100644 --- a/codex-rs/analytics/src/facts.rs +++ b/codex-rs/analytics/src/facts.rs @@ -412,6 +412,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 e2573d6d6d72..6e3e4026e3e8 100644 --- a/codex-rs/core/src/compact.rs +++ b/codex-rs/core/src/compact.rs @@ -340,6 +340,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 { @@ -376,6 +377,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); @@ -396,6 +398,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 1d4eb8ad5ae0..3581f7400b4c 100644 --- a/codex-rs/core/src/compact_remote_v2.rs +++ b/codex-rs/core/src/compact_remote_v2.rs @@ -283,6 +283,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);