| 628 | export function mergeMessages(messages, charName, userName, strict) { | 628 | export function mergeMessages(messages, charName, userName, strict) { |
| 629 | let mergedMessages = []; | 629 | let mergedMessages = []; |
| 630 | | 630 | |
| | 631 | /** @type {Map<string,object>} */ |
| | 632 | const contentTokens = new Map(); |
| | 633 | |
| 631 | // Remove names from the messages | 634 | // Remove names from the messages |
| 632 | messages.forEach((message) => { | 635 | messages.forEach((message) => { |
| 633 | if (!message.content) { | 636 | if (!message.content) { |
| 634 | message.content = ''; | 637 | message.content = ''; |
| 635 | } | 638 | } |
| | 639 | // Flatten contents and replace image URLs with random tokens |
| | 640 | if (Array.isArray(message.content)) { |
| | 641 | const text = message.content.map((content) => { |
| | 642 | if (content.type === 'text') { |
| | 643 | return content.text; |
| | 644 | } |
| | 645 | // Could be extended with other non-text types |
| | 646 | if (content.type === 'image_url') { |
| | 647 | const token = crypto.randomBytes(32).toString('base64'); |
| | 648 | contentTokens.set(token, content); |
| | 649 | return token; |
| | 650 | } |
| | 651 | return ''; |
| | 652 | }).join('\n\n'); |
| | 653 | message.content = text; |
| | 654 | } |
| 636 | if (message.role === 'system' && message.name === 'example_assistant') { | 655 | if (message.role === 'system' && message.name === 'example_assistant') { |
| 637 | if (charName && !message.content.startsWith(`${charName}: `)) { | 656 | if (charName && !message.content.startsWith(`${charName}: `)) { |
| 638 | message.content = `${charName}: ${message.content}`; | 657 | message.content = `${charName}: ${message.content}`; |