@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
132 lines (98 loc) • 4.59 kB
text/typescript
import { isProviderDisableBrowserRequest } from '@/config/modelProviders';
import { AIProviderStoreState } from '@/store/aiInfra/initialState';
import { AiProviderRuntimeConfig } from '@/types/aiProvider';
import { GlobalLLMProviderKey } from '@/types/user/settings';
// List
const enabledAiProviderList = (s: AIProviderStoreState) =>
s.aiProviderList.filter((item) => item.enabled).sort((a, b) => a.sort! - b.sort!);
const disabledAiProviderList = (s: AIProviderStoreState) =>
s.aiProviderList.filter((item) => !item.enabled);
const enabledImageModelList = (s: AIProviderStoreState) => s.enabledImageModelList || [];
const isProviderEnabled = (id: string) => (s: AIProviderStoreState) =>
enabledAiProviderList(s).some((i) => i.id === id);
const isProviderLoading = (id: string) => (s: AIProviderStoreState) =>
s.aiProviderLoadingIds.includes(id);
const activeProviderConfig = (s: AIProviderStoreState) => s.aiProviderDetail;
// Detail
const isAiProviderConfigLoading = (id: string) => (s: AIProviderStoreState) =>
s.activeAiProvider !== id;
const providerWhitelist = new Set(['ollama']);
const activeProviderKeyVaults = (s: AIProviderStoreState) => activeProviderConfig(s)?.keyVaults;
const isActiveProviderEndpointNotEmpty = (s: AIProviderStoreState) => {
const vault = activeProviderKeyVaults(s);
return !!vault?.baseURL || !!vault?.endpoint;
};
const isActiveProviderApiKeyNotEmpty = (s: AIProviderStoreState) => {
const vault = activeProviderKeyVaults(s);
return !!vault?.apiKey || !!vault?.accessKeyId || !!vault?.secretAccessKey;
};
const providerConfigById =
(id: string) =>
(s: AIProviderStoreState): AiProviderRuntimeConfig | undefined => {
if (!id) return undefined;
return s.aiProviderRuntimeConfig?.[id];
};
const isProviderConfigUpdating = (id: string) => (s: AIProviderStoreState) =>
s.aiProviderConfigUpdatingIds.includes(id);
/**
* @description The conditions to enable client fetch
* 1. If no baseUrl and apikey input, force on Server.
* 2. If only contains baseUrl, force on Client
* 3. Follow the user settings.
* 4. On Server, by default.
*/
const isProviderFetchOnClient =
(provider: GlobalLLMProviderKey | string) => (s: AIProviderStoreState) => {
const config = providerConfigById(provider)(s);
// If the provider already disable browser request in model config, force on Server.
if (isProviderDisableBrowserRequest(provider)) return false;
// If the provider in the whitelist, follow the user settings
if (providerWhitelist.has(provider) && typeof config?.fetchOnClient !== 'undefined')
return config?.fetchOnClient;
// 1. If no baseUrl and apikey input, force on Server.
const isProviderEndpointNotEmpty = !!config?.keyVaults.baseURL;
const isProviderApiKeyNotEmpty = !!config?.keyVaults.apiKey;
if (!isProviderEndpointNotEmpty && !isProviderApiKeyNotEmpty) return false;
// 2. If only contains baseUrl, force on Client
if (isProviderEndpointNotEmpty && !isProviderApiKeyNotEmpty) return true;
// 3. Follow the user settings.
if (typeof config?.fetchOnClient !== 'undefined') return config?.fetchOnClient;
// 4. On Server, by default.
return false;
};
const providerKeyVaults = (provider: string | undefined) => (s: AIProviderStoreState) => {
if (!provider) return undefined;
return s.aiProviderRuntimeConfig?.[provider]?.keyVaults;
};
const isProviderHasBuiltinSearch = (provider: string) => (s: AIProviderStoreState) => {
const config = providerConfigById(provider)(s);
return !!config?.settings.searchMode;
};
const isProviderHasBuiltinSearchConfig = (id: string) => (s: AIProviderStoreState) => {
const providerCfg = providerConfigById(id)(s);
return !!providerCfg?.settings.searchMode && providerCfg?.settings.searchMode !== 'internal';
};
const isProviderEnableResponseApi = (id: string) => (s: AIProviderStoreState) => {
const providerCfg = providerConfigById(id)(s);
const enableResponseApi = providerCfg?.config?.enableResponseApi;
if (typeof enableResponseApi === 'boolean') return enableResponseApi;
return false;
};
export const aiProviderSelectors = {
activeProviderConfig,
disabledAiProviderList,
enabledAiProviderList,
enabledImageModelList,
isActiveProviderApiKeyNotEmpty,
isActiveProviderEndpointNotEmpty,
isAiProviderConfigLoading,
isProviderConfigUpdating,
isProviderEnableResponseApi,
isProviderEnabled,
isProviderFetchOnClient,
isProviderHasBuiltinSearch,
isProviderHasBuiltinSearchConfig,
isProviderLoading,
providerConfigById,
providerKeyVaults,
};