.NET: Fix AG-UI tool message ordering for multi-turn tool calls (#2699) #2700
+272
−2
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.
Motivation and Context
Why is this change required?
AG-UI agents fail on the second turn after executing multiple tool calls, because the message history sent back to the provider violates the OpenAI tools protocol. The model rejects the request with a 400 error.
What problem does it solve?
When AG-UI streams tool calls, it emits several assistant messages with ToolCalls, followed later by several tool messages with results. When replayed in this order, the provider complains that assistant messages containing tool_calls are not immediately followed by tool responses. This PR ensures the backend normalizes the ordering so that each assistant tool call is directly followed by its corresponding tool result.
What scenario does it contribute to?
Enables multi-turn conversations involving multiple tool calls, which is a core scenario for agents. Without this fix, any multi-tool-turn conversation breaks on the next user turn.
Linked issue:
Fixes #2699
Description
This change introduces a preprocessing step inside MapAGUI that reorders incoming AGUIMessage instances before they are mapped into ChatMessages.