Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: OpenAI Node function to preserve original tools after node execution #8872

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@
},
},
{
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 Expand Up @@ -236,7 +237,7 @@
body.tools = tools;
}

const response = await apiRequest.call(this, 'POST', '/assistants', {

Check warning on line 240 in packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/assistant/create.operation.ts

View workflow job for this annotation

GitHub Actions / Lint changes

Unsafe assignment of an `any` value
body,
headers: {
'OpenAI-Beta': 'assistants=v1',
Expand All @@ -245,7 +246,7 @@

return [
{
json: response,

Check warning on line 249 in packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/actions/assistant/create.operation.ts

View workflow job for this annotation

GitHub Actions / Lint changes

Unsafe assignment of an `any` value
pairedItem: { item: i },
},
];
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
Loading