From efed1c461de3c3cf143190b7ee37d5fe57e89cdb Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Wed, 12 Mar 2025 12:03:16 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20feat:=20Support=20OpenAI=20Web?= =?UTF-8?q?=20Search=20models=20(#6313)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: reorder vision model entries for cheaper models first * fix: add endpoint property to bedrock client initialization * fix: exclude unsupported parameters for OpenAI Web Search models * fix: enhance options to exclude unsupported parameters for Web Search models --- api/app/clients/OpenAIClient.js | 23 ++++++++++++++++ .../services/Endpoints/bedrock/initialize.js | 3 ++- .../services/Endpoints/openAI/initialize.js | 9 +++---- api/server/services/Endpoints/openAI/llm.js | 26 +++++++++++++++++-- packages/data-provider/src/config.ts | 18 ++++++------- 5 files changed, 61 insertions(+), 18 deletions(-) diff --git a/api/app/clients/OpenAIClient.js b/api/app/clients/OpenAIClient.js index 9a89e34879..a1ab496b5d 100644 --- a/api/app/clients/OpenAIClient.js +++ b/api/app/clients/OpenAIClient.js @@ -1272,6 +1272,29 @@ ${convo} }); } + /** Note: OpenAI Web Search models do not support any known parameters besdies `max_tokens` */ + if (modelOptions.model && /gpt-4o.*search/.test(modelOptions.model)) { + const searchExcludeParams = [ + 'frequency_penalty', + 'presence_penalty', + 'temperature', + 'top_p', + 'top_k', + 'stop', + 'logit_bias', + 'seed', + 'response_format', + 'n', + 'logprobs', + 'user', + ]; + + this.options.dropParams = this.options.dropParams || []; + this.options.dropParams = [ + ...new Set([...this.options.dropParams, ...searchExcludeParams]), + ]; + } + if (this.options.dropParams && Array.isArray(this.options.dropParams)) { this.options.dropParams.forEach((param) => { delete modelOptions[param]; diff --git a/api/server/services/Endpoints/bedrock/initialize.js b/api/server/services/Endpoints/bedrock/initialize.js index 3ffa03393d..51d0040566 100644 --- a/api/server/services/Endpoints/bedrock/initialize.js +++ b/api/server/services/Endpoints/bedrock/initialize.js @@ -23,8 +23,9 @@ const initializeClient = async ({ req, res, endpointOption }) => { const agent = { id: EModelEndpoint.bedrock, name: endpointOption.name, - instructions: endpointOption.promptPrefix, provider: EModelEndpoint.bedrock, + endpoint: EModelEndpoint.bedrock, + instructions: endpointOption.promptPrefix, model: endpointOption.model_parameters.model, model_parameters: endpointOption.model_parameters, }; diff --git a/api/server/services/Endpoints/openAI/initialize.js b/api/server/services/Endpoints/openAI/initialize.js index 5614804b68..4d358cef1a 100644 --- a/api/server/services/Endpoints/openAI/initialize.js +++ b/api/server/services/Endpoints/openAI/initialize.js @@ -135,12 +135,9 @@ const initializeClient = async ({ } if (optionsOnly) { - clientOptions = Object.assign( - { - modelOptions: endpointOption.model_parameters, - }, - clientOptions, - ); + const modelOptions = endpointOption.model_parameters; + modelOptions.model = modelName; + clientOptions = Object.assign({ modelOptions }, clientOptions); clientOptions.modelOptions.user = req.user.id; const options = getLLMConfig(apiKey, clientOptions); if (!clientOptions.streamRate) { diff --git a/api/server/services/Endpoints/openAI/llm.js b/api/server/services/Endpoints/openAI/llm.js index af19ece486..a8aeeb5b9d 100644 --- a/api/server/services/Endpoints/openAI/llm.js +++ b/api/server/services/Endpoints/openAI/llm.js @@ -28,7 +28,7 @@ const { isEnabled } = require('~/server/utils'); * @returns {Object} Configuration options for creating an LLM instance. */ function getLLMConfig(apiKey, options = {}, endpoint = null) { - const { + let { modelOptions = {}, reverseProxyUrl, defaultQuery, @@ -50,10 +50,32 @@ function getLLMConfig(apiKey, options = {}, endpoint = null) { if (addParams && typeof addParams === 'object') { Object.assign(llmConfig, addParams); } + /** Note: OpenAI Web Search models do not support any known parameters besdies `max_tokens` */ + if (modelOptions.model && /gpt-4o.*search/.test(modelOptions.model)) { + const searchExcludeParams = [ + 'frequency_penalty', + 'presence_penalty', + 'temperature', + 'top_p', + 'top_k', + 'stop', + 'logit_bias', + 'seed', + 'response_format', + 'n', + 'logprobs', + 'user', + ]; + + dropParams = dropParams || []; + dropParams = [...new Set([...dropParams, ...searchExcludeParams])]; + } if (dropParams && Array.isArray(dropParams)) { dropParams.forEach((param) => { - delete llmConfig[param]; + if (llmConfig[param]) { + llmConfig[param] = undefined; + } }); } diff --git a/packages/data-provider/src/config.ts b/packages/data-provider/src/config.ts index 1cc0d5a785..af850b4180 100644 --- a/packages/data-provider/src/config.ts +++ b/packages/data-provider/src/config.ts @@ -827,28 +827,28 @@ export const supportsBalanceCheck = { }; export const visionModels = [ - 'grok-3', - 'grok-2-vision', 'grok-vision', - 'gpt-4.5', - 'gpt-4o', + 'grok-2-vision', + 'grok-3', 'gpt-4o-mini', - 'o1', + 'gpt-4o', 'gpt-4-turbo', 'gpt-4-vision', + 'o1', + 'gpt-4.5', 'llava', 'llava-13b', 'gemini-pro-vision', 'claude-3', - 'gemini-2.0', - 'gemini-1.5', 'gemini-exp', + 'gemini-1.5', + 'gemini-2.0', 'moondream', 'llama3.2-vision', - 'llama-3.2-90b-vision', 'llama-3.2-11b-vision', - 'llama-3-2-90b-vision', 'llama-3-2-11b-vision', + 'llama-3.2-90b-vision', + 'llama-3-2-90b-vision', ]; export enum VisionModes { generative = 'generative',