use structlog instead of loguru

This commit is contained in:
春河晴
2025-06-11 15:17:08 +09:00
parent 0cb595218e
commit 7b4e7b94f8
132 changed files with 283 additions and 1804 deletions

12
bot.py
View File

@@ -7,7 +7,7 @@ import time
import platform
import traceback
from dotenv import load_dotenv
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
# from src.common.logger import LogConfig, CONFIRM_STYLE_CONFIG
from src.common.crash_logger import install_crash_handler
@@ -69,10 +69,9 @@ def load_env():
# 直接加载生产环境变量配置
if os.path.exists(".env"):
load_dotenv(".env", override=True)
logger.success("成功加载环境变量配置")
logger.info("成功加载环境变量配置")
else:
logger.error("未找到.env文件请确保文件存在")
raise FileNotFoundError("未找到.env文件请确保文件存在")
logger.warn("未找到.env文件请确保程序所需的环境变量被正确设置")
def scan_provider(env_config: dict):
@@ -199,6 +198,7 @@ def check_eula():
def raw_main():
load_env()
# 利用 TZ 环境变量设定程序工作的时区
if platform.system().lower() != "windows":
time.tzset()
@@ -211,8 +211,6 @@ def raw_main():
easter_egg()
load_env()
env_config = {key: os.getenv(key) for key in os.environ}
scan_provider(env_config)
@@ -235,7 +233,7 @@ if __name__ == "__main__":
loop.run_until_complete(main_system.initialize())
loop.run_until_complete(main_system.schedule_tasks())
except KeyboardInterrupt:
# loop.run_until_complete(global_api.stop())
# loop.run_until_complete(get_global_api().stop())
logger.warning("收到中断信号,正在优雅关闭...")
if loop and not loop.is_closed():
try:

View File

@@ -39,7 +39,7 @@ from src.plugin_system import (
BasePlugin, register_plugin, BaseAction, BaseCommand,
ComponentInfo, ActionInfo, CommandInfo, ActionActivationType, ChatMode
)
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
logger = get_logger("my_first_plugin")

Binary file not shown.

View File

@@ -15,7 +15,7 @@ from src.chat.knowledge.embedding_store import EmbeddingManager
from src.chat.knowledge.llm_client import LLMClient
from src.chat.knowledge.open_ie import OpenIE
from src.chat.knowledge.kg_manager import KGManager
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from src.chat.knowledge.utils.hash import get_sha256
@@ -23,7 +23,7 @@ from src.chat.knowledge.utils.hash import get_sha256
ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
OPENIE_DIR = global_config["persistence"]["openie_data_path"] or os.path.join(ROOT_PATH, "data/openie")
logger = get_module_logger("OpenIE导入")
logger = get_logger("OpenIE导入")
def hash_deduplicate(

View File

@@ -12,7 +12,7 @@ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from rich.progress import Progress # 替换为 rich 进度条
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from src.chat.knowledge.lpmmconfig import global_config
from src.chat.knowledge.ie_process import info_extract_from_str
from src.chat.knowledge.llm_client import LLMClient
@@ -28,7 +28,7 @@ from rich.progress import (
TextColumn,
)
logger = get_module_logger("LPMM知识库-信息提取")
logger = get_logger("LPMM知识库-信息提取")
ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))

View File

@@ -32,7 +32,7 @@ sys.path.insert(0, str(project_root))
from src.chat.utils.chat_message_builder import build_readable_messages
from src.common.database.database_model import Messages
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.common.database.database import db
from src.config.config import global_config
from src.llm_models.utils_model import LLMRequest

View File

@@ -42,7 +42,7 @@ from src.common.database.database_model import (
GraphNodes,
GraphEdges,
)
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
logger = get_logger("mongodb_to_sqlite")

View File

@@ -5,7 +5,7 @@ import sys # 新增系统模块导入
import datetime # 新增导入
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.knowledge.lpmmconfig import global_config
logger = get_logger("lpmm")

View File

@@ -1,6 +1,6 @@
from src.chat.heart_flow.heartflow import heartflow
from src.chat.heart_flow.sub_heartflow import ChatState
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
import time
logger = get_logger("api")

View File

@@ -3,7 +3,7 @@ import strawberry
from fastapi import FastAPI
from strawberry.fastapi import GraphQLRouter
from src.common.server import global_server
from src.common.server import get_global_server
@strawberry.type
@@ -17,6 +17,6 @@ schema = strawberry.Schema(Query)
graphql_app = GraphQLRouter(schema)
fast_api_app: FastAPI = global_server.get_app()
fast_api_app: FastAPI = get_global_server().get_app()
fast_api_app.include_router(graphql_app, prefix="/graphql")

View File

@@ -6,9 +6,9 @@ import sys
# from src.chat.heart_flow.heartflow import heartflow
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
# from src.config.config import BotConfig
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.api.reload_config import reload_config as reload_config_func
from src.common.server import global_server
from src.common.server import get_global_server
from src.api.apiforgui import (
get_all_subheartflow_ids,
forced_change_subheartflow_status,
@@ -108,4 +108,4 @@ async def get_system_basic_info():
def start_api_server():
"""启动API服务器"""
global_server.register_router(router, prefix="/api/v1")
get_global_server().register_router(router, prefix="/api/v1")

View File

@@ -1,7 +1,7 @@
from fastapi import HTTPException
from rich.traceback import install
from src.config.config import get_config_dir, load_config
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
import os
install(extra_lines=3)

View File

@@ -1,6 +1,6 @@
from abc import ABC, abstractmethod
from typing import Tuple, Dict, Type
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
logger = get_logger("base_action")

View File

@@ -1,6 +1,6 @@
from typing import Tuple, Dict, Any, Optional
from src.chat.actions.base_action import BaseAction, register_action, ActionActivationType, ChatMode # noqa F401
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
import os
import inspect
import toml # 导入 toml 库

View File

@@ -1,7 +1,7 @@
import re
from abc import ABC, abstractmethod
from typing import Dict, List, Type, Optional, Tuple, Pattern
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.message_receive.message import MessageRecv
from src.chat.focus_chat.hfc_utils import create_empty_anchor_message
from src.chat.focus_chat.expressors.default_expressor import DefaultExpressor

View File

@@ -17,7 +17,7 @@ from src.common.database.database import db as peewee_db
from src.config.config import global_config
from src.chat.utils.utils_image import image_path_to_base64, image_manager
from src.llm_models.utils_model import LLMRequest
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from rich.traceback import install
install(extra_lines=3)
@@ -163,7 +163,7 @@ class MaiEmoji:
last_used_time=self.last_used_time,
)
logger.success(f"[注册] 表情包信息保存到数据库: {self.filename} ({self.emotion})")
logger.info(f"[注册] 表情包信息保存到数据库: {self.filename} ({self.emotion})")
return True
@@ -317,7 +317,7 @@ async def clear_temp_emoji() -> None:
os.remove(file_path)
logger.debug(f"[清理] 删除: {filename}")
logger.success("[清理] 完成")
logger.info("[清理] 完成")
async def clean_unused_emojis(emoji_dir: str, emoji_objects: List["MaiEmoji"]) -> None:
@@ -349,7 +349,7 @@ async def clean_unused_emojis(emoji_dir: str, emoji_objects: List["MaiEmoji"]) -
logger.error(f"[错误] 删除文件时出错 ({file_full_path}): {str(e)}")
if cleaned_count > 0:
logger.success(f"[清理] 在目录 {emoji_dir} 中清理了 {cleaned_count} 个破损表情包。")
logger.info(f"[清理] 在目录 {emoji_dir} 中清理了 {cleaned_count} 个破损表情包。")
else:
logger.info(f"[清理] 目录 {emoji_dir} 中没有需要清理的。")
@@ -568,7 +568,7 @@ class EmojiManager:
# 输出清理结果
if removed_count > 0:
logger.success(f"[清理] 已清理 {removed_count} 个失效/文件丢失的表情包记录")
logger.info(f"[清理] 已清理 {removed_count} 个失效/文件丢失的表情包记录")
logger.info(f"[统计] 清理前记录数: {total_count} | 清理后有效记录数: {len(self.emoji_objects)}")
else:
logger.info(f"[检查] 已检查 {total_count} 个表情包记录,全部完好")
@@ -645,7 +645,7 @@ class EmojiManager:
self.emoji_objects = emoji_objects
self.emoji_num = len(emoji_objects)
logger.success(f"[数据库] 加载完成: 共加载 {self.emoji_num} 个表情包记录。")
logger.info(f"[数据库] 加载完成: 共加载 {self.emoji_num} 个表情包记录。")
if load_errors > 0:
logger.warning(f"[数据库] 加载过程中出现 {load_errors} 个错误。")
@@ -808,7 +808,7 @@ class EmojiManager:
if register_success:
self.emoji_objects.append(new_emoji)
self.emoji_num += 1
logger.success(f"[成功] 注册: {new_emoji.filename}")
logger.info(f"[成功] 注册: {new_emoji.filename}")
return True
else:
logger.error(f"[错误] 注册表情包到数据库失败: {new_emoji.filename}")
@@ -973,7 +973,7 @@ class EmojiManager:
# 注册成功后,添加到内存列表
self.emoji_objects.append(new_emoji)
self.emoji_num += 1
logger.success(f"[成功] 注册新表情包: {filename} (当前: {self.emoji_num}/{self.emoji_num_max})")
logger.info(f"[成功] 注册新表情包: {filename} (当前: {self.emoji_num}/{self.emoji_num_max})")
return True
else:
logger.error(f"[注册失败] 保存表情包到数据库/移动文件失败: {filename}")

