From 054a4fce1a8163f2201efd846938b909c7d0e394 Mon Sep 17 00:00:00 2001 From: Michael Kret <88898367+michael-radency@users.noreply.github.com> Date: Wed, 13 Mar 2024 18:13:15 +0200 Subject: [PATCH] fix: OpenAI Node function to preserve original tools after node execution (#8872) Signed-off-by: Oleg Ivaniv Co-authored-by: Oleg Ivaniv --- .../actions/assistant/create.operation.ts | 3 +- .../actions/assistant/message.operation.ts | 33 ++++++++++++++++--- .../OpenAi/actions/versionDescription.ts | 2 +- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/assistant/create.operation.ts b/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/assistant/create.operation.ts index aa511a3ca4..185e0d94f9 100644 --- a/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/assistant/create.operation.ts +++ b/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/assistant/create.operation.ts @@ -120,7 +120,8 @@ const properties: INodeProperties[] = [ }, }, { - displayName: "Add custom n8n tools when using the 'Message Assistant' operation", + displayName: + 'Add custom n8n tools when you message your assistant (rather than when creating it)', name: 'noticeTools', type: 'notice', default: '', diff --git a/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/assistant/message.operation.ts b/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/assistant/message.operation.ts index 3623c18fd4..6d7e669e39 100644 --- a/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/assistant/message.operation.ts +++ b/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/assistant/message.operation.ts @@ -84,6 +84,19 @@ const properties: INodeProperties[] = [ description: 'Maximum amount of time a request is allowed to take in milliseconds', type: 'number', }, + { + displayName: 'Preserve Original Tools', + name: 'preserveOriginalTools', + type: 'boolean', + default: true, + description: + 'Whether to preserve the original tools of the assistant after the execution of this node, otherwise the tools will be replaced with the connected tools, if any, default is true', + displayOptions: { + show: { + '@version': [{ _cnd: { gte: 1.3 } }], + }, + }, + }, ], }, ]; @@ -123,6 +136,7 @@ export async function execute(this: IExecuteFunctions, i: number): Promise 1); + let assistantTools; if (tools.length) { const transformedConnectedTools = tools?.map(formatToOpenAIAssistantTool) ?? []; const nativeToolsParsed: OpenAIToolType = []; - const assistant = await client.beta.assistants.retrieve(assistantId); + assistantTools = (await client.beta.assistants.retrieve(assistantId)).tools; - const useCodeInterpreter = assistant.tools.some((tool) => tool.type === 'code_interpreter'); + const useCodeInterpreter = assistantTools.some((tool) => tool.type === 'code_interpreter'); if (useCodeInterpreter) { nativeToolsParsed.push({ type: 'code_interpreter', }); } - const useRetrieval = assistant.tools.some((tool) => tool.type === 'retrieval'); + const useRetrieval = assistantTools.some((tool) => tool.type === 'retrieval'); if (useRetrieval) { nativeToolsParsed.push({ type: 'retrieval', @@ -166,11 +181,21 @@ export async function execute(this: IExecuteFunctions, i: number): Promise= 1.3 && + (assistantTools ?? [])?.length + ) { + await client.beta.assistants.update(assistantId, { + tools: assistantTools, + }); + } + return [{ json: response, pairedItem: { item: i } }]; } diff --git a/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/versionDescription.ts b/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/versionDescription.ts index 778b42c26d..080680b776 100644 --- a/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/versionDescription.ts +++ b/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/versionDescription.ts @@ -68,7 +68,7 @@ export const versionDescription: INodeTypeDescription = { name: 'openAi', icon: 'file:openAi.svg', group: ['transform'], - version: [1, 1.1, 1.2], + version: [1, 1.1, 1.2, 1.3], subtitle: `={{(${prettifyOperation})($parameter.resource, $parameter.operation)}}`, description: 'Message an assistant or GPT, analyze images, generate audio, etc.', defaults: {