{"record":{"id":"220e7ada72b8a8de","repo":"n8n-io/n8n","slug":"unknown-model-discovery-provider-provider","errorCode":null,"errorMessage":"Unknown model discovery provider: \"${provider}\"","messagePattern":"Unknown model discovery provider: \"(.+?)\"","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/@n8n/ai-utilities/src/model-discovery/index.ts","lineNumber":49,"sourceCode":"\tmistral: listMistralModels,\n\tnvidia: listNvidiaModels,\n\topenai: listOpenAiModels,\n\topenrouter: listOpenRouterModels,\n\tvercel: listVercelModels,\n\txai: listXaiModels,\n};\n\nexport function isModelDiscoveryProvider(provider: string): boolean {\n\treturn provider in MODEL_DISCOVERY_PROVIDERS;\n}\n\nexport async function listModelsForProvider(\n\tprovider: string,\n\toptions: ListModelsOptions,\n): Promise<ProviderModel[]> {\n\tconst listModels = MODEL_DISCOVERY_PROVIDERS[provider];\n\tif (!listModels) {\n\t\tthrow new Error(`Unknown model discovery provider: \"${provider}\"`);\n\t}\n\treturn await listModels(options);\n}\n\nexport { listAnthropicModels } from './providers/anthropic';\nexport { listCohereModels } from './providers/cohere';\nexport { listDeepSeekModels } from './providers/deepseek';\nexport { listGoogleModels } from './providers/google';\nexport { listGroqModels } from './providers/groq';\nexport { listMistralModels } from './providers/mistral';\nexport { listNvidiaModels } from './providers/nvidia';\nexport {\n\tisOpenAiCustomEndpoint,\n\tlistOpenAiModels,\n\tshouldIncludeOpenAiModel,\n} from './providers/openai';\nexport { listOpenRouterModels } from './providers/openrouter';\nexport { listVercelModels } from './providers/vercel';","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/ai-utilities/src/model-discovery/index.ts#L31-L67","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nlistModelsForProvider('Anthropic', opts); // wrong case\n\n// after\nconst p = provider.trim().toLowerCase();\nif (!isModelDiscoveryProvider(p)) throw new Error(`Unsupported: ${p}`);\nawait listModelsForProvider(p, opts);","handlingStrategy":"validation","validationCode":"import { isModelDiscoveryProvider } from '@n8n/ai-utilities/model-discovery';\nconst provider = raw.trim().toLowerCase();\nif (!isModelDiscoveryProvider(provider)) {\n  throw new Error(`Unsupported provider '${raw}'. Supported: anthropic, openai, google, groq, mistral, cohere, deepseek, nvidia, openrouter, vercel, xai`);\n}","typeGuard":"import { isModelDiscoveryProvider } from '@n8n/ai-utilities/model-discovery';\n// isModelDiscoveryProvider(provider: string): boolean is itself the guard","tryCatchPattern":null,"preventionTips":["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."],"tags":["model-discovery","providers","validation","ai-utilities"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}