| 680 | 680 | } |
| 681 | 681 | |
| 682 | 682 | /** |
| 683 | + * Convert a prompt from the messages objects to the format used by xAI. |
| 684 | + * @param {object[]} messages Array of messages |
| 685 | + * @param {PromptNames} names Prompt names |
| 686 | + * @returns {object[]} Prompt for xAI |
| 687 | + */ |
| 688 | +export function convertXAIMessages(messages, names) { |
| 689 | + if (!Array.isArray(messages)) { |
| 690 | + return []; |
| 691 | + } |
| 692 | + |
| 693 | + messages.forEach(msg => { |
| 694 | + if (!msg.name || msg.role === 'user') { |
| 695 | + return; |
| 696 | + } |
| 697 | + |
| 698 | + const needsCharNamePrefix = [ |
| 699 | + { role: 'assistant', condition: names.charName && !msg.content.startsWith(`${names.charName}: `) && !names.startsWithGroupName(msg.content) }, |
| 700 | + { role: 'system', name: 'example_assistant', condition: names.charName && !msg.content.startsWith(`${names.charName}: `) && !names.startsWithGroupName(msg.content) }, |
| 701 | + { role: 'system', name: 'example_user', condition: names.userName && !msg.content.startsWith(`${names.userName}: `) }, |
| 702 | + ]; |
| 703 | + |
| 704 | + const matchingRule = needsCharNamePrefix.find(rule => |
| 705 | + msg.role === rule.role && (!rule.name || msg.name === rule.name) && rule.condition, |
| 706 | + ); |
| 707 | + |
| 708 | + if (matchingRule) { |
| 709 | + const prefix = msg.role === 'system' && msg.name === 'example_user' ? names.userName : names.charName; |
| 710 | + msg.content = `${prefix}: ${msg.content}`; |
| 711 | + } |
| 712 | + |
| 713 | + delete msg.name; |
| 714 | + }); |
| 715 | + |
| 716 | + return messages; |
| 717 | +} |
| 718 | + |
| 719 | +/** |
| 683 | 720 | * Merge messages with the same consecutive role, removing names if they exist. |
| 684 | 721 | * @param {any[]} messages Messages to merge |
| 685 | 722 | * @param {PromptNames} names Prompt names |