fix(ai): preserve providerMetadata through client-side UIMessage pipeline#404
fix(ai): preserve providerMetadata through client-side UIMessage pipeline#404houmark wants to merge 1 commit intoTanStack:mainfrom
providerMetadata through client-side UIMessage pipeline#404Conversation
…line PR TanStack#401 added providerMetadata to ToolCall and ToolCallStartEvent and wired it through the server-side ToolCallManager. However, the client-side pipeline (StreamProcessor → UIMessage → ModelMessage) drops providerMetadata entirely, breaking Gemini 3+ thinking models on multi-turn tool calls. This commit carries providerMetadata through every step: - types.ts: add providerMetadata to ToolCallPart - stream/types.ts: add providerMetadata to InternalToolCallState - stream/message-updaters.ts: accept and forward providerMetadata - stream/processor.ts: pass chunk.providerMetadata into state and parts - messages.ts: include providerMetadata in buildAssistantMessages() and modelMessageToUIMessage() Fixes TanStack#403
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (5)
📝 WalkthroughWalkthroughThis PR threads Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary
PR #401 added
providerMetadatatoToolCallandToolCallStartEventand wired it through the server-sideToolCallManager. However, the client-side pipeline (StreamProcessor→ UIMessage → ModelMessage) dropsproviderMetadataentirely, breaking Gemini 3+ thinking models on multi-turn tool calls.This PR completes the round-trip by carrying
providerMetadatathrough every step of the client-side pipeline.Fixes #403 (follow-up to #216, #401)
Changes (5 files, 26 lines added)
types.tsproviderMetadatatoToolCallPartinterfacestream/types.tsproviderMetadatatoInternalToolCallStatestream/message-updaters.tsproviderMetadatainupdateToolCallPart()stream/processor.tschunk.providerMetadataintoInternalToolCallStateandupdateToolCallPart()inhandleToolCallStartEvent(); include it ingetCompletedToolCalls()messages.tsproviderMetadataontoolCallsinbuildAssistantMessages()(UIMessage → ModelMessage); preserve it inmodelMessageToUIMessage()(ModelMessage → UIMessage)How it works
The data flow is now:
Test plan
preserves thoughtSignature in functionCall parts when sending history back to Gemini) continues to pass (server-side path)Summary by CodeRabbit