Reinject previous-turn context for pre-sampling model-switch compaction

This commit is contained in:
Charles Cunningham
2026-02-18 01:17:13 -08:00
parent 2ede42d319
commit 223eda12d3
5 changed files with 20 additions and 10 deletions

View File

@@ -4670,7 +4670,7 @@ async fn maybe_run_previous_model_inline_compact(
sess,
// We use previous turn context here because we compact with the previous model
&previous_turn_context,
AutoCompactCallsite::PreTurnExcludingIncomingUserMessage,
AutoCompactCallsite::PreSamplingModelSwitch,
None,
)
.await

View File

@@ -44,6 +44,9 @@ pub(crate) enum AutoCompactCallsite {
/// default pre-turn flow and retained for future model-specific strategies.
#[allow(dead_code)]
PreTurnExcludingIncomingUserMessage,
/// Pre-sampling compaction triggered by model switch to a smaller context window.
/// This compacts prior-turn history only and should reinsert previous-turn canonical context.
PreSamplingModelSwitch,
/// Mid-turn compaction between assistant responses in a follow-up loop.
MidTurnContinuation,
}
@@ -284,7 +287,9 @@ async fn run_compact_task_inner(
let mut new_history = process_compacted_history(compacted_history);
if matches!(
auto_compact_callsite,
Some(AutoCompactCallsite::MidTurnContinuation)
Some(
AutoCompactCallsite::MidTurnContinuation | AutoCompactCallsite::PreSamplingModelSwitch
)
) {
let initial_context = sess.build_initial_context(turn_context.as_ref()).await;
insert_initial_context_before_last_real_user(&mut new_history, initial_context);

View File

@@ -168,7 +168,10 @@ async fn run_remote_compact_task_inner_impl(
})
.await?;
new_history = process_compacted_history(new_history);
if auto_compact_callsite == AutoCompactCallsite::MidTurnContinuation {
if matches!(
auto_compact_callsite,
AutoCompactCallsite::MidTurnContinuation | AutoCompactCallsite::PreSamplingModelSwitch
) {
let initial_context = sess.build_initial_context(turn_context.as_ref()).await;
insert_initial_context_before_last_real_user(&mut new_history, initial_context);
}

View File

@@ -142,8 +142,8 @@ fn assert_pre_sampling_switch_compaction_requests(
"follow-up request after successful model-switch compaction should include model-switch update item"
);
assert!(
!body_contains_text(&follow_up_body, "<environment_context>"),
"follow-up request should not reinsert canonical environment context after pre-sampling compaction"
body_contains_text(&follow_up_body, "<environment_context>"),
"follow-up request should include canonical environment context from previous-turn context reinjection"
);
}

View File

@@ -1,6 +1,5 @@
---
source: core/tests/suite/compact.rs
assertion_line: 1460
expression: "format_labeled_requests_snapshot(\"Pre-sampling compaction on model switch to a smaller context window: current behavior compacts using prior-turn history only (incoming user message excluded), and the follow-up request carries compacted history plus the new user message.\",\n&[(\"Initial Request (Previous Model)\", &requests[0]),\n(\"Pre-sampling Compaction Request\", &requests[1]),\n(\"Post-Compaction Follow-up Request (Next Model)\", &requests[2]),])"
---
Scenario: Pre-sampling compaction on model switch to a smaller context window: current behavior compacts using prior-turn history only (incoming user message excluded), and the follow-up request carries compacted history plus the new user message.
@@ -22,7 +21,10 @@ Scenario: Pre-sampling compaction on model switch to a smaller context window: c
06:message/user:<SUMMARIZATION_PROMPT>
## Post-Compaction Follow-up Request (Next Model)
00:message/user:before switch
01:message/user:<COMPACTION_SUMMARY>\nPRE_SAMPLING_SUMMARY
02:message/developer:<model_switch>\nThe user was previously using a different model....
03:message/user:after switch
00:message/developer:<PERMISSIONS_INSTRUCTIONS>
01:message/user:<AGENTS_MD>
02:message/user:<ENVIRONMENT_CONTEXT:cwd=<CWD>>
03:message/user:before switch
04:message/user:<COMPACTION_SUMMARY>\nPRE_SAMPLING_SUMMARY
05:message/developer:<model_switch>\nThe user was previously using a different model....
06:message/user:after switch