UNPKG

@n8n/n8n-nodes-langchain

Version:

![Banner image](https://user-images.githubusercontent.com/10284570/173569848-c624317f-42b1-45a6-ab09-f0ea3c247648.png)

102 lines 4.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getAgentStepsParser = void 0; exports.createPromptTemplate = createPromptTemplate; const messages_1 = require("@langchain/core/messages"); const prompts_1 = require("@langchain/core/prompts"); const n8n_workflow_1 = require("n8n-workflow"); const ai_utilities_1 = require("@n8n/ai-utilities"); const imageUtils_1 = require("./imageUtils"); function buildQueryTemplate(formatInstructions) { return new prompts_1.PromptTemplate({ template: `{query}${formatInstructions ? '\n{formatInstructions}' : ''}`, inputVariables: ['query'], partialVariables: formatInstructions ? { formatInstructions } : undefined, }); } async function processMessageTemplates({ context, itemIndex, messages, }) { return await Promise.all(messages.map(async (message) => { const messageClass = [ prompts_1.SystemMessagePromptTemplate, prompts_1.AIMessagePromptTemplate, prompts_1.HumanMessagePromptTemplate, ].find((m) => m.lc_name() === message.type); if (!messageClass) { throw new n8n_workflow_1.OperationalError('Invalid message type', { extra: { messageType: message.type }, }); } if (messageClass === prompts_1.HumanMessagePromptTemplate && message.messageType !== 'text') { return await (0, imageUtils_1.createImageMessage)({ context, itemIndex, message }); } return messageClass.fromTemplate((message.message || '').replace(/[{}]/g, (match) => match + match)); })); } async function finalizePromptTemplate({ parsedMessages, queryTemplate, query, }) { const lastMessage = parsedMessages[parsedMessages.length - 1]; if (lastMessage instanceof messages_1.HumanMessage && Array.isArray(lastMessage.content)) { const humanMessage = new prompts_1.HumanMessagePromptTemplate(queryTemplate); const formattedMessage = await humanMessage.format({ query }); if (Array.isArray(lastMessage.content)) { const updatedContent = [ ...lastMessage.content, { text: formattedMessage.content.toString(), type: 'text', }, ]; lastMessage.content = updatedContent; } } else { parsedMessages.push(new prompts_1.HumanMessagePromptTemplate(queryTemplate)); } return prompts_1.ChatPromptTemplate.fromMessages(parsedMessages); } async function createPromptTemplate({ context, itemIndex, llm, messages, formatInstructions, query, }) { const queryTemplate = buildQueryTemplate(formatInstructions); if (!(0, ai_utilities_1.isChatInstance)(llm)) { return queryTemplate; } const parsedMessages = messages?.length ? await processMessageTemplates({ context, itemIndex, messages }) : []; return await finalizePromptTemplate({ parsedMessages, queryTemplate, query, }); } const isMessage = (message) => { return message instanceof messages_1.BaseMessage; }; const isAgentFinish = (value) => { return typeof value === 'object' && value !== null && 'returnValues' in value; }; const getAgentStepsParser = (outputParser) => async (steps) => { if (typeof steps === 'string') { return (await outputParser.parse(steps)); } if (Array.isArray(steps)) { const responseParserTool = steps.find((step) => step.tool === 'format_final_json_response'); if (responseParserTool) { const toolInput = responseParserTool.toolInput; const parserInput = toolInput instanceof Object ? JSON.stringify(toolInput) : toolInput; const parsedOutput = (await outputParser.parse(parserInput)); return parsedOutput; } } if (typeof steps === 'object' && isMessage(steps)) { const output = steps.text; const parsedOutput = (await outputParser.parse(output)); return parsedOutput; } if (isAgentFinish(steps)) { const returnValues = steps.returnValues; const parsedOutput = (await outputParser.parse(JSON.stringify(returnValues))); return parsedOutput; } throw new Error('Failed to parse agent steps'); }; exports.getAgentStepsParser = getAgentStepsParser; //# sourceMappingURL=promptUtils.js.map