diff --git a/src/endpoints/backends/chat-completions.js b/src/endpoints/backends/chat-completions.js index 7dcd0dfa3..352360ff0 100644 --- a/src/endpoints/backends/chat-completions.js +++ b/src/endpoints/backends/chat-completions.js @@ -64,11 +64,11 @@ function postProcessPrompt(messages, type, names) { switch (type) { case 'merge': case 'claude': - return mergeMessages(messages, names, false); + return mergeMessages(messages, names, false, true); case 'strict': - return mergeMessages(messages, names, true); + return mergeMessages(messages, names, true, true); case 'deepseek': - return (x => x[x.length - 1].role !== 'assistant' || (x[x.length - 1].prefix = true) ? x : x)([...mergeMessages(messages, names, true)]); + return (x => x.length && (x[x.length - 1].role !== 'assistant' || (x[x.length - 1].prefix = true)) ? x : x)(mergeMessages(messages, names, true, false)); default: return messages; } diff --git a/src/prompt-converters.js b/src/prompt-converters.js index 91df7fd65..e38813c99 100644 --- a/src/prompt-converters.js +++ b/src/prompt-converters.js @@ -639,9 +639,10 @@ export function convertMistralMessages(messages, names) { * @param {any[]} messages Messages to merge * @param {PromptNames} names Prompt names * @param {boolean} strict Enable strict mode: only allow one system message at the start, force user first message + * @param {boolean} placeholders Add user placeholders to the messages in strict mode * @returns {any[]} Merged messages */ -export function mergeMessages(messages, names, strict) { +export function mergeMessages(messages, names, strict, placeholders) { let mergedMessages = []; /** @type {Map} */ @@ -700,9 +701,9 @@ export function mergeMessages(messages, names, strict) { } }); - // Prevent erroring out if the messages array is empty. - if (messages.length === 0) { - messages.unshift({ + // Prevent erroring out if the mergedMessages array is empty. + if (mergedMessages.length === 0) { + mergedMessages.unshift({ role: 'user', content: PROMPT_PLACEHOLDER, }); @@ -741,7 +742,7 @@ export function mergeMessages(messages, names, strict) { mergedMessages[i].role = 'user'; } } - if (mergedMessages.length) { + if (mergedMessages.length && placeholders) { if (mergedMessages[0].role === 'system' && (mergedMessages.length === 1 || mergedMessages[1].role !== 'user')) { mergedMessages.splice(1, 0, { role: 'user', content: PROMPT_PLACEHOLDER }); } @@ -749,7 +750,7 @@ export function mergeMessages(messages, names, strict) { mergedMessages.unshift({ role: 'user', content: PROMPT_PLACEHOLDER }); } } - return mergeMessages(mergedMessages, names, false); + return mergeMessages(mergedMessages, names, false, placeholders); } return mergedMessages;