将 4130 行的单文件拆分为 13 个职责清晰的模块: - constants.py: 常量 + 可选依赖导入 - sandbox.py: 安全代码沙箱 (AST检查器 + 子进程隔离) - config.py: 配置管理 + 日志 - plugin_manager.py: LiuginManager 插件管理器 - cli_base.py: BaseAICLI 基类 (初始化/引擎/插件/命令) - cli_clawli.py: ClawliMixin 远程模式 - cli_tools.py: ToolMixin 工具调用 - cli_code_exec.py: CodeExecMixin 代码沙箱执行 - cli_display.py: DisplayMixin 显示/输出/图片/帮助 - cli_history.py: HistoryMixin 聊天记录 - cli_core.py: AICLI 主类 + 对话循环 + main() - tui.py: Textual TUI 界面 - __init__.py: 包导出汇总 ai_cli.py 保留为入口文件 (11行), 根目录整洁。 原逻辑完全不变, 仅做结构拆分。
55 lines
1.4 KiB
Python
55 lines
1.4 KiB
Python
import os
|
|
import json
|
|
import logging
|
|
from colorama import Fore, Style
|
|
|
|
# 配置文件路径
|
|
CONFIG_FILE = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "config.json")
|
|
|
|
|
|
def load_config():
|
|
"""加载配置文件"""
|
|
try:
|
|
with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
|
|
return json.load(f)
|
|
except FileNotFoundError:
|
|
return {"api": {"engines": {}}, "system": {}, "plugins": {}}
|
|
except json.JSONDecodeError:
|
|
return {"api": {"engines": {}}, "system": {}, "plugins": {}}
|
|
|
|
|
|
def save_config(config):
|
|
"""保存配置文件"""
|
|
try:
|
|
with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
|
|
json.dump(config, f, ensure_ascii=False, indent=2)
|
|
except Exception as e:
|
|
print(f"保存配置失败: {e}")
|
|
|
|
|
|
def get_system_config(key, default=None):
|
|
"""获取系统配置"""
|
|
config = load_config()
|
|
return config.get("system", {}).get(key, default)
|
|
|
|
|
|
def set_system_config(key, value):
|
|
"""设置系统配置"""
|
|
config = load_config()
|
|
if "system" not in config:
|
|
config["system"] = {}
|
|
config["system"][key] = value
|
|
save_config(config)
|
|
|
|
|
|
# 配置日志
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|
handlers=[
|
|
logging.FileHandler('xiaoli_cli.log', encoding='utf-8'),
|
|
logging.StreamHandler() # 同时输出到控制台
|
|
]
|
|
)
|
|
logger = logging.getLogger(__name__)
|