pub struct SummarizeCompactionStrategy {
pub trigger_fraction: f64,
pub tail_min_messages: usize,
pub summary_max_tokens: i32,
pub summary_prompt: String,
pub user_message_token_budget: u64,
}Expand description
Codex-style local compaction: send the full history to the model with a
handoff-summary prompt appended, collect the reply as a checkpoint, then
rebuild history as [...retained user messages, summary].
Design rationale:
- User messages are preserved verbatim (up to
user_message_token_budget) because they carry precise constraints and goals that paraphrasing loses. - Assistant / tool messages are folded into the summary — they are large but low-density and tolerate lossy compression.
- The summary is placed LAST so the model reads it as the most recent context rather than as background preamble.
- Reusing the same model client keeps the Anthropic prompt-cache prefix hot (identical system + tools on every call).
Fields§
§trigger_fraction: f64§tail_min_messages: usizeMinimum total message count below which compaction is skipped.
Does not control retention; use user_message_token_budget for that.
summary_max_tokens: i32§summary_prompt: String§user_message_token_budget: u64Token budget for verbatim user-message retention in the replacement history.
Implementations§
Source§impl SummarizeCompactionStrategy
impl SummarizeCompactionStrategy
pub fn with_trigger_fraction(self, fraction: f64) -> Self
pub fn with_tail_min_messages(self, n: usize) -> Self
pub fn with_summary_max_tokens(self, n: i32) -> Self
pub fn with_user_message_token_budget(self, budget: u64) -> Self
Trait Implementations§
Source§impl CompactionStrategy for SummarizeCompactionStrategy
impl CompactionStrategy for SummarizeCompactionStrategy
Source§fn should_compact(
&self,
messages: &[ChatMessage],
context_window_tokens: u64,
) -> bool
fn should_compact( &self, messages: &[ChatMessage], context_window_tokens: u64, ) -> bool
Boolean gate. Pure (no side effects). Cheap to call every step.
Source§fn compact<'life0, 'life1, 'async_trait>(
&'life0 self,
messages: Vec<ChatMessage>,
ctx: &'life1 CompactionContext,
) -> Pin<Box<dyn Future<Output = Result<CompactionOutcome, CompactionError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn compact<'life0, 'life1, 'async_trait>(
&'life0 self,
messages: Vec<ChatMessage>,
ctx: &'life1 CompactionContext,
) -> Pin<Box<dyn Future<Output = Result<CompactionOutcome, CompactionError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Fold history. Caller hands over the full
messages list and
expects a shorter list back (typically [summary, ...tail]).
Failures bubble up; agent_loop treats them as “skip this turn’s
compaction” rather than failing the whole turn.Auto Trait Implementations§
impl Freeze for SummarizeCompactionStrategy
impl RefUnwindSafe for SummarizeCompactionStrategy
impl Send for SummarizeCompactionStrategy
impl Sync for SummarizeCompactionStrategy
impl Unpin for SummarizeCompactionStrategy
impl UnsafeUnpin for SummarizeCompactionStrategy
impl UnwindSafe for SummarizeCompactionStrategy
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more