pub struct SummaryCompactor<M> { /* private fields */ }Expand description
LLM-summary Compactor — drops the oldest turns past
keep_recent_turns into a single summarised Turn::User, leaving
the most recent turns verbatim.
Pair invariant: dropped turns carry their ToolPairs away with
them — the retained set keeps every Turn::Assistant’s tools
vector intact, so the wire-side codec never sees an unmatched
tool block.
Construct with SummaryCompactor::new then chain
SummaryCompactor::with_system_prompt /
SummaryCompactor::with_keep_recent_turns for tuning. The
summariser model is any Runnable<Vec<Message>, Message> — the
operator’s ChatModel, a layered model, or a stub for tests.
Implementations§
Source§impl<M> SummaryCompactor<M>
impl<M> SummaryCompactor<M>
Sourcepub fn new(model: Arc<M>) -> Self
pub fn new(model: Arc<M>) -> Self
Construct with the default system prompt and keep-recent count.
Sourcepub fn with_system_prompt(self, prompt: impl Into<String>) -> Self
pub fn with_system_prompt(self, prompt: impl Into<String>) -> Self
Override the system prompt. Operators with a custom voice or downstream-format requirement (e.g. JSON envelope) point the summariser via this knob.
Sourcepub const fn with_keep_recent_turns(self, n: usize) -> Self
pub const fn with_keep_recent_turns(self, n: usize) -> Self
Override how many newest turns are retained verbatim. Higher values preserve more recent context at the cost of leaving more budget pressure for the summariser to manage.
Trait Implementations§
Source§impl<M> Compactor for SummaryCompactor<M>
impl<M> Compactor for SummaryCompactor<M>
Source§fn compact<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
events: &'life1 [GraphEvent],
_budget_chars: usize,
ctx: &'life2 ExecutionContext,
) -> Pin<Box<dyn Future<Output = Result<CompactedHistory>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn compact<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
events: &'life1 [GraphEvent],
_budget_chars: usize,
ctx: &'life2 ExecutionContext,
) -> Pin<Box<dyn Future<Output = Result<CompactedHistory>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
events to fit within budget_chars. The budget is
approximate — implementations measure character length of
the rendered text (closest free proxy for token count
without pulling a tokenizer dependency). The
ExecutionContext carries cancellation + deadline so a
long-running summarisation respects the same lifetime as the
dispatch that triggered it. Returns Error::Config when
the event log violates the pair invariant before
compaction (e.g. ToolResult without a preceding
ToolCall); a well-formed SessionGraph never hits this
path.Auto Trait Implementations§
impl<M> Freeze for SummaryCompactor<M>
impl<M> RefUnwindSafe for SummaryCompactor<M>where
M: RefUnwindSafe,
impl<M> Send for SummaryCompactor<M>
impl<M> Sync for SummaryCompactor<M>
impl<M> Unpin for SummaryCompactor<M>
impl<M> UnsafeUnpin for SummaryCompactor<M>
impl<M> UnwindSafe for SummaryCompactor<M>where
M: RefUnwindSafe,
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
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more