{"record":{"id":"907b2879086e4b87","repo":"spring-projects/spring-ai","slug":"argumenttype-is-required","errorCode":null,"errorMessage":"argumentType is required","messagePattern":"argumentType is required","errorType":"validation","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"spring-ai-model/src/main/java/org/springframework/ai/tool/augment/AugmentedToolCallbackProvider.java","lineNumber":147,"sourceCode":"\n\t\t/**\n\t\t * Sets whether to remove extra arguments after processing\n\t\t * @param removeExtraArgumentsAfterProcessing true to remove extra arguments\n\t\t * @return this builder\n\t\t */\n\t\tpublic Builder<T> removeExtraArgumentsAfterProcessing(boolean removeExtraArgumentsAfterProcessing) {\n\t\t\tthis.removeExtraArgumentsAfterProcessing = removeExtraArgumentsAfterProcessing;\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Builds the {@link AugmentedToolCallbackProvider} instance.\n\t\t * @return the built instance\n\t\t * @throws IllegalStateException if required fields are not set\n\t\t */\n\t\tpublic AugmentedToolCallbackProvider<T> build() {\n\t\t\tif (this.argumentType == null) {\n\t\t\t\tthrow new IllegalStateException(\"argumentType is required\");\n\t\t\t}\n\t\t\tif (this.argumentConsumer == null) {\n\t\t\t\tthrow new IllegalStateException(\"argumentConsumer is required\");\n\t\t\t}\n\n\t\t\tif (this.delegate != null && this.toolObject != null) {\n\t\t\t\tthrow new IllegalStateException(\"Cannot set both delegate and toolObject\");\n\t\t\t}\n\n\t\t\tif (this.delegate == null && this.toolObject == null) {\n\t\t\t\tthrow new IllegalStateException(\"Either delegate or toolObject must be set\");\n\t\t\t}\n\n\t\t\tif (this.toolObject != null) {\n\t\t\t\treturn new AugmentedToolCallbackProvider<>(this.toolObject, this.argumentType, this.argumentConsumer,\n\t\t\t\t\t\tthis.removeExtraArgumentsAfterProcessing);\n\t\t\t}\n\t\t\telse if (this.delegate != null) { // Redundant if condition to please NullAway","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/spring-projects/spring-ai/blob/98a7beda4f29d80a71c5837eb4053b03a93a46f7/spring-ai-model/src/main/java/org/springframework/ai/tool/augment/AugmentedToolCallbackProvider.java#L129-L165","documentation":"AugmentedToolCallbackProvider.Builder.build() validates required fields before creating the provider. If argumentType was never set it throws IllegalStateException(\"argumentType is required\"), because the provider needs the argument type to generate tool schemas and bind arguments. The argumentConsumer check follows immediately.","triggerScenarios":"Calling AugmentedToolCallbackProvider.builder()...build() without invoking .argumentType(SomeClass.class), or losing the builder value through conditional code paths; argumentType must be set on the builder before build().","commonSituations":"Copied builder snippets that omit argumentType, generic code where the type parameter T wasn't reflected into the builder, or refactoring that removed the argumentType call while keeping argumentConsumer.","solutions":["Call .argumentType(MyArguments.class) on the builder before build()","Also verify .argumentConsumer(...) and .delegate(...) or .toolObject(...) are set as required","Use the typed builder generic consistently so argumentType can be derived/checked at compile time"],"exampleFix":"// before\nvar provider = AugmentedToolCallbackProvider.builder()\n    .argumentConsumer(args -> handle(args))\n    .build();\n// after\nvar provider = AugmentedToolCallbackProvider.builder()\n    .argumentType(MyArgs.class)\n    .argumentConsumer(args -> handle(args))\n    .build();","handlingStrategy":"validation","validationCode":"// Validate builder inputs before build()\nif (argsType == null) throw new IllegalStateException(\"argumentType must be set before build()\");\nif (argsConsumer == null) throw new IllegalStateException(\"argumentConsumer must be set before build()\");","typeGuard":null,"tryCatchPattern":"AugmentedToolCallbackProvider<MyArgs> provider;\ntry {\n    provider = AugmentedToolCallbackProvider.<MyArgs>builder()\n        .argumentType(MyArgs.class)\n        .argumentConsumer(this::handle)\n        .build();\n} catch (IllegalStateException e) {\n    // missing builder field (argumentType/argumentConsumer/etc.)\n    throw new IllegalArgumentException(\"Incomplete AugmentedToolCallbackProvider builder: \" + e.getMessage(), e);\n}","preventionTips":["Always set argumentType first, then argumentConsumer, in builder chains","Centralize provider construction in one factory method","Add a smoke test that builds every provider at startup"],"tags":["spring-ai","builder","missing-argument","configuration"],"backgroundTag":"missing-required-argument","analyzedSha":"98a7beda4f29d80a71c5837eb4053b03a93a46f7","analyzedAt":"2026-09-11T14:15:49.441Z","contentChangedAt":"2026-09-11T14:15:49.441Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}