eyaltoledano/claude-task-master · error · Error

API error during

Error message

${this.name} API error during ${operation}: ${errorMessage}

What it means

BaseAIProvider.handleError wraps any error thrown during a provider operation into a normalized Error with the pattern '<ProviderName> API error during <operation>: <original message>'. It is the single catch-path used by generateText, streamText, generateObject and streamObject, so almost any downstream failure (auth, network, bad model, SDK error) surfaces in this form.

Solutions

  1. Read the trailing original message after 'API error during <operation>:' — that is the root cause
  2. Log/check the underlying error: handleError already log('error', ...) with the error object
  3. For auth messages, verify the provider's API key env var; for model errors, verify modelId against provider docs
  4. Add retry with backoff for transient network/rate-limit messages

Example fix

// before
catch (e) { /* vague handling of wrapped error */ }
// after
catch (e) {
  if (e.message.includes('API error during generateText: 401')) {
    // fix credentials
  } else if (/429|rate/i.test(e.message)) {
    // retry with backoff
  }
}
Defensive patterns

Strategy: try-catch

Validate before calling

null

Type guard

null

Try / catch

try {
  await provider.generateText({ messages, modelId });
} catch (e) {
  const wrapped = e.message.startsWith(provider.name + ' API error during ');
  if (wrapped) {
    const rootCause = e.message.split(': ').slice(1).join(': ');
    console.error('Provider op failed:', rootCause);
    // decide retry vs abort based on rootCause (429/timeout -> retry; 401 -> fix creds)
  } else throw e;
}

Prevention

When it happens

Trigger: Any exception thrown inside the try block of generateText/streamText/generateObject/streamObject: SDK client errors, network failures, invalid model IDs, API 4xx/5xx responses, or errors rethrown from validateParams/validateMessages within those methods.

Common situations: Expired or wrong API keys, rate limits (429), nonexistent model IDs after a provider renamed models, network timeouts, DNS failures, or a provider SDK throwing on malformed requests.

Related errors


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

Appendix: source

Thrown at src/ai-providers/base-provider.js:257

		for (const msg of messages) {
			if (!msg.role || !msg.content) {
				throw new Error(
					'Invalid message format. Each message must have role and content'
				);
			}
		}
	}

	/**
	 * Common error handler
	 */
	handleError(operation, error) {
		const errorMessage = error.message || 'Unknown error occurred';
		log('error', `${this.name} ${operation} failed: ${errorMessage}`, {
			error
		});
		throw new Error(
			`${this.name} API error during ${operation}: ${errorMessage}`
		);
	}

	/**
	 * Creates and returns a client instance for the provider
	 * @abstract
	 */
	getClient(params) {
		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() {

View on GitHub (pinned to c0c98d367c)