import { GoogleSafetySettingsThreshold, ServiceProvider, StoreKey, OPENAI_BASE_URL, ANTHROPIC_BASE_URL, GEMINI_BASE_URL, BAIDU_BASE_URL, BYTEDANCE_BASE_URL, ALIBABA_BASE_URL, TENCENT_BASE_URL, MOONSHOT_BASE_URL, STABILITY_BASE_URL, IFLYTEK_BASE_URL, } from "../constant"; import { getHeaders } from "../client/api"; import { getClientConfig } from "../config/client"; import { createPersistStore } from "../utils/store"; import { ensure } from "../utils/clone"; import { DEFAULT_CONFIG } from "./config"; let fetchState = 0; // 0 not fetch, 1 fetching, 2 done const isApp = getClientConfig()?.buildMode === "export"; const DEFAULT_ACCESS_STATE = { accessCode: "", useCustomConfig: false, provider: ServiceProvider.OpenAI, // openai openaiUrl: OPENAI_BASE_URL, openaiApiKey: "", // azure azureUrl: "", azureApiKey: "", azureApiVersion: "2023-08-01-preview", // google ai studio googleUrl: GEMINI_BASE_URL, googleApiKey: "", googleApiVersion: "v1", googleSafetySettings: GoogleSafetySettingsThreshold.BLOCK_ONLY_HIGH, // anthropic anthropicUrl: ANTHROPIC_BASE_URL, anthropicApiKey: "", anthropicApiVersion: "2023-06-01", // baidu baiduUrl: BAIDU_BASE_URL, baiduApiKey: "", baiduSecretKey: "", // bytedance bytedanceUrl: BYTEDANCE_BASE_URL, bytedanceApiKey: "", // alibaba alibabaUrl: ALIBABA_BASE_URL, alibabaApiKey: "", // moonshot moonshotUrl: MOONSHOT_BASE_URL, moonshotApiKey: "", //stability stabilityUrl: STABILITY_BASE_URL, stabilityApiKey: "", // tencent tencentUrl: TENCENT_BASE_URL, tencentSecretKey: "", tencentSecretId: "", // iflytek iflytekUrl: IFLYTEK_BASE_URL, iflytekApiKey: "", iflytekApiSecret: "", // server config needCode: true, hideUserApiKey: false, hideBalanceQuery: false, disableGPT4: false, disableFastLink: false, customModels: "", defaultModel: "", // tts config edgeTTSVoiceName: "zh-CN-YunxiNeural", }; export const useAccessStore = createPersistStore( { ...DEFAULT_ACCESS_STATE }, (set, get) => ({ enabledAccessControl() { this.fetch(); return get().needCode; }, edgeVoiceName() { this.fetch(); return get().edgeTTSVoiceName; }, isValidOpenAI() { return ensure(get(), ["openaiApiKey"]); }, isValidAzure() { return ensure(get(), ["azureUrl", "azureApiKey", "azureApiVersion"]); }, isValidGoogle() { return ensure(get(), ["googleApiKey"]); }, isValidAnthropic() { return ensure(get(), ["anthropicApiKey"]); }, isValidBaidu() { return ensure(get(), ["baiduApiKey", "baiduSecretKey"]); }, isValidByteDance() { return ensure(get(), ["bytedanceApiKey"]); }, isValidAlibaba() { return ensure(get(), ["alibabaApiKey"]); }, isValidTencent() { return ensure(get(), ["tencentSecretKey", "tencentSecretId"]); }, isValidMoonshot() { return ensure(get(), ["moonshotApiKey"]); }, isValidIflytek() { return ensure(get(), ["iflytekApiKey"]); }, isAuthorized() { this.fetch(); // has token or has code or disabled access control return ( this.isValidOpenAI() || this.isValidAzure() || this.isValidGoogle() || this.isValidAnthropic() || this.isValidBaidu() || this.isValidByteDance() || this.isValidAlibaba() || this.isValidTencent() || this.isValidMoonshot() || this.isValidIflytek() || !this.enabledAccessControl() || (this.enabledAccessControl() && ensure(get(), ["accessCode"])) ); }, fetch() { if (fetchState > 0 || getClientConfig()?.buildMode === "export") return; fetchState = 1; fetch("/api/config", { method: "post", body: null, headers: { ...getHeaders(), }, }) .then((res) => res.json()) .then((res) => { const defaultModel = res.defaultModel ?? ""; if (defaultModel !== "") { const [model, providerName] = defaultModel.split("@"); DEFAULT_CONFIG.modelConfig.model = model; DEFAULT_CONFIG.modelConfig.providerName = providerName; } return res; }) .then((res: DangerConfig) => { console.log("[Config] got config from server", res); set(() => ({ ...res })); }) .catch(() => { console.error("[Config] failed to fetch config"); }) .finally(() => { fetchState = 2; }); }, }), { name: StoreKey.Access, version: 2, migrate(persistedState, version) { if (version < 2) { const state = persistedState as { token: string; openaiApiKey: string; azureApiVersion: string; googleApiKey: string; }; state.openaiApiKey = state.token; state.azureApiVersion = "2023-08-01-preview"; } return persistedState as any; }, }, );