{"record":{"id":"ba4019f0b9fa6ce0","repo":"eyaltoledano/claude-task-master","slug":"model-model-is-not-available-for-provider","errorCode":null,"errorMessage":"Model \"${model}\" is not available for provider \"${this.getName()}\"","messagePattern":"Model \"(.+?)\" is not available for provider \"(.+?)\"","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/tm-core/src/modules/ai/interfaces/ai-provider.interface.ts","lineNumber":312,"sourceCode":"\tabstract getName(): string;\n\tabstract getDefaultModel(): string;\n\tabstract isAvailable(): Promise<boolean>;\n\tabstract getProviderInfo(): ProviderInfo;\n\tabstract validateCredentials(): Promise<boolean>;\n\tabstract initialize(): Promise<void>;\n\tabstract close(): Promise<void>;\n\n\t// Implemented methods with common functionality\n\tgetModel(): string {\n\t\treturn this.currentModel;\n\t}\n\n\tsetModel(model: string): void {\n\t\tconst availableModels = this.getAvailableModels();\n\t\tconst modelExists = availableModels.some((m) => m.id === model);\n\n\t\tif (!modelExists) {\n\t\t\tthrow new Error(\n\t\t\t\t`Model \"${model}\" is not available for provider \"${this.getName()}\"`\n\t\t\t);\n\t\t}\n\n\t\tthis.currentModel = model;\n\t}\n\n\tgetAvailableModels(): AIModel[] {\n\t\treturn this.getProviderInfo().models;\n\t}\n\n\tasync getUsageStats(): Promise<ProviderUsageStats | null> {\n\t\treturn this.usageStats;\n\t}\n\n\t/**\n\t * Initialize usage tracking\n\t */","sourceCodeStart":294,"sourceCodeEnd":330,"githubUrl":"https://github.com/eyaltoledano/claude-task-master/blob/c0c98d367c55296bfe69e65680625b6db437af02/packages/tm-core/src/modules/ai/interfaces/ai-provider.interface.ts#L294-L330","documentation":"setModel() on an AI provider checks the requested model ID against getAvailableModels(); if no entry with a matching id exists it throws rather than silently setting a model the provider cannot serve. this.getName() in the message identifies which provider rejected it.","triggerScenarios":"setModel('gpt-5') on a provider exposing only its current catalog; typos or casing mismatches in the model id; passing an Ollama/local model name to a hosted provider (or vice versa); model removed/renamed after a provider SDK upgrade.","commonSituations":"Hardcoded model names in config that no longer exist after updating provider SDKs; copying model names between providers (e.g. Claude id used on a ZAI/Gemini provider); region-restricted models absent from getAvailableModels().","solutions":["Print available ids first: provider.getAvailableModels().map(m => m.id) and use an exact match","Fix the model id string (spelling/case) in your config","Wrap in try/catch and fall back to provider.getDefaultModel()"],"exampleFix":"// before\nprovider.setModel('gpt-4-32k');\n// after\nconst ids = provider.getAvailableModels().map(m => m.id);\nif (!ids.includes('gpt-4-32k')) {\n  provider.setModel(provider.getDefaultModel());\n} else {\n  provider.setModel('gpt-4-32k');\n}","handlingStrategy":"try-catch","validationCode":"const available = provider.getAvailableModels().map(m => m.id);\nif (!available.includes(modelName)) throw new Error(`Model ${modelName} not offered by ${provider.getName()}; available: ${available.join(', ')}`);","typeGuard":"function isAvailableModel(provider: IAIProvider, model: string): boolean {\n  return provider.getAvailableModels().some(m => m.id === model);\n}","tryCatchPattern":"try {\n  provider.setModel(modelName);\n} catch (err) {\n  if (err.message.includes('is not available for provider')) {\n    console.warn(`${modelName} unavailable, using default`);\n    provider.setModel(provider.getDefaultModel());\n    return;\n  }\n  throw err;\n}","preventionTips":["Always enumerate getAvailableModels() before setting a model","Avoid hardcoding model ids in config; make them provider-relative","Re-check model availability after upgrading provider SDKs"],"tags":["ai-provider","configuration","model-validation"],"backgroundTag":"model-not-available","analyzedSha":"c0c98d367c55296bfe69e65680625b6db437af02","analyzedAt":"2026-08-29T02:56:26.071Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}