你还是把这个改好了 发完整版给我吧 你的修复我看不懂 弄得我不知道是直接替换 还是让我干什么“# E:\AI_System\core\config.py
import os
import sys
import json
import logging
from pathlib import Path
from dotenv import load_dotenv
from prettytable import PrettyTable
# 临时添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
class CoreConfig:
_instance = None
@classmethod
def get_instance(cls):
"""获取单例实例"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
def __init__(self):
"""初始化配置系统"""
# 设置日志
self.logger = logging.getLogger('CoreConfig')
self.logger.setLevel(logging.INFO)
# 确保有基本日志处理器
if not self.logger.handlers:
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
self.logger.addHandler(handler)
# 设置基础目录
self.base_dir = Path(__file__).resolve().parent.parent
self.env_prefix = "AI_SYSTEM"
self.config = {}
# 敏感字段列表(在日志和输出中掩码)
self.sensitive_fields = ["DB_PASSWORD", "SECRET_KEY", "API_KEY", "ACCESS_TOKEN"]
# 加载配置
self._load_config() # 直接调用方法,不要嵌套定义
self.logger.info("✅ 配置系统初始化完成")
# 注意:所有方法都在类作用域内,不要嵌套定义
def _load_config(self):
"""加载所有配置"""
# 1. 设置默认值
self._set_defaults()
# 2. 加载配置文件
self._load_config_files()
# 3. 加载环境变量
self._load_environment()
# 4. 验证关键路径
self.validate_model_paths()
def _mask_sensitive_value(self, key, value):
"""对敏感信息进行掩码处理"""
if value and key in self.sensitive_fields:
return "******"
return value
# ... 其他方法保持不变 ...
def _log_sensitive_value(self, key, value):
"""在日志中安全地记录敏感信息"""
if key in self.sensitive_fields:
self.logger.info(f"🔄 环境变量覆盖: {key}=******")
else:
self.logger.info(f"🔄 环境变量覆盖: {key}={value}")
def _set_defaults(self):
"""设置默认配置值"""
# 系统路径配置
defaults = {
"LOG_DIR": str(self.base_dir / "logs"),
"CONFIG_DIR": str(self.base_dir / "config"),
"MODEL_CACHE_DIR": str(self.base_dir / "model_cache"),
"AGENT_NAME": "小蓝",
"DEFAULT_USER": "管理员",
"MAX_WORKERS": 4,
"AGENT_RESPONSE_TIMEOUT": 30.0,
# 模型路径配置
"MODEL_BASE_PATH": "E:/AI_Models",
"TEXT_BASE": "E:/AI_Models/Qwen2-7B",
"TEXT_CHAT": "E:/AI_Models/deepseek-7b-chat",
"MULTIMODAL": "E:/AI_Models/deepseek-vl2",
"IMAGE_GEN": "E:/AI_Models/sdxl",
"YI_VL": "E:/AI_Models/yi-vl",
"STABLE_DIFFUSION": "E:/AI_Models/stable-diffusion-xl-base-1",
# 系统路径配置
"SYSTEM_ROOT": str(self.base_dir),
"AGENT_DIR": str(self.base_dir / "agent"),
"WEB_UI_DIR": str(self.base_dir / "web_ui"),
"CORE_DIR": str(self.base_dir / "core"),
"MODELS_DIR": str(self.base_dir / "models"),
"LOGS_DIR": str(self.base_dir / "logs"),
# 服务器配置
"HOST": "0.0.0.0",
"FLASK_PORT": 8000,
"GRADIO_PORT": 7860,
# 数据库配置
"DB_HOST": "localhost",
"DB_PORT": 5432,
"DB_NAME": "ai_system",
"DB_USER": "ai_user",
"DB_PASSWORD": "",
# 安全配置
"SECRET_KEY": "default-secret-key"
}
for key, value in defaults.items():
self.config[key] = value
self.logger.debug(f"设置默认值: {key}={self._mask_sensitive_value(key, value)}")
def _load_config_files(self):
"""加载配置文件"""
# 确保配置目录存在
config_dir = self.base_dir / "config"
config_dir.mkdir(exist_ok=True, parents=True)
# 配置加载顺序
config_files = [
config_dir / 'default.json',
config_dir / 'local.json'
]
for config_file in config_files:
if config_file.exists():
try:
with open(config_file, 'r', encoding='utf-8') as f:
config_data = json.load(f)
# 掩码敏感信息
masked_data = {k: self._mask_sensitive_value(k, v) for k, v in config_data.items()}
self.config.update(config_data)
self.logger.info(f"📂 从 {config_file} 加载配置: {masked_data}")
except Exception as e:
self.logger.error(f"❌ 加载配置文件 {config_file} 错误: {str(e)}")
else:
self.logger.info(f"ℹ️ 配置文件不存在: {config_file},跳过")
def _load_environment(self):
"""加载环境变量"""
# 加载.env文件
env_file = self.base_dir / '.env'
if env_file.exists():
try:
# 加载.env文件
load_dotenv(dotenv_path=str(env_file), override=True)
self.logger.info(f"🌐 从 {env_file} 加载环境变量")
except Exception as e:
self.logger.error(f"❌ 加载环境变量失败: {str(e)}")
# 覆盖环境变量中的配置
for key in list(self.config.keys()):
# 先尝试带前缀的环境变量
prefixed_key = f"{self.env_prefix}_{key}"
env_value = os.getenv(prefixed_key)
# 如果带前缀的环境变量不存在,尝试直接使用key
if env_value is None:
env_value = os.getenv(key)
if env_value is not None:
# 尝试转换数据类型
if env_value.lower() in ['true', 'false']:
env_value = env_value.lower() == 'true'
elif env_value.isdigit():
env_value = int(env_value)
elif env_value.replace('.', '', 1).isdigit():
try:
env_value = float(env_value)
except ValueError:
pass # 保持字符串
self.config[key] = env_value
self._log_sensitive_value(key, env_value)
def validate_model_paths(self):
"""验证所有模型路径是否存在"""
model_keys = ["TEXT_BASE", "TEXT_CHAT", "MULTIMODAL", "IMAGE_GEN", "YI_VL", "STABLE_DIFFUSION"]
results = {}
for key in model_keys:
path = self.get(key, "")
if path:
path_obj = Path(path)
exists = path_obj.exists()
results[key] = {
"path": str(path_obj),
"exists": exists
}
if not exists:
self.logger.warning(f"⚠️ 模型路径不存在: {key} = {path}")
else:
results[key] = {
"path": "",
"exists": False
}
self.logger.warning(f"⚠️ 模型路径未配置: {key}")
return results
def get(self, key, default=None):
"""获取配置值"""
return self.config.get(key, default)
def __getitem__(self, key):
"""通过键访问配置值"""
return self.config[key]
def __contains__(self, key):
"""检查键是否存在"""
return key in self.config
def to_dict(self, mask_sensitive=True):
"""返回当前配置的字典表示"""
if mask_sensitive:
return {k: self._mask_sensitive_value(k, v) for k, v in self.config.items()}
return self.config.copy()
# 创建全局配置实例
config = CoreConfig.get_instance()
# 测试代码
if __name__ == "__main__":
# 设置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
print("=" * 50)
print("配置系统测试")
print("=" * 50)
# 获取配置实例
config = CoreConfig.get_instance()
# 打印基本配置
print(f"AGENT_NAME: {config.get('AGENT_NAME')}")
print(f"SYSTEM_ROOT: {config.get('SYSTEM_ROOT')}")
print(f"LOG_DIR: {config.get('LOG_DIR')}")
print(f"AGENT_DIR: {config.get('AGENT_DIR')}")
print(f"WEB_UI_DIR: {config.get('WEB_UI_DIR')}")
print(f"DB_HOST: {config.get('DB_HOST')}")
# 验证模型路径
print("\n模型路径验证结果:")
for model, info in config.validate_model_paths().items():
status = "存在 ✅" if info["exists"] else "不存在 ❌"
print(f"{model:20} {status} ({info['path']})")
# 使用表格显示所有配置(美化输出)
print("\n当前所有配置:")
table = PrettyTable()
table.field_names = ["配置项", "值"]
table.align["配置项"] = "l"
table.align["值"] = "l"
# 获取掩码后的配置
masked_config = config.to_dict(mask_sensitive=True)
for key, value in masked_config.items():
table.add_row([key, value])
print(table)
print("\n测试完成!")
”还有这个 我不知道怎么添加,你下次最好把需要更改的文件 都弄成能直接复制粘贴的那种 你这么发 我看不明白 更改不明白 懂吗?“{
"ENV": "dev",
"LOG_LEVEL": "DEBUG",
"USE_GPU": false,
"DEFAULT_MODEL": "minimal-model",
"HOST": "0.0.0.0",
"FLASK_PORT": 8000,
"GRADIO_PORT": 7860,
"DB_HOST": "localhost",
"DB_PORT": 5432,
"DB_NAME": "ai_system",
"DB_USER": "ai_user"
}”
最新发布