(messages: Message[])
| 739 | ): (NormalizedAssistantMessage | NormalizedUserMessage)[] |
| 740 | export function normalizeMessages(messages: Message[]): NormalizedMessage[] |
| 741 | export function normalizeMessages(messages: Message[]): NormalizedMessage[] { |
| 742 | // isNewChain tracks whether we need to generate new UUIDs for messages when normalizing. |
| 743 | // When a message has multiple content blocks, we split it into multiple messages, |
| 744 | // each with a single content block. When this happens, we need to generate new UUIDs |
| 745 | // for all subsequent messages to maintain proper ordering and prevent duplicate UUIDs. |
| 746 | // This flag is set to true once we encounter a message with multiple content blocks, |
| 747 | // and remains true for all subsequent messages in the normalization process. |
| 748 | let isNewChain = false |
| 749 | return messages.flatMap(message => { |
| 750 | switch (message.type) { |
| 751 | case 'assistant': { |
| 752 | isNewChain = isNewChain || message.message.content.length > 1 |
| 753 | return message.message.content.map((_, index) => { |
| 754 | const uuid = isNewChain |
| 755 | ? deriveUUID(message.uuid, index) |
| 756 | : message.uuid |
| 757 | return { |
| 758 | type: 'assistant' as const, |
| 759 | timestamp: message.timestamp, |
| 760 | message: { |
| 761 | ...message.message, |
| 762 | content: [_], |
| 763 | context_management: message.message.context_management ?? null, |
| 764 | }, |
| 765 | isMeta: message.isMeta, |
| 766 | isVirtual: message.isVirtual, |
| 767 | requestId: message.requestId, |
| 768 | uuid, |
| 769 | error: message.error, |
| 770 | isApiErrorMessage: message.isApiErrorMessage, |
| 771 | advisorModel: message.advisorModel, |
| 772 | } as NormalizedAssistantMessage |
| 773 | }) |
| 774 | } |
| 775 | case 'attachment': |
| 776 | return [message] |
| 777 | case 'progress': |
| 778 | return [message] |
| 779 | case 'system': |
| 780 | return [message] |
| 781 | case 'user': { |
| 782 | if (typeof message.message.content === 'string') { |
| 783 | const uuid = isNewChain ? deriveUUID(message.uuid, 0) : message.uuid |
| 784 | return [ |
| 785 | { |
| 786 | ...message, |
| 787 | uuid, |
| 788 | message: { |
| 789 | ...message.message, |
| 790 | content: [{ type: 'text', text: message.message.content }], |
| 791 | }, |
| 792 | } as NormalizedMessage, |
| 793 | ] |
| 794 | } |
| 795 | isNewChain = isNewChain || message.message.content.length > 1 |
| 796 | let imageIndex = 0 |
| 797 | return message.message.content.map((_, index) => { |
| 798 | const isImage = _.type === 'image' |
no test coverage detected