| | const { handleError } = require('@librechat/api'); |
| | const { logger } = require('@librechat/data-schemas'); |
| | const { |
| | EndpointURLs, |
| | EModelEndpoint, |
| | isAgentsEndpoint, |
| | parseCompactConvo, |
| | } = require('librechat-data-provider'); |
| | const azureAssistants = require('~/server/services/Endpoints/azureAssistants'); |
| | const assistants = require('~/server/services/Endpoints/assistants'); |
| | const { processFiles } = require('~/server/services/Files/process'); |
| | const anthropic = require('~/server/services/Endpoints/anthropic'); |
| | const bedrock = require('~/server/services/Endpoints/bedrock'); |
| | const openAI = require('~/server/services/Endpoints/openAI'); |
| | const agents = require('~/server/services/Endpoints/agents'); |
| | const custom = require('~/server/services/Endpoints/custom'); |
| | const google = require('~/server/services/Endpoints/google'); |
| |
|
| | const buildFunction = { |
| | [EModelEndpoint.openAI]: openAI.buildOptions, |
| | [EModelEndpoint.google]: google.buildOptions, |
| | [EModelEndpoint.custom]: custom.buildOptions, |
| | [EModelEndpoint.agents]: agents.buildOptions, |
| | [EModelEndpoint.bedrock]: bedrock.buildOptions, |
| | [EModelEndpoint.azureOpenAI]: openAI.buildOptions, |
| | [EModelEndpoint.anthropic]: anthropic.buildOptions, |
| | [EModelEndpoint.assistants]: assistants.buildOptions, |
| | [EModelEndpoint.azureAssistants]: azureAssistants.buildOptions, |
| | }; |
| |
|
| | async function buildEndpointOption(req, res, next) { |
| | const { endpoint, endpointType } = req.body; |
| | let parsedBody; |
| | try { |
| | parsedBody = parseCompactConvo({ endpoint, endpointType, conversation: req.body }); |
| | } catch (error) { |
| | logger.warn( |
| | `Error parsing conversation for endpoint ${endpoint}${error?.message ? `: ${error.message}` : ''}`, |
| | ); |
| | return handleError(res, { text: 'Error parsing conversation' }); |
| | } |
| |
|
| | const appConfig = req.config; |
| | if (appConfig.modelSpecs?.list && appConfig.modelSpecs?.enforce) { |
| | |
| | const { list } = appConfig.modelSpecs; |
| | const { spec } = parsedBody; |
| |
|
| | if (!spec) { |
| | return handleError(res, { text: 'No model spec selected' }); |
| | } |
| |
|
| | const currentModelSpec = list.find((s) => s.name === spec); |
| | if (!currentModelSpec) { |
| | return handleError(res, { text: 'Invalid model spec' }); |
| | } |
| |
|
| | if (endpoint !== currentModelSpec.preset.endpoint) { |
| | return handleError(res, { text: 'Model spec mismatch' }); |
| | } |
| |
|
| | try { |
| | currentModelSpec.preset.spec = spec; |
| | parsedBody = parseCompactConvo({ |
| | endpoint, |
| | endpointType, |
| | conversation: currentModelSpec.preset, |
| | }); |
| | if (currentModelSpec.iconURL != null && currentModelSpec.iconURL !== '') { |
| | parsedBody.iconURL = currentModelSpec.iconURL; |
| | } |
| | } catch (error) { |
| | logger.error(`Error parsing model spec for endpoint ${endpoint}`, error); |
| | return handleError(res, { text: 'Error parsing model spec' }); |
| | } |
| | } else if (parsedBody.spec && appConfig.modelSpecs?.list) { |
| | |
| | const modelSpec = appConfig.modelSpecs.list.find((s) => s.name === parsedBody.spec); |
| | if (modelSpec?.iconURL) { |
| | parsedBody.iconURL = modelSpec.iconURL; |
| | } |
| | } |
| |
|
| | try { |
| | const isAgents = |
| | isAgentsEndpoint(endpoint) || req.baseUrl.startsWith(EndpointURLs[EModelEndpoint.agents]); |
| | const builder = isAgents |
| | ? (...args) => buildFunction[EModelEndpoint.agents](req, ...args) |
| | : buildFunction[endpointType ?? endpoint]; |
| |
|
| | |
| | req.body.endpointOption = await builder(endpoint, parsedBody, endpointType); |
| |
|
| | if (req.body.files && !isAgents) { |
| | req.body.endpointOption.attachments = processFiles(req.body.files); |
| | } |
| |
|
| | next(); |
| | } catch (error) { |
| | logger.error( |
| | `Error building endpoint option for endpoint ${endpoint} with type ${endpointType}`, |
| | error, |
| | ); |
| | return handleError(res, { text: 'Error building endpoint option' }); |
| | } |
| | } |
| |
|
| | module.exports = buildEndpointOption; |
| |
|