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
- Use an exact, supported provider name (e.g. 'openai', 'anthropic', 'google', 'perplexity', 'xai', 'ollama', 'openrouter').
- Check `task-master models` list/available providers to see valid names.
- Trim whitespace and fix casing in the config/flag supplying the provider name.
- 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
- Validate provider names against the known list at CLI/config parse time.
- Trim and lowercase provider strings from config/env.
- After upgrading, migrate renamed provider IDs.
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
- MISSING_CONFIGURATION
- INVALID_INPUT
- Required API key ${envVarName} for provider '${providerName}
- User prompt content is missing.
- Parameter validation failed: ${errors.join('; ')}
AI-assisted analysis of eyaltoledano/claude-task-master@c0c98d367c (2026-08-29).
Data as JSON: /api/errors/bd76ca3bd9b098df.
Report an issue: GitHub.