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}`, {
errorView on GitHub (pinned to c0c98d367c)
Solutions
- Ensure at least one message with both role and content, e.g., [{ role: 'user', content: 'Hello' }]
- Guard the conversation-building code so an empty history gets a seed message
- 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
- Always seed a conversation with at least one user message
- Validate message shape right after building history, not at call time
- Beware filters that can empty the messages array before a call
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
- Parameter validation failed: ${errors.join('; ')}
- Temperature must be between 0 and 1
- maxTokens must be a finite number greater than 0
- Invalid message format. Each message must have role and cont
- Object name is required for object generation
AI-assisted analysis of eyaltoledano/claude-task-master@c0c98d367c (2026-08-29).
Data as JSON: /api/errors/9bb286706a5022c8.
Report an issue: GitHub.