from collections import defaultdict from contextlib import contextmanager import os import logging import sys import commentjson as json from . import shared #from . import presets __all__ = [ "my_api_key", "authflag", "auth_list", "dockerflag", "retrieve_proxy", "log_level", "advance_docs", "update_doc_config", "render_latex", "usage_limit", "multi_api_key", "server_name", "server_port", "share", "hide_history_when_not_logged_in", "chatglm_6b_path", "azure_openai_key", "azure_openai_endpoint", "azure_openai_version", "azure_openai_engine", "LOCAL_MODELS", "ONLINE_MODELS", "MODELS", "DEFAULT_MODEL", "REPLY_LANGUAGES" ] # 添加一个统一的config文件,避免文件过多造成的疑惑(优先级最低) # 同时,也可以为后续支持自定义功能提供config的帮助 if os.path.exists("config.json"): with open("config.json", "r", encoding='utf-8') as f: config = json.load(f) else: config = {} ## 获取模型列表 LOCAL_MODELS = config.get("LOCAL_MODELS") ONLINE_MODELS = config.get("ONLINE_MODELS") # 合并预设的模型列表 if os.environ.get('HIDE_LOCAL_MODELS', 'false') == 'true': MODELS = ONLINE_MODELS else: MODELS = ONLINE_MODELS + LOCAL_MODELS # 读取 model 文件夹中的模型并合并至列表 for dir_name in os.listdir("models"): if os.path.isdir(os.path.join("models", dir_name)): if dir_name not in MODELS: MODELS.append(dir_name) # 设置默认model DEFAULT_MODEL = config.get("default_model", "") ''' try: presets.DEFAULT_MODEL = presets.MODELS.index(default_model) except ValueError: pass ''' ## 模型回复语言设置 REPLY_LANGUAGES = config.get("REPLY_LANGUAGES") ## OpenAI 设置 # 处理 api-key 以及 允许的用户列表 my_api_key = config.get("openai_api_key", "") my_api_key = os.environ.get("OPENAI_API_KEY", my_api_key) usage_limit = os.environ.get("USAGE_LIMIT", config.get("usage_limit", 120)) # 多账户机制 multi_api_key = config.get("multi_api_key", False) # 是否开启多账户机制 if multi_api_key: api_key_list = config.get("api_key_list", []) if len(api_key_list) == 0: logging.error("多账号模式已开启,但api_key_list为空,请检查config.json") sys.exit(1) shared.state.set_api_key_queue(api_key_list) auth_list = config.get("users", []) # 实际上是使用者的列表 authflag = len(auth_list) > 0 # 是否开启认证的状态值,改为判断auth_list长度 # 获取UI语言设置 lang_config = config.get("language", "auto") #language = os.environ.get("LANGUAGE", lang_config) ## 获取azure openai api信息 azure_openai_key = config.get("azure_openai_key") azure_openai_endpoint = config.get("azure_openai_endpoint") azure_openai_version = config.get("azure_openai_version") azure_openai_engine = config.get("azure_openai_engine") # 获取本地chatglm-6b模型路径 chatglm_6b_path = config.get("chatglm-6b") ## 处理advance docs advance_docs = defaultdict(lambda: defaultdict(dict)) advance_docs.update(config.get("advance_docs", {})) def update_doc_config(two_column_pdf): global advance_docs advance_docs["pdf"]["two_column"] = two_column_pdf logging.info(f"更新后的文件参数为:{advance_docs}") local_embedding = config.get("local_embedding", False) # 是否使用本地embedding REPLY_LANGUAGES = config.get("REPLY_LANGUAGES") # 获取历史聊天记录显示设置 hide_history_when_not_logged_in = config.get("hide_history_when_not_logged_in", True) ## 处理docker if we are running in Docker dockerflag = config.get("dockerflag", False) if os.environ.get("dockerrun") == "yes": dockerflag = True ## 设置是否渲染LaTex公式 render_latex = config.get("render_latex", True) if render_latex: os.environ["RENDER_LATEX"] = "yes" else: os.environ["RENDER_LATEX"] = "no" # 处理自定义的api_host,优先读环境变量的配置,如果存在则自动装配 api_host = os.environ.get("api_host", config.get("api_host", "")) if api_host: shared.state.set_api_host(api_host) @contextmanager def retrieve_openai_api(api_key = None): old_api_key = os.environ.get("OPENAI_API_KEY", "") if api_key is None: os.environ["OPENAI_API_KEY"] = my_api_key yield my_api_key else: os.environ["OPENAI_API_KEY"] = api_key yield api_key os.environ["OPENAI_API_KEY"] = old_api_key ## 处理log log_level = config.get("log_level", "INFO") logging.basicConfig( level=log_level, format="%(asctime)s [%(levelname)s] [%(filename)s:%(lineno)d] %(message)s", ) ## 处理代理: http_proxy = config.get("http_proxy", "") https_proxy = config.get("https_proxy", "") http_proxy = os.environ.get("HTTP_PROXY", http_proxy) https_proxy = os.environ.get("HTTPS_PROXY", https_proxy) # 重置系统变量,在不需要设置的时候不设置环境变量,以免引起全局代理报错 os.environ["HTTP_PROXY"] = "" os.environ["HTTPS_PROXY"] = "" @contextmanager def retrieve_proxy(proxy=None): """ 1, 如果proxy = NONE,设置环境变量,并返回最新设置的代理 2,如果proxy != NONE,更新当前的代理配置,但是不更新环境变量 """ global http_proxy, https_proxy if proxy is not None: http_proxy = proxy https_proxy = proxy yield http_proxy, https_proxy else: old_var = os.environ["HTTP_PROXY"], os.environ["HTTPS_PROXY"] os.environ["HTTP_PROXY"] = http_proxy os.environ["HTTPS_PROXY"] = https_proxy yield http_proxy, https_proxy # return new proxy # return old proxy os.environ["HTTP_PROXY"], os.environ["HTTPS_PROXY"] = old_var ## 处理gradio.launch参数 server_name = config.get("server_name", None) server_port = config.get("server_port", None) if server_name is None: if dockerflag: server_name = "0.0.0.0" else: server_name = "127.0.0.1" if server_port is None: if dockerflag: server_port = 7860 assert server_port is None or type(server_port) == int, "要求port设置为int类型" share = config.get("share", False)