Skip to content

Commit

Permalink
fix: OpenAI Node function to preserve original tools after node execu…
Browse files Browse the repository at this point in the history
…tion (#8872)

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Oleg Ivaniv <me@olegivaniv.com>
  • Loading branch information
michael-radency and OlegIvaniv authored Mar 13, 2024
1 parent 6e99e26 commit 054a4fc
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 <i>message</i> your assistant (rather than when creating it)',
name: 'noticeTools',
type: 'notice',
default: '',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 } }],
},
},
},
],
},
];
Expand Down Expand Up @@ -123,6 +136,7 @@ export async function execute(this: IExecuteFunctions, i: number): Promise<INode
baseURL?: string;
maxRetries: number;
timeout: number;
preserveOriginalTools?: boolean;
};

const client = new OpenAIClient({
Expand All @@ -135,21 +149,22 @@ export async function execute(this: IExecuteFunctions, i: number): Promise<INode
const agent = new OpenAIAssistantRunnable({ assistantId, client, asAgent: true });

const tools = await getConnectedTools(this, nodeVersion > 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',
Expand All @@ -166,11 +181,21 @@ export async function execute(this: IExecuteFunctions, i: number): Promise<INode
tools: tools ?? [],
});

const response = await agentExecutor.call({
const response = await agentExecutor.invoke({
content: input,
signal: this.getExecutionCancelSignal(),
timeout: options.timeout ?? 10000,
});

if (
options.preserveOriginalTools !== false &&
nodeVersion >= 1.3 &&
(assistantTools ?? [])?.length
) {
await client.beta.assistants.update(assistantId, {
tools: assistantTools,
});
}

return [{ json: response, pairedItem: { item: i } }];
}
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down

0 comments on commit 054a4fc

Please sign in to comment.