refactor: 拆分 ai_cli.py 为模块化 xcli_core 包
将 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行), 根目录整洁。 原逻辑完全不变, 仅做结构拆分。
This commit is contained in:
1 parent
7efb6dfe8b
commit
04e2d26809
14 files changed
+3798
-4125
No files matched your search
@@ -0,0 +1,94 @@
|
||||
# 常量定义
|
||||
WEB_SERVER_DEFAULT_PORT = 8080
|
||||
MAX_FILE_SIZE = 52428800 # 50MB
|
||||
MAX_VIDEO_DURATION = 10000 # 10秒
|
||||
VIDEO_FRAME_DELAY = 0.04 # 40毫秒
|
||||
LOVE_FILE_PATH = "love.txt"
|
||||
DEFAULT_MAX_HISTORY = 999999 # 无限制对话历史
|
||||
|
||||
import os
|
||||
import sys
|
||||
import importlib.util
|
||||
import json
|
||||
import re
|
||||
import requests
|
||||
import shutil
|
||||
import time
|
||||
import threading
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from openai import OpenAI
|
||||
from colorama import init, Fore, Style
|
||||
|
||||
# tkinter 仅在视频播放功能中使用,服务器环境可能不可用
|
||||
try:
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
TKINTER_AVAILABLE = True
|
||||
except ImportError:
|
||||
TKINTER_AVAILABLE = False
|
||||
|
||||
# cv2 仅在视频播放功能中使用
|
||||
try:
|
||||
import cv2
|
||||
CV2_AVAILABLE = True
|
||||
except ImportError:
|
||||
CV2_AVAILABLE = False
|
||||
|
||||
import numpy as np
|
||||
from http.server import HTTPServer, BaseHTTPRequestHandler
|
||||
from urllib.parse import urlparse, parse_qs
|
||||
import socket
|
||||
import webbrowser
|
||||
from datetime import datetime
|
||||
import logging
|
||||
|
||||
# 图像显示相关(可选)
|
||||
try:
|
||||
from PIL import Image
|
||||
PIL_AVAILABLE = True
|
||||
except ImportError:
|
||||
PIL_AVAILABLE = False
|
||||
|
||||
try:
|
||||
from ascii_magic import AsciiArt
|
||||
ASCII_MAGIC_AVAILABLE = True
|
||||
except ImportError:
|
||||
ASCII_MAGIC_AVAILABLE = False
|
||||
|
||||
# WebSocket 服务端
|
||||
try:
|
||||
import websocket_server
|
||||
WEBSOCKET_AVAILABLE = True
|
||||
except ImportError:
|
||||
WEBSOCKET_AVAILABLE = False
|
||||
|
||||
# Clawli 独立进程服务器
|
||||
try:
|
||||
import clawli_server
|
||||
CLAWLI_SERVER_AVAILABLE = True
|
||||
except ImportError:
|
||||
CLAWLI_SERVER_AVAILABLE = False
|
||||
|
||||
# 统一工具管理器 - 支持 Liugin 和 Skill 双协议
|
||||
try:
|
||||
from unified_tool_manager import UnifiedToolManager
|
||||
UNIFIED_TOOL_MANAGER_AVAILABLE = True
|
||||
except ImportError:
|
||||
UNIFIED_TOOL_MANAGER_AVAILABLE = False
|
||||
|
||||
# Textual TUI 支持
|
||||
import asyncio
|
||||
from typing import Optional
|
||||
from io import StringIO
|
||||
|
||||
try:
|
||||
from textual.app import App, ComposeResult
|
||||
from textual.containers import Container, Horizontal, Vertical, VerticalScroll
|
||||
from textual.widgets import Header, Footer, Input, RichLog, Static, Button, Tree
|
||||
from textual.widgets.tree import TreeNode
|
||||
from textual.binding import Binding
|
||||
from textual.events import Mount
|
||||
TEXTUAL_AVAILABLE = True
|
||||
except ImportError:
|
||||
TEXTUAL_AVAILABLE = False
|
||||
print(f"{Fore.YELLOW}Textual 未安装,TUI 模式不可用。请运行: pip install textual{Style.RESET_ALL}")
|
||||
Reference in new issue
Block a user