From 3ffb20b777dd037106bdafab043cc582d2a20480 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Mon, 8 Jul 2024 01:31:11 +0530 Subject: [PATCH 1/4] feat(backend): fix type errors --- src/agents/suggestionGeneratorAgent.ts | 2 +- src/websocket/connectionManager.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/agents/suggestionGeneratorAgent.ts b/src/agents/suggestionGeneratorAgent.ts index 0efdfa9..6ba255d 100644 --- a/src/agents/suggestionGeneratorAgent.ts +++ b/src/agents/suggestionGeneratorAgent.ts @@ -47,7 +47,7 @@ const generateSuggestions = ( input: SuggestionGeneratorInput, llm: BaseChatModel, ) => { - (llm as ChatOpenAI).temperature = 0; + (llm as unknown as ChatOpenAI).temperature = 0; const suggestionGeneratorChain = createSuggestionGeneratorChain(llm); return suggestionGeneratorChain.invoke(input); }; diff --git a/src/websocket/connectionManager.ts b/src/websocket/connectionManager.ts index 5cb075b..70e20d9 100644 --- a/src/websocket/connectionManager.ts +++ b/src/websocket/connectionManager.ts @@ -45,7 +45,7 @@ export const handleConnection = async ( chatModelProviders[chatModelProvider][chatModel] && chatModelProvider != 'custom_openai' ) { - llm = chatModelProviders[chatModelProvider][chatModel] as + llm = chatModelProviders[chatModelProvider][chatModel] as unknown as | BaseChatModel | undefined; } else if (chatModelProvider == 'custom_openai') { @@ -56,7 +56,7 @@ export const handleConnection = async ( configuration: { baseURL: searchParams.get('openAIBaseURL'), }, - }); + }) as unknown as BaseChatModel; } if ( From 3b4b8a8b0227cee590014f99e10aefd9e1176791 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Mon, 8 Jul 2024 15:24:45 +0530 Subject: [PATCH 2/4] feat(providers): add `custom_openai` --- src/lib/providers/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 5807f94..41342b5 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -22,6 +22,8 @@ export const getAvailableChatModelProviders = async () => { models[provider] = await chatModelProviders[provider](); } + models['custom_openai'] = {} + return models; }; From 8539ce82ad4b289956fc9c57bd1fb505aa26451d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Mon, 8 Jul 2024 15:39:27 +0530 Subject: [PATCH 3/4] feat(providers): fix loading issues --- src/lib/providers/groq.ts | 2 ++ src/lib/providers/index.ts | 22 ++++++++++++++-------- src/lib/providers/ollama.ts | 6 +++++- src/lib/providers/openai.ts | 6 +++++- src/lib/providers/transformers.ts | 2 +- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index ecdce4d..35bd125 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -5,6 +5,8 @@ import logger from '../../utils/logger'; export const loadGroqChatModels = async () => { const groqApiKey = getGroqApiKey(); + if (!groqApiKey) return {}; + try { const chatModels = { 'LLaMA3 8b': new ChatOpenAI( diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 41342b5..b1d4502 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -1,7 +1,7 @@ import { loadGroqChatModels } from './groq'; -import { loadOllamaChatModels } from './ollama'; -import { loadOpenAIChatModels, loadOpenAIEmbeddingsModel } from './openai'; -import { loadTransformersEmbeddingsModel } from './transformers'; +import { loadOllamaChatModels, loadOllamaEmbeddingsModels } from './ollama'; +import { loadOpenAIChatModels, loadOpenAIEmbeddingsModels } from './openai'; +import { loadTransformersEmbeddingsModels } from './transformers'; const chatModelProviders = { openai: loadOpenAIChatModels, @@ -10,16 +10,19 @@ const chatModelProviders = { }; const embeddingModelProviders = { - openai: loadOpenAIEmbeddingsModel, - local: loadTransformersEmbeddingsModel, - ollama: loadOllamaChatModels, + openai: loadOpenAIEmbeddingsModels, + local: loadTransformersEmbeddingsModels, + ollama: loadOllamaEmbeddingsModels, }; export const getAvailableChatModelProviders = async () => { const models = {}; for (const provider in chatModelProviders) { - models[provider] = await chatModelProviders[provider](); + const providerModels = await chatModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels + } } models['custom_openai'] = {} @@ -31,7 +34,10 @@ export const getAvailableEmbeddingModelProviders = async () => { const models = {}; for (const provider in embeddingModelProviders) { - models[provider] = await embeddingModelProviders[provider](); + const providerModels = await embeddingModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels + } } return models; diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index febe5e8..b2901ff 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -6,6 +6,8 @@ import { ChatOllama } from '@langchain/community/chat_models/ollama'; export const loadOllamaChatModels = async () => { const ollamaEndpoint = getOllamaApiEndpoint(); + if (!ollamaEndpoint) return {}; + try { const response = await fetch(`${ollamaEndpoint}/api/tags`, { headers: { @@ -31,9 +33,11 @@ export const loadOllamaChatModels = async () => { } }; -export const loadOpenAIEmbeddingsModel = async () => { +export const loadOllamaEmbeddingsModels = async () => { const ollamaEndpoint = getOllamaApiEndpoint(); + if (!ollamaEndpoint) return {}; + try { const response = await fetch(`${ollamaEndpoint}/api/tags`, { headers: { diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index 705f1a4..afc7ab8 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -5,6 +5,8 @@ import logger from '../../utils/logger'; export const loadOpenAIChatModels = async () => { const openAIApiKey = getOpenaiApiKey(); + if (!openAIApiKey) return {}; + try { const chatModels = { 'GPT-3.5 turbo': new ChatOpenAI({ @@ -36,9 +38,11 @@ export const loadOpenAIChatModels = async () => { } }; -export const loadOpenAIEmbeddingsModel = async () => { +export const loadOpenAIEmbeddingsModels = async () => { const openAIApiKey = getOpenaiApiKey(); + if (!openAIApiKey) return {}; + try { const embeddingModels = { 'Text embedding 3 small': new OpenAIEmbeddings({ diff --git a/src/lib/providers/transformers.ts b/src/lib/providers/transformers.ts index 7ef8596..0ec7052 100644 --- a/src/lib/providers/transformers.ts +++ b/src/lib/providers/transformers.ts @@ -1,7 +1,7 @@ import logger from '../../utils/logger'; import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer'; -export const loadTransformersEmbeddingsModel = async () => { +export const loadTransformersEmbeddingsModels = async () => { try { const embeddingModels = { 'BGE Small': new HuggingFaceTransformersEmbeddings({ From 27e6f5b9e1adeda5aeb5665a366d21d03cb07f30 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Tue, 9 Jul 2024 16:21:45 +0530 Subject: [PATCH 4/4] feat(chat-window): unselect unavailable model --- ui/components/ChatWindow.tsx | 49 ++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 675df49..b1a87a2 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -83,6 +83,55 @@ const useSocket = ( 'embeddingModelProvider', embeddingModelProvider, ); + } else { + const providers = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}/models`, + { + headers: { + 'Content-Type': 'application/json', + }, + }, + ).then(async (res) => await res.json()); + + const chatModelProviders = providers.chatModelProviders; + const embeddingModelProviders = providers.embeddingModelProviders; + + if ( + Object.keys(chatModelProviders).length > 0 && + !chatModelProviders[chatModelProvider] + ) { + chatModelProvider = Object.keys(chatModelProviders)[0]; + localStorage.setItem('chatModelProvider', chatModelProvider); + } + + if ( + chatModelProvider && + !chatModelProviders[chatModelProvider][chatModel] + ) { + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + localStorage.setItem('chatModel', chatModel); + } + + if ( + Object.keys(embeddingModelProviders).length > 0 && + !embeddingModelProviders[embeddingModelProvider] + ) { + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + localStorage.setItem( + 'embeddingModelProvider', + embeddingModelProvider, + ); + } + + if ( + embeddingModelProvider && + !embeddingModelProviders[embeddingModelProvider][embeddingModel] + ) { + embeddingModel = Object.keys( + embeddingModelProviders[embeddingModelProvider], + )[0]; + localStorage.setItem('embeddingModel', embeddingModel); + } } const wsURL = new URL(url);