From 452f52c124017e002e86c547ba42b1633b14beed Mon Sep 17 00:00:00 2001 From: jeanpaul Date: Tue, 30 Jul 2024 16:19:47 +0200 Subject: [PATCH] fix(Text Classifier Node): Use proper documentation URL and respect continueOnFail (#10216) --- .../TextClassifier/TextClassifier.node.ts | 49 +++++++++++++------ 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/packages/@n8n/nodes-langchain/nodes/chains/TextClassifier/TextClassifier.node.ts b/packages/@n8n/nodes-langchain/nodes/chains/TextClassifier/TextClassifier.node.ts index 6a433eaac31a0..0033361a07396 100644 --- a/packages/@n8n/nodes-langchain/nodes/chains/TextClassifier/TextClassifier.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/chains/TextClassifier/TextClassifier.node.ts @@ -46,7 +46,7 @@ export class TextClassifier implements INodeType { resources: { primaryDocumentation: [ { - url: 'https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.chainllm/', + url: 'https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.text-classifier/', }, ], }, @@ -203,20 +203,27 @@ export class TextClassifier implements INodeType { discard: 'If there is not a very fitting category, select none of the categories.', }[fallback]; - const systemPromptTemplate = SystemMessagePromptTemplate.fromTemplate( - `${options.systemPromptTemplate ?? SYSTEM_PROMPT_TEMPLATE} -{format_instructions} -${multiClassPrompt} -${fallbackPrompt}`, - ); - const returnData: INodeExecutionData[][] = Array.from( { length: categories.length + (fallback === 'other' ? 1 : 0) }, (_) => [], ); for (let itemIdx = 0; itemIdx < items.length; itemIdx++) { + const item = items[itemIdx]; + item.pairedItem = { item: itemIdx }; const input = this.getNodeParameter('inputText', itemIdx) as string; const inputPrompt = new HumanMessage(input); + + const systemPromptTemplateOpt = this.getNodeParameter( + 'options.systemPromptTemplate', + itemIdx, + ) as string; + const systemPromptTemplate = SystemMessagePromptTemplate.fromTemplate( + `${systemPromptTemplateOpt ?? SYSTEM_PROMPT_TEMPLATE} +{format_instructions} +${multiClassPrompt} +${fallbackPrompt}`, + ); + const messages = [ await systemPromptTemplate.format({ categories: categories.map((cat) => cat.category).join(', '), @@ -227,13 +234,27 @@ ${fallbackPrompt}`, const prompt = ChatPromptTemplate.fromMessages(messages); const chain = prompt.pipe(llm).pipe(parser).withConfig(getTracingConfig(this)); - const output = await chain.invoke(messages); - categories.forEach((cat, idx) => { - if (output[cat.category]) returnData[idx].push(items[itemIdx]); - }); - if (fallback === 'other' && output.fallback) - returnData[returnData.length - 1].push(items[itemIdx]); + try { + const output = await chain.invoke(messages); + + categories.forEach((cat, idx) => { + if (output[cat.category]) returnData[idx].push(item); + }); + if (fallback === 'other' && output.fallback) returnData[returnData.length - 1].push(item); + } catch (error) { + if (this.continueOnFail(error)) { + returnData[0].push({ + json: { error: error.message }, + pairedItem: { item: itemIdx }, + }); + + continue; + } + + throw error; + } } + return returnData; } }