{"record":{"id":"2dfc98bda3504e96","repo":"eyaltoledano/claude-task-master","slug":"invalid-message-format-each-message-must-have-rol","errorCode":null,"errorMessage":"Invalid message format. Each message must have role and content","messagePattern":"Invalid message format\\. Each message must have role and content","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/ai-providers/base-provider.js","lineNumber":242,"sourceCode":"\t\tif (params.maxTokens !== undefined) {\n\t\t\tconst maxTokens = Number(params.maxTokens);\n\t\t\tif (!Number.isFinite(maxTokens) || maxTokens <= 0) {\n\t\t\t\tthrow new Error('maxTokens must be a finite number greater than 0');\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Validates message array structure\n\t */\n\tvalidateMessages(messages) {\n\t\tif (!messages || !Array.isArray(messages) || messages.length === 0) {\n\t\t\tthrow new Error('Invalid or empty messages array provided');\n\t\t}\n\n\t\tfor (const msg of messages) {\n\t\t\tif (!msg.role || !msg.content) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Invalid message format. Each message must have role and content'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Common error handler\n\t */\n\thandleError(operation, error) {\n\t\tconst errorMessage = error.message || 'Unknown error occurred';\n\t\tlog('error', `${this.name} ${operation} failed: ${errorMessage}`, {\n\t\t\terror\n\t\t});\n\t\tthrow new Error(\n\t\t\t`${this.name} API error during ${operation}: ${errorMessage}`\n\t\t);\n\t}","sourceCodeStart":224,"sourceCodeEnd":260,"githubUrl":"https://github.com/eyaltoledano/claude-task-master/blob/c0c98d367c55296bfe69e65680625b6db437af02/src/ai-providers/base-provider.js#L224-L260","documentation":"This error is thrown by BaseAIProvider.validateMessages when a message in the messages array is missing either a 'role' or a 'content' property. The base provider requires every message to be a well-formed {role, content} object before it is forwarded to the underlying AI SDK. It guards all four entry points: generateText, streamText, generateObject and streamObject.","triggerScenarios":"Calling generateText/streamText/generateObject/streamObject with a messages array where at least one element lacks 'role' or 'content' (or has them set to empty string/null/undefined). E.g. messages: [{ role: 'user' }] or messages: [{ content: 'hi' }].","commonSituations":"Building message arrays programmatically and pushing partial objects; older message formats from a different library that use e.g. {author, text}; conditionally-built prompts where an assistant message got an empty content string after filtering; forgetting to include content on system messages.","solutions":["Ensure every message object has both a truthy 'role' ('system'|'user'|'assistant') and truthy 'content' string","Filter out incomplete messages before calling: messages.filter(m => m.role && m.content)","Fix code that constructs messages so empty content yields either omission of the message or placeholder content"],"exampleFix":"// before\nconst messages = [{ role: 'user', content: userText }, { role: 'assistant', content: '' }];\nawait provider.generateText({ messages });\n// after\nconst messages = [{ role: 'user', content: userText }, { role: 'assistant', content: '' }]\n  .filter(m => m.role && m.content);\nawait provider.generateText({ messages });","handlingStrategy":"validation","validationCode":"function validateMessagesBeforeCall(messages) {\n  if (!Array.isArray(messages) || messages.length === 0) throw new Error('messages must be a non-empty array');\n  messages.forEach((m, i) => {\n    if (!m || typeof m !== 'object' || !m.role || !m.content) throw new Error(`messages[${i}] must have role and content`);\n  });\n}","typeGuard":"function isValidMessage(m) {\n  return typeof m === 'object' && m !== null && typeof m.role === 'string' && m.role.length > 0 && typeof m.content === 'string' && m.content.length > 0;\n}","tryCatchPattern":"try {\n  await provider.generateText({ messages });\n} catch (e) {\n  if (e.message === 'Invalid message format. Each message must have role and content') {\n    console.error('Malformed message array:', messages.filter(m => !m?.role || !m?.content));\n  } else throw e;\n}","preventionTips":["Filter message arrays with .filter(m => m.role && m.content) before every call","Centralize message construction in one helper that enforces {role, content}","Unit-test prompt builders to guarantee well-formed messages"],"tags":["validation","messages","input-validation"],"backgroundTag":"invalid-message-format","analyzedSha":"c0c98d367c55296bfe69e65680625b6db437af02","analyzedAt":"2026-08-29T02:56:26.071Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}