{"record":{"id":"7c0eaa35418beced","repo":"eyaltoledano/claude-task-master","slug":"getrequiredapikeyname-must-be-implemented-by-provi","errorCode":null,"errorMessage":"getRequiredApiKeyName must be implemented by provider","messagePattern":"getRequiredApiKeyName must be implemented by provider","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/ai-providers/base-provider.js","lineNumber":285,"sourceCode":"\t\tthrow new Error('getClient must be implemented by provider');\n\t}\n\n\t/**\n\t * Returns if the API key is required\n\t * @abstract\n\t * @returns {boolean} if the API key is required, defaults to true\n\t */\n\tisRequiredApiKey() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Returns the required API key environment variable name\n\t * @abstract\n\t * @returns {string|null} The environment variable name, or null if no API key is required\n\t */\n\tgetRequiredApiKeyName() {\n\t\tthrow new Error('getRequiredApiKeyName must be implemented by provider');\n\t}\n\n\t/**\n\t * Prepares token limit parameter based on model requirements\n\t * @param {string} modelId - The model ID\n\t * @param {number} maxTokens - The maximum tokens value\n\t * @returns {object} Object with either maxTokens or max_completion_tokens\n\t */\n\tprepareTokenParam(modelId, maxTokens) {\n\t\tif (maxTokens === undefined) {\n\t\t\treturn {};\n\t\t}\n\n\t\t// Ensure maxTokens is an integer\n\t\tconst tokenValue = Math.floor(Number(maxTokens));\n\n\t\treturn { maxOutputTokens: tokenValue };\n\t}","sourceCodeStart":267,"sourceCodeEnd":303,"githubUrl":"https://github.com/eyaltoledano/claude-task-master/blob/c0c98d367c55296bfe69e65680625b6db437af02/src/ai-providers/base-provider.js#L267-L303","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\nclass MyProvider extends BaseAIProvider { /* missing getRequiredApiKeyName */ }\n// after\nclass MyProvider extends BaseAIProvider {\n  getRequiredApiKeyName() { return 'MY_PROVIDER_API_KEY'; }\n}","handlingStrategy":"type-guard","validationCode":"function checkApiKeyName(provider) {\n  if (typeof provider.getRequiredApiKeyName !== 'function' || BaseAIProvider.prototype.getRequiredApiKeyName === provider.getRequiredApiKeyName) {\n    throw new Error('Provider does not implement getRequiredApiKeyName');\n  }\n}","typeGuard":"function implementsApiKeyName(provider) {\n  return typeof provider?.getRequiredApiKeyName === 'function' &&\n    provider.getRequiredApiKeyName !== BaseAIProvider.prototype.getRequiredApiKeyName;\n}","tryCatchPattern":"try {\n  const keyName = provider.getRequiredApiKeyName();\n} catch (e) {\n  if (e.message === 'getRequiredApiKeyName must be implemented by provider') {\n    throw new Error('Provider subclass must override getRequiredApiKeyName()');\n  }\n  throw e;\n}","preventionTips":["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"],"tags":["abstract-method","subclassing","api-key"],"backgroundTag":"unimplemented-abstract-method","analyzedSha":"c0c98d367c55296bfe69e65680625b6db437af02","analyzedAt":"2026-08-29T02:56:26.071Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}