From 3be18e3f9d5dc395405235f42bd5a6dbbdeaf1d7 Mon Sep 17 00:00:00 2001 From: Anirban Kar Date: Sat, 1 Feb 2025 15:29:54 +0530 Subject: [PATCH] feat: added dynamic model support for openAI provider (#1241) --- app/lib/modules/llm/providers/openai.ts | 41 +++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/app/lib/modules/llm/providers/openai.ts b/app/lib/modules/llm/providers/openai.ts index 8a19ff21c..b6193b910 100644 --- a/app/lib/modules/llm/providers/openai.ts +++ b/app/lib/modules/llm/providers/openai.ts @@ -20,6 +20,47 @@ export default class OpenAIProvider extends BaseProvider { { name: 'gpt-3.5-turbo', label: 'GPT-3.5 Turbo', provider: 'OpenAI', maxTokenAllowed: 8000 }, ]; + async getDynamicModels( + apiKeys?: Record, + settings?: IProviderSetting, + serverEnv?: Record, + ): Promise { + const { apiKey } = this.getProviderBaseUrlAndKey({ + apiKeys, + providerSettings: settings, + serverEnv: serverEnv as any, + defaultBaseUrlKey: '', + defaultApiTokenKey: 'OPENAI_API_KEY', + }); + + if (!apiKey) { + throw `Missing Api Key configuration for ${this.name} provider`; + } + + const response = await fetch(`https://api.openai.com/v1/models`, { + headers: { + Authorization: `Bearer ${apiKey}`, + }, + }); + + const res = (await response.json()) as any; + const staticModelIds = this.staticModels.map((m) => m.name); + + const data = res.data.filter( + (model: any) => + model.object === 'model' && + (model.id.startsWith('gpt-') || model.id.startsWith('o') || model.id.startsWith('chatgpt-')) && + !staticModelIds.includes(model.id), + ); + + return data.map((m: any) => ({ + name: m.id, + label: `${m.id}`, + provider: this.name, + maxTokenAllowed: m.context_window || 32000, + })); + } + getModelInstance(options: { model: string; serverEnv: Env;