mirror of
				https://github.com/Yidadaa/ChatGPT-Next-Web.git
				synced 2025-10-31 21:59:19 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			222 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 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;
 | |
|     },
 | |
|   },
 | |
| );
 |