alibaba/spring-ai-alibaba · error · IllegalArgumentException
unsupported mode: ${metadata.getMode()}
Error message
unsupported mode: ${metadata.getMode()} What it means
Thrown by AbstractDSLAdapter.importDSL when the imported DSL's metadata mode is neither the workflow nor chatbot mode. The adapter can only materialize specs for those two modes; any other mode string in the DSL is rejected.
Source
Thrown at spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/builder/generator/service/dsl/AbstractDSLAdapter.java:64
protected NodeDataConverter<? extends NodeData> getNodeDataConverter(NodeType nodeType) {
return nodeDataConverters.stream()
.filter(converter -> converter.supportNodeType(nodeType))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("invalid node type " + nodeType));
}
@Override
public App importDSL(String dsl) {
log.info("dsl importing: {}", dsl);
Map<String, Object> data = getSerializer().load(dsl);
validateDSLData(data);
Map<String, Object> immutableData = Map.copyOf(data);
AppMetadata metadata = mapToMetadata(immutableData);
Object spec = switch (metadata.getMode()) {
case AppMetadata.WORKFLOW_MODE -> mapToWorkflow(immutableData);
case AppMetadata.CHATBOT_MODE -> mapToChatBot(immutableData);
default -> throw new IllegalArgumentException("unsupported mode: " + metadata.getMode());
};
App app = new App(metadata, spec);
log.info("App imported:{}", app);
return app;
}
@Override
public String exportDSL(App app) {
log.info("App exporting: \n{}", app);
AppMetadata metadata = app.getMetadata();
Map<String, Object> metaMap = metadataToMap(metadata);
Map<String, Object> specMap;
switch (metadata.getMode()) {
case AppMetadata.WORKFLOW_MODE -> specMap = workflowToMap((Workflow) app.getSpec());
case AppMetadata.CHATBOT_MODE -> specMap = chatbotToMap((ChatBot) app.getSpec());
default -> throw new IllegalArgumentException("unsupported mode: " + metadata.getMode());
}
Map<String, Object> data = Stream.concat(metaMap.entrySet().stream(), specMap.entrySet().stream())View on GitHub (pinned to f82da0b50f)
Solutions
- Ensure the DSL's mode field is "workflow" or "chatbot"
- Re-export the app in a supported mode from the source platform
- Check the mode key wasn't corrupted or renamed in a hand edit
Example fix
// before # dsl metadata mode: agent-chat // after mode: workflow
Defensive patterns
Strategy: validation
Validate before calling
Object mode = data.get("mode"); if (!AppMetadata.WORKFLOW_MODE.equals(mode) && !AppMetadata.CHATBOT_MODE.equals(mode)) { throw new IllegalArgumentException("unsupported dsl mode: " + mode); } Try / catch
try { adapter.importDSL(dsl); } catch (IllegalArgumentException e) { /* show 'only workflow/chatbot DSL supported' to user */ } Prevention
- Only import DSL exported from workflow or chatbot apps
- Sanity-check DSL metadata before import
- Handle agent apps with a dedicated adapter
When it happens
Trigger: Importing a DSL file whose root metadata 'mode' field is 'agent', 'completion', or missing/misspelled, then hitting the switch's default branch.
Common situations: Dify DSLs of agent/completion apps, DSLs edited or truncated so the mode field is wrong, version skew between exporter and importer.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- Not support dslValue: [${dslValue}] for type: [${variableTyp
- Unsupported logical operator type: ${value}
- Invalid write mode: ${dslValue}
- unsupported app mode: ${param.getMode()}
- invalid agent dsl: data is null
AI-assisted analysis of alibaba/spring-ai-alibaba@f82da0b50f (2026-09-09).
Data as JSON: /api/errors/dd1a4bce5c69bd98.
Report an issue: GitHub.