eyaltoledano/claude-task-master · error · Error

Invalid or empty messages array provided

Error message

Invalid or empty messages array provided

What it means

validateMessages() ensures the messages argument is a non-empty array before calling the AI API. Beyond array-ness, each message must have role and content. Empty or malformed message arrays would otherwise cause confusing downstream provider errors or wasted API calls.

Source

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

			params.temperature !== undefined &&
			(params.temperature < 0 || params.temperature > 1)
		) {
			throw new Error('Temperature must be between 0 and 1');
		}
		if (params.maxTokens !== undefined) {
			const maxTokens = Number(params.maxTokens);
			if (!Number.isFinite(maxTokens) || maxTokens <= 0) {
				throw new Error('maxTokens must be a finite number greater than 0');
			}
		}
	}

	/**
	 * Validates message array structure
	 */
	validateMessages(messages) {
		if (!messages || !Array.isArray(messages) || messages.length === 0) {
			throw new Error('Invalid or empty messages array provided');
		}

		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

View on GitHub (pinned to c0c98d367c)

Solutions

  1. Ensure at least one message with both role and content, e.g., [{ role: 'user', content: 'Hello' }]
  2. Guard the conversation-building code so an empty history gets a seed message
  3. Validate each message has role and content before calling

Example fix

// before
await provider.generateText({ modelId, messages: [] });
// after
const messages = history.length ? history : [{ role: 'user', content: prompt }];
await provider.generateText({ modelId, messages });
Defensive patterns

Strategy: validation

Validate before calling

const valid = Array.isArray(messages) && messages.length > 0 && messages.every(m => m?.role && m?.content);
if (!valid) throw new Error('messages must be a non-empty array of {role, content}');

Type guard

function isValidMessages(msgs) { return Array.isArray(msgs) && msgs.length > 0 && msgs.every(m => typeof m?.role === 'string' && typeof m?.content === 'string' && m.content.length > 0); }

Try / catch

try {
  await provider.generateText({ modelId, messages });
} catch (err) {
  if (err.message === 'Invalid or empty messages array provided') {
    messages = [{ role: 'user', content: prompt }];
  } else throw err;
}

Prevention

When it happens

Trigger: Calling generateText/streamText/streamObject/generateObject with messages = undefined, null, [], a non-array, or an array whose entries lack role or content.

Common situations: Conversation history not initialized before the first call; a filtering step removed all messages; building messages from user input that arrived empty; pushing {content} without role.

Related errors


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