[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`
This commit is contained in:
rhan-oai
2026-06-10 22:47:22 -07:00
committed by GitHub
Unverified
parent 598125109d
commit 383708e74e
5 changed files with 11 additions and 0 deletions
@@ -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),
+2
View File
@@ -767,6 +767,7 @@ pub(crate) struct CodexCompactionEventParams {
pub(crate) active_context_tokens_after: i64,
pub(crate) retained_image_count: Option<usize>,
pub(crate) compaction_summary_tokens: Option<i64>,
pub(crate) cached_input_tokens: Option<i64>,
pub(crate) started_at: u64,
pub(crate) completed_at: u64,
pub(crate) duration_ms: Option<u64>,
@@ -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,
+1
View File
@@ -413,6 +413,7 @@ pub struct CodexCompactionEvent {
pub active_context_tokens_after: i64,
pub retained_image_count: Option<usize>,
pub compaction_summary_tokens: Option<i64>,
pub cached_input_tokens: Option<i64>,
pub started_at: u64,
pub completed_at: u64,
pub duration_ms: Option<u64>,
+3
View File
@@ -343,6 +343,7 @@ pub(crate) struct CompactionAnalyticsDetails {
pub(crate) active_context_tokens_before: Option<i64>,
pub(crate) retained_image_count: Option<usize>,
pub(crate) compaction_summary_tokens: Option<i64>,
pub(crate) cached_input_tokens: Option<i64>,
}
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(
+1
View File
@@ -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);