nodestep.middleware.summarization ¶
SummarizationMiddleware, which replaces older messages with a summary.
See Built-in middleware.
| Name | What it is |
|---|---|
| Middleware | |
SummarizationMiddleware | Replace older messages with a summary before a model call once a trigger fires. |
SummarizationResult | Result of the summarize_context tool. |
| Triggers | |
SummarizationTrigger | Protocol that decides when to summarize. |
MessageCountTrigger | Summarize above a number of messages. |
TokenLimitTrigger | Summarize above a share of the model's input limit. |
FixedTokenTrigger | Summarize above a fixed number of tokens. |
SummarizationDecision | Whether to summarize, and why. |
| Recent messages | |
RecentMessagesPolicy | Keep the last N messages out of the summary. |
RecentTokensPolicy | Keep the most recent messages within a token budget. |
| Token counting | |
TokenCounter | Protocol for counting message tokens. |
ApproximateTokenCounter | Estimate tokens as characters divided by four. |
Middleware¶
SummarizationMiddleware¶
SummarizationMiddleware(chat, *, trigger, recent, messages_field='messages', token_counter=None, summary_prompt='Summarize the prior conversation concisely. Preserve facts, decisions, and unresolved questions.', summary_message_factory=None, provide_tool=False)
Replace older messages with a summary before a model call once a trigger fires.
Subclass of Middleware.
Only model_node calls are summarized, and not in a node that shares
its superstep. The node's stored messages that recent does not keep go
to chat; one summary message replaces them in place, with any unstored
messages between them, and other unstored messages, such as the system
prompt, stay. The node's update stores the summary in place of the first
replaced message and removes the others. See
Built-in middleware.
chat | Chat |
Model that writes the summary. |
trigger | SummarizationTrigger |
When to summarize, checked against the whole request, e.g.
|
recent | RecentMessagesPolicy | RecentTokensPolicy |
Which messages to keep verbatim; a tool call and its results are never split. |
messages_field | str |
State field holding the messages. |
token_counter | TokenCounter | None |
Counts tokens for the trigger and the recent policy; an
|
summary_prompt | str |
Instructions for the summarizer. |
summary_message_factory | Callable[[str], BaseMessage] | None |
Builds the summary message; a |
provide_tool | bool |
Return a |
ModelProviderError |
From |
GraphConfigError |
From |
Methods
before_node(ctx)¶
Remember which messages the node's stored input holds.
before_node(ctx)¶before_node(ctx) -> None
GraphConfigError |
If the graph's state schema does not declare |
async before_model(ctx)¶
Summarize the request's older stored messages when the trigger fires.
async before_model(ctx)¶async before_model(ctx) -> Replacement | None
Replacement or None |
The request with the summary, or |
ModelProviderError |
If the summarizer returns no text. |
after_node(ctx)¶
Add the summary edits to the node's update.
after_node(ctx)¶after_node(ctx) -> Replacement | None
Replacement or None |
The update with the edits, or |
on_error(ctx, error)¶
Forget the node's pending summary.
on_error(ctx, error)¶on_error(ctx, error) -> None
tools()¶
Return this instance's summarize_context when provide_tool is set.
tools()¶tools() -> tuple[Tool, ...]
async summarize_state(state)¶
Summarize the messages of a state without changing it.
async summarize_state(state)¶async summarize_state(state) -> SummarizationResult
state | Any | |
GraphConfigError |
If |
SummarizationResult¶
SummarizationResult(*, summary, original_message_count, summarized_message_count, kept_message_count, token_count=None, reason)
Result of the summarize_context tool.
summary | str |
The summary; empty when no older message was left to summarize. |
original_message_count | int |
Messages before summarizing. |
summarized_message_count | int |
Older messages the summary replaces. |
kept_message_count | int |
Recent messages kept as they are. |
token_count | int | None |
Tokens counted by the trigger; |
reason | str |
The trigger's |
Triggers¶
SummarizationTrigger¶
Protocol that decides when to summarize.
Methods
should_summarize(messages, token_counter)¶
Decide whether the messages should be summarized.
should_summarize(messages, token_counter)¶should_summarize(messages, token_counter) -> SummarizationDecision
messages | list[BaseMessage] | |
token_counter | TokenCounter | |
MessageCountTrigger¶
MessageCountTrigger(*, max_messages)
Summarize above a number of messages.
max_messages | int |
Message count above which the trigger fires. |
Methods
should_summarize(messages, token_counter)¶
Check the message count against the limit.
should_summarize(messages, token_counter)¶should_summarize(messages, token_counter) -> SummarizationDecision
TokenLimitTrigger¶
TokenLimitTrigger(*, max_input_tokens, threshold_ratio=0.8)
Summarize above a share of the model's input limit.
max_input_tokens | int |
The model's input limit. |
threshold_ratio | float |
Share of the limit above which the trigger fires. |
Methods
should_summarize(messages, token_counter)¶
Check the token count against the limit.
should_summarize(messages, token_counter)¶should_summarize(messages, token_counter) -> SummarizationDecision
FixedTokenTrigger¶
FixedTokenTrigger(*, max_tokens)
Summarize above a fixed number of tokens.
max_tokens | int |
Token count above which the trigger fires. |
Methods
should_summarize(messages, token_counter)¶
Check the token count against the limit.
should_summarize(messages, token_counter)¶should_summarize(messages, token_counter) -> SummarizationDecision
SummarizationDecision¶
SummarizationDecision(*, should_summarize, reason, token_count=None, message_count)
Whether to summarize, and why.
should_summarize | bool | |
reason | str |
The check that was made, such as |
token_count | int | None |
Tokens counted; |
message_count | int |
Messages checked. |
Recent messages¶
RecentMessagesPolicy¶
RecentMessagesPolicy(*, keep_recent=20)
Keep the last N messages out of the summary.
keep_recent | int |
Number of messages kept as they are. |
Methods
split(messages, token_counter)¶
Split messages into those to summarize and those to keep.
split(messages, token_counter)¶split(messages, token_counter) -> tuple[list[BaseMessage], list[BaseMessage]]
messages | list[BaseMessage] | |
token_counter | TokenCounter | |
tuple[list, list] |
Older and recent messages. |
RecentTokensPolicy¶
RecentTokensPolicy(*, keep_recent_tokens)
Keep the most recent messages within a token budget.
keep_recent_tokens | int |
Token budget of the messages kept as they are. |
Methods
split(messages, token_counter)¶
Split messages into those to summarize and those to keep.
split(messages, token_counter)¶split(messages, token_counter) -> tuple[list[BaseMessage], list[BaseMessage]]
messages | list[BaseMessage] | |
token_counter | TokenCounter | |
tuple[list, list] |
Older and recent messages. |