{"record":{"id":"e61f9a415f51f782","repo":"alibaba/spring-ai-alibaba","slug":"app-spec-is-not-agent","errorCode":null,"errorMessage":"App spec is not Agent","messagePattern":"App spec is not Agent","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/builder/generator/service/dsl/adapters/AgentDSLAdapter.java","lineNumber":56,"sourceCode":"@Component(\"agentDSLAdapter\")\npublic class AgentDSLAdapter implements DSLAdapter {\n\n\tprivate final Serializer serializer;\n\n\tprivate final ObjectMapper objectMapper;\n\n\tprivate final AgentTypeProviderRegistry providerRegistry;\n\n\tpublic AgentDSLAdapter(@Qualifier(\"yaml\") Serializer serializer, AgentTypeProviderRegistry providerRegistry) {\n\t\tthis.serializer = serializer;\n\t\tthis.objectMapper = new ObjectMapper();\n\t\tthis.providerRegistry = providerRegistry;\n\t}\n\n\t@Override\n\tpublic String exportDSL(App app) {\n\t\tif (!(app.getSpec() instanceof Agent agent)) {\n\t\t\tthrow new IllegalArgumentException(\"App spec is not Agent\");\n\t\t}\n\t\tMap<String, Object> body = dumpAgent(agent);\n\t\tbody.put(\"name\", app.getMetadata().getName());\n\t\tbody.put(\"description\", app.getMetadata().getDescription());\n\t\tbody.put(\"mode\", \"agent\");\n\t\treturn serializer.dump(body);\n\t}\n\n\t@Override\n\tpublic App importDSL(String dsl) {\n\t\tMap<String, Object> data = serializer.load(dsl);\n\t\tvalidateDSLData(data);\n\t\tMap<String, Object> root = getAgentRoot(data);\n\t\tif (root == null)\n\t\t\troot = data;\n\n\t\t// 仅解析壳层字段，handle 原样透传\n\t\tAppMetadata metadata = mapToMetadata(data);","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/alibaba/spring-ai-alibaba/blob/f82da0b50f35744c13968191be2b1cd2452ef550/spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/builder/generator/service/dsl/adapters/AgentDSLAdapter.java#L38-L74","documentation":"Thrown by AgentDSLAdapter.exportDSL when the App's spec is not an Agent instance. This adapter serializes only Agent specs; being handed an App with a Workflow or ChatBot spec is an argument-type violation.","triggerScenarios":"Calling AgentDSLAdapter.exportDSL with an App whose spec is a Workflow/ChatBot object, or an App built with a null spec.","commonSituations":"Routing all apps through the agent adapter in shared export code, apps created with mismatched metadata mode and spec, tests constructing App with arbitrary specs.","solutions":["Confirm app.getSpec() instanceof Agent before invoking the agent adapter","Use AbstractDSLAdapter.exportDSL for workflow/chatbot apps","Check that the app's metadata mode ('agent') matches its spec type"],"exampleFix":"// before\nagentDslAdapter.exportDSL(new App(metadata, new Workflow(...)));\n// after\nif (app.getSpec() instanceof Agent) {\n    agentDslAdapter.exportDSL(app);\n}\n","handlingStrategy":"type-guard","validationCode":"if (!(app.getSpec() instanceof Agent)) { throw new IllegalArgumentException(\"use the matching adapter for \" + app.getMetadata().getMode()); }","typeGuard":"boolean isAgentApp(App app) { return app != null && app.getSpec() instanceof Agent; }","tryCatchPattern":"try { agentDslAdapter.exportDSL(app); } catch (IllegalArgumentException e) { /* fall back to AbstractDSLAdapter.exportDSL */ }","preventionTips":["Select adapters by metadata mode, not by call site convenience","Assert spec type matches mode when constructing App objects","Unit-test adapter dispatch for every mode"],"tags":["type-mismatch","dsl-export","agent"],"backgroundTag":"type-mismatch","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"}