From 1b387779db637f14e3a14493254b4b2f665247d4 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Sat, 21 Jun 2025 14:52:17 -0400 Subject: [PATCH] refactor: remove AskController and related routes, update endpoint URLs (now all streamlined to agents route) --- api/app/clients/BaseClient.js | 6 +- api/server/controllers/AskController.js | 282 ------------------------ api/server/index.js | 1 - api/server/routes/ask/anthropic.js | 25 --- api/server/routes/ask/custom.js | 25 --- api/server/routes/ask/google.js | 24 -- api/server/routes/ask/gptPlugins.js | 241 -------------------- api/server/routes/ask/index.js | 47 ---- api/server/routes/ask/openAI.js | 27 --- api/server/routes/bedrock/chat.js | 37 ---- api/server/routes/bedrock/index.js | 35 --- api/server/routes/index.js | 2 - packages/data-provider/src/config.ts | 12 +- 13 files changed, 6 insertions(+), 758 deletions(-) delete mode 100644 api/server/controllers/AskController.js delete mode 100644 api/server/routes/ask/anthropic.js delete mode 100644 api/server/routes/ask/custom.js delete mode 100644 api/server/routes/ask/google.js delete mode 100644 api/server/routes/ask/gptPlugins.js delete mode 100644 api/server/routes/ask/index.js delete mode 100644 api/server/routes/ask/openAI.js delete mode 100644 api/server/routes/bedrock/chat.js delete mode 100644 api/server/routes/bedrock/index.js diff --git a/api/app/clients/BaseClient.js b/api/app/clients/BaseClient.js index 55b8780180..c8f4228f10 100644 --- a/api/app/clients/BaseClient.js +++ b/api/app/clients/BaseClient.js @@ -792,7 +792,8 @@ class BaseClient { userMessage.tokenCount = userMessageTokenCount; /* - Note: `AskController` saves the user message, so we update the count of its `userMessage` reference + Note: `AgentController` saves the user message if not saved here + (noted by `savedMessageIds`), so we update the count of its `userMessage` reference */ if (typeof opts?.getReqData === 'function') { opts.getReqData({ @@ -801,7 +802,8 @@ class BaseClient { } /* Note: we update the user message to be sure it gets the calculated token count; - though `AskController` saves the user message, EditController does not + though `AgentController` saves the user message if not saved here + (noted by `savedMessageIds`), EditController does not */ await userMessagePromise; await this.updateMessageInDatabase({ diff --git a/api/server/controllers/AskController.js b/api/server/controllers/AskController.js deleted file mode 100644 index 40b209ef35..0000000000 --- a/api/server/controllers/AskController.js +++ /dev/null @@ -1,282 +0,0 @@ -const { getResponseSender, Constants } = require('librechat-data-provider'); -const { - handleAbortError, - createAbortController, - cleanupAbortController, -} = require('~/server/middleware'); -const { - disposeClient, - processReqData, - clientRegistry, - requestDataMap, -} = require('~/server/cleanup'); -const { sendMessage, createOnProgress } = require('~/server/utils'); -const { saveMessage } = require('~/models'); -const { logger } = require('~/config'); - -const AskController = async (req, res, next, initializeClient, addTitle) => { - let { - text, - endpointOption, - conversationId, - modelDisplayLabel, - parentMessageId = null, - overrideParentMessageId = null, - } = req.body; - - let client = null; - let abortKey = null; - let cleanupHandlers = []; - let clientRef = null; - - logger.debug('[AskController]', { - text, - conversationId, - ...endpointOption, - modelsConfig: endpointOption?.modelsConfig ? 'exists' : '', - }); - - let userMessage = null; - let userMessagePromise = null; - let promptTokens = null; - let userMessageId = null; - let responseMessageId = null; - let getAbortData = null; - - const sender = getResponseSender({ - ...endpointOption, - model: endpointOption.modelOptions.model, - modelDisplayLabel, - }); - const initialConversationId = conversationId; - const newConvo = !initialConversationId; - const userId = req.user.id; - - let reqDataContext = { - userMessage, - userMessagePromise, - responseMessageId, - promptTokens, - conversationId, - userMessageId, - }; - - const updateReqData = (data = {}) => { - reqDataContext = processReqData(data, reqDataContext); - abortKey = reqDataContext.abortKey; - userMessage = reqDataContext.userMessage; - userMessagePromise = reqDataContext.userMessagePromise; - responseMessageId = reqDataContext.responseMessageId; - promptTokens = reqDataContext.promptTokens; - conversationId = reqDataContext.conversationId; - userMessageId = reqDataContext.userMessageId; - }; - - let { onProgress: progressCallback, getPartialText } = createOnProgress(); - - const performCleanup = () => { - logger.debug('[AskController] Performing cleanup'); - if (Array.isArray(cleanupHandlers)) { - for (const handler of cleanupHandlers) { - try { - if (typeof handler === 'function') { - handler(); - } - } catch (e) { - // Ignore - } - } - } - - if (abortKey) { - logger.debug('[AskController] Cleaning up abort controller'); - cleanupAbortController(abortKey); - abortKey = null; - } - - if (client) { - disposeClient(client); - client = null; - } - - reqDataContext = null; - userMessage = null; - userMessagePromise = null; - promptTokens = null; - getAbortData = null; - progressCallback = null; - endpointOption = null; - cleanupHandlers = null; - addTitle = null; - - if (requestDataMap.has(req)) { - requestDataMap.delete(req); - } - logger.debug('[AskController] Cleanup completed'); - }; - - try { - ({ client } = await initializeClient({ req, res, endpointOption })); - if (clientRegistry && client) { - clientRegistry.register(client, { userId }, client); - } - - if (client) { - requestDataMap.set(req, { client }); - } - - clientRef = new WeakRef(client); - - getAbortData = () => { - const currentClient = clientRef?.deref(); - const currentText = - currentClient?.getStreamText != null ? currentClient.getStreamText() : getPartialText(); - - return { - sender, - conversationId, - messageId: reqDataContext.responseMessageId, - parentMessageId: overrideParentMessageId ?? userMessageId, - text: currentText, - userMessage: userMessage, - userMessagePromise: userMessagePromise, - promptTokens: reqDataContext.promptTokens, - }; - }; - - const { onStart, abortController } = createAbortController( - req, - res, - getAbortData, - updateReqData, - ); - - const closeHandler = () => { - logger.debug('[AskController] Request closed'); - if (!abortController || abortController.signal.aborted || abortController.requestCompleted) { - return; - } - abortController.abort(); - logger.debug('[AskController] Request aborted on close'); - }; - - res.on('close', closeHandler); - cleanupHandlers.push(() => { - try { - res.removeListener('close', closeHandler); - } catch (e) { - // Ignore - } - }); - - const messageOptions = { - user: userId, - parentMessageId, - conversationId: reqDataContext.conversationId, - overrideParentMessageId, - getReqData: updateReqData, - onStart, - abortController, - progressCallback, - progressOptions: { - res, - }, - }; - - /** @type {TMessage} */ - let response = await client.sendMessage(text, messageOptions); - response.endpoint = endpointOption.endpoint; - - const databasePromise = response.databasePromise; - delete response.databasePromise; - - const { conversation: convoData = {} } = await databasePromise; - const conversation = { ...convoData }; - conversation.title = - conversation && !conversation.title ? null : conversation?.title || 'New Chat'; - - const latestUserMessage = reqDataContext.userMessage; - - if (client?.options?.attachments && latestUserMessage) { - latestUserMessage.files = client.options.attachments; - if (endpointOption?.modelOptions?.model) { - conversation.model = endpointOption.modelOptions.model; - } - delete latestUserMessage.image_urls; - } - - if (!abortController.signal.aborted) { - const finalResponseMessage = { ...response }; - - sendMessage(res, { - final: true, - conversation, - title: conversation.title, - requestMessage: latestUserMessage, - responseMessage: finalResponseMessage, - }); - res.end(); - - if (client?.savedMessageIds && !client.savedMessageIds.has(response.messageId)) { - await saveMessage( - req, - { ...finalResponseMessage, user: userId }, - { context: 'api/server/controllers/AskController.js - response end' }, - ); - } - } - - if (!client?.skipSaveUserMessage && latestUserMessage) { - await saveMessage(req, latestUserMessage, { - context: "api/server/controllers/AskController.js - don't skip saving user message", - }); - } - - if (typeof addTitle === 'function' && parentMessageId === Constants.NO_PARENT && newConvo) { - addTitle(req, { - text, - response: { ...response }, - client, - }) - .then(() => { - logger.debug('[AskController] Title generation started'); - }) - .catch((err) => { - logger.error('[AskController] Error in title generation', err); - }) - .finally(() => { - logger.debug('[AskController] Title generation completed'); - performCleanup(); - }); - } else { - performCleanup(); - } - } catch (error) { - logger.error('[AskController] Error handling request', error); - let partialText = ''; - try { - const currentClient = clientRef?.deref(); - partialText = - currentClient?.getStreamText != null ? currentClient.getStreamText() : getPartialText(); - } catch (getTextError) { - logger.error('[AskController] Error calling getText() during error handling', getTextError); - } - - handleAbortError(res, req, error, { - sender, - partialText, - conversationId: reqDataContext.conversationId, - messageId: reqDataContext.responseMessageId, - parentMessageId: overrideParentMessageId ?? reqDataContext.userMessageId ?? parentMessageId, - userMessageId: reqDataContext.userMessageId, - }) - .catch((err) => { - logger.error('[AskController] Error in `handleAbortError` during catch block', err); - }) - .finally(() => { - performCleanup(); - }); - } -}; - -module.exports = AskController; diff --git a/api/server/index.js b/api/server/index.js index 8c7db3e226..28fcf0433c 100644 --- a/api/server/index.js +++ b/api/server/index.js @@ -97,7 +97,6 @@ const startServer = async () => { app.use('/api/actions', routes.actions); app.use('/api/keys', routes.keys); app.use('/api/user', routes.user); - app.use('/api/ask', routes.ask); app.use('/api/search', routes.search); app.use('/api/edit', routes.edit); app.use('/api/messages', routes.messages); diff --git a/api/server/routes/ask/anthropic.js b/api/server/routes/ask/anthropic.js deleted file mode 100644 index afe1720d84..0000000000 --- a/api/server/routes/ask/anthropic.js +++ /dev/null @@ -1,25 +0,0 @@ -const express = require('express'); -const AskController = require('~/server/controllers/AskController'); -const { addTitle, initializeClient } = require('~/server/services/Endpoints/anthropic'); -const { - setHeaders, - handleAbort, - validateModel, - validateEndpoint, - buildEndpointOption, -} = require('~/server/middleware'); - -const router = express.Router(); - -router.post( - '/', - validateEndpoint, - validateModel, - buildEndpointOption, - setHeaders, - async (req, res, next) => { - await AskController(req, res, next, initializeClient, addTitle); - }, -); - -module.exports = router; diff --git a/api/server/routes/ask/custom.js b/api/server/routes/ask/custom.js deleted file mode 100644 index 8fc343cf17..0000000000 --- a/api/server/routes/ask/custom.js +++ /dev/null @@ -1,25 +0,0 @@ -const express = require('express'); -const AskController = require('~/server/controllers/AskController'); -const { initializeClient } = require('~/server/services/Endpoints/custom'); -const { addTitle } = require('~/server/services/Endpoints/openAI'); -const { - setHeaders, - validateModel, - validateEndpoint, - buildEndpointOption, -} = require('~/server/middleware'); - -const router = express.Router(); - -router.post( - '/', - validateEndpoint, - validateModel, - buildEndpointOption, - setHeaders, - async (req, res, next) => { - await AskController(req, res, next, initializeClient, addTitle); - }, -); - -module.exports = router; diff --git a/api/server/routes/ask/google.js b/api/server/routes/ask/google.js deleted file mode 100644 index 16c7e265f4..0000000000 --- a/api/server/routes/ask/google.js +++ /dev/null @@ -1,24 +0,0 @@ -const express = require('express'); -const AskController = require('~/server/controllers/AskController'); -const { initializeClient, addTitle } = require('~/server/services/Endpoints/google'); -const { - setHeaders, - validateModel, - validateEndpoint, - buildEndpointOption, -} = require('~/server/middleware'); - -const router = express.Router(); - -router.post( - '/', - validateEndpoint, - validateModel, - buildEndpointOption, - setHeaders, - async (req, res, next) => { - await AskController(req, res, next, initializeClient, addTitle); - }, -); - -module.exports = router; diff --git a/api/server/routes/ask/gptPlugins.js b/api/server/routes/ask/gptPlugins.js deleted file mode 100644 index a40022848a..0000000000 --- a/api/server/routes/ask/gptPlugins.js +++ /dev/null @@ -1,241 +0,0 @@ -const express = require('express'); -const { getResponseSender, Constants } = require('librechat-data-provider'); -const { initializeClient } = require('~/server/services/Endpoints/gptPlugins'); -const { sendMessage, createOnProgress } = require('~/server/utils'); -const { addTitle } = require('~/server/services/Endpoints/openAI'); -const { saveMessage, updateMessage } = require('~/models'); -const { - handleAbort, - createAbortController, - handleAbortError, - setHeaders, - validateModel, - validateEndpoint, - buildEndpointOption, - moderateText, -} = require('~/server/middleware'); -const { validateTools } = require('~/app'); -const { logger } = require('~/config'); - -const router = express.Router(); - -router.use(moderateText); - -router.post( - '/', - validateEndpoint, - validateModel, - buildEndpointOption, - setHeaders, - async (req, res) => { - let { - text, - endpointOption, - conversationId, - parentMessageId = null, - overrideParentMessageId = null, - } = req.body; - - logger.debug('[/ask/gptPlugins]', { text, conversationId, ...endpointOption }); - - let userMessage; - let userMessagePromise; - let promptTokens; - let userMessageId; - let responseMessageId; - const sender = getResponseSender({ - ...endpointOption, - model: endpointOption.modelOptions.model, - }); - const newConvo = !conversationId; - const user = req.user.id; - - const plugins = []; - - const getReqData = (data = {}) => { - for (let key in data) { - if (key === 'userMessage') { - userMessage = data[key]; - userMessageId = data[key].messageId; - } else if (key === 'userMessagePromise') { - userMessagePromise = data[key]; - } else if (key === 'responseMessageId') { - responseMessageId = data[key]; - } else if (key === 'promptTokens') { - promptTokens = data[key]; - } else if (!conversationId && key === 'conversationId') { - conversationId = data[key]; - } - } - }; - - let streaming = null; - let timer = null; - - const { - onProgress: progressCallback, - sendIntermediateMessage, - getPartialText, - } = createOnProgress({ - onProgress: () => { - if (timer) { - clearTimeout(timer); - } - - streaming = new Promise((resolve) => { - timer = setTimeout(() => { - resolve(); - }, 250); - }); - }, - }); - - const pluginMap = new Map(); - const onAgentAction = async (action, runId) => { - pluginMap.set(runId, action.tool); - sendIntermediateMessage(res, { - plugins, - parentMessageId: userMessage.messageId, - messageId: responseMessageId, - }); - }; - - const onToolStart = async (tool, input, runId, parentRunId) => { - const pluginName = pluginMap.get(parentRunId); - const latestPlugin = { - runId, - loading: true, - inputs: [input], - latest: pluginName, - outputs: null, - }; - - if (streaming) { - await streaming; - } - const extraTokens = ':::plugin:::\n'; - plugins.push(latestPlugin); - sendIntermediateMessage( - res, - { plugins, parentMessageId: userMessage.messageId, messageId: responseMessageId }, - extraTokens, - ); - }; - - const onToolEnd = async (output, runId) => { - if (streaming) { - await streaming; - } - - const pluginIndex = plugins.findIndex((plugin) => plugin.runId === runId); - - if (pluginIndex !== -1) { - plugins[pluginIndex].loading = false; - plugins[pluginIndex].outputs = output; - } - }; - - const getAbortData = () => ({ - sender, - conversationId, - userMessagePromise, - messageId: responseMessageId, - parentMessageId: overrideParentMessageId ?? userMessageId, - text: getPartialText(), - plugins: plugins.map((p) => ({ ...p, loading: false })), - userMessage, - promptTokens, - }); - const { abortController, onStart } = createAbortController(req, res, getAbortData, getReqData); - - try { - endpointOption.tools = await validateTools(user, endpointOption.tools); - const { client } = await initializeClient({ req, res, endpointOption }); - - const onChainEnd = () => { - if (!client.skipSaveUserMessage) { - saveMessage( - req, - { ...userMessage, user }, - { context: 'api/server/routes/ask/gptPlugins.js - onChainEnd' }, - ); - } - sendIntermediateMessage(res, { - plugins, - parentMessageId: userMessage.messageId, - messageId: responseMessageId, - }); - }; - - let response = await client.sendMessage(text, { - user, - conversationId, - parentMessageId, - overrideParentMessageId, - getReqData, - onAgentAction, - onChainEnd, - onToolStart, - onToolEnd, - onStart, - getPartialText, - ...endpointOption, - progressCallback, - progressOptions: { - res, - // parentMessageId: overrideParentMessageId || userMessageId, - plugins, - }, - abortController, - }); - - if (overrideParentMessageId) { - response.parentMessageId = overrideParentMessageId; - } - - logger.debug('[/ask/gptPlugins]', response); - - const { conversation = {} } = await response.databasePromise; - delete response.databasePromise; - conversation.title = - conversation && !conversation.title ? null : conversation?.title || 'New Chat'; - - sendMessage(res, { - title: conversation.title, - final: true, - conversation, - requestMessage: userMessage, - responseMessage: response, - }); - res.end(); - - if (parentMessageId === Constants.NO_PARENT && newConvo) { - addTitle(req, { - text, - response, - client, - }); - } - - response.plugins = plugins.map((p) => ({ ...p, loading: false })); - if (response.plugins?.length > 0) { - await updateMessage( - req, - { ...response, user }, - { context: 'api/server/routes/ask/gptPlugins.js - save plugins used' }, - ); - } - } catch (error) { - const partialText = getPartialText(); - handleAbortError(res, req, error, { - partialText, - conversationId, - sender, - messageId: responseMessageId, - parentMessageId: userMessageId ?? parentMessageId, - }); - } - }, -); - -module.exports = router; diff --git a/api/server/routes/ask/index.js b/api/server/routes/ask/index.js deleted file mode 100644 index 525bd8e29d..0000000000 --- a/api/server/routes/ask/index.js +++ /dev/null @@ -1,47 +0,0 @@ -const express = require('express'); -const { EModelEndpoint } = require('librechat-data-provider'); -const { - uaParser, - checkBan, - requireJwtAuth, - messageIpLimiter, - concurrentLimiter, - messageUserLimiter, - validateConvoAccess, -} = require('~/server/middleware'); -const { isEnabled } = require('~/server/utils'); -const gptPlugins = require('./gptPlugins'); -const anthropic = require('./anthropic'); -const custom = require('./custom'); -const google = require('./google'); -const openAI = require('./openAI'); - -const { LIMIT_CONCURRENT_MESSAGES, LIMIT_MESSAGE_IP, LIMIT_MESSAGE_USER } = process.env ?? {}; - -const router = express.Router(); - -router.use(requireJwtAuth); -router.use(checkBan); -router.use(uaParser); - -if (isEnabled(LIMIT_CONCURRENT_MESSAGES)) { - router.use(concurrentLimiter); -} - -if (isEnabled(LIMIT_MESSAGE_IP)) { - router.use(messageIpLimiter); -} - -if (isEnabled(LIMIT_MESSAGE_USER)) { - router.use(messageUserLimiter); -} - -router.use(validateConvoAccess); - -router.use([`/${EModelEndpoint.azureOpenAI}`, `/${EModelEndpoint.openAI}`], openAI); -router.use(`/${EModelEndpoint.gptPlugins}`, gptPlugins); -router.use(`/${EModelEndpoint.anthropic}`, anthropic); -router.use(`/${EModelEndpoint.google}`, google); -router.use(`/${EModelEndpoint.custom}`, custom); - -module.exports = router; diff --git a/api/server/routes/ask/openAI.js b/api/server/routes/ask/openAI.js deleted file mode 100644 index dadf00def4..0000000000 --- a/api/server/routes/ask/openAI.js +++ /dev/null @@ -1,27 +0,0 @@ -const express = require('express'); -const AskController = require('~/server/controllers/AskController'); -const { addTitle, initializeClient } = require('~/server/services/Endpoints/openAI'); -const { - handleAbort, - setHeaders, - validateModel, - validateEndpoint, - buildEndpointOption, - moderateText, -} = require('~/server/middleware'); - -const router = express.Router(); -router.use(moderateText); - -router.post( - '/', - validateEndpoint, - validateModel, - buildEndpointOption, - setHeaders, - async (req, res, next) => { - await AskController(req, res, next, initializeClient, addTitle); - }, -); - -module.exports = router; diff --git a/api/server/routes/bedrock/chat.js b/api/server/routes/bedrock/chat.js deleted file mode 100644 index 263ca96002..0000000000 --- a/api/server/routes/bedrock/chat.js +++ /dev/null @@ -1,37 +0,0 @@ -const express = require('express'); - -const router = express.Router(); -const { - setHeaders, - handleAbort, - moderateText, - // validateModel, - // validateEndpoint, - buildEndpointOption, -} = require('~/server/middleware'); -const { initializeClient } = require('~/server/services/Endpoints/bedrock'); -const AgentController = require('~/server/controllers/agents/request'); -const addTitle = require('~/server/services/Endpoints/agents/title'); - -router.use(moderateText); - -/** - * @route POST / - * @desc Chat with an assistant - * @access Public - * @param {express.Request} req - The request object, containing the request data. - * @param {express.Response} res - The response object, used to send back a response. - * @returns {void} - */ -router.post( - '/', - // validateModel, - // validateEndpoint, - buildEndpointOption, - setHeaders, - async (req, res, next) => { - await AgentController(req, res, next, initializeClient, addTitle); - }, -); - -module.exports = router; diff --git a/api/server/routes/bedrock/index.js b/api/server/routes/bedrock/index.js deleted file mode 100644 index ce440a7c0e..0000000000 --- a/api/server/routes/bedrock/index.js +++ /dev/null @@ -1,35 +0,0 @@ -const express = require('express'); -const { - uaParser, - checkBan, - requireJwtAuth, - messageIpLimiter, - concurrentLimiter, - messageUserLimiter, -} = require('~/server/middleware'); -const { isEnabled } = require('~/server/utils'); -const chat = require('./chat'); - -const { LIMIT_CONCURRENT_MESSAGES, LIMIT_MESSAGE_IP, LIMIT_MESSAGE_USER } = process.env ?? {}; - -const router = express.Router(); - -router.use(requireJwtAuth); -router.use(checkBan); -router.use(uaParser); - -if (isEnabled(LIMIT_CONCURRENT_MESSAGES)) { - router.use(concurrentLimiter); -} - -if (isEnabled(LIMIT_MESSAGE_IP)) { - router.use(messageIpLimiter); -} - -if (isEnabled(LIMIT_MESSAGE_USER)) { - router.use(messageUserLimiter); -} - -router.use('/chat', chat); - -module.exports = router; diff --git a/api/server/routes/index.js b/api/server/routes/index.js index 7c1b5de0fa..dba8bdd1c0 100644 --- a/api/server/routes/index.js +++ b/api/server/routes/index.js @@ -26,11 +26,9 @@ const auth = require('./auth'); const edit = require('./edit'); const keys = require('./keys'); const user = require('./user'); -const ask = require('./ask'); const mcp = require('./mcp'); module.exports = { - ask, edit, auth, keys, diff --git a/packages/data-provider/src/config.ts b/packages/data-provider/src/config.ts index 4d1c95b69f..0215b00fbc 100644 --- a/packages/data-provider/src/config.ts +++ b/packages/data-provider/src/config.ts @@ -940,18 +940,10 @@ export const initialModelsConfig: TModelsConfig = { [EModelEndpoint.bedrock]: defaultModels[EModelEndpoint.bedrock], }; -export const EndpointURLs: { [key in EModelEndpoint]: string } = { - [EModelEndpoint.openAI]: `/api/ask/${EModelEndpoint.openAI}`, - [EModelEndpoint.google]: `/api/ask/${EModelEndpoint.google}`, - [EModelEndpoint.custom]: `/api/ask/${EModelEndpoint.custom}`, - [EModelEndpoint.anthropic]: `/api/ask/${EModelEndpoint.anthropic}`, - [EModelEndpoint.gptPlugins]: `/api/ask/${EModelEndpoint.gptPlugins}`, - [EModelEndpoint.azureOpenAI]: `/api/ask/${EModelEndpoint.azureOpenAI}`, - [EModelEndpoint.chatGPTBrowser]: `/api/ask/${EModelEndpoint.chatGPTBrowser}`, - [EModelEndpoint.azureAssistants]: '/api/assistants/v1/chat', +export const EndpointURLs: Record = { [EModelEndpoint.assistants]: '/api/assistants/v2/chat', + [EModelEndpoint.azureAssistants]: '/api/assistants/v1/chat', [EModelEndpoint.agents]: `/api/${EModelEndpoint.agents}/chat`, - [EModelEndpoint.bedrock]: `/api/${EModelEndpoint.bedrock}/chat`, }; export const modularEndpoints = new Set([