n8n-io/n8n · error · Error
Unknown model discovery provider: "${provider}"
Error message
Unknown model discovery provider: "${provider}" What it means
listModelsForProvider looks up the provider name in the fixed MODEL_DISCOVERY_PROVIDERS registry (anthropic, cohere, deepseek, google, groq, mistral, nvidia, openai, openrouter, vercel, xai). A provider string not in that map has no list-models implementation, so it throws rather than calling undefined. Use isModelDiscoveryProvider() to check membership without throwing.
Source
Thrown at packages/@n8n/ai-utilities/src/model-discovery/index.ts:49
mistral: listMistralModels,
nvidia: listNvidiaModels,
openai: listOpenAiModels,
openrouter: listOpenRouterModels,
vercel: listVercelModels,
xai: listXaiModels,
};
export function isModelDiscoveryProvider(provider: string): boolean {
return provider in MODEL_DISCOVERY_PROVIDERS;
}
export async function listModelsForProvider(
provider: string,
options: ListModelsOptions,
): Promise<ProviderModel[]> {
const listModels = MODEL_DISCOVERY_PROVIDERS[provider];
if (!listModels) {
throw new Error(`Unknown model discovery provider: "${provider}"`);
}
return await listModels(options);
}
export { listAnthropicModels } from './providers/anthropic';
export { listCohereModels } from './providers/cohere';
export { listDeepSeekModels } from './providers/deepseek';
export { listGoogleModels } from './providers/google';
export { listGroqModels } from './providers/groq';
export { listMistralModels } from './providers/mistral';
export { listNvidiaModels } from './providers/nvidia';
export {
isOpenAiCustomEndpoint,
listOpenAiModels,
shouldIncludeOpenAiModel,
} from './providers/openai';
export { listOpenRouterModels } from './providers/openrouter';
export { listVercelModels } from './providers/vercel';View on GitHub (pinned to 5ac6606e81)
Solutions
- Use one of the supported keys: anthropic, cohere, deepseek, google, groq, mistral, nvidia, openai, openrouter, vercel, xai.
- Guard with isModelDiscoveryProvider(provider) before calling listModelsForProvider, and surface a controlled error to the UI.
- Trim/normalize the provider string (lowercase, strip whitespace) before lookup.
Example fix
// before
listModelsForProvider('Anthropic', opts); // wrong case
// after
const p = provider.trim().toLowerCase();
if (!isModelDiscoveryProvider(p)) throw new Error(`Unsupported: ${p}`);
await listModelsForProvider(p, opts); Defensive patterns
Strategy: validation
Validate before calling
import { isModelDiscoveryProvider } from '@n8n/ai-utilities/model-discovery';
const provider = raw.trim().toLowerCase();
if (!isModelDiscoveryProvider(provider)) {
throw new Error(`Unsupported provider '${raw}'. Supported: anthropic, openai, google, groq, mistral, cohere, deepseek, nvidia, openrouter, vercel, xai`);
} Type guard
import { isModelDiscoveryProvider } from '@n8n/ai-utilities/model-discovery';
// isModelDiscoveryProvider(provider: string): boolean is itself the guard Prevention
- Always call isModelDiscoveryProvider() before listModelsForProvider().
- Normalize provider strings (trim + lowercase) at the input boundary.
- Drive the provider dropdown from Object.keys(MODEL_DISCOVERY_PROVIDERS) so UI and registry can't drift.
When it happens
Trigger: Passing a misspelled or unsupported provider id (e.g. 'anthropic ' with trailing space, 'Azure', 'huggingface'); a typo in config; a provider id from a newer/older version not present in this build.
Common situations: User-selected provider in a model dropdown doesn't match the registry key; copy-paste typos; a custom provider that isn't wired into MODEL_DISCOVERY_PROVIDERS.
Related errors
- Failed to list ${provider} models (status ${response.status}
- Cannot embed empty or undefined text
- Documents must be an array
- Cannot decrease maxIterations when resuming a run. Expected
- Checkpoint for runId ${this.runId} has pending tool calls —
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/220e7ada72b8a8de.
Report an issue: GitHub.