Skip to content

Commit 790c9a6

Browse files
committed
Preserve token totals after /compact
Signed-off-by: Fahad <[email protected]>
1 parent ed77d2d commit 790c9a6

File tree

4 files changed

+35
-0
lines changed

4 files changed

+35
-0
lines changed

codex-rs/core/src/codex.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -995,6 +995,11 @@ impl Session {
995995
}
996996
}
997997

998+
async fn reset_last_token_usage(&self) {
999+
let mut state = self.state.lock().await;
1000+
state.reset_last_token_usage();
1001+
}
1002+
9981003
/// Record a user input item to conversation history and also persist a
9991004
/// corresponding UserMessage EventMsg to rollout.
10001005
async fn record_input_and_rollout_usermsg(

codex-rs/core/src/codex/compact.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ async fn run_compact_task_inner(
154154
let initial_context = sess.build_initial_context(turn_context.as_ref());
155155
let new_history = build_compacted_history(initial_context, &user_messages, &summary_text);
156156
sess.replace_history(new_history).await;
157+
sess.reset_last_token_usage().await;
158+
sess.send_token_count_event(turn_context.as_ref()).await;
157159

158160
let rollout_item = RolloutItem::Compacted(CompactedItem {
159161
message: summary_text.clone(),

codex-rs/core/src/conversation_history.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,12 @@ impl ConversationHistory {
332332
model_context_window,
333333
);
334334
}
335+
336+
pub(crate) fn reset_last_token_usage(&mut self) {
337+
if let Some(info) = self.token_info.as_mut() {
338+
info.last_token_usage = TokenUsage::default();
339+
}
340+
}
335341
}
336342

337343
#[inline]
@@ -395,6 +401,24 @@ mod tests {
395401
}
396402
}
397403

404+
#[test]
405+
fn replace_preserves_totals_and_reset_clears_last_usage() {
406+
let mut history = ConversationHistory::new();
407+
let mut usage = TokenUsage::default();
408+
usage.total_tokens = 1280;
409+
usage.input_tokens = 640;
410+
history.update_token_info(&usage, Some(13_000));
411+
412+
history.replace(Vec::new());
413+
history.reset_last_token_usage();
414+
415+
let info = history
416+
.token_info()
417+
.expect("token info should persist after replace");
418+
assert_eq!(info.total_token_usage.total_tokens, 1280);
419+
assert_eq!(info.last_token_usage.total_tokens, 0);
420+
}
421+
398422
#[test]
399423
fn filters_non_api_messages() {
400424
let mut h = ConversationHistory::default();

codex-rs/core/src/state/session.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,8 @@ impl SessionState {
7272
pub(crate) fn set_token_usage_full(&mut self, context_window: i64) {
7373
self.history.set_token_usage_full(context_window);
7474
}
75+
76+
pub(crate) fn reset_last_token_usage(&mut self) {
77+
self.history.reset_last_token_usage();
78+
}
7579
}

0 commit comments

Comments
 (0)