conductor-oss/conductor · error · IllegalArgumentException
Unsupported agent framework: '${framework}'. Supported frame
Error message
Unsupported agent framework: '${framework}'. Supported frameworks: ${normalizers.keySet()} What it means
Thrown by NormalizerRegistry.normalize() when the 'framework' parameter does not match any registered AgentConfigNormalizer's frameworkId(). The registry is populated by Spring from all normalizer beans. Supported frameworks are: openai, google_adk, langchain, langgraph, vercel_ai, claude_agent_sdk, skill.
Source
Thrown at agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/normalizer/NormalizerRegistry.java:51
public NormalizerRegistry(List<AgentConfigNormalizer> allNormalizers) {
for (AgentConfigNormalizer n : allNormalizers) {
normalizers.put(n.frameworkId(), n);
}
}
/**
* Normalize a framework-specific raw config into the canonical AgentConfig.
*
* @param framework the framework identifier (e.g. "openai", "google_adk")
* @param rawConfig the raw agent config as deserialized JSON
* @return the normalized AgentConfig
* @throws IllegalArgumentException if the framework is not supported
*/
public AgentConfig normalize(String framework, Map<String, Object> rawConfig) {
AgentConfigNormalizer normalizer = normalizers.get(framework);
if (normalizer == null) {
throw new IllegalArgumentException(
"Unsupported agent framework: '"
+ framework
+ "'. Supported frameworks: "
+ normalizers.keySet());
}
return normalizer.normalize(rawConfig);
}
/** Check whether a given framework is supported. */
public boolean supports(String framework) {
return normalizers.containsKey(framework);
}
}
View on GitHub (pinned to cf7c3e4a8a)
Solutions
- Use one of the exact framework IDs: 'openai', 'google_adk', 'langchain', 'langgraph', 'vercel_ai', 'claude_agent_sdk', or 'skill'.
- Check the error message — it prints the full set of supported framework IDs (normalizers.keySet()).
- If you need a custom framework, implement AgentConfigNormalizer and register it as a Spring @Component.
Example fix
// before
registry.normalize("anthropic", rawConfig);
// after
registry.normalize("claude_agent_sdk", rawConfig); Defensive patterns
Strategy: type-guard
Validate before calling
// Use the registry's own supports() method before calling normalize()
if (!registry.supports(framework)) {
throw new IllegalArgumentException(
"Unsupported framework '" + framework + "'. Supported: "
+ "openai, google_adk, langchain, langgraph, vercel_ai, claude_agent_sdk, skill");
}
AgentConfig normalized = registry.normalize(framework, rawConfig); Type guard
static boolean isSupportedFramework(NormalizerRegistry registry, String framework) {
return framework != null && registry.supports(framework);
}
static final Set<String> KNOWN_FRAMEWORKS = Set.of(
"openai", "google_adk", "langchain", "langgraph",
"vercel_ai", "claude_agent_sdk", "skill"); Try / catch
try {
AgentConfig config = registry.normalize(framework, rawConfig);
} catch (IllegalArgumentException e) {
if (e.getMessage().contains("Unsupported agent framework")) {
// pick the correct framework ID from the error's supported list
}
throw e;
} Prevention
- Always call registry.supports(framework) before normalize() to get a clean error.
- Framework IDs are lowercase with underscores — e.g., 'google_adk' not 'GoogleADK'.
- The error message includes the full set of supported IDs — read it.
When it happens
Trigger: Calling NormalizerRegistry.normalize(framework, rawConfig) with a framework string that is null, misspelled, or not one of the seven registered normalizer IDs. For example framework='open_ai' (with underscore) instead of 'openai', or framework='anthropic' instead of 'claude_agent_sdk'.
Common situations: Using the wrong framework identifier string (underscores vs camelCase, wrong casing), referencing a framework by its vendor name instead of its registered ID, or trying to use a framework whose normalizer is not on the classpath (e.g., a custom normalizer bean wasn't registered with Spring).
Related errors
- SWARM handoff type must be on_tool_result, on_text_mention,
- SWARM handoff target must name a swarm agent: ${handoff.getT
- on_tool_result requires toolName and resultContains
- on_text_mention requires text
- on_condition requires a nonblank taskName
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/db928454871e4238.
Report an issue: GitHub.