增加通用性

This commit is contained in:
Your Name 2023-05-02 14:54:51 +08:00
parent 988c5c24da
commit 896077009a

View File

@ -518,61 +518,64 @@ def select_api_key(keys, llm_model):
api_key = random.choice(avail_key_list) # 随机负载均衡 api_key = random.choice(avail_key_list) # 随机负载均衡
return api_key return api_key
def read_single_conf_from_env(arg, default_value): def read_env_variable(arg, default_value):
ENV_PREFIX = "GPT_ACADEMIC_" # 环境变量的前缀 """
env_arg = ENV_PREFIX + arg # 环境变量的KEY 环境变量可以是 `GPT_ACADEMIC_CONFIG`(优先)也可以直接是`CONFIG`
if arg == "proxies": 例如在windows cmd中既可以写
# 对于proxies我们使用多个环境变量来配置 set USE_PROXY=True
# HTTP_PROXY: 对应http代理 set API_KEY=sk-j7caBpkRoxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# HTTPS_PROXY: 对应https代理 set proxies={"http":"http://127.0.0.1:10085", "https":"http://127.0.0.1:10085",}
# ALL_PROXY: 对应http和https代理优先级较HTTP_PROXY和HTTPS_PROXY更低 set AVAIL_LLM_MODELS=["gpt-3.5-turbo", "chatglm"]
http_proxy = os.environ.get(ENV_PREFIX + "HTTP_PROXY") or os.environ.get("ALL_PROXY") set AUTHENTICATION=[("username", "password"), ("username2", "password2")]
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") set GPT_ACADEMIC_USE_PROXY=True
assert https_proxy is not None, f"请设置环境变量{ENV_PREFIX + 'HTTPS_PROXY'}" set GPT_ACADEMIC_API_KEY=sk-j7caBpkRoxxxxxxxxxxxxxxxxxxxxxxxxxxxx
r = { set GPT_ACADEMIC_proxies={"http":"http://127.0.0.1:10085", "https":"http://127.0.0.1:10085",}
"http": http_proxy, set GPT_ACADEMIC_AVAIL_LLM_MODELS=["gpt-3.5-turbo", "chatglm"]
"https": https_proxy set GPT_ACADEMIC_AUTHENTICATION=[("username", "password"), ("username2", "password2")]
} """
elif arg == "AVAIL_LLM_MODELS": from colorful import print亮红, print亮绿
r = [] arg_with_prefix = "GPT_ACADEMIC_" + arg
# 对于AVAIL_LLM_MODELS的环境变量配置我们允许用户使用;分隔多个模型 if arg_with_prefix in os.environ: env_arg = os.environ[arg_with_prefix]
for item in os.environ[env_arg].split(";"): elif arg in os.environ: env_arg = os.environ[arg]
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]
else: 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 return r
@lru_cache(maxsize=128) @lru_cache(maxsize=128)
def read_single_conf_with_lru_cache(arg): def read_single_conf_with_lru_cache(arg):
from colorful import print亮红, print亮绿, print亮蓝 from colorful import print亮红, print亮绿, print亮蓝
default_r = getattr(importlib.import_module('config'), arg)
try: 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: except:
try: try:
# 优先级2. 获取config_private中的配置
r = getattr(importlib.import_module('config_private'), arg) r = getattr(importlib.import_module('config_private'), arg)
except: except:
r = default_r # 优先级3. 获取config中的配置
r = getattr(importlib.import_module('config'), arg)
# 在读取API_KEY时检查一下是不是忘了改config # 在读取API_KEY时检查一下是不是忘了改config
if arg == 'API_KEY': if arg == 'API_KEY':
print亮蓝(f"[API_KEY] 本项目现已支持OpenAI和API2D的api-key。也支持同时填写多个api-key如API_KEY=\"openai-key1,openai-key2,api2d-key3\"") print亮蓝(f"[API_KEY] 本项目现已支持OpenAI和API2D的api-key。也支持同时填写多个api-key如API_KEY=\"openai-key1,openai-key2,api2d-key3\"")