优化日志

This commit is contained in:
Windpicker-owo
2025-11-26 21:16:16 +08:00
parent e0157256b1
commit 0908fb50a0
100 changed files with 493 additions and 574 deletions

View File

@@ -1039,9 +1039,9 @@ class EmojiManager:
break
logger.warning("[VLM分析] VLM返回的JSON数据不完整或格式错误准备重试。")
except (json.JSONDecodeError, AttributeError) as e:
logger.error(f"VLM JSON解析失败 (第 {i+1}/3 次): {e}", exc_info=True)
logger.error(f"VLM JSON解析失败 (第 {i+1}/3 次): {e}")
except Exception as e:
logger.error(f"VLM调用失败 (第 {i+1}/3 次): {e}", exc_info=True)
logger.error(f"VLM调用失败 (第 {i+1}/3 次): {e}")
description, emotions, refined_description = "", [], "" # Reset for retry
if i < 2:

View File

@@ -274,7 +274,7 @@ class EnergyManager:
self.thresholds["reply"] = max(self.thresholds["reply"], self.thresholds["non_reply"] + 0.1)
self.stats["last_threshold_update"] = time.time()
logger.info(f"加载AFC阈值: {self.thresholds}")
except Exception as e:
logger.warning(f"加载AFC阈值失败使用默认值: {e}")
@@ -468,23 +468,22 @@ class EnergyManager:
self.thresholds["reply"] = max(self.thresholds["reply"], self.thresholds["non_reply"] + 0.1)
self.stats["last_threshold_update"] = time.time()
logger.info(f"更新AFC阈值: {self.thresholds}")
def add_calculator(self, calculator: EnergyCalculator) -> None:
"""添加计算器"""
self.calculators.append(calculator)
logger.info(f"添加能量计算器: {calculator.__class__.__name__}")
logger.debug(f"添加能量计算器: {calculator.__class__.__name__}")
def remove_calculator(self, calculator: EnergyCalculator) -> None:
"""移除计算器"""
if calculator in self.calculators:
self.calculators.remove(calculator)
logger.info(f"移除能量计算器: {calculator.__class__.__name__}")
logger.debug(f"移除能量计算器: {calculator.__class__.__name__}")
def clear_cache(self) -> None:
"""清空缓存"""
self.energy_cache.clear()
logger.info("清空能量缓存")
logger.debug("清空能量缓存")
def get_cache_hit_rate(self) -> float:
"""获取缓存命中率"""

View File

@@ -542,7 +542,7 @@ class ExpressionLearner:
# 获取 StyleLearner 实例
learner = style_learner_manager.get_learner(chat_id)
logger.info(f"开始训练 StyleLearner: chat_id={chat_id}, 样本数={len(expr_list)}")
logger.debug(f"开始训练 StyleLearner: chat_id={chat_id}, 样本数={len(expr_list)}")
# 为每个学习到的表达方式训练模型
# 使用 situation 作为输入style 作为目标
@@ -566,12 +566,12 @@ class ExpressionLearner:
# 保存模型
if learner.save(style_learner_manager.model_save_path):
logger.info(f"StyleLearner 模型保存成功: {chat_id}")
logger.debug(f"StyleLearner 模型保存成功: {chat_id}")
else:
logger.error(f"StyleLearner 模型保存失败: {chat_id}")
except Exception as e:
logger.error(f"训练 StyleLearner 失败: {e}", exc_info=True)
logger.error(f"训练 StyleLearner 失败: {e}")
return learnt_expressions
return None

View File

