eyaltoledano/claude-task-master · error

Unknown provider '${providerName}' for API key resolution.

Error message

Unknown provider '${providerName}' for API key resolution.

What it means

_resolveApiKey in the unified AI services layer looks up a provider instance by name before resolving its API key. If the name does not match any registered provider, it throws immediately. This guards against silently continuing with an unrecognized provider string from config or CLI flags.

Source

Thrown at scripts/modules/ai-services-unified.js:385

		projectId,
		location,
		...(credentials && { credentials })
	};
}

/**
 * Internal helper to resolve the API key for a given provider.
 * @param {string} providerName - The name of the provider (lowercase).
 * @param {object|null} session - Optional MCP session object.
 * @param {string|null} projectRoot - Optional project root path for .env fallback.
 * @returns {string|null} The API key or null if not found/needed.
 * @throws {Error} If a required API key is missing.
 */
function _resolveApiKey(providerName, session, projectRoot = null) {
	// Get provider instance
	const provider = _getProvider(providerName);
	if (!provider) {
		throw new Error(
			`Unknown provider '${providerName}' for API key resolution.`
		);
	}

	// All providers must implement getRequiredApiKeyName()
	const envVarName = provider.getRequiredApiKeyName();

	// If envVarName is null (like for MCP), return null directly
	if (envVarName === null) {
		return null;
	}

	const apiKey = resolveEnvVariable(envVarName, session, projectRoot);

	// Special handling for providers that can use alternative auth or no API key
	if (!provider.isRequiredApiKey()) {
		return apiKey || null;
	}

View on GitHub (pinned to c0c98d367c)

Solutions

  1. Use an exact, supported provider name (e.g. 'openai', 'anthropic', 'google', 'perplexity', 'xai', 'ollama', 'openrouter').
  2. Check `task-master models` list/available providers to see valid names.
  3. Trim whitespace and fix casing in the config/flag supplying the provider name.
  4. If upgrading from an older version, migrate any renamed provider IDs in your config.

Example fix

// before
await generateTextService({ providerName: 'OpenAI ', ... }); // unknown provider
// after
await generateTextService({ providerName: 'openai', ... }); // exact registered name
Defensive patterns

Strategy: validation

Validate before calling

const SUPPORTED = ['openai','anthropic','google','perplexity','xai','ollama','openrouter'];
if (!SUPPORTED.includes(String(providerName).trim())) {
  throw new Error(`Unsupported provider "${providerName}". Valid: ${SUPPORTED.join(', ')}`);
}

Try / catch

try {
  const result = await generateTextService({ providerName, ... });
} catch (e) {
  if (/Unknown provider/.test(e.message)) {
    console.error(`Provider "${providerName}" not recognized; run 'task-master models' to list valid providers.`);
  } else throw e;
}

Prevention

When it happens

Trigger: Calling an AI service (or _unifiedServiceRunner) with provider='openai ' (typo/whitespace), 'gpt4', 'anthropic-' or any name not returned by _getProvider — often from a misspelled --provider flag or a stale config entry.

Common situations: Typos in CLI/model config, renaming between supported providers across versions (old names no longer registered), casing mismatches, or trailing whitespace from env/config parsing.

Related errors


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