{"record":{"id":"0128842040aafea8","repo":"alibaba/spring-ai-alibaba","slug":"invalid-params-012884","errorCode":"INVALID_PARAMS","errorMessage":"can not find published component: + code","messagePattern":"can not find published component: \\+ code","errorType":"error_code","errorClass":"BizException","httpStatus":null,"severity":"warning","filePath":"spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-core/src/main/java/com/alibaba/cloud/ai/studio/core/base/manager/AppComponentManager.java","lineNumber":266,"sourceCode":"\t\t}\n\t\tString config = appComponent.getConfig();\n\t\tif (config != null) {\n\t\t\treturn JsonUtils.fromJson(config, AppComponentConfig.class);\n\t\t}\n\t\treturn null;\n\n\t}\n\n\tpublic HashMap<String, ToolCallSchema> getToolCallSchema(List<String> codes) {\n\t\tif (CollectionUtils.isEmpty(codes)) {\n\t\t\treturn null;\n\t\t}\n\t\tHashMap<String, ToolCallSchema> toolCallSchemas = new HashMap<>();\n\t\tfor (String code : codes) {\n\t\t\tAppComponent appComponent = appComponentService.getAppComponentByCode(code,\n\t\t\t\t\tAppComponentStatusEnum.Published.getCode());\n\t\t\tif (appComponent == null) {\n\t\t\t\tthrow new BizException(ErrorCode.INVALID_PARAMS.toError(\"component_code\",\n\t\t\t\t\t\t\"can not find published component: \" + code));\n\t\t\t}\n\n\t\t\tAppComponentConfig appComponentConfig = getAppComponentInputConfig(appComponent);\n\t\t\tToolCallSchema toolCallSchema = new ToolCallSchema();\n\t\t\ttoolCallSchema.setName(appComponent.getName());\n\t\t\ttoolCallSchema.setDescription(appComponent.getDescription());\n\t\t\tAppComponentConfig.Input input = appComponentConfig.getInput();\n\t\t\tInputSchema inputSchema = new InputSchema();\n\t\t\ttoolCallSchema.setInputSchema(inputSchema);\n\t\t\tMap<String, Object> properties = new HashMap<>();\n\t\t\tList<String> required = new ArrayList<>();\n\t\t\tinputSchema.setProperties(properties);\n\t\t\tinputSchema.setRequired(required);\n\t\t\tfor (AppComponentConfig.UserParams userParam : input.getUserParams()) {\n\t\t\t\tif (CollectionUtils.isNotEmpty(userParam.getParams())) {\n\t\t\t\t\tfor (AppComponentConfig.Params param : userParam.getParams()) {\n\t\t\t\t\t\tif (Objects.equals(param.getSource(), APIPluginValueSourceEnum.BIZ.getCode())) {","sourceCodeStart":248,"sourceCodeEnd":284,"githubUrl":"https://github.com/alibaba/spring-ai-alibaba/blob/f82da0b50f35744c13968191be2b1cd2452ef550/spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-core/src/main/java/com/alibaba/cloud/ai/studio/core/base/manager/AppComponentManager.java#L248-L284","documentation":"HumanInTheLoopHook.validateFeedback() requires that every tool call which needed approval has a matching ToolFeedback entry (matched by tool name and call id). If a pending call has no feedback, validation returns false, the interrupt stays active, and this warning explains which tool/id is still awaiting human input.","triggerScenarios":"interrupt() is called to decide whether to resume; one of toolCallsNeedingApproval has no entry in the provided InterruptionMetadata.ToolFeedback list whose getName()/getId() equal the call's name()/id().","commonSituations":"UI only submitting answers for some of several pending approval requests; id mismatch because the client echoed stale ids from an older interrupt; feedback built by hand without copying call.id(); multiple tool calls in one AssistantMessage but feedback given for one.","solutions":["Provide a ToolFeedback for every pending tool call id in the interrupt metadata","Copy name AND id exactly from the AssistantMessage's tool calls when building feedback","Inspect the persisted InterruptionMetadata to list pending call ids and validate the client payload against it","Regenerate the interrupt (new ids) if the client cached stale ids from a previous run"],"exampleFix":"// before\nList<ToolFeedback> feedback = List.of(new ToolFeedback(\"search\", \"approved\")); // id missing/stale\n// after\nList<ToolFeedback> feedback = pendingCalls.stream()\n    .map(call -> new ToolFeedback(call.name(), call.id(), \"approved\"))\n    .toList(); // one feedback per pending call id","handlingStrategy":"validation","validationCode":"Set<String> pendingIds = toolCallsNeedingApproval.stream().map(AssistantMessage.ToolCall::id).collect(java.util.stream.Collectors.toSet());\nSet<String> answered = toolFeedbacks.stream().map(InterruptionMetadata.ToolFeedback::getId).collect(java.util.stream.Collectors.toSet());\nif (!pendingIds.equals(answered)) throw new IllegalArgumentException(\"Feedback must cover every pending tool id: \" + pendingIds);","typeGuard":"boolean coversAllPending(List<ToolCall> pending, List<ToolFeedback> fb) {\n    return pending.stream().allMatch(c -> fb.stream().anyMatch(f -> c.id().equals(f.getId()) && c.name().equals(f.getName())));\n}","tryCatchPattern":null,"preventionTips":["Always echo both name and id from the interrupt metadata into feedback","Render all pending approvals in the UI so users answer every one","Regenerate interrupt metadata instead of reusing ids across runs"],"tags":["human-in-the-loop","tool-approval","missing-feedback"],"backgroundTag":"missing-required-argument","analyzedSha":"f82da0b50f35744c13968191be2b1cd2452ef550","analyzedAt":"2026-09-09T15:32:42.421Z","contentChangedAt":"2026-09-09T15:32:42.421Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}