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

  1. Print available ids first: provider.getAvailableModels().map(m => m.id) and use an exact match
  2. Fix the model id string (spelling/case) in your config
  3. 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

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


AI-assisted analysis of eyaltoledano/claude-task-master@c0c98d367c (2026-08-29). Data as JSON: /api/errors/ba4019f0b9fa6ce0. Report an issue: GitHub.