View File

@@ -4,7 +4,7 @@ from src.chat.message_receive.message import MessageRecv, MessageThinking, Messa
from src.chat.message_receive.message import Seg # Local import needed after move
from src.chat.message_receive.message import UserInfo
from src.chat.message_receive.chat_stream import chat_manager
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
from src.chat.utils.utils_image import image_path_to_base64 # Local import needed after move

View File

@@ -1,7 +1,7 @@
import time
import random
from typing import List, Dict, Optional, Any, Tuple
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
from src.chat.utils.chat_message_builder import get_raw_msg_by_timestamp_random, build_anonymous_messages

View File

@@ -1,7 +1,7 @@
import time
import os
from typing import Optional, Dict, Any
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
import json
logger = get_logger("hfc") # Logger Name Changed

View File

@@ -7,7 +7,7 @@ from typing import List, Optional, Dict, Any, Deque, Callable, Awaitable
from src.chat.message_receive.chat_stream import chat_manager
from rich.traceback import install
from src.chat.utils.prompt_builder import global_prompt_manager
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.utils.timer_calculator import Timer
from src.chat.heart_flow.observation.observation import Observation
from src.chat.focus_chat.heartFC_Cycleinfo import CycleDetail

View File

@@ -1,10 +1,10 @@
import asyncio
from typing import Dict, Optional # 重新导入类型
from src.chat.message_receive.message import MessageSending, MessageThinking
from src.common.message.api import global_api
from src.common.message.api import get_global_api
from src.chat.message_receive.storage import MessageStorage
from src.chat.utils.utils import truncate_message
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.utils.utils import calculate_typing_time
from rich.traceback import install
import traceback
@@ -21,8 +21,8 @@ async def send_message(message: MessageSending) -> str:
try:
# 直接调用API发送消息
await global_api.send_message(message)
logger.success(f"已将消息 '{message_preview}' 发往平台'{message.message_info.platform}'")
await get_global_api().send_message(message)
logger.info(f"已将消息 '{message_preview}' 发往平台'{message.message_info.platform}'")
return message.processed_plain_text
except Exception as e:

View File

@@ -6,7 +6,7 @@ from src.chat.heart_flow.heartflow import heartflow
from src.chat.message_receive.chat_stream import chat_manager, ChatStream
from src.chat.utils.utils import is_mentioned_bot_in_message
from src.chat.utils.timer_calculator import Timer
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.person_info.relationship_manager import relationship_manager
import math

View File

@@ -3,7 +3,7 @@ from typing import Optional
from src.chat.message_receive.message import MessageRecv, BaseMessageInfo
from src.chat.message_receive.chat_stream import ChatStream
from src.chat.message_receive.message import UserInfo
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
import json
logger = get_logger(__name__)

View File

@@ -2,7 +2,7 @@ from abc import ABC, abstractmethod
from typing import List, Any, Optional, Dict
from src.chat.focus_chat.info.info_base import InfoBase
from src.chat.heart_flow.observation.observation import Observation
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
logger = get_logger("base_processor")

View File

@@ -3,7 +3,7 @@ from src.chat.focus_chat.info.obs_info import ObsInfo
from src.chat.heart_flow.observation.observation import Observation
from src.chat.focus_chat.info.info_base import InfoBase
from .base_processor import BaseProcessor
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.heart_flow.observation.chatting_observation import ChattingObservation
from src.chat.heart_flow.observation.hfcloop_observation import HFCloopObservation
from src.chat.focus_chat.info.cycle_info import CycleInfo

View File

@@ -4,7 +4,7 @@ from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
import time
import traceback
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.individuality.individuality import individuality
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.chat.utils.json_utils import safe_json_dumps

View File

@@ -4,7 +4,7 @@ from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
import time
import traceback
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.chat.message_receive.chat_stream import chat_manager
from src.person_info.relationship_manager import relationship_manager

View File

@@ -4,7 +4,7 @@ from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
import time
import traceback
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.individuality.individuality import individuality
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.chat.message_receive.chat_stream import chat_manager

View File

@@ -2,7 +2,7 @@ from src.chat.heart_flow.observation.chatting_observation import ChattingObserva
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
import time
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.individuality.individuality import individuality
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.tools.tool_use import ToolUser

View File

@@ -4,7 +4,7 @@ from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
import time
import traceback
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.chat.message_receive.chat_stream import chat_manager
from .base_processor import BaseProcessor

View File

@@ -3,7 +3,7 @@ from src.chat.heart_flow.observation.structure_observation import StructureObser
from src.chat.heart_flow.observation.hfcloop_observation import HFCloopObservation
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from datetime import datetime
from src.chat.memory_system.Hippocampus import hippocampus_manager

View File

@@ -4,7 +4,7 @@ from src.chat.heart_flow.observation.observation import Observation
from src.chat.focus_chat.replyer.default_replyer import DefaultReplyer
from src.chat.focus_chat.expressors.default_expressor import DefaultExpressor
from src.chat.message_receive.chat_stream import ChatStream
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
# 不再需要导入动作类因为已经在main.py中导入
# import src.chat.actions.default_actions # noqa

View File

@@ -1,6 +1,6 @@
from typing import List, Optional, Any, Dict
from src.chat.heart_flow.observation.observation import Observation
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.heart_flow.observation.hfcloop_observation import HFCloopObservation
from src.chat.heart_flow.observation.chatting_observation import ChattingObservation
from src.chat.message_receive.chat_stream import chat_manager

View File

@@ -3,7 +3,7 @@ from src.chat.focus_chat.planners.base_planner import BasePlanner
from src.chat.focus_chat.planners.planner_simple import ActionPlanner as SimpleActionPlanner
from src.chat.focus_chat.planners.action_manager import ActionManager
from src.config.config import global_config
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
logger = get_logger("planner_factory")

View File

@@ -11,7 +11,7 @@ from src.chat.focus_chat.info.action_info import ActionInfo
from src.chat.focus_chat.info.structured_info import StructuredInfo
from src.chat.focus_chat.info.self_info import SelfInfo
from src.chat.focus_chat.info.relation_info import RelationInfo
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.individuality.individuality import individuality
from src.chat.focus_chat.planners.action_manager import ActionManager

View File

