Fix xAI example messages conversion

This commit is contained in:
Cohee
2025-04-12 14:14:57 +03:00
parent 91fc50b82d
commit 5eeba8894e
2 changed files with 39 additions and 0 deletions

View File

@ -23,6 +23,7 @@ import {
convertCohereMessages, convertCohereMessages,
convertMistralMessages, convertMistralMessages,
convertAI21Messages, convertAI21Messages,
convertXAIMessages,
mergeMessages, mergeMessages,
cachingAtDepthForOpenRouterClaude, cachingAtDepthForOpenRouterClaude,
cachingAtDepthForClaude, cachingAtDepthForClaude,
@ -1159,6 +1160,7 @@ router.post('/generate', function (request, response) {
apiKey = readSecret(request.user.directories, SECRET_KEYS.XAI); apiKey = readSecret(request.user.directories, SECRET_KEYS.XAI);
headers = {}; headers = {};
bodyParams = {}; bodyParams = {};
request.body.messages = convertXAIMessages(request.body.messages, getPromptNames(request));
} else { } else {
console.warn('This chat completion source is not supported yet.'); console.warn('This chat completion source is not supported yet.');
return response.status(400).send({ error: true }); return response.status(400).send({ error: true });

View File

@ -679,6 +679,43 @@ export function convertMistralMessages(messages, names) {
return messages; return messages;
} }
/**
* Convert a prompt from the messages objects to the format used by xAI.
* @param {object[]} messages Array of messages
* @param {PromptNames} names Prompt names
* @returns {object[]} Prompt for xAI
*/
export function convertXAIMessages(messages, names) {
if (!Array.isArray(messages)) {
return [];
}
messages.forEach(msg => {
if (!msg.name || msg.role === 'user') {
return;
}
const needsCharNamePrefix = [
{ role: 'assistant', condition: names.charName && !msg.content.startsWith(`${names.charName}: `) && !names.startsWithGroupName(msg.content) },
{ role: 'system', name: 'example_assistant', condition: names.charName && !msg.content.startsWith(`${names.charName}: `) && !names.startsWithGroupName(msg.content) },
{ role: 'system', name: 'example_user', condition: names.userName && !msg.content.startsWith(`${names.userName}: `) },
];
const matchingRule = needsCharNamePrefix.find(rule =>
msg.role === rule.role && (!rule.name || msg.name === rule.name) && rule.condition,
);
if (matchingRule) {
const prefix = msg.role === 'system' && msg.name === 'example_user' ? names.userName : names.charName;
msg.content = `${prefix}: ${msg.content}`;
}
delete msg.name;
});
return messages;
}
/** /**
* Merge messages with the same consecutive role, removing names if they exist. * Merge messages with the same consecutive role, removing names if they exist.
* @param {any[]} messages Messages to merge * @param {any[]} messages Messages to merge