const { HumanMessage, AIMessage, SystemMessage } = require('langchain/schema'); /** * Formats a message to OpenAI payload format based on the provided options. * * @param {Object} params - The parameters for formatting. * @param {Object} params.message - The message object to format. * @param {string} [params.message.role] - The role of the message sender (e.g., 'user', 'assistant'). * @param {string} [params.message._name] - The name associated with the message. * @param {string} [params.message.sender] - The sender of the message. * @param {string} [params.message.text] - The text content of the message. * @param {string} [params.message.content] - The content of the message. * @param {string} [params.userName] - The name of the user. * @param {string} [params.assistantName] - The name of the assistant. * @param {boolean} [params.langChain=false] - Whether to return a LangChain message object. * @returns {(Object|HumanMessage|AIMessage|SystemMessage)} - The formatted message. */ const formatMessage = ({ message, userName, assistantName, langChain = false }) => { let { role: _role, _name, sender, text, content: _content, lc_id } = message; if (lc_id && lc_id[2] && !langChain) { const roleMapping = { SystemMessage: 'system', HumanMessage: 'user', AIMessage: 'assistant', }; _role = roleMapping[lc_id[2]]; } const role = _role ?? (sender && sender?.toLowerCase() === 'user' ? 'user' : 'assistant'); const content = text ?? _content ?? ''; const formattedMessage = { role, content, }; if (_name) { formattedMessage.name = _name; } if (userName && formattedMessage.role === 'user') { formattedMessage.name = userName; } if (assistantName && formattedMessage.role === 'assistant') { formattedMessage.name = assistantName; } if (!langChain) { return formattedMessage; } if (role === 'user') { return new HumanMessage(formattedMessage); } else if (role === 'assistant') { return new AIMessage(formattedMessage); } else { return new SystemMessage(formattedMessage); } }; /** * Formats an array of messages for LangChain. * * @param {Array} messages - The array of messages to format. * @param {Object} formatOptions - The options for formatting each message. * @param {string} [formatOptions.userName] - The name of the user. * @param {string} [formatOptions.assistantName] - The name of the assistant. * @returns {Array<(HumanMessage|AIMessage|SystemMessage)>} - The array of formatted LangChain messages. */ const formatLangChainMessages = (messages, formatOptions) => messages.map((msg) => formatMessage({ ...formatOptions, message: msg, langChain: true })); /** * Formats a LangChain message object by merging properties from `lc_kwargs` or `kwargs` and `additional_kwargs`. * * @param {Object} message - The message object to format. * @param {Object} [message.lc_kwargs] - Contains properties to be merged. Either this or `message.kwargs` should be provided. * @param {Object} [message.kwargs] - Contains properties to be merged. Either this or `message.lc_kwargs` should be provided. * @param {Object} [message.kwargs.additional_kwargs] - Additional properties to be merged. * * @returns {Object} The formatted LangChain message. */ const formatFromLangChain = (message) => { const { additional_kwargs, ...message_kwargs } = message.lc_kwargs ?? message.kwargs; return { ...message_kwargs, ...additional_kwargs, }; }; module.exports = { formatMessage, formatLangChainMessages, formatFromLangChain };