{"record":{"id":"8972a84abd9391d0","repo":"vercel/ai","slug":"multiple-system-messages-that-are-separated-by-use","errorCode":null,"errorMessage":"Multiple system messages that are separated by user/assistant messages","messagePattern":"Multiple system messages that are separated by user/assistant messages","errorType":"exception","errorClass":"UnsupportedFunctionalityError","httpStatus":null,"severity":"error","filePath":"packages/amazon-bedrock/src/convert-to-amazon-bedrock-chat-messages.ts","lineNumber":174,"sourceCode":"  messages: AmazonBedrockMessages;\n}> {\n  const blocks = groupIntoBlocks(prompt);\n\n  let system: AmazonBedrockSystemMessages = [];\n  const messages: AmazonBedrockMessages = [];\n\n  let documentCounter = 0;\n  const generateDocumentName = () => `document-${++documentCounter}`;\n\n  for (let i = 0; i < blocks.length; i++) {\n    const block = blocks[i];\n    const isLastBlock = i === blocks.length - 1;\n    const type = block.type;\n\n    switch (type) {\n      case 'system': {\n        if (messages.length > 0) {\n          throw new UnsupportedFunctionalityError({\n            functionality:\n              'Multiple system messages that are separated by user/assistant messages',\n          });\n        }\n\n        for (const message of block.messages) {\n          system.push({ text: message.content });\n          const cachePoint = getCachePoint(message.providerOptions);\n          if (cachePoint) {\n            system.push(cachePoint);\n          }\n        }\n        break;\n      }\n\n      case 'user': {\n        // combines all user and tool messages in this block into a single message:\n        const amazonBedrockContent: AmazonBedrockUserMessage['content'] = [];","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/vercel/ai/blob/69428b1f8b037e4d118fb4853428d5c4e620493c/packages/amazon-bedrock/src/convert-to-amazon-bedrock-chat-messages.ts#L156-L192","documentation":"convertToAmazonBedrockChatMessages only supports a system prompt as the very first message; Bedrock's Converse-style payload cannot represent a system message appearing after user/assistant turns. When a system message follows other messages, an UnsupportedFunctionalityError is thrown.","triggerScenarios":"Building a prompt array where a message with role 'system' appears after any user or assistant message — e.g. [user, system] or [user, assistant, system] — then passing it to generateText/streamText with a Bedrock model.","commonSituations":"Dynamically appending a system prompt mid-conversation; merging conversation histories where a reminder system message got inserted later; porting code from providers that allow interleaved system messages.","solutions":["Move all system content into a single system message at the start of the message array.","Merge multiple/mid-conversation system text into the first system message or prepend it to the following user message.","If a mid-conversation reminder is needed, include it as part of the user message content instead."],"exampleFix":"// before\nmessages: [\n  { role: 'user', content: 'Hi' },\n  { role: 'system', content: 'Be terse' },\n]\n// after\nmessages: [\n  { role: 'system', content: 'Be terse' },\n  { role: 'user', content: 'Hi' },\n]","handlingStrategy":"validation","validationCode":"function assertSystemFirst(messages) {\n  let seenOther = false;\n  for (const m of messages) {\n    if (m.role === 'system') {\n      if (seenOther) throw new Error('System message must be the first message for Bedrock.');\n    } else {\n      seenOther = true;\n    }\n  }\n}","typeGuard":null,"tryCatchPattern":"import { UnsupportedFunctionalityError } from '@ai-sdk/provider';\ntry {\n  await generateText({ model: bedrock(modelId), messages });\n} catch (error) {\n  if (UnsupportedFunctionalityError.isInstance(error) && error.functionality.includes('system messages')) {\n    // reorder messages: hoist system prompt to position 0\n  } else {\n    throw error;\n  }\n}","preventionTips":["Normalize message arrays through a helper that hoists all system content to the front and merges it.","Never append system messages to an in-flight conversation; fold reminders into user content.","Add an assertion in tests for every prompt template sent to Bedrock."],"tags":["bedrock","prompt-format","unsupported-functionality","messages"],"backgroundTag":"unsupported-functionality","analyzedSha":"69428b1f8b037e4d118fb4853428d5c4e620493c","analyzedAt":"2026-08-30T12:32:21.016Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}