diff --git a/api/server/services/Config/loadConfigModels.js b/api/server/services/Config/loadConfigModels.js index fc255b8c47..2943317e34 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 0db13ec318..e9876269c7 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 dca5ff7f11..4cc2d81209 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 df9d4b5cbb..b906180519 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;