@@ -4,7 +4,7 @@ from src.chat.message_receive.message import MessageRecv, MessageThinking, Messa
from src.chat.message_receive.message import Seg # Local import needed after move
from src.chat.message_receive.message import UserInfo
from src.chat.message_receive.chat_stream import chat_manager
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
from src.chat.utils.utils_image import image_path_to_base64 # Local import needed after move

View File

@@ -2,7 +2,7 @@ from typing import Dict, Any, Type, TypeVar, List, Optional
import traceback
from json_repair import repair_json
from rich.traceback import install
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
from src.chat.focus_chat.working_memory.memory_item import MemoryItem

View File

@@ -1,6 +1,6 @@
from typing import List, Any, Optional
import asyncio
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.focus_chat.working_memory.memory_manager import MemoryManager, MemoryItem
from src.config.config import global_config

View File

@@ -1,7 +1,7 @@
import asyncio
import traceback
from typing import Optional, Coroutine, Callable, Any, List
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.heart_flow.subheartflow_manager import SubHeartflowManager
from src.config.config import global_config

View File

@@ -1,5 +1,5 @@
from src.chat.heart_flow.sub_heartflow import SubHeartflow, ChatState
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from typing import Any, Optional, List
from src.chat.heart_flow.subheartflow_manager import SubHeartflowManager
from src.chat.heart_flow.background_tasks import BackgroundTaskManager # Import BackgroundTaskManager

View File

@@ -1,7 +1,7 @@
# 定义了来自外部世界的信息
# 外部世界可以是某个聊天 不同平台的聊天 也可以是任意媒体
from datetime import datetime
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.focus_chat.planners.action_manager import ActionManager
logger = get_logger("observation")

View File

@@ -14,7 +14,7 @@ import difflib
from src.chat.message_receive.message import MessageRecv # 添加 MessageRecv 导入
from src.chat.heart_flow.observation.observation import Observation
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.heart_flow.utils_chat import get_chat_type_and_target_info
from src.chat.utils.prompt_builder import Prompt

View File

@@ -1,7 +1,7 @@
# 定义了来自外部世界的信息
# 外部世界可以是某个聊天 不同平台的聊天 也可以是任意媒体
from datetime import datetime
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.focus_chat.heartFC_Cycleinfo import CycleDetail
from typing import List
# Import the new utility function

View File

@@ -1,7 +1,7 @@
# 定义了来自外部世界的信息
# 外部世界可以是某个聊天 不同平台的聊天 也可以是任意媒体
from datetime import datetime
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
logger = get_logger("observation")

View File

@@ -1,5 +1,5 @@
from datetime import datetime
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
# Import the new utility function

View File

@@ -1,7 +1,7 @@
# 定义了来自外部世界的信息
# 外部世界可以是某个聊天 不同平台的聊天 也可以是任意媒体
from datetime import datetime
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.focus_chat.working_memory.working_memory import WorkingMemory
from src.chat.focus_chat.working_memory.memory_item import MemoryItem
from typing import List

View File

@@ -4,7 +4,7 @@ import asyncio
import time
from typing import Optional, List, Dict, Tuple
import traceback
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.message_receive.message import MessageRecv
from src.chat.message_receive.chat_stream import chat_manager
from src.chat.focus_chat.heartFC_chat import HeartFChatting

View File

@@ -1,7 +1,7 @@
import asyncio
import time
from typing import Dict, Any, Optional, List
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.message_receive.chat_stream import chat_manager
from src.chat.heart_flow.sub_heartflow import SubHeartflow, ChatState

View File

@@ -1,5 +1,5 @@
from typing import Optional, Tuple, Dict
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.message_receive.chat_stream import chat_manager
from src.person_info.person_info import person_info_manager, PersonInfoManager

View File

@@ -1,5 +1,5 @@
# Configure logger
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
logger = get_logger("lpmm")

View File

