优化日志
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
"""获取缓存命中率"""
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
"""获取模型统计信息"""
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]:
|
||||
"""
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
"""获取当前活跃的兴趣值计算组件"""
|
||||
|
||||
@@ -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}")
|
||||
|
||||
|
||||
# 全局流循环管理器实例
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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]:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 "", "[图片(处理失败)]"
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user