diff --git a/toolbox.py b/toolbox.py index 20a9abb..d560f3e 100644 --- a/toolbox.py +++ b/toolbox.py @@ -518,61 +518,64 @@ def select_api_key(keys, llm_model): api_key = random.choice(avail_key_list) # 随机负载均衡 return api_key -def read_single_conf_from_env(arg, default_value): - ENV_PREFIX = "GPT_ACADEMIC_" # 环境变量的前缀 - env_arg = ENV_PREFIX + arg # 环境变量的KEY - if arg == "proxies": - # 对于proxies,我们使用多个环境变量来配置 - # HTTP_PROXY: 对应http代理 - # HTTPS_PROXY: 对应https代理 - # ALL_PROXY: 对应http和https代理,优先级较HTTP_PROXY和HTTPS_PROXY更低 - http_proxy = os.environ.get(ENV_PREFIX + "HTTP_PROXY") or os.environ.get("ALL_PROXY") - assert http_proxy is not None, f"请设置环境变量{ENV_PREFIX + 'HTTP_PROXY'}" - https_proxy = os.environ.get(ENV_PREFIX + "HTTPS_PROXY") or os.environ.get("ALL_PROXY") - assert https_proxy is not None, f"请设置环境变量{ENV_PREFIX + 'HTTPS_PROXY'}" - r = { - "http": http_proxy, - "https": https_proxy - } - elif arg == "AVAIL_LLM_MODELS": - r = [] - # 对于AVAIL_LLM_MODELS的环境变量配置,我们允许用户使用;分隔多个模型 - for item in os.environ[env_arg].split(";"): - r.append(item) - elif arg == "AUTHENTICATION": - r = [] - # 对于AUTHENTICATION的环境变量配置,我们允许用户使用;分隔多个账号 - # 格式为:username1:password1;username2:password2 - for item in os.environ[env_arg].split(";"): - r.append(tuple(item.split(":"))) - elif arg == "API_URL_REDIRECT": - # 对于API_URL_REDIRECT的环境变量,我们允许用户使用json格式配置多个url重定向 - # 格式为一个json字符串,例如:{"https://api.openai.com/v1/chat/completions": "https://ai.open.com/api/conversation"} - import json - r = json.loads(os.environ[env_arg]) - elif isinstance(default_value, bool): - r = bool(os.environ[env_arg]) - elif isinstance(default_value, int): - r = int(os.environ[env_arg]) - elif isinstance(default_value, float): - r = float(os.environ[env_arg]) - elif isinstance(default_value, str): - r = os.environ[env_arg] +def read_env_variable(arg, default_value): + """ + 环境变量可以是 `GPT_ACADEMIC_CONFIG`(优先),也可以直接是`CONFIG` + 例如在windows cmd中,既可以写: + set USE_PROXY=True + set API_KEY=sk-j7caBpkRoxxxxxxxxxxxxxxxxxxxxxxxxxxxx + set proxies={"http":"http://127.0.0.1:10085", "https":"http://127.0.0.1:10085",} + set AVAIL_LLM_MODELS=["gpt-3.5-turbo", "chatglm"] + set AUTHENTICATION=[("username", "password"), ("username2", "password2")] + 也可以写: + set GPT_ACADEMIC_USE_PROXY=True + set GPT_ACADEMIC_API_KEY=sk-j7caBpkRoxxxxxxxxxxxxxxxxxxxxxxxxxxxx + set GPT_ACADEMIC_proxies={"http":"http://127.0.0.1:10085", "https":"http://127.0.0.1:10085",} + set GPT_ACADEMIC_AVAIL_LLM_MODELS=["gpt-3.5-turbo", "chatglm"] + set GPT_ACADEMIC_AUTHENTICATION=[("username", "password"), ("username2", "password2")] + """ + from colorful import print亮红, print亮绿 + arg_with_prefix = "GPT_ACADEMIC_" + arg + if arg_with_prefix in os.environ: env_arg = os.environ[arg_with_prefix] + elif arg in os.environ: env_arg = os.environ[arg] else: - raise RuntimeError(f"[CONFIG] 环境变量{arg}不支持自动转换到{type(default_value)}类型") + raise KeyError + if isinstance(default_value, bool): + r = bool(env_arg) + elif isinstance(default_value, int): + r = int(env_arg) + elif isinstance(default_value, float): + r = float(env_arg) + elif isinstance(default_value, str): + r = env_arg + elif isinstance(default_value, dict): + r = eval(env_arg) + elif isinstance(default_value, list): + r = eval(env_arg) + elif default_value is None: + assert arg == "proxies" + r = eval(env_arg) + else: + print亮红(f"[ENV_VAR] 环境变量{arg}不支持通过环境变量设置!{default_value}") + raise KeyError + print亮绿(f"[ENV_VAR] 成功读取环境变量{arg}") return r @lru_cache(maxsize=128) def read_single_conf_with_lru_cache(arg): from colorful import print亮红, print亮绿, print亮蓝 - default_r = getattr(importlib.import_module('config'), arg) try: - r = read_single_conf_from_env(arg, default_r) # 优先获取环境变量作为配置 + # 优先级1. 获取环境变量作为配置 + default_ref = getattr(importlib.import_module('config'), arg) # 读取默认值作为数据类型转换的参考 + r = read_env_variable(arg, default_ref) except: try: + # 优先级2. 获取config_private中的配置 r = getattr(importlib.import_module('config_private'), arg) except: - r = default_r + # 优先级3. 获取config中的配置 + r = getattr(importlib.import_module('config'), arg) + # 在读取API_KEY时,检查一下是不是忘了改config if arg == 'API_KEY': print亮蓝(f"[API_KEY] 本项目现已支持OpenAI和API2D的api-key。也支持同时填写多个api-key,如API_KEY=\"openai-key1,openai-key2,api2d-key3\"")