From 6c227cab6fd973135bc51ce9d0f4efc12e5d29d9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:24:51 +0530 Subject: [PATCH] feat(providers): move providers to UI --- ui/lib/providers/index.ts | 72 +++++++++++++++++++++++++++++++ ui/lib/providers/openai.ts | 88 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 ui/lib/providers/index.ts create mode 100644 ui/lib/providers/openai.ts diff --git a/ui/lib/providers/index.ts b/ui/lib/providers/index.ts new file mode 100644 index 0000000..cbb1677 --- /dev/null +++ b/ui/lib/providers/index.ts @@ -0,0 +1,72 @@ +import { Embeddings } from '@langchain/core/embeddings'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai'; +import { getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName } from '../config'; +import { ChatOpenAI } from '@langchain/openai'; + +export interface ChatModelProvider { + displayName: string + model: BaseChatModel +} + +export interface EmbeddingModelProvider { + displayName: string + model: Embeddings +} + +const chatModelProviders: Record Promise>> = { + openai: loadOpenAIChatModels +} + +const embeddingModelProviders: Record Promise>> = { + openai: loadOpenAIEmbeddingModels +} + +export const getAvailableChatModelProviders = async () => { + const models: Record> = {}; + + for (const provider in chatModelProviders) { + const providerModels = await chatModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels; + } + } + + const customOpenAiApiKey = getCustomOpenaiApiKey(); + const customOpenAiApiUrl = getCustomOpenaiApiUrl(); + const customOpenAiModelName = getCustomOpenaiModelName(); + + models['custom_openai'] = { + ...(customOpenAiApiKey && customOpenAiApiUrl && customOpenAiModelName + ? { + [customOpenAiModelName]: { + displayName: customOpenAiModelName, + model: new ChatOpenAI({ + openAIApiKey: customOpenAiApiKey, + modelName: customOpenAiModelName, + temperature: 0.7, + configuration: { + baseURL: customOpenAiApiUrl, + }, + }), + }, + } + : {}), + }; + + return models; +}; + +export const getAvailableEmbeddingModelProviders = async () => { + const models: Record> = {}; + + for (const provider in embeddingModelProviders) { + const providerModels = await embeddingModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels; + } + } + + return models; + }; + \ No newline at end of file diff --git a/ui/lib/providers/openai.ts b/ui/lib/providers/openai.ts new file mode 100644 index 0000000..9726957 --- /dev/null +++ b/ui/lib/providers/openai.ts @@ -0,0 +1,88 @@ +import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai' +import { getOpenaiApiKey } from '../config' +import { ChatModelProvider, EmbeddingModelProvider } from '.' + +const openaiChatModels: Record[] = [ + { + displayName: 'GPT-3.5 Turbo', + key: 'gpt-3.5-turbo', + }, + { + displayName: 'GPT-4', + key: 'gpt-4', + }, + { + displayName: 'GPT-4 turbo', + key: 'gpt-4-turbo', + }, + { + displayName: 'GPT-4 omni', + key: 'gpt-4o', + }, + { + displayName: 'GPT-4 omni mini', + key: 'gpt-4o-mini', + } +] + +const openaiEmbeddingModels: Record[] = [ + { + displayName: 'Text Embedding 3 Small', + key: 'text-embedding-3-small', + }, + { + displayName: 'Text Embedding 3 Large', + key: 'text-embedding-3-large', + } +] + +export const loadOpenAIChatModels = async () => { + const openaiApiKey = getOpenaiApiKey() + + if (!openaiApiKey) return {} + + try { + const chatModels: Record = {} + + openaiChatModels.forEach(model => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: openaiApiKey, + modelName: model.key, + temperature: 0.7 + }) + } + }) + + return chatModels + } catch(err) { + console.error(`Error loading OpenAI models: ${err}`) + return {} + } +} + +export const loadOpenAIEmbeddingModels = async () => { + const openaiApiKey = getOpenaiApiKey() + + if (!openaiApiKey) return {} + + try { + const embeddingModels: Record = {} + + openaiEmbeddingModels.forEach(model => { + embeddingModels[model.key] = { + displayName: model.displayName, + model: new OpenAIEmbeddings({ + openAIApiKey: openaiApiKey, + modelName: model.key, + }) + } + }) + + return embeddingModels + } catch(err) { + console.error(`Error loading OpenAI embeddings models: ${err}`) + return {} + } +} \ No newline at end of file