From a49b2b2833d5f1aafe27b88d1cc5438816d6b178 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Wed, 20 Aug 2025 15:55:32 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A3=EF=B8=8F=20feat:=20`directEndpoint?= =?UTF-8?q?`=20Fetch=20Override=20for=20Custom=20Endpoints=20(#9179)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: Add directEndpoint option to OpenAIConfigOptions and update fetch logic to override /chat/completions URL * feat: Add directEndpoint support to fetchModels and update loadConfigModels logic --- api/server/services/Config/loadConfigModels.js | 7 ++++--- api/server/services/ModelService.js | 5 ++++- packages/api/src/endpoints/openai/llm.ts | 11 +++++++++++ packages/api/src/types/openai.ts | 1 + 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/api/server/services/Config/loadConfigModels.js b/api/server/services/Config/loadConfigModels.js index fc255b8c4..2943317e3 100644 --- a/api/server/services/Config/loadConfigModels.js +++ b/api/server/services/Config/loadConfigModels.js @@ -76,10 +76,11 @@ async function loadConfigModels(req) { fetchPromisesMap[uniqueKey] = fetchPromisesMap[uniqueKey] || fetchModels({ - user: req.user.id, - baseURL: BASE_URL, - apiKey: API_KEY, name, + apiKey: API_KEY, + baseURL: BASE_URL, + user: req.user.id, + direct: endpoint.directEndpoint, userIdQuery: models.userIdQuery, }); uniqueKeyToEndpointsMap[uniqueKey] = uniqueKeyToEndpointsMap[uniqueKey] || []; diff --git a/api/server/services/ModelService.js b/api/server/services/ModelService.js index 0db13ec31..e9876269c 100644 --- a/api/server/services/ModelService.js +++ b/api/server/services/ModelService.js @@ -34,6 +34,7 @@ const { openAIApiKey, userProvidedOpenAI } = require('./Config/EndpointService') * @param {string} params.apiKey - The API key for authentication with the API. * @param {string} params.baseURL - The base path URL for the API. * @param {string} [params.name='OpenAI'] - The name of the API; defaults to 'OpenAI'. + * @param {boolean} [params.direct=false] - Whether `directEndpoint` was configured * @param {boolean} [params.azure=false] - Whether to fetch models from Azure. * @param {boolean} [params.userIdQuery=false] - Whether to send the user ID as a query parameter. * @param {boolean} [params.createTokenConfig=true] - Whether to create a token configuration from the API response. @@ -44,14 +45,16 @@ const { openAIApiKey, userProvidedOpenAI } = require('./Config/EndpointService') const fetchModels = async ({ user, apiKey, - baseURL, + baseURL: _baseURL, name = EModelEndpoint.openAI, + direct, azure = false, userIdQuery = false, createTokenConfig = true, tokenKey, }) => { let models = []; + const baseURL = direct ? extractBaseURL(_baseURL) : _baseURL; if (!baseURL && !azure) { return models; diff --git a/packages/api/src/endpoints/openai/llm.ts b/packages/api/src/endpoints/openai/llm.ts index dca5ff7f1..4cc2d8120 100644 --- a/packages/api/src/endpoints/openai/llm.ts +++ b/packages/api/src/endpoints/openai/llm.ts @@ -6,8 +6,11 @@ import type { AzureOpenAIInput } from '@langchain/openai'; import type { OpenAI } from 'openai'; import type * as t from '~/types'; import { sanitizeModelName, constructAzureURL } from '~/utils/azure'; +import { createFetch } from '~/utils/generators'; import { isEnabled } from '~/utils/common'; +type Fetch = (input: string | URL | Request, init?: RequestInit) => Promise; + export const knownOpenAIParams = new Set([ // Constructor/Instance Parameters 'model', @@ -92,6 +95,7 @@ export function getOpenAIConfig( const { modelOptions: _modelOptions = {}, reverseProxyUrl, + directEndpoint, defaultQuery, headers, proxy, @@ -311,6 +315,13 @@ export function getOpenAIConfig( llmConfig.modelKwargs = modelKwargs; } + if (directEndpoint === true && configOptions?.baseURL != null) { + configOptions.fetch = createFetch({ + directEndpoint: directEndpoint, + reverseProxyUrl: configOptions?.baseURL, + }) as unknown as Fetch; + } + const result: t.LLMConfigResult = { llmConfig, configOptions, diff --git a/packages/api/src/types/openai.ts b/packages/api/src/types/openai.ts index df9d4b5cb..b90618051 100644 --- a/packages/api/src/types/openai.ts +++ b/packages/api/src/types/openai.ts @@ -12,6 +12,7 @@ export type OpenAIParameters = z.infer; */ export interface OpenAIConfigOptions { modelOptions?: Partial; + directEndpoint?: boolean; reverseProxyUrl?: string; defaultQuery?: Record; headers?: Record;