fix(ai): fix providerExecuted tool approvals being passed to language model twice#14289
Open
felixarntz wants to merge 2 commits intomainfrom
Open
fix(ai): fix providerExecuted tool approvals being passed to language model twice#14289felixarntz wants to merge 2 commits intomainfrom
providerExecuted tool approvals being passed to language model twice#14289felixarntz wants to merge 2 commits intomainfrom
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Background
When a UI message history contains an approved
providerExecutedtool invocation and the server does the standard pattern:the provider receives the same
tool-approval-responsetwice for the sameapprovalIdin one tool message. This can cause downstream providers to reject the prompt as invalid (one approval request must produce exactly one response).Summary
collectToolApprovalsfinds approval responses by reading the last tool message ofinitialMessages. Those responses are already present ininitialMessagesbecauseconvertToModelMessagesplaced them there. BothgenerateTextandstreamTextthen redundantly pushed the same responses intoresponseMessages/initialResponseMessages. When the step computedstepInputMessages = [...initialMessages, ...responseMessages], the approval appeared twice, andconvertToLanguageModelPromptsurfaced both copies inside a single merged tool message.providerExecutedToolApprovalspush ingenerateTextstreamTextManual Verification
In
examples/ai-e2e-next, navigate to/chat/test-openai-responses-mcp-approvaland send"Shorten the link https://ai-sdk.dev/". After approving the MCP tool call, the conversation should complete successfully.To compare before/after, add a
console.logof the prompt passed to the model in the mock or in the route handler. IngenerateText/streamText, you can logstepInputMessages(the variable at the top of thedoloop /streamStepbody) immediately before the language model call and confirm the tool message contains exactly onetool-approval-responseentry after the fix.Checklist
pnpm changesetin the project root)