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

  1. Override getRequiredApiKeyName() in the subclass to return the env var name (e.g. 'MY_PROVIDER_API_KEY') or null
  2. Verify you are instantiating the intended concrete provider class
  3. 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

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


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