@@ -12,7 +12,7 @@ import networkx as nx
import numpy as np
from collections import Counter
from ...llm_models.utils_model import LLMRequest
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.memory_system.sample_distribution import MemoryBuildScheduler # 分布生成器
from ..utils.chat_message_builder import (
get_raw_msg_by_timestamp,
@@ -829,7 +829,7 @@ class EntorhinalCortex:
)
if messages:
time_diff = (datetime.datetime.now().timestamp() - timestamp) / 3600
logger.success(f"成功抽取 {time_diff:.1f} 小时前的消息样本,共{len(messages)}")
logger.info(f"成功抽取 {time_diff:.1f} 小时前的消息样本,共{len(messages)}")
chat_samples.append(messages)
else:
logger.debug(f"时间戳 {timestamp} 的消息无需记忆")
@@ -1046,8 +1046,8 @@ class EntorhinalCortex:
GraphEdges.delete().where((GraphEdges.source == source) & (GraphEdges.target == target)).execute()
end_time = time.time()
logger.success(f"[同步] 总耗时: {end_time - start_time:.2f}")
logger.success(f"[同步] 同步了 {len(memory_nodes)} 个节点和 {len(memory_edges)} 条边")
logger.info(f"[同步] 总耗时: {end_time - start_time:.2f}")
logger.info(f"[同步] 同步了 {len(memory_nodes)} 个节点和 {len(memory_edges)} 条边")
async def resync_memory_to_db(self):
"""清空数据库并重新同步所有记忆数据"""
@@ -1133,8 +1133,8 @@ class EntorhinalCortex:
logger.info(f"[数据库] 写入 {len(edges_data)} 条边耗时: {edge_end - edge_start:.2f}")
end_time = time.time()
logger.success(f"[数据库] 重新同步完成,总耗时: {end_time - start_time:.2f}")
logger.success(f"[数据库] 同步了 {len(nodes_data)} 个节点和 {len(edges_data)} 条边")
logger.info(f"[数据库] 重新同步完成,总耗时: {end_time - start_time:.2f}")
logger.info(f"[数据库] 同步了 {len(nodes_data)} 个节点和 {len(edges_data)} 条边")
def sync_memory_from_db(self):
"""从数据库同步数据到内存中的图结构"""
@@ -1209,7 +1209,7 @@ class EntorhinalCortex:
)
if need_update:
logger.success("[数据库] 已为缺失的时间字段进行补充")
logger.info("[数据库] 已为缺失的时间字段进行补充")
# 负责整合,遗忘,合并记忆
@@ -1387,7 +1387,7 @@ class ParahippocampalGyrus:
logger.debug(f"进度: [{bar}] {progress:.1f}% ({i}/{len(memory_samples)})")
if all_added_nodes:
logger.success(f"更新记忆: {', '.join(all_added_nodes)}")
logger.info(f"更新记忆: {', '.join(all_added_nodes)}")
if all_added_edges:
logger.debug(f"强化连接: {', '.join(all_added_edges)}")
if all_connected_nodes:
@@ -1396,7 +1396,7 @@ class ParahippocampalGyrus:
await self.hippocampus.entorhinal_cortex.sync_memory_to_db()
end_time = time.time()
logger.success(f"---------------------记忆构建耗时: {end_time - start_time:.2f} 秒---------------------")
logger.info(f"---------------------记忆构建耗时: {end_time - start_time:.2f} 秒---------------------")
async def operation_forget_topic(self, percentage=0.005):
start_time = time.time()
@@ -1686,7 +1686,7 @@ class HippocampusManager:
node_count = len(memory_graph.nodes())
edge_count = len(memory_graph.edges())
logger.success(f"""--------------------------------
logger.info(f"""--------------------------------
记忆系统参数配置:
构建间隔: {global_config.memory.memory_build_interval}秒|样本数: {global_config.memory.memory_build_sample_num},长度: {global_config.memory.memory_build_sample_length}|压缩率: {global_config.memory.memory_compress_rate}
记忆构建分布: {global_config.memory.memory_build_distribution}

View File

@@ -1,7 +1,7 @@
import traceback
from typing import Dict, Any
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.manager.mood_manager import mood_manager # 导入情绪管理器
from src.chat.message_receive.chat_stream import chat_manager
from src.chat.message_receive.message import MessageRecv

View File

@@ -13,7 +13,7 @@ from maim_message import GroupInfo, UserInfo
if TYPE_CHECKING:
from .message import MessageRecv
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from rich.traceback import install
install(extra_lines=3)
@@ -135,7 +135,7 @@ class ChatManager:
"""异步初始化"""
try:
await self.load_all_streams()
logger.success(f"聊天管理器已启动,已加载 {len(self.streams)} 个聊天流")
logger.info(f"聊天管理器已启动,已加载 {len(self.streams)} 个聊天流")
except Exception as e:
logger.error(f"聊天管理器启动失败: {str(e)}")

View File

@@ -5,7 +5,7 @@ from typing import Optional, Any, TYPE_CHECKING
import urllib3
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
if TYPE_CHECKING:
from .chat_stream import ChatStream

View File

@@ -3,7 +3,7 @@ import asyncio
import time
from asyncio import Task
from typing import Union
from src.common.message.api import global_api
from src.common.message.api import get_global_api
# from ...common.database import db # 数据库依赖似乎不需要了,注释掉
from .message import MessageSending, MessageThinking, MessageSet
@@ -12,7 +12,7 @@ from .storage import MessageStorage
from ...config.config import global_config
from ..utils.utils import truncate_message, calculate_typing_time, count_messages_between
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from rich.traceback import install
install(extra_lines=3)
@@ -24,7 +24,7 @@ logger = get_logger("sender")
async def send_via_ws(message: MessageSending) -> None:
"""通过 WebSocket 发送消息"""
try:
await global_api.send_message(message)
await get_global_api().send_message(message)
except Exception as e:
logger.error(f"WS发送失败: {e}")
raise ValueError(f"未找到平台:{message.message_info.platform} 的url配置请检查配置文件") from e
@@ -50,7 +50,7 @@ async def send_message(
try:
await send_via_ws(message)
logger.success(f"发送消息 '{message_preview}' 成功") # 调整日志格式
logger.info(f"发送消息 '{message_preview}' 成功") # 调整日志格式
except Exception as e:
logger.error(f"发送消息 '{message_preview}' 失败: {str(e)}")

View File

@@ -5,9 +5,9 @@ from typing import Union
from .message import MessageSending, MessageRecv
from .chat_stream import ChatStream
from ...common.database.database_model import Messages, RecalledMessages # Import Peewee models
from src.common.logger import get_module_logger
from src.common.logger import get_logger
logger = get_module_logger("message_storage")
logger = get_logger("message_storage")
class MessageStorage:

View File

@@ -4,7 +4,7 @@ import traceback
from random import random
from typing import List, Optional # 导入 Optional
from maim_message import UserInfo, Seg
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.heart_flow.utils_chat import get_chat_type_and_target_info
from src.manager.mood_manager import mood_manager
from src.chat.message_receive.chat_stream import ChatStream, chat_manager

View File

@@ -1,5 +1,5 @@
from typing import List, Any, Dict
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.focus_chat.planners.action_manager import ActionManager
from src.chat.actions.base_action import ActionActivationType, ChatMode
from src.chat.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat

View File

@@ -12,7 +12,7 @@ from src.chat.message_receive.message import UserInfo
from src.chat.message_receive.chat_stream import ChatStream, chat_manager
from src.chat.message_receive.message_sender import message_manager
from src.config.config import global_config
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
logger = get_logger("normal_chat_expressor")

View File

@@ -5,7 +5,7 @@ from src.config.config import global_config
from src.chat.message_receive.message import MessageThinking
from src.chat.normal_chat.normal_prompt import prompt_builder
from src.chat.utils.timer_calculator import Timer
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.person_info.person_info import person_info_manager, PersonInfoManager
from src.chat.utils.utils import process_llm_response

View File

@@ -3,7 +3,7 @@ from typing import Dict, Any
from rich.traceback import install
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.individuality.individuality import individuality
from src.chat.focus_chat.planners.action_manager import ActionManager

View File

@@ -1,5 +1,5 @@
from src.config.config import global_config
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.individuality.individuality import individuality
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.chat.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat

View File

@@ -1,4 +1,4 @@
from src.common.logger import LogConfig, WILLING_STYLE_CONFIG, LoguruLogger, get_module_logger
from src.common.logger import get_logger
from dataclasses import dataclass
from src.config.config import global_config
from src.chat.message_receive.chat_stream import ChatStream, GroupInfo
@@ -33,12 +33,7 @@ set_willing 设置某聊天流意愿
示例: 在 `mode_aggressive.py` 中,类名应为 `AggressiveWillingManager`
"""
willing_config = LogConfig(
# 使用消息发送专用样式
console_format=WILLING_STYLE_CONFIG["console_format"],
file_format=WILLING_STYLE_CONFIG["file_format"],
)
logger = get_module_logger("willing", config=willing_config)
logger = get_logger("willing")
@dataclass
@@ -93,7 +88,7 @@ class BaseWillingManager(ABC):
self.chat_reply_willing: Dict[str, float] = {} # 存储每个聊天流的回复意愿(chat_id)
self.ongoing_messages: Dict[str, WillingInfo] = {} # 当前正在进行的消息(message_id)
self.lock = asyncio.Lock()
self.logger: LoguruLogger = logger
self.logger = logger
def setup(self, message: MessageRecv, chat: ChatStream, is_mentioned_bot: bool, interested_rate: float):
person_id = PersonInfoManager.get_person_id(chat.platform, chat.user_info.user_id)

View File

@@ -1,88 +0,0 @@
import sys
import loguru
from enum import Enum
class LogClassification(Enum):
BASE = "base"
MEMORY = "memory"
EMOJI = "emoji"
CHAT = "chat"
PBUILDER = "promptbuilder"
class LogModule:
logger = loguru.logger.opt()
def __init__(self):
pass
def setup_logger(self, log_type: LogClassification):
"""配置日志格式
Args:
log_type: 日志类型可选值BASE(基础日志)、MEMORY(记忆系统日志)、EMOJI(表情包系统日志)
"""
# 移除默认日志处理器
self.logger.remove()
# 基础日志格式
base_format = (
"<green>{time:HH:mm:ss}</green> | <level>{level: <8}</level> | "
" d<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>"
)
chat_format = (
"<green>{time:HH:mm:ss}</green> | <level>{level: <8}</level> | "
"<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>"
)
# 记忆系统日志格式
memory_format = (
"<green>{time:HH:mm}</green> | <level>{level: <8}</level> | "
"<light-magenta>海马体</light-magenta> | <level>{message}</level>"
)
# 表情包系统日志格式
emoji_format = (
"<green>{time:HH:mm}</green> | <level>{level: <8}</level> | <yellow>表情包</yellow> | "
"<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>"
)
promptbuilder_format = (
"<green>{time:HH:mm}</green> | <level>{level: <8}</level> | <yellow>Prompt</yellow> | "
"<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>"
)
# 根据日志类型选择日志格式和输出
if log_type == LogClassification.CHAT:
self.logger.add(
sys.stderr,
format=chat_format,
# level="INFO"
)
elif log_type == LogClassification.PBUILDER:
self.logger.add(
sys.stderr,
format=promptbuilder_format,
# level="INFO"
)
elif log_type == LogClassification.MEMORY:
# 同时输出到控制台和文件
self.logger.add(
sys.stderr,
format=memory_format,
# level="INFO"
)
self.logger.add("logs/memory.log", format=memory_format, level="INFO", rotation="1 day", retention="7 days")
elif log_type == LogClassification.EMOJI:
self.logger.add(
sys.stderr,
format=emoji_format,
# level="INFO"
)
self.logger.add("logs/emoji.log", format=emoji_format, level="INFO", rotation="1 day", retention="7 days")
else: # BASE
self.logger.add(sys.stderr, format=base_format, level="INFO")
return self.logger

View File

@@ -3,14 +3,14 @@ import re
from contextlib import asynccontextmanager
import asyncio
import contextvars
from src.common.logger import get_module_logger
from src.common.logger import get_logger
# import traceback
from rich.traceback import install
install(extra_lines=3)
logger = get_module_logger("prompt_build")
logger = get_logger("prompt_build")
class PromptContext:

View File

@@ -3,14 +3,14 @@ from datetime import datetime, timedelta
from typing import Any, Dict, Tuple, List
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from src.manager.async_task_manager import AsyncTask
from ...common.database.database import db # This db is the Peewee database instance
from ...common.database.database_model import OnlineTime, LLMUsage, Messages # Import the Peewee model
from src.manager.local_store_manager import local_storage
logger = get_module_logger("maibot_statistic")
logger = get_logger("maibot_statistic")
# 统计数据的键
TOTAL_REQ_CNT = "total_requests"

View File

@@ -13,9 +13,9 @@ from pathlib import Path
import jieba
from pypinyin import Style, pinyin
from src.common.logger import get_module_logger
from src.common.logger import get_logger
logger = get_module_logger("typo_gen")
logger = get_logger("typo_gen")
class ChineseTypoGenerator:

View File

@@ -7,7 +7,7 @@ import jieba
import numpy as np
from maim_message import UserInfo
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from src.manager.mood_manager import mood_manager
from ..message_receive.message import MessageRecv
from src.llm_models.utils_model import LLMRequest
@@ -15,7 +15,7 @@ from .typo_generator import ChineseTypoGenerator
from ...config.config import global_config
from ...common.message_repository import find_messages, count_messages
logger = get_module_logger("chat_utils")
logger = get_logger("chat_utils")
def is_english_letter(char: str) -> bool:

View File

@@ -13,7 +13,7 @@ from src.common.database.database_model import Images, ImageDescriptions
from src.config.config import global_config
from src.llm_models.utils_model import LLMRequest
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from rich.traceback import install
install(extra_lines=3)

View File

@@ -1,7 +1,7 @@
from peewee import Model, DoubleField, IntegerField, BooleanField, TextField, FloatField, DateTimeField
from .database import db
import datetime
from ..logger_manager import get_logger
from src.common.logger import get_logger
logger = get_logger("database_model")
# 请在此处定义您的数据库实例。

View File

@@ -1,110 +0,0 @@
import functools
import inspect
from typing import Callable, Any
from .logger import logger, add_custom_style_handler
from rich.traceback import install
install(extra_lines=3)
def use_log_style(
style_name: str,
console_format: str,
console_level: str = "INFO",
# file_format: Optional[str] = None, # 暂未支持文件输出
# file_level: str = "DEBUG",
) -> Callable:
"""装饰器:为函数内的日志启用特定的自定义样式。
Args:
style_name (str): 自定义样式的唯一名称。
console_format (str): 控制台输出的格式字符串。
console_level (str, optional): 控制台日志级别. Defaults to "INFO".
# file_format (Optional[str], optional): 文件输出格式 (暂未支持). Defaults to None.
# file_level (str, optional): 文件日志级别 (暂未支持). Defaults to "DEBUG".
Returns:
Callable: 返回装饰器本身。
"""
def decorator(func: Callable) -> Callable:
# 获取被装饰函数所在的模块名
module = inspect.getmodule(func)
if module is None:
# 如果无法获取模块(例如,在交互式解释器中定义函数),则使用默认名称
module_name = "unknown_module"
logger.warning(f"无法确定函数 {func.__name__} 的模块,将使用 '{module_name}'")
else:
module_name = module.__name__
# 在函数首次被调用(或模块加载时)确保自定义处理器已添加
# 注意:这会在模块加载时执行,而不是每次函数调用时
# print(f"Setting up custom style '{style_name}' for module '{module_name}' in decorator definition")
add_custom_style_handler(
module_name=module_name,
style_name=style_name,
console_format=console_format,
console_level=console_level,
# file_format=file_format,
# file_level=file_level,
)
@functools.wraps(func)
def wrapper(*args: Any, **kwargs: Any) -> Any:
# 创建绑定了模块名和自定义样式标记的 logger 实例
custom_logger = logger.bind(module=module_name, custom_style=style_name)
# print(f"Executing {func.__name__} with custom logger for style '{style_name}'")
# 将自定义 logger 作为第一个参数传递给原函数
# 注意:这要求被装饰的函数第一个参数用于接收 logger
try:
return func(custom_logger, *args, **kwargs)
except TypeError as e:
# 捕获可能的类型错误,比如原函数不接受 logger 参数
logger.error(
f"调用 {func.__name__} 时出错:请确保该函数接受一个 logger 实例作为其第一个参数。错误:{e}"
)
# 可以选择重新抛出异常或返回特定值
raise e
return wrapper
return decorator
# --- 示例用法 (可以在其他模块中这样使用) ---
# # 假设这是你的模块 my_module.py
# from src.common.log_decorators import use_log_style
# from src.common.logger import get_module_logger, LoguruLogger
# # 获取模块的标准 logger
# standard_logger = get_module_logger(__name__)
# # 定义一个自定义样式
# MY_SPECIAL_STYLE = "special"
# MY_SPECIAL_FORMAT = "<bg yellow><black> SPECIAL [{time:HH:mm:ss}] </black></bg yellow> | <level>{message}</level>"
# @use_log_style(style_name=MY_SPECIAL_STYLE, console_format=MY_SPECIAL_FORMAT)
# def my_function_with_special_logs(custom_logger: LoguruLogger, x: int, y: int):
# standard_logger.info("这是一条使用标准格式的日志")
# custom_logger.info(f"开始执行特殊操作,参数: x={x}, y={y}")
# result = x + y
# custom_logger.success(f"特殊操作完成,结果: {result}")
# standard_logger.info("标准格式日志:函数即将结束")
# return result
# @use_log_style(style_name="another_style", console_format="<cyan>任务:</cyan> {message}")
# def another_task(task_logger: LoguruLogger, task_name: str):
# standard_logger.debug("准备执行另一个任务")
# task_logger.info(f"正在处理任务 '{task_name}'")
# # ... 执行任务 ...
# task_logger.warning("任务处理中遇到一个警告")
# standard_logger.info("另一个任务的标准日志")
# if __name__ == "__main__":
# print("\n--- 调用 my_function_with_special_logs ---")
# my_function_with_special_logs(10, 5)
# print("\n--- 调用 another_task ---")
# another_task("数据清理")
# print("\n--- 单独使用标准 logger ---")
# standard_logger.info("这是一条完全独立的标准日志")

File diff suppressed because it is too large Load Diff

View File

@@ -1,118 +0,0 @@
from src.common.logger import get_module_logger, LogConfig
from src.common.logger import (
BACKGROUND_TASKS_STYLE_CONFIG,
MAIN_STYLE_CONFIG,
MEMORY_STYLE_CONFIG,
PFC_STYLE_CONFIG,
MOOD_STYLE_CONFIG,
TOOL_USE_STYLE_CONFIG,
RELATION_STYLE_CONFIG,
CONFIG_STYLE_CONFIG,
HEARTFLOW_STYLE_CONFIG,
CHAT_STYLE_CONFIG,
EMOJI_STYLE_CONFIG,
SUB_HEARTFLOW_STYLE_CONFIG,
SUB_HEARTFLOW_MIND_STYLE_CONFIG,
SUBHEARTFLOW_MANAGER_STYLE_CONFIG,
BASE_TOOL_STYLE_CONFIG,
CHAT_STREAM_STYLE_CONFIG,
PERSON_INFO_STYLE_CONFIG,
WILLING_STYLE_CONFIG,
PFC_ACTION_PLANNER_STYLE_CONFIG,
STATISTIC_STYLE_CONFIG,
NORMAL_CHAT_STYLE_CONFIG,
FOCUS_CHAT_STYLE_CONFIG,
LPMM_STYLE_CONFIG,
HFC_STYLE_CONFIG,
OBSERVATION_STYLE_CONFIG,
PLANNER_STYLE_CONFIG,
PROCESSOR_STYLE_CONFIG,
ACTION_TAKEN_STYLE_CONFIG,
TIANYI_STYLE_CONFIG,
REMOTE_STYLE_CONFIG,
TOPIC_STYLE_CONFIG,
SENDER_STYLE_CONFIG,
CONFIRM_STYLE_CONFIG,
MODEL_UTILS_STYLE_CONFIG,
PROMPT_STYLE_CONFIG,
CHANGE_MOOD_TOOL_STYLE_CONFIG,
CHANGE_RELATIONSHIP_TOOL_STYLE_CONFIG,
GET_KNOWLEDGE_TOOL_STYLE_CONFIG,
GET_TIME_DATE_TOOL_STYLE_CONFIG,
LPMM_GET_KNOWLEDGE_TOOL_STYLE_CONFIG,
MESSAGE_BUFFER_STYLE_CONFIG,
CHAT_MESSAGE_STYLE_CONFIG,
CHAT_IMAGE_STYLE_CONFIG,
INIT_STYLE_CONFIG,
INTEREST_CHAT_STYLE_CONFIG,
API_SERVER_STYLE_CONFIG,
NORMAL_CHAT_RESPONSE_STYLE_CONFIG,
EXPRESS_STYLE_CONFIG,
ACTION_MANAGER_STYLE_CONFIG,
)
# 可根据实际需要补充更多模块配置
MODULE_LOGGER_CONFIGS = {
"background_tasks": BACKGROUND_TASKS_STYLE_CONFIG, # 后台任务
"main": MAIN_STYLE_CONFIG, # 主程序
"memory": MEMORY_STYLE_CONFIG, # 海马体
"pfc": PFC_STYLE_CONFIG, # PFC
"mood": MOOD_STYLE_CONFIG, # 心情
"tool_use": TOOL_USE_STYLE_CONFIG, # 工具使用
"relation": RELATION_STYLE_CONFIG, # 关系
"config": CONFIG_STYLE_CONFIG, # 配置
"heartflow": HEARTFLOW_STYLE_CONFIG, # 麦麦大脑袋
"normal_chat_response": NORMAL_CHAT_RESPONSE_STYLE_CONFIG, # 麦麦组织语言
"chat": CHAT_STYLE_CONFIG, # 见闻
"emoji": EMOJI_STYLE_CONFIG, # 表情包
"sub_heartflow": SUB_HEARTFLOW_STYLE_CONFIG, # 麦麦水群
"sub_heartflow_mind": SUB_HEARTFLOW_MIND_STYLE_CONFIG, # 麦麦小脑袋
"subheartflow_manager": SUBHEARTFLOW_MANAGER_STYLE_CONFIG, # 麦麦水群[管理]
"base_tool": BASE_TOOL_STYLE_CONFIG, # 工具使用
"chat_stream": CHAT_STREAM_STYLE_CONFIG, # 聊天流
"person_info": PERSON_INFO_STYLE_CONFIG, # 人物信息
"willing": WILLING_STYLE_CONFIG, # 意愿
"pfc_action_planner": PFC_ACTION_PLANNER_STYLE_CONFIG, # PFC私聊规划
"statistic": STATISTIC_STYLE_CONFIG, # 麦麦统计
"lpmm": LPMM_STYLE_CONFIG, # LPMM
"hfc": HFC_STYLE_CONFIG, # HFC
"observation": OBSERVATION_STYLE_CONFIG, # 聊天观察
"planner": PLANNER_STYLE_CONFIG, # 规划器
"processor": PROCESSOR_STYLE_CONFIG, # 处理器
"action_taken": ACTION_TAKEN_STYLE_CONFIG, # 动作
"tianyi": TIANYI_STYLE_CONFIG, # 天依
"remote": REMOTE_STYLE_CONFIG, # 远程
"topic": TOPIC_STYLE_CONFIG, # 话题
"sender": SENDER_STYLE_CONFIG, # 消息发送
"confirm": CONFIRM_STYLE_CONFIG, # EULA与PRIVACY确认
"model_utils": MODEL_UTILS_STYLE_CONFIG, # 模型工具
"prompt": PROMPT_STYLE_CONFIG, # 提示词
"change_mood_tool": CHANGE_MOOD_TOOL_STYLE_CONFIG, # 改变心情工具
"change_relationship": CHANGE_RELATIONSHIP_TOOL_STYLE_CONFIG, # 改变关系工具
"get_knowledge_tool": GET_KNOWLEDGE_TOOL_STYLE_CONFIG, # 获取知识工具
"get_time_date": GET_TIME_DATE_TOOL_STYLE_CONFIG, # 获取时间日期工具
"lpm_get_knowledge_tool": LPMM_GET_KNOWLEDGE_TOOL_STYLE_CONFIG, # LPMM获取知识工具
"message_buffer": MESSAGE_BUFFER_STYLE_CONFIG, # 消息缓冲
"chat_message": CHAT_MESSAGE_STYLE_CONFIG, # 聊天消息
"chat_image": CHAT_IMAGE_STYLE_CONFIG, # 聊天图片
"init": INIT_STYLE_CONFIG, # 初始化
"interest_chat": INTEREST_CHAT_STYLE_CONFIG, # 兴趣
"api": API_SERVER_STYLE_CONFIG, # API服务器
"normal_chat": NORMAL_CHAT_STYLE_CONFIG, # 一般水群
"focus_chat": FOCUS_CHAT_STYLE_CONFIG, # 专注水群
"expressor": EXPRESS_STYLE_CONFIG, # 麦麦表达
"action_manager": ACTION_MANAGER_STYLE_CONFIG, # 动作选择
# ...如有更多模块,继续添加...
}
def get_logger(module_name: str):
style_config = MODULE_LOGGER_CONFIGS.get(module_name)
if style_config:
log_config = LogConfig(
console_format=style_config["console_format"],
file_format=style_config["file_format"],
)
return get_module_logger(module_name, config=log_config)
# 若无特殊样式,使用默认
return get_module_logger(module_name)

View File

@@ -2,9 +2,9 @@
__version__ = "0.1.0"
from .api import global_api
from .api import get_global_api
__all__ = [
"global_api",
"get_global_api",
]

View File

@@ -1,30 +1,35 @@
from src.common.server import global_server
from src.common.server import get_global_server
import os
import importlib.metadata
from maim_message import MessageServer
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.config.config import global_config
global_api = None
# 检查maim_message版本
try:
def get_global_api() -> MessageServer:
"""获取全局MessageServer实例"""
global global_api
if global_api is None:
# 检查maim_message版本
try:
maim_message_version = importlib.metadata.version("maim_message")
version_compatible = [int(x) for x in maim_message_version.split(".")] >= [0, 3, 3]
except (importlib.metadata.PackageNotFoundError, ValueError):
except (importlib.metadata.PackageNotFoundError, ValueError):
version_compatible = False
# 读取配置项
maim_message_config = global_config.maim_message
# 读取配置项
maim_message_config = global_config.maim_message
# 设置基本参数
kwargs = {
# 设置基本参数
kwargs = {
"host": os.environ["HOST"],
"port": int(os.environ["PORT"]),
"app": global_server.get_app(),
}
"app": get_global_server().get_app(),
}
# 只有在版本 >= 0.3.0 时才使用高级特性
if version_compatible:
# 只有在版本 >= 0.3.0 时才使用高级特性
if version_compatible:
# 添加自定义logger
maim_message_logger = get_logger("maim_message")
kwargs["custom_logger"] = maim_message_logger
@@ -47,9 +52,8 @@ if version_compatible:
kwargs["ssl_keyfile"] = maim_message_config.key_file
kwargs["enable_custom_uvicorn_logger"] = False
global_api = MessageServer(**kwargs)
if version_compatible and maim_message_config.auth_token:
global_api = MessageServer(**kwargs)
if version_compatible and maim_message_config.auth_token:
for token in maim_message_config.auth_token:
global_api.add_valid_token(token)
return global_api

View File

@@ -1,10 +1,10 @@
from src.common.database.database_model import Messages # 更改导入
from src.common.logger import get_module_logger
from src.common.logger import get_logger
import traceback
from typing import List, Any, Optional
from peewee import Model # 添加 Peewee Model 导入
logger = get_module_logger(__name__)
logger = get_logger(__name__)
def _model_to_dict(model_instance: Model) -> dict[str, Any]:

View File

@@ -3,8 +3,7 @@ import asyncio
import requests
import platform
# from loguru import logger
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.config.config import global_config
from src.manager.async_task_manager import AsyncTask
from src.manager.local_store_manager import local_storage

View File

@@ -90,4 +90,11 @@ class Server:
return self.app
global_server = Server(host=os.environ["HOST"], port=int(os.environ["PORT"]))
global_server = None
def get_global_server() -> Server:
"""获取全局服务器实例"""
global global_server
if global_server is None:
global_server = Server(host=os.environ["HOST"], port=int(os.environ["PORT"]))
return global_server

View File

@@ -8,7 +8,7 @@ from datetime import datetime
from tomlkit import TOMLDocument
from tomlkit.items import Table
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from rich.traceback import install
from src.config.config_base import ConfigBase

View File

@@ -1,6 +1,6 @@
import time
from typing import Tuple, Optional # 增加了 Optional
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
from src.experimental.PFC.chat_observer import ChatObserver

View File

@@ -2,7 +2,7 @@ import time
import asyncio
import traceback
from typing import Optional, Dict, Any, List
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from maim_message import UserInfo
from src.config.config import global_config
from src.experimental.PFC.chat_states import (
@@ -15,7 +15,7 @@ from rich.traceback import install
install(extra_lines=3)
logger = get_module_logger("chat_observer")
logger = get_logger("chat_observer")
class ChatObserver:

View File

@@ -11,7 +11,7 @@ from src.chat.message_receive.message import Message
from .pfc_types import ConversationState
from .pfc import ChatObserver, GoalAnalyzer
from .message_sender import DirectMessageSender
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from .action_planner import ActionPlanner
from .observation_info import ObservationInfo
from .conversation_info import ConversationInfo # 确保导入 ConversationInfo

View File

@@ -1,6 +1,6 @@
import time
from typing import Optional
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from src.chat.message_receive.chat_stream import ChatStream
from src.chat.message_receive.message import Message
from maim_message import UserInfo, Seg
@@ -13,7 +13,7 @@ from rich.traceback import install
install(extra_lines=3)
logger = get_module_logger("message_sender")
logger = get_logger("message_sender")
class DirectMessageSender:

View File

@@ -1,13 +1,13 @@
from typing import List, Optional, Dict, Any, Set
from maim_message import UserInfo
import time
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from src.experimental.PFC.chat_observer import ChatObserver
from src.experimental.PFC.chat_states import NotificationHandler, NotificationType, Notification
from src.chat.utils.chat_message_builder import build_readable_messages
import traceback # 导入 traceback 用于调试
logger = get_module_logger("observation_info")
logger = get_logger("observation_info")
class ObservationInfoHandler(NotificationHandler):

View File

@@ -1,5 +1,5 @@
from typing import List, Tuple, TYPE_CHECKING
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
from src.experimental.PFC.chat_observer import ChatObserver
@@ -15,7 +15,7 @@ install(extra_lines=3)
if TYPE_CHECKING:
pass
logger = get_module_logger("pfc")
logger = get_logger("pfc")
def _calculate_similarity(goal1: str, goal2: str) -> float:
@@ -289,13 +289,13 @@ class GoalAnalyzer:
# """直接发送消息到平台的发送器"""
# def __init__(self, private_name: str):
# self.logger = get_module_logger("direct_sender")
# self.logger = get_logger("direct_sender")
# self.storage = MessageStorage()
# self.private_name = private_name
# async def send_via_ws(self, message: MessageSending) -> None:
# try:
# await global_api.send_message(message)
# await get_global_api().send_message(message)
# except Exception as e:
# raise ValueError(f"未找到平台:{message.message_info.platform} 的url配置请检查配置文件") from e
@@ -341,6 +341,6 @@ class GoalAnalyzer:
# try:
# await self.send_via_ws(message)
# await self.storage.store_message(message, chat_stream)
# logger.success(f"[私聊][{self.private_name}]PFC消息已发送: {content}")
# logger.info(f"[私聊][{self.private_name}]PFC消息已发送: {content}")
# except Exception as e:
# logger.error(f"[私聊][{self.private_name}]PFC消息发送失败: {str(e)}")

View File

@@ -1,5 +1,5 @@
from typing import List, Tuple
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from src.chat.memory_system.Hippocampus import hippocampus_manager
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
@@ -7,7 +7,7 @@ from src.chat.message_receive.message import Message
from src.chat.knowledge.knowledge_lib import qa_manager
from src.chat.utils.chat_message_builder import build_readable_messages
logger = get_module_logger("knowledge_fetcher")
logger = get_logger("knowledge_fetcher")
class KnowledgeFetcher:

View File

@@ -1,10 +1,10 @@
import time
from typing import Dict, Optional
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from .conversation import Conversation
import traceback
logger = get_module_logger("pfc_manager")
logger = get_logger("pfc_manager")
class PFCManager:

View File

@@ -1,9 +1,9 @@
import json
import re
from typing import Dict, Any, Optional, Tuple, List, Union
from src.common.logger import get_module_logger
from src.common.logger import get_logger
logger = get_module_logger("pfc_utils")
logger = get_logger("pfc_utils")
def get_items_from_json(

View File

@@ -1,12 +1,12 @@
import json
from typing import Tuple, List, Dict, Any
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
from src.experimental.PFC.chat_observer import ChatObserver
from maim_message import UserInfo
logger = get_module_logger("reply_checker")
logger = get_logger("reply_checker")
class ReplyChecker:

View File

@@ -1,5 +1,5 @@
from typing import Tuple, List, Dict, Any
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
from src.experimental.PFC.chat_observer import ChatObserver
@@ -9,7 +9,7 @@ from .observation_info import ObservationInfo
from .conversation_info import ConversationInfo
from src.chat.utils.chat_message_builder import build_readable_messages
logger = get_module_logger("reply_generator")
logger = get_logger("reply_generator")
# --- 定义 Prompt 模板 ---

View File

@@ -1,4 +1,4 @@
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from .chat_observer import ChatObserver
from .conversation_info import ConversationInfo
@@ -7,7 +7,7 @@ from src.config.config import global_config
import time
import asyncio
logger = get_module_logger("waiter")
logger = get_logger("waiter")
# --- 在这里设定你想要的超时时间(秒) ---
# 例如: 120 秒 = 2 分钟

View File

@@ -1,4 +1,4 @@
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.chat.message_receive.message import MessageRecv
from src.chat.message_receive.storage import MessageStorage
from src.config.config import global_config

View File

@@ -1,6 +1,6 @@
import random
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.llm_models.utils_model import LLMRequest
from src.config.config import global_config
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager

View File

@@ -5,13 +5,13 @@ from typing import Tuple, Union
import aiohttp
import requests
from src.common.logger import get_module_logger
from src.common.logger import get_logger
from src.common.tcp_connector import get_tcp_connector
from rich.traceback import install
install(extra_lines=3)
logger = get_module_logger("offline_llm")
logger = get_logger("offline_llm")
class LLMRequestOff:

View File

@@ -1,11 +1,12 @@
import asyncio
import json
import re
import sys
from datetime import datetime
from typing import Tuple, Union, Dict, Any
import aiohttp
from aiohttp.client import ClientResponse
from src.common.logger import get_module_logger
from src.common.logger import get_logger
import base64
from PIL import Image
import io
@@ -18,7 +19,7 @@ from rich.traceback import install
install(extra_lines=3)
logger = get_module_logger("model_utils")
logger = get_logger("model_utils")
class PayLoadTooLargeError(Exception):
@@ -115,6 +116,8 @@ class LLMRequest:
logger.error(f"原始 model dict 信息:{model}")
logger.error(f"配置错误:找不到对应的配置项 - {str(e)}")
raise ValueError(f"配置错误:找不到对应的配置项 - {str(e)}") from e
except KeyError as e:
logger.warn(f"找不到{model['provider']}_KEY或{model['provider']}_BASE_URL环境变量请检查配置文件或环境变量设置。")
self.model_name: str = model["name"]
self.params = kwargs
@@ -885,7 +888,7 @@ def compress_base64_image_by_scale(base64_data: str, target_size: int = 0.8 * 10
# 获取压缩后的数据并转换为base64
compressed_data = output_buffer.getvalue()
logger.success(f"压缩图片: {original_width}x{original_height} -> {new_width}x{new_height}")
logger.info(f"压缩图片: {original_width}x{original_height} -> {new_width}x{new_height}")
logger.info(f"压缩前大小: {len(image_data) / 1024:.1f}KB, 压缩后大小: {len(compressed_data) / 1024:.1f}KB")
return base64.b64encode(compressed_data).decode("utf-8")

View File

@@ -1,34 +1,34 @@
import asyncio
import time
from maim_message import MessageServer
from .common.remote import TelemetryHeartBeatTask
from .manager.async_task_manager import async_task_manager
from .chat.utils.statistic import OnlineTimeRecordTask, StatisticOutputTask
from .manager.mood_manager import MoodPrintTask, MoodUpdateTask
from .chat.emoji_system.emoji_manager import emoji_manager
from .chat.normal_chat.willing.willing_manager import willing_manager
from .chat.message_receive.chat_stream import chat_manager
from src.common.remote import TelemetryHeartBeatTask
from src.manager.async_task_manager import async_task_manager
from src.chat.utils.statistic import OnlineTimeRecordTask, StatisticOutputTask
from src.manager.mood_manager import MoodPrintTask, MoodUpdateTask
from src.chat.emoji_system.emoji_manager import emoji_manager
from src.chat.normal_chat.willing.willing_manager import willing_manager
from src.chat.message_receive.chat_stream import chat_manager
from src.chat.heart_flow.heartflow import heartflow
from .chat.message_receive.message_sender import message_manager
from .chat.message_receive.storage import MessageStorage
from .config.config import global_config
from .chat.message_receive.bot import chat_bot
from .common.logger_manager import get_logger
from .individuality.individuality import individuality, Individuality
from .common.server import global_server, Server
from src.chat.message_receive.message_sender import message_manager
from src.chat.message_receive.storage import MessageStorage
from src.config.config import global_config
from src.chat.message_receive.bot import chat_bot
from src.common.logger import get_logger
from src.individuality.individuality import individuality, Individuality
from src.common.server import get_global_server, Server
from rich.traceback import install
from .chat.focus_chat.expressors.exprssion_learner import expression_learner
from .api.main import start_api_server
from src.chat.focus_chat.expressors.exprssion_learner import expression_learner
from src.api.main import start_api_server
# 导入新的插件管理器
from src.plugin_system.core.plugin_manager import plugin_manager
# 导入消息API和traceback模块
from src.common.message import global_api
from src.common.message import get_global_api
# 条件导入记忆系统
if global_config.memory.enable_memory:
from .chat.memory_system.Hippocampus import hippocampus_manager
from src.chat.memory_system.Hippocampus import hippocampus_manager
# 插件系统现在使用统一的插件加载器
@@ -48,8 +48,8 @@ class MainSystem:
self.individuality: Individuality = individuality
# 使用消息API替代直接的FastAPI实例
self.app: MessageServer = global_api
self.server: Server = global_server
self.app: MessageServer = get_global_api()
self.server: Server = get_global_server()
async def initialize(self):
"""初始化系统组件"""
@@ -75,15 +75,15 @@ class MainSystem:
# 启动API服务器
start_api_server()
logger.success("API服务器启动成功")
logger.info("API服务器启动成功")
# 加载所有actions包括默认的和插件的
plugin_count, component_count = plugin_manager.load_all_plugins()
logger.success(f"插件系统加载成功: {plugin_count} 个插件,{component_count} 个组件")
logger.info(f"插件系统加载成功: {plugin_count} 个插件,{component_count} 个组件")
# 初始化表情管理器
emoji_manager.initialize()
logger.success("表情包管理器初始化成功")
logger.info("表情包管理器初始化成功")
# 添加情绪衰减任务
await async_task_manager.add_task(MoodUpdateTask())
@@ -101,7 +101,7 @@ class MainSystem:
if global_config.memory.enable_memory:
if self.hippocampus_manager:
self.hippocampus_manager.initialize()
logger.success("记忆系统初始化成功")
logger.info("记忆系统初始化成功")
else:
logger.info("记忆系统已禁用,跳过初始化")
@@ -117,19 +117,19 @@ class MainSystem:
personality_sides=global_config.personality.personality_sides,
identity_detail=global_config.identity.identity_detail,
)
logger.success("个体特征初始化成功")
logger.info("个体特征初始化成功")
try:
# 启动全局消息管理器 (负责消息发送/排队)
await message_manager.start()
logger.success("全局消息管理器启动成功")
logger.info("全局消息管理器启动成功")
# 启动心流系统主循环
asyncio.create_task(heartflow.heartflow_start_working())
logger.success("心流系统启动成功")
logger.info("心流系统启动成功")
init_time = int(1000 * (time.time() - init_start_time))
logger.success(f"初始化完成,神经元放电{init_time}")
logger.info(f"初始化完成,神经元放电{init_time}")
except Exception as e:
logger.error(f"启动大脑和外部世界失败: {e}")
raise

View File

@@ -4,7 +4,7 @@ import asyncio
from asyncio import Task, Event, Lock
from typing import Callable, Dict
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
logger = get_logger("async_task_manager")

View File

@@ -1,7 +1,7 @@
import json
import os
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
LOCAL_STORE_FILE_PATH = "data/local_store.json"
@@ -50,20 +50,20 @@ class LocalStoreManager:
try:
with open(self.file_path, "r", encoding="utf-8") as f:
self.store = json.load(f)
logger.success("全都记起来了!")
logger.info("全都记起来了!")
except json.JSONDecodeError:
logger.warning("啊咧?记事本被弄脏了,正在重建记事本......")
self.store = {}
with open(self.file_path, "w", encoding="utf-8") as f:
json.dump({}, f, ensure_ascii=False, indent=4)
logger.success("记事本重建成功!")
logger.info("记事本重建成功!")
else:
# 不存在本地存储文件,创建新的目录和文件
logger.warning("啊咧?记事本不存在,正在创建新的记事本......")
os.makedirs(os.path.dirname(self.file_path), exist_ok=True)
with open(self.file_path, "w", encoding="utf-8") as f:
json.dump({}, f, ensure_ascii=False, indent=4)
logger.success("记事本创建成功!")
logger.info("记事本创建成功!")
def save_local_store(self):
"""保存本地存储数据"""

View File

@@ -5,7 +5,7 @@ from dataclasses import dataclass
from typing import Dict, Tuple
from ..config.config import global_config
from ..common.logger_manager import get_logger
from ..common.logger import get_logger
from ..manager.async_task_manager import AsyncTask
from ..individuality.individuality import individuality

View File

@@ -1,5 +1,5 @@
from src.manager.async_task_manager import AsyncTask
from src.common.logger_manager import get_logger
from src.common.logger import get_logger
from src.person_info.person_info import PersonInfoManager
from src.person_info.relationship_manager import relationship_manager
from src.chat.utils.chat_message_builder import get_raw_msg_by_timestamp

Some files were not shown because too many files have changed in this diff Show More