diff --git a/src/plugins/config/auto_update.py b/src/config/auto_update.py similarity index 100% rename from src/plugins/config/auto_update.py rename to src/config/auto_update.py diff --git a/src/plugins/config/config.py b/src/config/config.py similarity index 99% rename from src/plugins/config/config.py rename to src/config/config.py index ebde77734..332be7442 100644 --- a/src/plugins/config/config.py +++ b/src/config/config.py @@ -44,7 +44,7 @@ else: def update_config(): # 获取根目录路径 - root_dir = Path(__file__).parent.parent.parent.parent + root_dir = Path(__file__).parent.parent.parent template_dir = root_dir / "template" config_dir = root_dir / "config" old_config_dir = config_dir / "old" @@ -305,7 +305,7 @@ class BotConfig: def get_config_dir() -> str: """获取配置文件目录""" current_dir = os.path.dirname(os.path.abspath(__file__)) - root_dir = os.path.abspath(os.path.join(current_dir, "..", "..", "..")) + root_dir = os.path.abspath(os.path.join(current_dir, "..", "..")) config_dir = os.path.join(root_dir, "config") if not os.path.exists(config_dir): os.makedirs(config_dir) diff --git a/src/do_tool/tool_can_use/change_mood.py b/src/do_tool/tool_can_use/change_mood.py index 53410068f..1c13b1e5f 100644 --- a/src/do_tool/tool_can_use/change_mood.py +++ b/src/do_tool/tool_can_use/change_mood.py @@ -1,5 +1,5 @@ from src.do_tool.tool_can_use.base_tool import BaseTool -from src.plugins.config.config import global_config +from src.config.config import global_config from src.common.logger import get_module_logger from src.plugins.moods.moods import MoodManager from src.plugins.chat_module.think_flow_chat.think_flow_generator import ResponseGenerator diff --git a/src/do_tool/tool_use.py b/src/do_tool/tool_use.py index b8c35d912..b323f0452 100644 --- a/src/do_tool/tool_use.py +++ b/src/do_tool/tool_use.py @@ -1,5 +1,5 @@ from src.plugins.models.utils_model import LLMRequest -from src.plugins.config.config import global_config +from src.config.config import global_config from src.plugins.chat.chat_stream import ChatStream from src.common.database import db import time @@ -7,6 +7,8 @@ import json from src.common.logger import get_module_logger, TOOL_USE_STYLE_CONFIG, LogConfig from src.do_tool.tool_can_use import get_all_tool_definitions, get_tool_instance from src.heart_flow.sub_heartflow import SubHeartflow +import traceback +from src.plugins.chat.utils import get_recent_group_detailed_plain_text tool_use_config = LogConfig( # 使用消息发送专用样式 @@ -195,6 +197,7 @@ class ToolUser: except Exception as e: logger.error(f"工具调用过程中出错: {str(e)}") + logger.error(f"工具调用过程中出错: {traceback.format_exc()}") return { "used_tools": False, "error": str(e), diff --git a/src/gui/logger_gui.py b/src/gui/logger_gui.py deleted file mode 100644 index ad6edafb8..000000000 --- a/src/gui/logger_gui.py +++ /dev/null @@ -1,378 +0,0 @@ -# import customtkinter as ctk -# import subprocess -# import threading -# import queue -# import re -# import os -# import signal -# from collections import deque -# import sys - -# # 设置应用的外观模式和默认颜色主题 -# ctk.set_appearance_mode("dark") -# ctk.set_default_color_theme("blue") - - -# class LogViewerApp(ctk.CTk): -# """日志查看器应用的主类,继承自customtkinter的CTk类""" - -# def __init__(self): -# """初始化日志查看器应用的界面和状态""" -# super().__init__() -# self.title("日志查看器") -# self.geometry("1200x800") - -# # 标记GUI是否运行中 -# self.is_running = True - -# # 程序关闭时的清理操作 -# self.protocol("WM_DELETE_WINDOW", self._on_closing) - -# # 初始化进程、日志队列、日志数据等变量 -# self.process = None -# self.log_queue = queue.Queue() -# self.log_data = deque(maxlen=10000) # 使用固定长度队列 -# self.available_levels = set() -# self.available_modules = set() -# self.sorted_modules = [] -# self.module_checkboxes = {} # 存储模块复选框的字典 - -# # 日志颜色配置 -# self.color_config = { -# "time": "#888888", -# "DEBUG": "#2196F3", -# "INFO": "#4CAF50", -# "WARNING": "#FF9800", -# "ERROR": "#F44336", -# "module": "#D4D0AB", -# "default": "#FFFFFF", -# } - -# # 列可见性配置 -# self.column_visibility = {"show_time": True, "show_level": True, "show_module": True} - -# # 选中的日志等级和模块 -# self.selected_levels = set() -# self.selected_modules = set() - -# # 创建界面组件并启动日志队列处理 -# self.create_widgets() -# self.after(100, self.process_log_queue) - -# def create_widgets(self): -# """创建应用界面的各个组件""" -# self.grid_columnconfigure(0, weight=1) -# self.grid_rowconfigure(1, weight=1) - -# # 控制面板 -# control_frame = ctk.CTkFrame(self) -# control_frame.grid(row=0, column=0, sticky="ew", padx=10, pady=5) - -# self.start_btn = ctk.CTkButton(control_frame, text="启动", command=self.start_process) -# self.start_btn.pack(side="left", padx=5) - -# self.stop_btn = ctk.CTkButton(control_frame, text="停止", command=self.stop_process, state="disabled") -# self.stop_btn.pack(side="left", padx=5) - -# self.clear_btn = ctk.CTkButton(control_frame, text="清屏", command=self.clear_logs) -# self.clear_btn.pack(side="left", padx=5) - -# column_filter_frame = ctk.CTkFrame(control_frame) -# column_filter_frame.pack(side="left", padx=20) - -# self.time_check = ctk.CTkCheckBox(column_filter_frame, text="显示时间", command=self.refresh_logs) -# self.time_check.pack(side="left", padx=5) -# self.time_check.select() - -# self.level_check = ctk.CTkCheckBox(column_filter_frame, text="显示等级", command=self.refresh_logs) -# self.level_check.pack(side="left", padx=5) -# self.level_check.select() - -# self.module_check = ctk.CTkCheckBox(column_filter_frame, text="显示模块", command=self.refresh_logs) -# self.module_check.pack(side="left", padx=5) -# self.module_check.select() - -# # 筛选面板 -# filter_frame = ctk.CTkFrame(self) -# filter_frame.grid(row=0, column=1, rowspan=2, sticky="ns", padx=5) - -# ctk.CTkLabel(filter_frame, text="日志等级筛选").pack(pady=5) -# self.level_scroll = ctk.CTkScrollableFrame(filter_frame, width=150, height=200) -# self.level_scroll.pack(fill="both", expand=True, padx=5) - -# ctk.CTkLabel(filter_frame, text="模块筛选").pack(pady=5) -# self.module_filter_entry = ctk.CTkEntry(filter_frame, placeholder_text="输入模块过滤词") -# self.module_filter_entry.pack(pady=5) -# self.module_filter_entry.bind("", self.update_module_filter) - -# self.module_scroll = ctk.CTkScrollableFrame(filter_frame, width=300, height=200) -# self.module_scroll.pack(fill="both", expand=True, padx=5) - -# self.log_text = ctk.CTkTextbox(self, wrap="word") -# self.log_text.grid(row=1, column=0, sticky="nsew", padx=10, pady=5) - -# self.init_text_tags() - -# def update_module_filter(self, event): -# """根据模块过滤词更新模块复选框的显示""" -# filter_text = self.module_filter_entry.get().strip().lower() -# for module, checkbox in self.module_checkboxes.items(): -# if filter_text in module.lower(): -# checkbox.pack(anchor="w", padx=5, pady=2) -# else: -# checkbox.pack_forget() - -# def update_filters(self, level, module): -# """更新日志等级和模块的筛选器""" -# if level not in self.available_levels: -# self.available_levels.add(level) -# self.add_checkbox(self.level_scroll, level, "level") - -# module_key = self.get_module_key(module) -# if module_key not in self.available_modules: -# self.available_modules.add(module_key) -# self.sorted_modules = sorted(self.available_modules, key=lambda x: x.lower()) -# self.rebuild_module_checkboxes() - -# def rebuild_module_checkboxes(self): -# """重新构建模块复选框""" -# # 清空现有复选框 -# for widget in self.module_scroll.winfo_children(): -# widget.destroy() -# self.module_checkboxes.clear() - -# # 重建排序后的复选框 -# for module in self.sorted_modules: -# self.add_checkbox(self.module_scroll, module, "module") - -# def add_checkbox(self, parent, text, type_): -# """在指定父组件中添加复选框""" - -# def update_filter(): -# current = cb.get() -# if type_ == "level": -# (self.selected_levels.add if current else self.selected_levels.discard)(text) -# else: -# (self.selected_modules.add if current else self.selected_modules.discard)(text) -# self.refresh_logs() - -# cb = ctk.CTkCheckBox(parent, text=text, command=update_filter) -# cb.select() # 初始选中 - -# # 手动同步初始状态到集合(关键修复) -# if type_ == "level": -# self.selected_levels.add(text) -# else: -# self.selected_modules.add(text) - -# if type_ == "module": -# self.module_checkboxes[text] = cb -# cb.pack(anchor="w", padx=5, pady=2) -# return cb - -# def check_filter(self, entry): -# """检查日志条目是否符合当前筛选条件""" -# level_ok = not self.selected_levels or entry["level"] in self.selected_levels -# module_key = self.get_module_key(entry["module"]) -# module_ok = not self.selected_modules or module_key in self.selected_modules -# return level_ok and module_ok - -# def init_text_tags(self): -# """初始化日志文本的颜色标签""" -# for tag, color in self.color_config.items(): -# self.log_text.tag_config(tag, foreground=color) -# self.log_text.tag_config("default", foreground=self.color_config["default"]) - -# def start_process(self): -# """启动日志进程并开始读取输出""" -# self.process = subprocess.Popen( -# ["nb", "run"], -# stdout=subprocess.PIPE, -# stderr=subprocess.STDOUT, -# text=True, -# bufsize=1, -# encoding="utf-8", -# errors="ignore", -# ) -# self.start_btn.configure(state="disabled") -# self.stop_btn.configure(state="normal") -# threading.Thread(target=self.read_output, daemon=True).start() - -# def stop_process(self): -# """停止日志进程并清理相关资源""" -# if self.process: -# try: -# if hasattr(self.process, "pid"): -# if os.name == "nt": -# subprocess.run( -# ["taskkill", "/F", "/T", "/PID", str(self.process.pid)], check=True, capture_output=True -# ) -# else: -# os.killpg(os.getpgid(self.process.pid), signal.SIGTERM) -# except (subprocess.CalledProcessError, ProcessLookupError, OSError) as e: -# print(f"终止进程失败: {e}") -# finally: -# self.process = None -# self.log_queue.queue.clear() -# self.start_btn.configure(state="normal") -# self.stop_btn.configure(state="disabled") -# self.refresh_logs() - -# def read_output(self): -# """读取日志进程的输出并放入队列""" -# try: -# while self.process and self.process.poll() is None and self.is_running: -# line = self.process.stdout.readline() -# if line: -# self.log_queue.put(line) -# else: -# break # 避免空循环 -# self.process.stdout.close() # 确保关闭文件描述符 -# except ValueError: # 处理可能的I/O操作异常 -# pass - -# def process_log_queue(self): -# """处理日志队列中的日志条目""" -# while not self.log_queue.empty(): -# line = self.log_queue.get() -# self.process_log_line(line) - -# # 仅在GUI仍在运行时继续处理队列 -# if self.is_running: -# self.after(100, self.process_log_queue) - -# def process_log_line(self, line): -# """解析单行日志并更新日志数据和筛选器""" -# match = re.match( -# r"""^ -# (?:(?P