@@ -38,7 +38,7 @@ class ExpressorModel:
self._candidates: dict[str, str] = {} # cid -> text (style)
self._situations: dict[str, str] = {} # cid -> situation (不参与计算)
logger.info(
logger.debug(
f"ExpressorModel初始化完成 (alpha={alpha}, beta={beta}, gamma={gamma}, vocab_size={vocab_size}, use_jieba={use_jieba})"
)
@@ -199,8 +199,6 @@ class ExpressorModel:
with open(path, "wb") as f:
pickle.dump(data, f)
logger.info(f"模型已保存到 {path}")
def load(self, path: str):
"""
从文件加载模型
@@ -230,7 +228,7 @@ class ExpressorModel:
for cid, tc in data["nb_token_counts"].items():
self.nb.token_counts[cid] = defaultdict(float, tc)
logger.info(f"模型已从 {path} 加载")
logger.debug(f"模型已从 {path} 加载")
def get_stats(self) -> dict:
"""获取模型统计信息"""

View File

@@ -24,7 +24,7 @@ class Tokenizer:
import rjieba # noqa: F401
# rjieba 会自动初始化,无需手动调用
logger.info("RJieba分词器初始化成功")
logger.debug("RJieba分词器初始化成功")
except ImportError:
logger.warning("RJieba未安装将使用字符级分词")
self.use_jieba = False

View File

@@ -51,8 +51,6 @@ class StyleLearner:
"last_update": time.time(),
}
logger.info(f"StyleLearner初始化成功: chat_id={chat_id}")
def add_style(self, style: str, situation: str | None = None) -> bool:
"""
动态添加一个新的风格
@@ -178,7 +176,7 @@ class StyleLearner:
logger.debug(f"被删除的风格样例(前5): {deleted_styles[:5]}")
except Exception as e:
logger.error(f"清理风格失败: {e}", exc_info=True)
logger.error(f"清理风格失败: {e}")
def learn_mapping(self, up_content: str, style: str) -> bool:
"""
@@ -271,7 +269,7 @@ class StyleLearner:
return best_style, style_scores
except Exception as e:
logger.error(f"预测style失败: {e}", exc_info=True)
logger.error(f"预测style失败: {e}")
return None, {}
def get_style_info(self, style: str) -> tuple[str | None, str | None]:
@@ -373,7 +371,6 @@ class StyleLearner:
with open(meta_path, "wb") as f:
pickle.dump(meta_data, f)
logger.info(f"StyleLearner保存成功: {save_dir}")
return True
except Exception as e:
@@ -421,7 +418,6 @@ class StyleLearner:
if "style_last_used" not in self.learning_stats:
self.learning_stats["style_last_used"] = {}
logger.info(f"StyleLearner加载成功: {save_dir}")
return True
except Exception as e:
@@ -454,7 +450,7 @@ class StyleLearnerManager:
# 确保保存目录存在
os.makedirs(model_save_path, exist_ok=True)
logger.info(f"StyleLearnerManager初始化成功, 模型保存路径: {model_save_path}")
logger.debug(f"StyleLearnerManager初始化成功, 模型保存路径: {model_save_path}")
def get_learner(self, chat_id: str, model_config: dict | None = None) -> StyleLearner:
"""
@@ -520,7 +516,7 @@ class StyleLearnerManager:
if not learner.save(self.model_save_path):
success = False
logger.info(f"保存所有StyleLearner {'成功' if success else '部分失败'}")
logger.debug(f"保存所有StyleLearner {'成功' if success else '部分失败'}")
return success
def cleanup_all_old_styles(self, ratio: float | None = None) -> dict[str, int]:
@@ -540,7 +536,7 @@ class StyleLearnerManager:
cleanup_results[chat_id] = cleaned
total_cleaned = sum(cleanup_results.values())
logger.info(f"清理所有StyleLearner完成: 总共清理了 {total_cleaned} 个风格")
logger.debug(f"清理所有StyleLearner完成: 总共清理了 {total_cleaned} 个风格")
return cleanup_results
def apply_decay_all(self, factor: float | None = None):
@@ -553,7 +549,7 @@ class StyleLearnerManager:
for learner in self.learners.values():
learner.apply_decay(factor)
logger.info("对所有StyleLearner应用知识衰减")
logger.debug("对所有StyleLearner应用知识衰减")
def get_all_stats(self) -> dict[str, dict]:
"""

View File

@@ -44,7 +44,7 @@ class BotInterestManager:
async def initialize(self, personality_description: str, personality_id: str = "default"):
"""初始化兴趣标签系统"""
try:
logger.info("机器人兴趣系统开始初始化...")
logger.debug("机器人兴趣系统开始初始化...")
# 初始化embedding模型
await self._initialize_embedding_model()
@@ -61,8 +61,8 @@ class BotInterestManager:
# 检查是否成功获取兴趣标签
if self.current_interests and len(self.current_interests.get_active_tags()) > 0:
active_tags_count = len(self.current_interests.get_active_tags())
logger.info("机器人兴趣系统初始化完成!")
logger.info(f"当前已激活 {active_tags_count} 个兴趣标签, Embedding缓存 {len(self.embedding_cache)}")
logger.debug("机器人兴趣系统初始化完成!")
logger.debug(f"当前已激活 {active_tags_count} 个兴趣标签, Embedding缓存 {len(self.embedding_cache)}")
else:
raise RuntimeError("未能成功加载或生成兴趣标签")
@@ -83,10 +83,8 @@ class BotInterestManager:
self.embedding_config = model_config.model_task_config.embedding
if self.embedding_dimension:
logger.info(f"📐 配置的embedding维度: {self.embedding_dimension}")
else:
logger.info("📐 未在配置中检测到embedding维度将根据首次返回的向量自动识别")
if not self.embedding_dimension:
logger.debug("未在配置中检测到embedding维度,将根据首次返回的向量自动识别")
# 创建LLMRequest实例用于embedding
self.embedding_request = LLMRequest(model_set=self.embedding_config, request_type="interest_embedding")
@@ -107,7 +105,7 @@ class BotInterestManager:
await self._generate_embeddings_for_tags(loaded_interests)
else:
# 生成新的兴趣标签
logger.info("数据库中未找到兴趣标签,开始生成...")
logger.debug("数据库中未找到兴趣标签,开始生成...")
generated_interests = await self._generate_interests_from_personality(
personality_description, personality_id
)
@@ -115,15 +113,15 @@ class BotInterestManager:
if generated_interests:
self.current_interests = generated_interests
active_count = len(generated_interests.get_active_tags())
logger.info(f"成功生成 {active_count} 个新兴趣标签。")
logger.debug(f"成功生成 {active_count} 个新兴趣标签。")
tags_info = [
f" - '{tag.tag_name}' (权重: {tag.weight:.2f})" for tag in generated_interests.get_active_tags()
]
tags_str = "\n".join(tags_info)
logger.info(f"当前兴趣标签:\n{tags_str}")
logger.debug(f"当前兴趣标签:\n{tags_str}")
# 保存到数据库
logger.info("正在保存至数据库...")
logger.debug("正在保存至数据库...")
await self._save_interests_to_database(generated_interests)
else:
raise RuntimeError("❌ 兴趣标签生成失败")
@@ -133,8 +131,7 @@ class BotInterestManager:
) -> BotPersonalityInterests | None:
"""根据人设生成兴趣标签"""
try:
logger.info("🎨 开始根据人设生成兴趣标签...")
logger.info(f"📝 人设长度: {len(personality_description)} 字符")
logger.debug("开始根据人设生成兴趣标签...")
# 检查embedding客户端是否可用
if not hasattr(self, "embedding_request"):
@@ -211,7 +208,7 @@ class BotInterestManager:
# 解析生成的兴趣标签
interests_list = interests_data.get("interests", [])
logger.info(f"📋 解析到 {len(interests_list)} 个兴趣标签")
logger.debug(f"📋 解析到 {len(interests_list)} 个兴趣标签")
for i, tag_data in enumerate(interests_list):
tag_name = tag_data.get("name", f"标签_{i}")
@@ -234,10 +231,10 @@ class BotInterestManager:
bot_interests.interest_tags.append(tag)
# 为所有标签生成embedding
logger.info("🧠 开始为兴趣标签生成embedding向量...")
logger.debug("开始为兴趣标签生成embedding向量...")
await self._generate_embeddings_for_tags(bot_interests)
logger.info("兴趣标签生成完成")
logger.debug("兴趣标签生成完成")
return bot_interests
except Exception as e:
@@ -248,7 +245,7 @@ class BotInterestManager:
async def _call_llm_for_interest_generation(self, prompt: str) -> str | None:
"""调用LLM生成兴趣标签"""
try:
logger.info("🔧 配置LLM客户端...")
logger.debug("配置LLM客户端...")
# 使用llm_api来处理请求
from src.config.config import model_config

View File

@@ -89,7 +89,7 @@ class InterestManager:
return False
except Exception as e:
logger.error(f"注册兴趣值计算组件失败: {e}", exc_info=True)
logger.error(f"注册兴趣值计算组件失败: {e}")
return False
async def calculate_interest(self, message: "DatabaseMessages", timeout: float = 2.0) -> InterestCalculationResult:
@@ -159,7 +159,7 @@ class InterestManager:
except Exception as e:
self._failed_calculations += 1
logger.error(f"兴趣值计算异常: {e}", exc_info=True)
logger.error(f"兴趣值计算异常: {e}")
return InterestCalculationResult(
success=False,
message_id=getattr(message, "message_id", ""),
@@ -185,7 +185,7 @@ class InterestManager:
# 任务被取消,退出循环
break
except Exception as e:
logger.error(f"计算工作线程异常: {e}", exc_info=True)
logger.error(f"计算工作线程异常: {e}")
def get_current_calculator(self) -> BaseInterestCalculator | None:
"""获取当前活跃的兴趣值计算组件"""

View File

@@ -277,7 +277,7 @@ class StreamLoopManager:
logger.info(f"🛑 [流工作器] stream={stream_id[:8]}, 任务ID={task_id}, 被取消")
break
except Exception as e:
logger.error(f"❌ [流工作器] stream={stream_id[:8]}, 任务ID={task_id}, 出错: {e}", exc_info=True)
logger.error(f"❌ [流工作器] stream={stream_id[:8]}, 任务ID={task_id}, 出错: {e}")
self.stats["total_failures"] += 1
await asyncio.sleep(5.0) # 错误时等待5秒再重试
@@ -398,7 +398,7 @@ class StreamLoopManager:
chatter_task.cancel()
raise
except Exception as e:
logger.error(f"流处理异常: {stream_id} - {e}", exc_info=True)
logger.error(f"流处理异常: {stream_id} - {e}")
return False
finally:
# 清除 Chatter 处理标志
@@ -699,7 +699,7 @@ class StreamLoopManager:
logger.warning(f"创建强制分发流循环失败: {stream_id}")
except Exception as e:
logger.error(f"强制分发流处理失败 {stream_id}: {e}", exc_info=True)
logger.error(f"强制分发流处理失败 {stream_id}: {e}")
# 全局流循环管理器实例

View File

@@ -228,7 +228,7 @@ class GlobalNoticeManager:
return result
except Exception as e:
logger.error(f"获取notice文本失败: {e}", exc_info=True)
logger.error(f"获取notice文本失败: {e}")
return ""
def clear_notices(self, stream_id: str | None = None, notice_type: str | None = None) -> int:

View File

@@ -198,7 +198,7 @@ class ChatStream:
raise RuntimeError("没有可用的兴趣值计算组件")
except Exception as e:
logger.error(f"计算消息兴趣值失败: {e}", exc_info=True)
logger.error(f"计算消息兴趣值失败: {e}")
# 异常情况下使用默认值
if hasattr(db_message, "interest_value"):
db_message.interest_value = 0.3
@@ -259,7 +259,7 @@ class ChatStream:
return energy
except Exception as e:
logger.error(f"获取focus_energy失败: {e}", exc_info=True)
logger.error(f"获取focus_energy失败: {e}")
# 返回缓存的值或默认值
if hasattr(self, "_focus_energy"):
return self._focus_energy
@@ -325,7 +325,7 @@ class ChatManager:
"""异步初始化"""
try:
await self.load_all_streams()
logger.info(f"聊天管理器已启动,已加载 {len(self.streams)} 个聊天流")
logger.debug(f"聊天管理器已启动,已加载 {len(self.streams)} 个聊天流")
except Exception as e:
logger.error(f"聊天管理器启动失败: {e!s}")
@@ -335,7 +335,7 @@ class ChatManager:
await asyncio.sleep(300) # 每5分钟保存一次
try:
await self._save_all_streams()
logger.info("聊天流自动保存完成")
logger.debug("聊天流自动保存完成")
except Exception as e:
logger.error(f"聊天流自动保存失败: {e!s}")
@@ -461,7 +461,7 @@ class ChatManager:
group_info=group_info,
)
except Exception as e:
logger.error(f"获取或创建聊天流失败: {e}", exc_info=True)
logger.error(f"获取或创建聊天流失败: {e}")
raise e
if stream_id in self.last_messages and isinstance(self.last_messages[stream_id], DatabaseMessages):
@@ -645,7 +645,7 @@ class ChatManager:
async def load_all_streams(self):
"""从数据库加载所有聊天流"""
logger.info("正在从数据库加载所有聊天流")
logger.debug("正在从数据库加载所有聊天流")
async def _db_load_all_streams_async():
loaded_streams_data = []
@@ -703,7 +703,7 @@ class ChatManager:
# await stream.set_context(self.last_messages[stream.stream_id])
except Exception as e:
logger.error(f"从数据库加载所有聊天流失败 (SQLAlchemy): {e}", exc_info=True)
logger.error(f"从数据库加载所有聊天流失败 (SQLAlchemy): {e}")
chat_manager = None

View File

@@ -130,7 +130,7 @@ class MessageStorageBatcher:
)
except Exception as e:
logger.error(f"批量存储消息失败: {e}", exc_info=True)
logger.error(f"批量存储消息失败: {e}")
async def _prepare_message_dict(self, message, chat_stream):
"""准备消息字典数据用于批量INSERT
@@ -534,7 +534,7 @@ class MessageStorage:
else:
logger.warning(f"无法为描述 '{description[:20]}...' 找到对应的picid将保留原始标记")
except Exception as e:
logger.error(f"替换图片描述时查询数据库失败: {e}", exc_info=True)
logger.error(f"替换图片描述时查询数据库失败: {e}")
new_text.append(replacement)
last_end = match.end()

View File

@@ -58,7 +58,7 @@ async def send_envelope(
message=db_message or envelope,
)
except Exception as event_error:
logger.error(f"触发 AFTER_SEND 事件时出错: {event_error}", exc_info=True)
logger.error(f"触发 AFTER_SEND 事件时出错: {event_error}")
return True

View File

@@ -636,7 +636,7 @@ class DefaultReplyer:
return ""
except Exception as e:
logger.error(f"[三层记忆] 检索失败: {e}", exc_info=True)
logger.error(f"[三层记忆] 检索失败: {e}")
return ""
def _build_memory_query_text(
@@ -819,7 +819,7 @@ class DefaultReplyer:
pass
except Exception as e:
logger.error(f"关键词检测与反应时发生异常: {e!s}", exc_info=True)
logger.error(f"关键词检测与反应时发生异常: {e!s}")
return reaction_prompt
@@ -868,7 +868,7 @@ class DefaultReplyer:
return ""
except Exception as e:
logger.error(f"构建notice块失败chat_id={chat_id}: {e}", exc_info=True)
logger.error(f"构建notice块失败chat_id={chat_id}: {e}")
return ""
async def _time_and_run_task(self, coroutine, name: str) -> tuple[str, Any, float]:

View File

@@ -119,7 +119,7 @@ class SecurityManager:
return await self._check_sequential(message, context, start_time)
except Exception as e:
logger.error(f"安全检测失败: {e}", exc_info=True)
logger.error(f"安全检测失败: {e}")
return SecurityCheckResult(
is_safe=True, # 异常情况下默认允许通过,避免阻断正常消息
level=SecurityLevel.SAFE,

View File

@@ -75,5 +75,5 @@ class BlockShuffler:
return prompt_template, shuffled_context
except Exception as e:
logger.error(f"Block重排失败: {e}", exc_info=True)
logger.error(f"Block重排失败: {e}")
return prompt_template, context_data

View File

@@ -99,7 +99,7 @@ class PromptComponentManager:
result = await instance.execute()
return str(result) if result is not None else ""
except Exception as e:
logger.error(f"执行静态规则提供者 '{cls.prompt_name}' 时出错: {e}", exc_info=True)
logger.error(f"执行静态规则提供者 '{cls.prompt_name}' 时出错: {e}")
return "" # 出错时返回空字符串,避免影响主流程
return content_provider
@@ -313,7 +313,7 @@ class PromptComponentManager:
try:
content = await provider(params, target_prompt_name)
except Exception as e:
logger.error(f"执行规则 '{rule}' (来源: {source}) 的内容提供者时失败: {e}", exc_info=True)
logger.error(f"执行规则 '{rule}' (来源: {source}) 的内容提供者时失败: {e}")
continue
try:
@@ -336,7 +336,7 @@ class PromptComponentManager:
except re.error as e:
logger.error(f"应用规则时发生正则错误: {e} (pattern: '{rule.target_content}')")
except Exception as e:
logger.error(f"应用注入规则 '{rule}' (来源: {source}) 失败: {e}", exc_info=True)
logger.error(f"应用注入规则 '{rule}' (来源: {source}) 失败: {e}")
# 4. 占位符恢复
final_template = modified_template

View File

@@ -839,7 +839,7 @@ async def get_chat_type_and_target_info(chat_id: str) -> tuple[bool, dict | None
else:
logger.warning(f"无法获取 chat_stream for {chat_id} in utils")
except Exception as e:
logger.error(f"获取聊天类型和目标信息时出错 for {chat_id}: {e}", exc_info=True)
logger.error(f"获取聊天类型和目标信息时出错 for {chat_id}: {e}")
# Keep defaults on error
return is_group_chat, chat_target_info

View File

@@ -214,7 +214,7 @@ class ImageManager:
return f"[表情包:{refined_part}]"
except Exception as e:
logger.error(f"获取表情包描述失败: {e!s}", exc_info=True)
logger.error(f"获取表情包描述失败: {e!s}")
return "[表情包(处理失败)]"
async def get_image_description(self, image_base64: str) -> str:
@@ -257,7 +257,7 @@ class ImageManager:
if description and description.strip():
break # 成功获取描述则跳出循环
except Exception as e:
logger.error(f"VLM调用失败 (第 {i+1}/3 次): {e}", exc_info=True)
logger.error(f"VLM调用失败 (第 {i+1}/3 次): {e}")
if i < 2: # 如果不是最后一次则等待1秒
logger.warning("识图失败将在1秒后重试...")
@@ -286,7 +286,7 @@ class ImageManager:
return f"[图片:{description}]"
except Exception as e:
logger.error(f"获取图片描述时发生严重错误: {e!s}", exc_info=True)
logger.error(f"获取图片描述时发生严重错误: {e!s}")
return "[图片(处理失败)]"
@staticmethod
@@ -388,7 +388,7 @@ class ImageManager:
logger.error("GIF转换失败: 内存不足可能是GIF太大或帧数太多")
return None # 内存不够啦
except Exception as e:
logger.error(f"GIF转换失败: {e!s}", exc_info=True) # 记录详细错误信息
logger.error(f"GIF转换失败: {e!s}") # 记录详细错误信息
return None # 其他错误也返回None
async def process_image(self, image_base64: str) -> tuple[str, str]:
@@ -459,7 +459,7 @@ class ImageManager:
return image_id, description
except Exception as e:
logger.error(f"处理图片时发生严重错误: {e!s}", exc_info=True)
logger.error(f"处理图片时发生严重错误: {e!s}")
return "", "[图片(处理失败)]"