@n8n/n8n-nodes-langchain
Version:

102 lines • 4.4 kB
JavaScript
;
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