fix(langchain): keep tool call / AIMessage pairings when summarizing #9740
+287
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Port of langchain-ai/langchain#34609
Problem
When using agents with tools (like file reading, web search, etc.), the conversation looks like this:
When the conversation gets too long,
SummarizationMiddlewarekicks in to compress older messages. The problem was:If you asked to keep the last 6 messages, you'd get:
The AI's original request to read the files (
[AI]message withtool_calls) was summarized away, but the tool responses remained. This caused the error:Many APIs require that every tool response has a matching tool request. Without the AI message, the tool responses are "orphaned."
The Fix
Now when the cutoff lands on tool messages, we move backward to include the AI message that requested those tools:
The AI message is preserved along with its tool responses, keeping them paired together.
Changes
findSafeCutoffPoint()function that searches backward for matching AIMessage when cutoff lands on ToolMessagefindTokenBasedCutoff()andfindSafeCutoff()to use the new function