From 5e35cfc44abc36b4791ba6c4d72fc4daab85bdbb Mon Sep 17 00:00:00 2001 From: myifeng Date: Tue, 29 Apr 2025 13:55:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E4=B9=89config.yaml=E4=B8=BA=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E9=85=8D=E7=BD=AE=EF=BC=9B=20data/.config.yaml=20?= =?UTF-8?q?=E4=B8=BA=E8=87=AA=E5=AE=9A=E4=B9=89=E9=85=8D=E7=BD=AE=EF=BC=9B?= =?UTF-8?q?=20=E4=BD=BF=E7=94=A8=E8=80=85=E9=80=9A=E8=BF=87=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=87=AA=E5=AE=9A=E4=B9=89=E9=85=8D=E7=BD=AE=E5=8D=B3?= =?UTF-8?q?=E5=8F=AF=E5=AE=8C=E6=88=90=E5=90=AF=E5=8A=A8=EF=BC=8C=E6=97=A0?= =?UTF-8?q?=E9=9C=80=E5=85=B3=E5=BF=83=E9=BB=98=E8=AE=A4=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=A1=B9=EF=BC=8C=E5=87=8F=E5=B0=91=E7=94=A8=E6=88=B7=E5=86=97?= =?UTF-8?q?=E4=BD=99=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/config/config_loader.py | 43 +++++++++++++++++--- main/xiaozhi-server/config/settings.py | 45 ++++++++------------- 2 files changed, 55 insertions(+), 33 deletions(-) diff --git a/main/xiaozhi-server/config/config_loader.py b/main/xiaozhi-server/config/config_loader.py index 849a2a8a..b892b437 100644 --- a/main/xiaozhi-server/config/config_loader.py +++ b/main/xiaozhi-server/config/config_loader.py @@ -1,6 +1,7 @@ import os import argparse import yaml +from collections.abc import Mapping from config.manage_api_client import init_service, get_server_config, get_agent_models @@ -25,12 +26,19 @@ def load_config(): if _config_cache is not None: return _config_cache - parser = argparse.ArgumentParser(description="Server configuration") - config_file = get_config_file() + default_config_path = get_project_dir() + "config.yaml" + custom_config_path = get_project_dir() + "data/.config.yaml" - parser.add_argument("--config_path", type=str, default=config_file) - args = parser.parse_args() - config = read_config(args.config_path) + # 加载默认配置 + default_config = read_config(default_config_path) + + # 加载用户自定义配置(如果存在) + if os.path.exists(custom_config_path): + custom_config = read_config(custom_config_path) + # 合并配置 + config = merge_configs(default_config, custom_config) + else: + config = default_config if config.get("manager-api", {}).get("url"): config = get_config_from_api(config) @@ -115,3 +123,28 @@ def ensure_directories(config): os.makedirs(dir_path, exist_ok=True) except PermissionError: print(f"警告:无法创建目录 {dir_path},请检查写入权限") + + +def merge_configs(default_config, custom_config): + """ + 递归合并配置,custom_config优先级更高 + + Args: + default_config: 默认配置 + custom_config: 用户自定义配置 + + Returns: + 合并后的配置 + """ + if not isinstance(default_config, Mapping) or not isinstance(custom_config, Mapping): + return custom_config + + merged = dict(default_config) + + for key, value in custom_config.items(): + if key in merged and isinstance(merged[key], Mapping) and isinstance(value, Mapping): + merged[key] = merge_configs(merged[key], value) + else: + merged[key] = value + + return merged \ No newline at end of file diff --git a/main/xiaozhi-server/config/settings.py b/main/xiaozhi-server/config/settings.py index 535a81ed..c12c70d8 100644 --- a/main/xiaozhi-server/config/settings.py +++ b/main/xiaozhi-server/config/settings.py @@ -1,7 +1,11 @@ import os from collections.abc import Mapping +from config import logger from config.config_loader import read_config, get_project_dir, load_config +TAG = __name__ +logger = logger.setup_logging() + default_config_file = "config.yaml" @@ -34,31 +38,16 @@ def find_missing_keys(new_config, old_config, parent_key=""): def check_config_file(): - old_config_file = get_project_dir() + "data/." + default_config_file - if not os.path.exists(old_config_file): - return - old_config = load_config() - new_config = read_config(get_project_dir() + default_config_file) - # 查找缺失的配置项 - missing_keys = find_missing_keys(new_config, old_config) - read_config_from_api = old_config.get("read_config_from_api", False) - if read_config_from_api: - old_config_origin = read_config(old_config_file) - if old_config_origin.get("selected_module") is not None: - missing_keys_str = "\n".join(f"- {key}" for key in missing_keys) - error_msg = "您的配置文件好像既包含智控台的配置又包含本地配置:\n" - error_msg += "\n建议您:\n" - error_msg += "1、将根目录的config_from_api.yaml文件复制到data下,重命名为.config.yaml\n" - error_msg += "2、按教程配置好接口地址和密钥\n" - raise ValueError(error_msg) - return - - if missing_keys: - missing_keys_str = "\n".join(f"- {key}" for key in missing_keys) - error_msg = "您的配置文件太旧了,缺少了:\n" - error_msg += missing_keys_str - error_msg += "\n建议您:\n" - error_msg += "1、备份data/.config.yaml文件\n" - error_msg += "2、将根目录的config.yaml文件复制到data下,重命名为.config.yaml\n" - error_msg += "3、将密钥逐个复制到新的配置文件中\n" - raise ValueError(error_msg) + """ + 简化的配置检查,仅提示用户配置文件的使用情况 + """ + custom_config_file = get_project_dir() + "data/." + default_config_file + if not os.path.exists(custom_config_file): + logger.bind(tag=TAG).info("提示: 使用默认配置文件。如需自定义配置,请创建 data/.config.yaml 文件") + else: + logger.bind(tag=TAG).info(f"提示: 使用自定义配置文件 data/.config.yaml,配置将覆盖默认值") + + # 检查是否从API读取配置 + config = load_config() + if config.get("read_config_from_api", False): + logger.bind(tag=TAG).info("提示: 从API获取配置")