From 1dabe964040675f25631b908765dd5f24e8a4d64 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Wed, 16 Jul 2025 17:17:15 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=95=92=20refactor:=20Use=20Legacy=20Conte?= =?UTF-8?q?nt=20for=20Custom=20Endpoints=20and=20Azure=20Serverless=20for?= =?UTF-8?q?=20Improved=20Compatibility=20(#8502)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🕒 refactor: Use Legacy Content for Custom Endpoints to Improve Compatibility - Also applies to Azure serverless endpoints from AI Foundry * chore: move useLegacyContent condition before early return * fix: Ensure useLegacyContent is set only when options are available --- api/server/controllers/agents/client.js | 9 +++------ api/server/services/Endpoints/agents/agent.js | 3 ++- api/server/services/Endpoints/custom/initialize.js | 4 ++++ api/server/services/Endpoints/openAI/initialize.js | 8 ++++++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/api/server/controllers/agents/client.js b/api/server/controllers/agents/client.js index d19ddf08b6..c02e147110 100644 --- a/api/server/controllers/agents/client.js +++ b/api/server/controllers/agents/client.js @@ -26,7 +26,6 @@ const { VisionModes, ContentTypes, EModelEndpoint, - KnownEndpoints, PermissionTypes, isAgentsEndpoint, AgentCapabilities, @@ -76,8 +75,6 @@ const payloadParser = ({ req, agent, endpoint }) => { return req.body.endpointOption.model_parameters; }; -const legacyContentEndpoints = new Set([KnownEndpoints.groq, KnownEndpoints.deepseek]); - const noSystemModelRegex = [/\b(o1-preview|o1-mini|amazon\.titan-text)\b/gi]; function createTokenCounter(encoding) { @@ -718,9 +715,6 @@ class AgentClient extends BaseClient { this.indexTokenCountMap, toolSet, ); - if (legacyContentEndpoints.has(this.options.agent.endpoint?.toLowerCase())) { - initialMessages = formatContentStrings(initialMessages); - } /** * @@ -784,6 +778,9 @@ class AgentClient extends BaseClient { } let messages = _messages; + if (agent.useLegacyContent === true) { + messages = formatContentStrings(messages); + } if ( agent.model_parameters?.clientOptions?.defaultHeaders?.['anthropic-beta']?.includes( 'prompt-caching', diff --git a/api/server/services/Endpoints/agents/agent.js b/api/server/services/Endpoints/agents/agent.js index 7b13e753bd..b5be8ec913 100644 --- a/api/server/services/Endpoints/agents/agent.js +++ b/api/server/services/Endpoints/agents/agent.js @@ -186,10 +186,11 @@ const initializeAgent = async ({ return { ...agent, + tools, attachments, resendFiles, toolContextMap, - tools, + useLegacyContent: !!options.useLegacyContent, maxContextTokens: (agentMaxContextTokens - maxTokens) * 0.9, }; }; diff --git a/api/server/services/Endpoints/custom/initialize.js b/api/server/services/Endpoints/custom/initialize.js index 4fcbe76ea6..58da9f10dd 100644 --- a/api/server/services/Endpoints/custom/initialize.js +++ b/api/server/services/Endpoints/custom/initialize.js @@ -139,6 +139,9 @@ const initializeClient = async ({ req, res, endpointOption, optionsOnly, overrid ); clientOptions.modelOptions.user = req.user.id; const options = getOpenAIConfig(apiKey, clientOptions, endpoint); + if (options != null) { + options.useLegacyContent = true; + } if (!customOptions.streamRate) { return options; } @@ -156,6 +159,7 @@ const initializeClient = async ({ req, res, endpointOption, optionsOnly, overrid } return { + useLegacyContent: true, llmConfig: modelOptions, }; } diff --git a/api/server/services/Endpoints/openAI/initialize.js b/api/server/services/Endpoints/openAI/initialize.js index e86596181a..bfa228f378 100644 --- a/api/server/services/Endpoints/openAI/initialize.js +++ b/api/server/services/Endpoints/openAI/initialize.js @@ -65,19 +65,20 @@ const initializeClient = async ({ const isAzureOpenAI = endpoint === EModelEndpoint.azureOpenAI; /** @type {false | TAzureConfig} */ const azureConfig = isAzureOpenAI && req.app.locals[EModelEndpoint.azureOpenAI]; - + let serverless = false; if (isAzureOpenAI && azureConfig) { const { modelGroupMap, groupMap } = azureConfig; const { azureOptions, baseURL, headers = {}, - serverless, + serverless: _serverless, } = mapModelToAzureConfig({ modelName, modelGroupMap, groupMap, }); + serverless = _serverless; clientOptions.reverseProxyUrl = baseURL ?? clientOptions.reverseProxyUrl; clientOptions.headers = resolveHeaders( @@ -143,6 +144,9 @@ const initializeClient = async ({ clientOptions = Object.assign({ modelOptions }, clientOptions); clientOptions.modelOptions.user = req.user.id; const options = getOpenAIConfig(apiKey, clientOptions); + if (options != null && serverless === true) { + options.useLegacyContent = true; + } const streamRate = clientOptions.streamRate; if (!streamRate) { return options;