Wrap missing primitive tool parameter errors as ToolExecutionException - #6743
Open
arimu1 wants to merge 1 commit into
Open
Wrap missing primitive tool parameter errors as ToolExecutionException#6743arimu1 wants to merge 1 commit into
arimu1 wants to merge 1 commit into
Conversation
When a model omits an argument for a @tool method parameter that is a primitive, Method.invoke threw a raw IllegalArgumentException that escaped callMethod unwrapped. Catch that path and fail earlier in buildMethodArguments with the parameter name so ToolExecutionExceptionProcessor can return the error to the model instead of aborting the chat turn. Fixes spring-projects#6723 Signed-off-by: arimu1 <19286898+arimu1@users.noreply.github.com>
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.
Thank you for taking time to contribute this pull request!
You might have already read the contributor guide, but as a reminder, please make sure to:
git commit -s) per the DCOmainbranch and squash your commitsFor more details, please check the contributor guide.
Thank you upfront!
Fixes #6723
Problem
When the model omits an argument for a
@Toolmethod parameter that is a primitive (boolean,int, …),MethodToolCallbackresolves it tonullandMethod.invokethrows a rawIllegalArgumentException. That exception is not anInvocationTargetException, socallMethoddid not wrap it asToolExecutionException. The failure escaped tool-calling machinery and aborted the entire chat turn instead of being handled byToolExecutionExceptionProcessor.Solution
buildMethodArguments: if a looked-up argument isnulland the parameter type is primitive, throwToolExecutionExceptionwith anIllegalArgumentExceptionthat names the parameter and type (actionable for the model).callMethod: catchIllegalArgumentExceptionfromMethod.invokeand wrap it asToolExecutionException, mirroring the existingInvocationTargetExceptionhandling.Wrapper types (
Boolean,Integer, …) are unchanged: missing values still arrive asnull.Tests
MethodToolCallbackPrimitiveArgumentTests(4 tests):boolean/int→ToolExecutionExceptionwith parameter nameBooleanstill succeeds withnullMethodToolCallbackExceptionHandlingTestandMethodToolCallbackGenericTypesTestResult: 9 tests, 0 failures (Temurin 21). DCO: Signed-off-by present.
Notes
This keeps the fix scoped to the reported
MethodToolCallbackfailure path. Broader “required parameter” enforcement across schema generation and MCP annotations (as discussed on the issue) is left for a follow-up if maintainers want that direction.