UNPKG

@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.

159 lines (132 loc) 4.58 kB
import { LOBE_CHAT_AUTH_HEADER, isDeprecatedEdition } from '@lobechat/const'; import { AWSBedrockKeyVault, AzureOpenAIKeyVault, ClientSecretPayload, CloudflareKeyVault, ComfyUIKeyVault, OpenAICompatibleKeyVault, VertexAIKeyVault, } from '@lobechat/types'; import { clientApiKeyManager } from '@lobechat/utils/client'; import { ModelProvider } from 'model-bank'; import { aiProviderSelectors, useAiInfraStore } from '@/store/aiInfra'; import { useUserStore } from '@/store/user'; import { keyVaultsConfigSelectors, userProfileSelectors } from '@/store/user/selectors'; import { obfuscatePayloadWithXOR } from '@/utils/client/xor-obfuscation'; import { resolveRuntimeProvider } from './chat/helper'; export const getProviderAuthPayload = ( provider: string, keyVaults: OpenAICompatibleKeyVault & AzureOpenAIKeyVault & AWSBedrockKeyVault & CloudflareKeyVault & ComfyUIKeyVault & VertexAIKeyVault, ) => { switch (provider) { case ModelProvider.Bedrock: { const { accessKeyId, region, secretAccessKey, sessionToken } = keyVaults; const awsSecretAccessKey = secretAccessKey; const awsAccessKeyId = accessKeyId; const apiKey = (awsSecretAccessKey || '') + (awsAccessKeyId || ''); return { accessKeyId, accessKeySecret: awsSecretAccessKey, apiKey, /** @deprecated */ awsAccessKeyId, /** @deprecated */ awsRegion: region, /** @deprecated */ awsSecretAccessKey, /** @deprecated */ awsSessionToken: sessionToken, region, sessionToken, }; } case ModelProvider.Azure: { return { apiKey: clientApiKeyManager.pick(keyVaults.apiKey), apiVersion: keyVaults.apiVersion, /** @deprecated */ azureApiVersion: keyVaults.apiVersion, baseURL: keyVaults.baseURL || keyVaults.endpoint, }; } case ModelProvider.Ollama: { return { baseURL: keyVaults?.baseURL }; } case ModelProvider.Cloudflare: { return { apiKey: clientApiKeyManager.pick(keyVaults?.apiKey), baseURLOrAccountID: keyVaults?.baseURLOrAccountID, /** @deprecated */ cloudflareBaseURLOrAccountID: keyVaults?.baseURLOrAccountID, }; } case ModelProvider.ComfyUI: { return { apiKey: keyVaults?.apiKey, authType: keyVaults?.authType, baseURL: keyVaults?.baseURL, customHeaders: keyVaults?.customHeaders, password: keyVaults?.password, username: keyVaults?.username, }; } case ModelProvider.VertexAI: { // Vertex AI uses JSON credentials, should not split by comma return { apiKey: keyVaults?.apiKey, baseURL: keyVaults?.baseURL, vertexAIRegion: keyVaults?.region, }; } default: { return { apiKey: clientApiKeyManager.pick(keyVaults?.apiKey), baseURL: keyVaults?.baseURL }; } } }; const createAuthTokenWithPayload = (payload = {}) => { const accessCode = keyVaultsConfigSelectors.password(useUserStore.getState()); const userId = userProfileSelectors.userId(useUserStore.getState()); return obfuscatePayloadWithXOR<ClientSecretPayload>({ accessCode, userId, ...payload }); }; interface AuthParams { // eslint-disable-next-line no-undef headers?: HeadersInit; payload?: Record<string, any>; provider?: string; } export const createPayloadWithKeyVaults = (provider: string) => { let keyVaults = {}; // TODO: remove this condition in V2.0 if (isDeprecatedEdition) { keyVaults = keyVaultsConfigSelectors.getVaultByProvider(provider as any)( useUserStore.getState(), ); } else { keyVaults = aiProviderSelectors.providerKeyVaults(provider)(useAiInfraStore.getState()) || {}; } const runtimeProvider = resolveRuntimeProvider(provider); return { ...getProviderAuthPayload(runtimeProvider, keyVaults as any), runtimeProvider, }; }; export const createXorKeyVaultsPayload = (provider: string) => { const payload = createPayloadWithKeyVaults(provider); return obfuscatePayloadWithXOR(payload); }; // eslint-disable-next-line no-undef export const createHeaderWithAuth = async (params?: AuthParams): Promise<HeadersInit> => { let payload = params?.payload || {}; if (params?.provider) { payload = { ...payload, ...createPayloadWithKeyVaults(params?.provider) }; } const token = createAuthTokenWithPayload(payload); // eslint-disable-next-line no-undef return { ...params?.headers, [LOBE_CHAT_AUTH_HEADER]: token }; };