eyaltoledano/claude-task-master · error · Error
getRequiredApiKeyName must be implemented by provider
Error message
getRequiredApiKeyName must be implemented by provider
What it means
BaseAIProvider.getRequiredApiKeyName is an abstract method that each provider must implement to return the name of the API key environment variable it needs (or null if none). This throw indicates the method was called on a provider class that did not override it.
Source
Thrown at src/ai-providers/base-provider.js:285
throw new Error('getClient must be implemented by provider');
}
/**
* Returns if the API key is required
* @abstract
* @returns {boolean} if the API key is required, defaults to true
*/
isRequiredApiKey() {
return true;
}
/**
* Returns the required API key environment variable name
* @abstract
* @returns {string|null} The environment variable name, or null if no API key is required
*/
getRequiredApiKeyName() {
throw new Error('getRequiredApiKeyName must be implemented by provider');
}
/**
* Prepares token limit parameter based on model requirements
* @param {string} modelId - The model ID
* @param {number} maxTokens - The maximum tokens value
* @returns {object} Object with either maxTokens or max_completion_tokens
*/
prepareTokenParam(modelId, maxTokens) {
if (maxTokens === undefined) {
return {};
}
// Ensure maxTokens is an integer
const tokenValue = Math.floor(Number(maxTokens));
return { maxOutputTokens: tokenValue };
}View on GitHub (pinned to c0c98d367c)
Solutions
- Override getRequiredApiKeyName() in the subclass to return the env var name (e.g. 'MY_PROVIDER_API_KEY') or null
- Verify you are instantiating the intended concrete provider class
- For built-in providers, upgrade the library if a provider is missing this implementation
Example fix
// before
class MyProvider extends BaseAIProvider { /* missing getRequiredApiKeyName */ }
// after
class MyProvider extends BaseAIProvider {
getRequiredApiKeyName() { return 'MY_PROVIDER_API_KEY'; }
} Defensive patterns
Strategy: type-guard
Validate before calling
function checkApiKeyName(provider) {
if (typeof provider.getRequiredApiKeyName !== 'function' || BaseAIProvider.prototype.getRequiredApiKeyName === provider.getRequiredApiKeyName) {
throw new Error('Provider does not implement getRequiredApiKeyName');
}
} Type guard
function implementsApiKeyName(provider) {
return typeof provider?.getRequiredApiKeyName === 'function' &&
provider.getRequiredApiKeyName !== BaseAIProvider.prototype.getRequiredApiKeyName;
} Try / catch
try {
const keyName = provider.getRequiredApiKeyName();
} catch (e) {
if (e.message === 'getRequiredApiKeyName must be implemented by provider') {
throw new Error('Provider subclass must override getRequiredApiKeyName()');
}
throw e;
} Prevention
- Override getRequiredApiKeyName in every concrete provider subclass
- Include provider instantiation in unit tests so missing overrides surface early
- Prefer extending existing concrete providers over the abstract base
When it happens
Trigger: Calling provider.getRequiredApiKeyName() on a custom/incomplete subclass of BaseAIProvider that hasn't implemented the method, e.g. during config validation or when checking whether an API key is required before generating.
Common situations: Building tooling that introspects providers for required env vars; a newly added provider missing the override; using object composition that inherited the base implementation instead of a concrete provider's.
Related errors
- getClient must be implemented by provider
- Required API key ${envVarName} for provider '${providerName}
- ${lastCleanErrorMessage}
- Azure API key is required
- ${this.name} API key is required
AI-assisted analysis of eyaltoledano/claude-task-master@c0c98d367c (2026-08-29).
Data as JSON: /api/errors/7c0eaa35418beced.
Report an issue: GitHub.