fix: normalize stringified tool call arguments on resume#2814
Merged
tusharmath merged 4 commits intomainfrom Apr 3, 2026
Merged
fix: normalize stringified tool call arguments on resume#2814tusharmath merged 4 commits intomainfrom
tusharmath merged 4 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.
Summary
Normalize stringified tool call arguments before request serialization so resumed conversations can be sent back to providers without invalid tool-call payloads.
Context
Some providers can return assistant tool calls whose
argumentsare emitted as stringified JSON instead of structured objects. That becomes a problem when the conversation is resumed and replayed, because downstream request builders expect structured tool arguments and can otherwise send invalid payloads back upstream.Changes
ToolCallArgumentsdeserializationToolCallArguments::normalize()to repair persistedUnparsedtool arguments and wrap unrecoverable values in a fallback objectNormalizeToolCallArgumentsand run it in the orchestrator before provider-specific request conversionkimi-k2p5-turbo-error-dump.jsonresume scenarioKey Implementation Details
The fix is split into two layers:
Parsedvalues immediately.Unparsedarguments. If repair fails, the raw content is preserved in a fallback object so request builders always receive structured JSON.This keeps the fix provider-agnostic while ensuring the outbound request pipeline works for resumed conversations.
Use Cases
patch/readtool calls without sending string payloads back upstreamTesting
cargo test -p forge_domain --test test_kimi_dump_normalization --test test_stringified_tool_calls cargo check -p forge_domain -p forge_app -p forge_repo -p forge_main