| const { parseConvo, EModelEndpoint } = require('librechat-data-provider'); |
| const { getModelsConfig } = require('~/server/controllers/ModelController'); |
| const azureAssistants = require('~/server/services/Endpoints/azureAssistants'); |
| const assistants = require('~/server/services/Endpoints/assistants'); |
| const gptPlugins = require('~/server/services/Endpoints/gptPlugins'); |
| const { processFiles } = require('~/server/services/Files/process'); |
| const anthropic = require('~/server/services/Endpoints/anthropic'); |
| const openAI = require('~/server/services/Endpoints/openAI'); |
| const custom = require('~/server/services/Endpoints/custom'); |
| const google = require('~/server/services/Endpoints/google'); |
| const enforceModelSpec = require('./enforceModelSpec'); |
| const { handleError } = require('~/server/utils'); |
|
|
| const buildFunction = { |
| [EModelEndpoint.openAI]: openAI.buildOptions, |
| [EModelEndpoint.google]: google.buildOptions, |
| [EModelEndpoint.custom]: custom.buildOptions, |
| [EModelEndpoint.azureOpenAI]: openAI.buildOptions, |
| [EModelEndpoint.anthropic]: anthropic.buildOptions, |
| [EModelEndpoint.gptPlugins]: gptPlugins.buildOptions, |
| [EModelEndpoint.assistants]: assistants.buildOptions, |
| [EModelEndpoint.azureAssistants]: azureAssistants.buildOptions, |
| }; |
|
|
| async function buildEndpointOption(req, res, next) { |
| const { endpoint, endpointType } = req.body; |
| const parsedBody = parseConvo({ endpoint, endpointType, conversation: req.body }); |
|
|
| if (req.app.locals.modelSpecs?.list && req.app.locals.modelSpecs?.enforce) { |
| |
| const { list } = req.app.locals.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' }); |
| } |
|
|
| if ( |
| currentModelSpec.preset.endpoint !== EModelEndpoint.gptPlugins && |
| currentModelSpec.preset.tools |
| ) { |
| return handleError(res, { |
| text: `Only the "${EModelEndpoint.gptPlugins}" endpoint can have tools defined in the preset`, |
| }); |
| } |
|
|
| const isValidModelSpec = enforceModelSpec(currentModelSpec, parsedBody); |
| if (!isValidModelSpec) { |
| return handleError(res, { text: 'Model spec mismatch' }); |
| } |
| } |
|
|
| req.body.endpointOption = buildFunction[endpointType ?? endpoint]( |
| endpoint, |
| parsedBody, |
| endpointType, |
| ); |
|
|
| const modelsConfig = await getModelsConfig(req); |
| req.body.endpointOption.modelsConfig = modelsConfig; |
|
|
| if (req.body.files) { |
| |
| req.body.endpointOption.attachments = processFiles(req.body.files); |
| } |
| next(); |
| } |
|
|
| module.exports = buildEndpointOption; |
|
|