From b99579693829d2633a0dd64aa865409e305f0ff0 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 10 Nov 2023 15:41:59 +0000 Subject: [PATCH] add openai assistant tools and documents fix --- .../agents/OpenAIAssistant/OpenAIAssistant.ts | 6 ++-- packages/server/src/index.ts | 36 +++++++++++++------ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts index 7c353492..56e1b290 100644 --- a/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts +++ b/packages/components/nodes/agents/OpenAIAssistant/OpenAIAssistant.ts @@ -6,7 +6,7 @@ import { MessageContentImageFile, MessageContentText } from 'openai/resources/be import * as fsDefault from 'node:fs' import * as path from 'node:path' import fetch from 'node-fetch' -import { flatten } from 'lodash' +import { flatten, uniqWith, isEqual } from 'lodash' import { zodToJsonSchema } from 'zod-to-json-schema' class OpenAIAssistant_Agents implements INode { @@ -142,7 +142,9 @@ class OpenAIAssistant_Agents implements INode { const retrievedAssistant = await openai.beta.assistants.retrieve(openAIAssistantId) if (formattedTools.length) { - await openai.beta.assistants.update(openAIAssistantId, { tools: formattedTools }) + let filteredTools = uniqWith([...retrievedAssistant.tools, ...formattedTools], isEqual) + filteredTools = filteredTools.filter((tool) => !(tool.type === 'function' && !(tool as any).function)) + await openai.beta.assistants.update(openAIAssistantId, { tools: filteredTools }) } const chatmessage = await appDataSource.getRepository(databaseEntities['ChatMessage']).findOneBy({ diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 98ad7ea7..ba6c3ce0 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -52,7 +52,7 @@ import { clearSessionMemoryFromViewMessageDialog, getUserHome } from './utils' -import { cloneDeep, omit } from 'lodash' +import { cloneDeep, omit, uniqWith, isEqual } from 'lodash' import { getDataSource } from './DataSource' import { NodesPool } from './NodesPool' import { ChatFlow } from './database/entities/ChatFlow' @@ -670,14 +670,11 @@ export class App { const openai = new OpenAI({ apiKey: openAIApiKey }) const retrievedAssistant = await openai.beta.assistants.retrieve(req.params.id) + const resp = await openai.files.list() + const existingFiles = resp.data ?? [] if (retrievedAssistant.file_ids && retrievedAssistant.file_ids.length) { - const files = [] - for (const file_id of retrievedAssistant.file_ids) { - const file = await openai.files.retrieve(file_id) - files.push(file) - } - ;(retrievedAssistant as any).files = files + ;(retrievedAssistant as any).files = existingFiles.filter((file) => retrievedAssistant.file_ids.includes(file.id)) } return res.json(retrievedAssistant) @@ -779,13 +776,23 @@ export class App { }) assistantDetails.id = newAssistant.id } else { + const retrievedAssistant = await openai.beta.assistants.retrieve(assistantDetails.id) + let filteredTools = uniqWith([...retrievedAssistant.tools, ...tools], isEqual) + filteredTools = filteredTools.filter((tool) => !(tool.type === 'function' && !(tool as any).function)) + await openai.beta.assistants.update(assistantDetails.id, { name: assistantDetails.name, description: assistantDetails.description, instructions: assistantDetails.instructions, model: assistantDetails.model, - tools, - file_ids: (assistantDetails.files ?? []).map((file: OpenAI.Files.FileObject) => file.id) + tools: filteredTools, + file_ids: uniqWith( + [ + ...retrievedAssistant.file_ids, + ...(assistantDetails.files ?? []).map((file: OpenAI.Files.FileObject) => file.id) + ], + isEqual + ) }) } @@ -881,13 +888,20 @@ export class App { assistantDetails.files = [...assistantDetails.files, ...uploadedFiles] } + const retrievedAssistant = await openai.beta.assistants.retrieve(openAIAssistantId) + let filteredTools = uniqWith([...retrievedAssistant.tools, ...tools], isEqual) + filteredTools = filteredTools.filter((tool) => !(tool.type === 'function' && !(tool as any).function)) + await openai.beta.assistants.update(openAIAssistantId, { name: assistantDetails.name, description: assistantDetails.description, instructions: assistantDetails.instructions, model: assistantDetails.model, - tools, - file_ids: (assistantDetails.files ?? []).map((file: OpenAI.Files.FileObject) => file.id) + tools: filteredTools, + file_ids: uniqWith( + [...retrievedAssistant.file_ids, ...(assistantDetails.files ?? []).map((file: OpenAI.Files.FileObject) => file.id)], + isEqual + ) }) const newAssistantDetails = {