| const { FileContext } = require('librechat-data-provider'); |
| const validateAuthor = require('~/server/middleware/assistants/validateAuthor'); |
| const { getStrategyFunctions } = require('~/server/services/Files/strategies'); |
| const { deleteAssistantActions } = require('~/server/services/ActionService'); |
| const { updateAssistantDoc, getAssistants } = require('~/models/Assistant'); |
| const { uploadImageBuffer } = require('~/server/services/Files/process'); |
| const { getOpenAIClient, fetchAssistants } = require('./helpers'); |
| const { deleteFileByFilter } = require('~/models/File'); |
| const { logger } = require('~/config'); |
|
|
| |
| |
| |
| |
| |
| |
| const createAssistant = async (req, res) => { |
| try { |
| const { openai } = await getOpenAIClient({ req, res }); |
|
|
| const { tools = [], endpoint, ...assistantData } = req.body; |
| assistantData.tools = tools |
| .map((tool) => { |
| if (typeof tool !== 'string') { |
| return tool; |
| } |
|
|
| return req.app.locals.availableTools[tool]; |
| }) |
| .filter((tool) => tool); |
|
|
| let azureModelIdentifier = null; |
| if (openai.locals?.azureOptions) { |
| azureModelIdentifier = assistantData.model; |
| assistantData.model = openai.locals.azureOptions.azureOpenAIApiDeploymentName; |
| } |
|
|
| assistantData.metadata = { |
| author: req.user.id, |
| endpoint, |
| }; |
|
|
| const assistant = await openai.beta.assistants.create(assistantData); |
| const promise = updateAssistantDoc({ assistant_id: assistant.id }, { user: req.user.id }); |
| if (azureModelIdentifier) { |
| assistant.model = azureModelIdentifier; |
| } |
| await promise; |
| logger.debug('/assistants/', assistant); |
| res.status(201).json(assistant); |
| } catch (error) { |
| logger.error('[/assistants] Error creating assistant', error); |
| res.status(500).json({ error: error.message }); |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| const retrieveAssistant = async (req, res) => { |
| try { |
| |
| const { openai } = await getOpenAIClient({ req, res }); |
| const assistant_id = req.params.id; |
| const assistant = await openai.beta.assistants.retrieve(assistant_id); |
| res.json(assistant); |
| } catch (error) { |
| logger.error('[/assistants/:id] Error retrieving assistant', error); |
| res.status(500).json({ error: error.message }); |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const patchAssistant = async (req, res) => { |
| try { |
| const { openai } = await getOpenAIClient({ req, res }); |
| await validateAuthor({ req, openai }); |
|
|
| const assistant_id = req.params.id; |
| const { endpoint: _e, ...updateData } = req.body; |
| updateData.tools = (updateData.tools ?? []) |
| .map((tool) => { |
| if (typeof tool !== 'string') { |
| return tool; |
| } |
|
|
| return req.app.locals.availableTools[tool]; |
| }) |
| .filter((tool) => tool); |
|
|
| if (openai.locals?.azureOptions && updateData.model) { |
| updateData.model = openai.locals.azureOptions.azureOpenAIApiDeploymentName; |
| } |
|
|
| const updatedAssistant = await openai.beta.assistants.update(assistant_id, updateData); |
| res.json(updatedAssistant); |
| } catch (error) { |
| logger.error('[/assistants/:id] Error updating assistant', error); |
| res.status(500).json({ error: error.message }); |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| const deleteAssistant = async (req, res) => { |
| try { |
| const { openai } = await getOpenAIClient({ req, res }); |
| await validateAuthor({ req, openai }); |
|
|
| const assistant_id = req.params.id; |
| const deletionStatus = await openai.beta.assistants.del(assistant_id); |
| if (deletionStatus?.deleted) { |
| await deleteAssistantActions({ req, assistant_id }); |
| } |
| res.json(deletionStatus); |
| } catch (error) { |
| logger.error('[/assistants/:id] Error deleting assistant', error); |
| res.status(500).json({ error: 'Error deleting assistant' }); |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| const listAssistants = async (req, res) => { |
| try { |
| const body = await fetchAssistants({ req, res }); |
| res.json(body); |
| } catch (error) { |
| logger.error('[/assistants] Error listing assistants', error); |
| res.status(500).json({ message: 'Error listing assistants' }); |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| const getAssistantDocuments = async (req, res) => { |
| try { |
| res.json(await getAssistants({ user: req.user.id })); |
| } catch (error) { |
| logger.error('[/assistants/documents] Error listing assistant documents', error); |
| res.status(500).json({ error: error.message }); |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const uploadAssistantAvatar = async (req, res) => { |
| try { |
| const { assistant_id } = req.params; |
| if (!assistant_id) { |
| return res.status(400).json({ message: 'Assistant ID is required' }); |
| } |
|
|
| let { metadata: _metadata = '{}' } = req.body; |
| const { openai } = await getOpenAIClient({ req, res }); |
| await validateAuthor({ req, openai }); |
|
|
| const image = await uploadImageBuffer({ |
| req, |
| context: FileContext.avatar, |
| metadata: { |
| buffer: req.file.buffer, |
| }, |
| }); |
|
|
| try { |
| _metadata = JSON.parse(_metadata); |
| } catch (error) { |
| logger.error('[/avatar/:assistant_id] Error parsing metadata', error); |
| _metadata = {}; |
| } |
|
|
| if (_metadata.avatar && _metadata.avatar_source) { |
| const { deleteFile } = getStrategyFunctions(_metadata.avatar_source); |
| try { |
| await deleteFile(req, { filepath: _metadata.avatar }); |
| await deleteFileByFilter({ filepath: _metadata.avatar }); |
| } catch (error) { |
| logger.error('[/avatar/:assistant_id] Error deleting old avatar', error); |
| } |
| } |
|
|
| const metadata = { |
| ..._metadata, |
| avatar: image.filepath, |
| avatar_source: req.app.locals.fileStrategy, |
| }; |
|
|
| const promises = []; |
| promises.push( |
| updateAssistantDoc( |
| { assistant_id }, |
| { |
| avatar: { |
| filepath: image.filepath, |
| source: req.app.locals.fileStrategy, |
| }, |
| user: req.user.id, |
| }, |
| ), |
| ); |
| promises.push(openai.beta.assistants.update(assistant_id, { metadata })); |
|
|
| const resolved = await Promise.all(promises); |
| res.status(201).json(resolved[1]); |
| } catch (error) { |
| const message = 'An error occurred while updating the Assistant Avatar'; |
| logger.error(message, error); |
| res.status(500).json({ message }); |
| } |
| }; |
|
|
| module.exports = { |
| createAssistant, |
| retrieveAssistant, |
| patchAssistant, |
| deleteAssistant, |
| listAssistants, |
| getAssistantDocuments, |
| uploadAssistantAvatar, |
| }; |
|
|