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

  1. Ensure the DSL's mode field is "workflow" or "chatbot"
  2. Re-export the app in a supported mode from the source platform
  3. 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

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


AI-assisted analysis of alibaba/spring-ai-alibaba@f82da0b50f (2026-09-09). Data as JSON: /api/errors/dd1a4bce5c69bd98. Report an issue: GitHub.