{"record":{"id":"6a5588cfd539e35d","repo":"alibaba/nacos","slug":"400-6a5588","errorCode":"400","errorMessage":"Unknown AI request type: %s","messagePattern":"Unknown AI request type: (.+?)","errorType":"exception","errorClass":"NacosException","httpStatus":null,"severity":"error","filePath":"client/src/main/java/com/alibaba/nacos/client/ai/remote/AiGrpcClient.java","lineNumber":868,"sourceCode":"            if (request instanceof AbstractAgentClientRpcRequest) {\n                AbstractAgentClientRpcRequest agentRequest =\n                    (AbstractAgentClientRpcRequest) request;\n                request.putAllHeader(getSecurityHeaders(agentRequest.extractNamespaceId(),\n                    agentRequest.extractAgentName()));\n            } else if (request instanceof AbstractMcpRequest) {\n                AbstractMcpRequest mcpRequest = (AbstractMcpRequest) request;\n                request.putAllHeader(\n                    getSecurityHeaders(mcpRequest.getNamespaceId(), mcpRequest.getMcpName()));\n            } else if (request instanceof AbstractAgentRequest) {\n                AbstractAgentRequest agentRequest = (AbstractAgentRequest) request;\n                request.putAllHeader(getSecurityHeaders(agentRequest.getNamespaceId(),\n                    agentRequest.getAgentName()));\n            } else if (request instanceof AbstractPromptRequest) {\n                AbstractPromptRequest promptRequest = (AbstractPromptRequest) request;\n                request.putAllHeader(getSecurityHeaders(promptRequest.getNamespaceId(),\n                    promptRequest.getPromptKey()));\n            } else {\n                throw new NacosException(400,\n                    String.format(\"Unknown AI request type: %s\",\n                        request.getClass().getSimpleName()));\n            }\n            \n            response = requestTimeout < 0 ? rpcClient.request(request)\n                : rpcClient.request(request, requestTimeout);\n            if (ResponseCode.SUCCESS.getCode() != response.getResultCode()) {\n                // If the 403 login operation is triggered, refresh the accessToken of the client\n                int errorCode = request instanceof AbstractAgentClientRpcRequest\n                    ? mapAgentClientErrorCode(response.getErrorCode())\n                    : response.getErrorCode();\n                if (NacosException.NO_RIGHT == errorCode) {\n                    securityProxy.reLogin();\n                }\n                throw new NacosException(errorCode, response.getMessage());\n            }\n            if (responseClass.isAssignableFrom(response.getClass())) {\n                return (T) response;","sourceCodeStart":850,"sourceCodeEnd":886,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/client/src/main/java/com/alibaba/nacos/client/ai/remote/AiGrpcClient.java#L850-L886","documentation":"Thrown by AiGrpcClient.requestToServer when the Request object is not one of the recognized AI request supertypes (AbstractAgentClientRpcRequest, AbstractMcpRequest, AbstractAgentRequest, AbstractPromptRequest). Because security headers cannot be attached for an unrecognized type, the request is rejected with code 400 before being sent. This is essentially an internal-programmer error indicating a new/unsupported request type reached the dispatcher.","triggerScenarios":"Passing a Request subclass that the client does not know how to categorize - e.g. a custom Request type, a new request class not extending one of the recognized abstract AI request bases, or a non-AI Request leaking into the AI request path.","commonSituations":"Custom request subclass introduced without extending AbstractAgentRequest/AbstractPromptRequest/etc.; cross-wiring a config/naming Request into the AI client; SDK version mismatch where a newer request type is sent through an older client.","solutions":["Ensure custom AI request types extend one of the recognized abstract bases (AbstractAgentRequest, AbstractPromptRequest, AbstractMcpRequest, AbstractAgentClientRpcRequest).","Avoid dispatching non-AI requests through AiGrpcClient.requestToServer.","Align client and API/SDK versions so the request hierarchy is consistent."],"exampleFix":"// before\nclass MyRequest extends Request { ... } // unrecognized\n// after\nclass MyRequest extends AbstractAgentRequest { ... } // categorized; namespaceId/agentName available","handlingStrategy":"type-guard","validationCode":"if (!(request instanceof AbstractAgentRequest)\n    && !(request instanceof AbstractPromptRequest)\n    && !(request instanceof AbstractMcpRequest)\n    && !(request instanceof AbstractAgentClientRpcRequest)) {\n    throw new IllegalArgumentException(\"Unsupported AI request type: \" + request.getClass());\n}","typeGuard":"request instanceof AbstractAgentRequest\n    || request instanceof AbstractPromptRequest\n    || request instanceof AbstractMcpRequest\n    || request instanceof AbstractAgentClientRpcRequest","tryCatchPattern":null,"preventionTips":["Extend one of the recognized abstract AI request bases for custom request types.","Do not route non-AI requests through AiGrpcClient.requestToServer.","Keep request hierarchy and client versions aligned."],"tags":["ai","grpc","request-type","validation","programmer-error"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}