eyaltoledano/claude-task-master · error
Model "${model}" is not available for provider "${this.getNa
Error message
Model "${model}" is not available for provider "${this.getName()}" What it means
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.
Source
Thrown at packages/tm-core/src/modules/ai/interfaces/ai-provider.interface.ts:312
abstract getName(): string;
abstract getDefaultModel(): string;
abstract isAvailable(): Promise<boolean>;
abstract getProviderInfo(): ProviderInfo;
abstract validateCredentials(): Promise<boolean>;
abstract initialize(): Promise<void>;
abstract close(): Promise<void>;
// Implemented methods with common functionality
getModel(): string {
return this.currentModel;
}
setModel(model: string): void {
const availableModels = this.getAvailableModels();
const modelExists = availableModels.some((m) => m.id === model);
if (!modelExists) {
throw new Error(
`Model "${model}" is not available for provider "${this.getName()}"`
);
}
this.currentModel = model;
}
getAvailableModels(): AIModel[] {
return this.getProviderInfo().models;
}
async getUsageStats(): Promise<ProviderUsageStats | null> {
return this.usageStats;
}
/**
* Initialize usage tracking
*/View on GitHub (pinned to c0c98d367c)
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()
Example fix
// before
provider.setModel('gpt-4-32k');
// after
const ids = provider.getAvailableModels().map(m => m.id);
if (!ids.includes('gpt-4-32k')) {
provider.setModel(provider.getDefaultModel());
} else {
provider.setModel('gpt-4-32k');
} Defensive patterns
Strategy: try-catch
Validate before calling
const available = provider.getAvailableModels().map(m => m.id);
if (!available.includes(modelName)) throw new Error(`Model ${modelName} not offered by ${provider.getName()}; available: ${available.join(', ')}`); Type guard
function isAvailableModel(provider: IAIProvider, model: string): boolean {
return provider.getAvailableModels().some(m => m.id === model);
} Try / catch
try {
provider.setModel(modelName);
} catch (err) {
if (err.message.includes('is not available for provider')) {
console.warn(`${modelName} unavailable, using default`);
provider.setModel(provider.getDefaultModel());
return;
}
throw err;
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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().
Related errors
- AUTHENTICATION_ERROR
- Model '${modelId || 'unknown'}' via provider '${providerName
- Prompt must be a non-empty string
- Prompt cannot be empty or only whitespace
- VALIDATION_ERROR
AI-assisted analysis of eyaltoledano/claude-task-master@c0c98d367c (2026-08-29).
Data as JSON: /api/errors/ba4019f0b9fa6ce0.
Report an issue: GitHub.