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

  1. Use one of the supported keys: anthropic, cohere, deepseek, google, groq, mistral, nvidia, openai, openrouter, vercel, xai.
  2. Guard with isModelDiscoveryProvider(provider) before calling listModelsForProvider, and surface a controlled error to the UI.
  3. 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

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


AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12). Data as JSON: /api/errors/220e7ada72b8a8de. Report an issue: GitHub.