优化日志
This commit is contained in:
@@ -175,7 +175,7 @@ class AffinityInterestCalculator(BaseInterestCalculator):
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Affinity兴趣值计算失败: {e}", exc_info=True)
|
||||
logger.error(f"Affinity兴趣值计算失败: {e}")
|
||||
return InterestCalculationResult(
|
||||
success=False, message_id=getattr(message, "message_id", ""), interest_value=0.0, error_message=str(e)
|
||||
)
|
||||
|
||||
@@ -92,7 +92,7 @@ class ProactiveThinkingReplyHandler(BaseEventHandler):
|
||||
logger.warning(f"❌ 重置聊天流 {stream_id} 主动思考任务失败")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ 处理reply事件时出错: {e}", exc_info=True)
|
||||
logger.error(f"❌ 处理reply事件时出错: {e}")
|
||||
|
||||
# 总是继续处理其他handler
|
||||
return HandlerResult(success=True, continue_process=True, message=None)
|
||||
@@ -165,7 +165,7 @@ class ProactiveThinkingMessageHandler(BaseEventHandler):
|
||||
logger.info(f"为新聊天流 {stream_id} 创建了主动思考任务")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"处理消息事件时出错: {e}", exc_info=True)
|
||||
logger.error(f"处理消息事件时出错: {e}")
|
||||
|
||||
# 总是继续处理其他handler
|
||||
return HandlerResult(success=True, continue_process=True, message=None)
|
||||
|
||||
@@ -255,7 +255,7 @@ class ProactiveThinkingPlanner:
|
||||
return context
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"搜集上下文信息失败: {e}", exc_info=True)
|
||||
logger.error(f"搜集上下文信息失败: {e}")
|
||||
return None
|
||||
|
||||
@cached(ttl=300, key_prefix="stream_impression") # 缓存5分钟
|
||||
@@ -352,7 +352,7 @@ class ProactiveThinkingPlanner:
|
||||
|
||||
return decision
|
||||
except Exception as e:
|
||||
logger.error(f"决策过程失败: {e}", exc_info=True)
|
||||
logger.error(f"决策过程失败: {e}")
|
||||
return None
|
||||
|
||||
async def generate_reply(
|
||||
@@ -424,7 +424,7 @@ class ProactiveThinkingPlanner:
|
||||
return filtered_response
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"生成回复失败: {e}", exc_info=True)
|
||||
logger.error(f"生成回复失败: {e}")
|
||||
return None
|
||||
|
||||
async def _get_expression_habits(self, stream_id: str, chat_history: str) -> str:
|
||||
@@ -707,4 +707,4 @@ async def execute_proactive_thinking(stream_id: str):
|
||||
logger.info(f"[主动思考] 聊天流 {stream_id} 的主动思考执行完成")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"[主动思考] 执行主动思考失败: {e}", exc_info=True)
|
||||
logger.error(f"[主动思考] 执行主动思考失败: {e}")
|
||||
|
||||
@@ -216,7 +216,7 @@ class ProactiveThinkingScheduler:
|
||||
return 0.5
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"[调度器] ❌ 获取聊天流 {stream_id} 的 focus_energy 失败: {e}", exc_info=True)
|
||||
logger.error(f"[调度器] ❌ 获取聊天流 {stream_id} 的 focus_energy 失败: {e}")
|
||||
return 0.5
|
||||
|
||||
async def schedule_proactive_thinking(self, stream_id: str) -> bool:
|
||||
@@ -280,7 +280,7 @@ class ProactiveThinkingScheduler:
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ 创建主动思考任务失败 {stream_id}: {e}", exc_info=True)
|
||||
logger.error(f"❌ 创建主动思考任务失败 {stream_id}: {e}")
|
||||
return False
|
||||
|
||||
async def pause_proactive_thinking(self, stream_id: str, reason: str = "抛出话题") -> bool:
|
||||
@@ -340,7 +340,7 @@ class ProactiveThinkingScheduler:
|
||||
return success
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ 恢复主动思考失败 {stream_id}: {e}", exc_info=True)
|
||||
logger.error(f"❌ 恢复主动思考失败 {stream_id}: {e}")
|
||||
return False
|
||||
|
||||
async def cancel_proactive_thinking(self, stream_id: str) -> bool:
|
||||
@@ -366,7 +366,7 @@ class ProactiveThinkingScheduler:
|
||||
return success
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ 取消主动思考失败 {stream_id}: {e}", exc_info=True)
|
||||
logger.error(f"❌ 取消主动思考失败 {stream_id}: {e}")
|
||||
return False
|
||||
|
||||
async def is_paused(self, stream_id: str) -> bool:
|
||||
|
||||
@@ -131,7 +131,7 @@ class ChatStreamImpressionTool(BaseTool):
|
||||
return {"type": "chat_stream_impression_update", "id": stream_id, "content": result_text}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"聊天流印象更新失败: {e}", exc_info=True)
|
||||
logger.error(f"聊天流印象更新失败: {e}")
|
||||
return {
|
||||
"type": "error",
|
||||
"id": function_args.get("stream_id", "unknown"),
|
||||
@@ -222,7 +222,7 @@ class ChatStreamImpressionTool(BaseTool):
|
||||
raise ValueError(error_msg)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"更新聊天流印象到数据库失败: {e}", exc_info=True)
|
||||
logger.error(f"更新聊天流印象到数据库失败: {e}")
|
||||
raise
|
||||
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ class UserProfileTool(BaseTool):
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"用户画像更新失败: {e}", exc_info=True)
|
||||
logger.error(f"用户画像更新失败: {e}")
|
||||
return {
|
||||
"type": "error",
|
||||
"id": function_args.get("target_user_id", "unknown"),
|
||||
@@ -199,7 +199,7 @@ class UserProfileTool(BaseTool):
|
||||
logger.info(f"用户画像已更新到数据库: {user_id}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"更新用户画像到数据库失败: {e}", exc_info=True)
|
||||
logger.error(f"更新用户画像到数据库失败: {e}")
|
||||
raise
|
||||
|
||||
|
||||
|
||||
@@ -256,7 +256,7 @@ class AntiInjectionChecker(SecurityChecker):
|
||||
reason="LLM API不可用",
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(f"LLM检测失败: {e}", exc_info=True)
|
||||
logger.error(f"LLM检测失败: {e}")
|
||||
return SecurityCheckResult(
|
||||
is_safe=True,
|
||||
level=SecurityLevel.SAFE,
|
||||
|
||||
@@ -328,5 +328,5 @@ class EmojiAction(BaseAction):
|
||||
return True, f"发送表情包: {emoji_description}"
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"{self.log_prefix} 表情动作执行失败: {e}", exc_info=True)
|
||||
logger.error(f"{self.log_prefix} 表情动作执行失败: {e}")
|
||||
return False, f"表情发送失败: {e!s}"
|
||||
|
||||
@@ -78,6 +78,6 @@ class ReadFeedAction(BaseAction):
|
||||
return False, error_message
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"执行阅读说说动作时发生未知异常: {e}", exc_info=True)
|
||||
logger.error(f"执行阅读说说动作时发生未知异常: {e}")
|
||||
await self.send_text("糟糕,在看说说的过程中网络好像出问题了...")
|
||||
return False, "动作执行异常"
|
||||
|
||||
@@ -82,6 +82,6 @@ class SendFeedAction(BaseAction):
|
||||
return False, result.get("message", "未知错误")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"执行发送说说动作时发生未知异常: {e}", exc_info=True)
|
||||
logger.error(f"执行发送说说动作时发生未知异常: {e}")
|
||||
await self.send_text("糟糕,发送的时候网络好像波动了一下...")
|
||||
return False, "动作执行异常"
|
||||
|
||||
@@ -59,6 +59,6 @@ class SendFeedCommand(PlusCommand):
|
||||
return False, result.get("message", "未知错误"), True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"执行发送说说命令时发生未知异常: {e},它的类型是:{type(e)}", exc_info=True)
|
||||
logger.error(f"执行发送说说命令时发生未知异常: {e},它的类型是:{type(e)}")
|
||||
await self.send_text("呜... 发送过程中好像出了点问题。")
|
||||
return False, "命令执行异常", True
|
||||
|
||||
@@ -86,7 +86,7 @@ class QZoneService:
|
||||
return {"success": True, "message": story}
|
||||
return {"success": False, "message": "发布说说至QQ空间失败"}
|
||||
except Exception as e:
|
||||
logger.error(f"发布说说时发生异常: {e}", exc_info=True)
|
||||
logger.error(f"发布说说时发生异常: {e}")
|
||||
return {"success": False, "message": f"发布说说异常: {e}"}
|
||||
|
||||
async def send_feed_from_activity(self, activity: str) -> dict[str, Any]:
|
||||
@@ -112,7 +112,7 @@ class QZoneService:
|
||||
return {"success": True, "message": story}
|
||||
return {"success": False, "message": "发布说说至QQ空间失败"}
|
||||
except Exception as e:
|
||||
logger.error(f"根据活动发布说说时发生异常: {e}", exc_info=True)
|
||||
logger.error(f"根据活动发布说说时发生异常: {e}")
|
||||
return {"success": False, "message": f"发布说说异常: {e}"}
|
||||
|
||||
async def read_and_process_feeds(self, target_name: str, stream_id: str | None) -> dict[str, Any]:
|
||||
@@ -213,7 +213,7 @@ class QZoneService:
|
||||
return {"success": False, "message": error_msg}
|
||||
except Exception as e:
|
||||
# 其他未知异常
|
||||
logger.error(f"读取和处理说说时发生异常: {e}", exc_info=True)
|
||||
logger.error(f"读取和处理说说时发生异常: {e}")
|
||||
return {"success": False, "message": f"处理说说时出现异常: {e}"}
|
||||
return {"success": False, "message": "读取和处理说说时发生未知错误,循环意外结束。"}
|
||||
|
||||
@@ -241,7 +241,7 @@ class QZoneService:
|
||||
await self._reply_to_own_feed_comments(feed, api_client)
|
||||
await asyncio.sleep(random.uniform(3, 5))
|
||||
except Exception as e:
|
||||
logger.error(f"处理自己说说评论时发生异常: {e}", exc_info=True)
|
||||
logger.error(f"处理自己说说评论时发生异常: {e}")
|
||||
|
||||
# --- 第二步: 处理好友的动态 ---
|
||||
friend_feeds = await api_client["monitor_list_feeds"](20)
|
||||
@@ -297,7 +297,7 @@ class QZoneService:
|
||||
|
||||
except Exception as e:
|
||||
# 其他未知异常
|
||||
logger.error(f"监控好友动态时发生异常: {e}", exc_info=True)
|
||||
logger.error(f"监控好友动态时发生异常: {e}")
|
||||
return
|
||||
|
||||
# --- Internal Helper Methods ---
|
||||
@@ -363,7 +363,7 @@ class QZoneService:
|
||||
else:
|
||||
logger.warning(f"生成回复内容失败,跳过回复'{nickname}'的评论")
|
||||
except Exception as e:
|
||||
logger.error(f"回复'{nickname}'的评论时发生异常: {e}", exc_info=True)
|
||||
logger.error(f"回复'{nickname}'的评论时发生异常: {e}")
|
||||
finally:
|
||||
# 无论成功与否,都解除锁定
|
||||
logger.debug(f"解锁评论: {comment_key}")
|
||||
@@ -430,7 +430,7 @@ class QZoneService:
|
||||
else:
|
||||
logger.error(f"评论'{target_name}'的说说失败")
|
||||
except Exception as e:
|
||||
logger.error(f"评论'{target_name}'的说说时发生异常: {e}", exc_info=True)
|
||||
logger.error(f"评论'{target_name}'的说说时发生异常: {e}")
|
||||
finally:
|
||||
logger.debug(f"解锁说说: {comment_key}")
|
||||
if comment_key in self.processing_comments:
|
||||
@@ -710,7 +710,7 @@ class QZoneService:
|
||||
|
||||
return bool(tid), tid
|
||||
except Exception as e:
|
||||
logger.error(f"发布说说异常: {e}", exc_info=True)
|
||||
logger.error(f"发布说说异常: {e}")
|
||||
return False, ""
|
||||
|
||||
def _image_to_base64(image_bytes: bytes) -> str:
|
||||
@@ -830,7 +830,7 @@ class QZoneService:
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"上传图片 {index + 1} 异常: {e}", exc_info=True)
|
||||
logger.error(f"上传图片 {index + 1} 异常: {e}")
|
||||
return None
|
||||
|
||||
async def _list_feeds(t_qq: str, num: int) -> list[dict]:
|
||||
@@ -952,7 +952,7 @@ class QZoneService:
|
||||
raise
|
||||
except Exception as e:
|
||||
# 其他异常(如网络错误、JSON解析错误等),记录后返回空列表
|
||||
logger.error(f"获取说说列表失败: {e}", exc_info=True)
|
||||
logger.error(f"获取说说列表失败: {e}")
|
||||
return []
|
||||
|
||||
async def _comment(t_qq: str, feed_id: str, text: str) -> bool:
|
||||
@@ -986,7 +986,7 @@ class QZoneService:
|
||||
logger.warning(f"评论API响应无法解析为JSON,假定成功: {response_text[:200]}")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(f"评论说说异常: {e}", exc_info=True)
|
||||
logger.error(f"评论说说异常: {e}")
|
||||
return False
|
||||
|
||||
async def _like(t_qq: str, feed_id: str) -> bool:
|
||||
@@ -1022,7 +1022,7 @@ class QZoneService:
|
||||
logger.warning(f"点赞API响应无法解析为JSON,假定成功: {response_text[:200]}")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(f"点赞说说异常: {e}", exc_info=True)
|
||||
logger.error(f"点赞说说异常: {e}")
|
||||
return False
|
||||
|
||||
async def _reply(fid, host_qq, target_name, content, comment_tid):
|
||||
@@ -1067,7 +1067,7 @@ class QZoneService:
|
||||
logger.warning(f"回复API响应无法解析为JSON,假定成功: {response_text[:200]}")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(f"回复评论异常: {e}", exc_info=True)
|
||||
logger.error(f"回复评论异常: {e}")
|
||||
return False
|
||||
|
||||
async def _monitor_list_feeds(num: int) -> list[dict]:
|
||||
@@ -1232,7 +1232,7 @@ class QZoneService:
|
||||
if "错误码: -3000" in str(e):
|
||||
logger.warning("监控任务遇到Cookie失效错误,重新抛出异常以触发上层重试")
|
||||
raise # 重新抛出异常,让上层处理
|
||||
logger.error(f"监控好友动态失败: {e}", exc_info=True)
|
||||
logger.error(f"监控好友动态失败: {e}")
|
||||
return []
|
||||
|
||||
logger.info("[DEBUG] API客户端构造完成,返回包含6个方法的字典")
|
||||
|
||||
@@ -116,7 +116,7 @@ class ReplyTrackerService:
|
||||
|
||||
except Exception as e:
|
||||
# 捕获迁移过程中可能出现的任何异常
|
||||
logger.error(f"迁移旧数据文件时发生错误: {e}", exc_info=True)
|
||||
logger.error(f"迁移旧数据文件时发生错误: {e}")
|
||||
|
||||
def _validate_data(self, data: Any) -> bool:
|
||||
"""
|
||||
@@ -175,7 +175,7 @@ class ReplyTrackerService:
|
||||
self.storage.set("data", self.replied_comments)
|
||||
logger.debug("回复记录已暂存,将由存储API在后台保存")
|
||||
except Exception as e:
|
||||
logger.error(f"持久化回复记录失败: {e}", exc_info=True)
|
||||
logger.error(f"持久化回复记录失败: {e}")
|
||||
|
||||
def _cleanup_old_records(self):
|
||||
"""
|
||||
|
||||
@@ -41,7 +41,7 @@ class NapcatAdapter(BaseAdapter):
|
||||
adapter_description = "基于 MoFox-Bus 的 Napcat/OneBot 11 适配器"
|
||||
platform = "qq"
|
||||
|
||||
run_in_subprocess = False
|
||||
run_in_subprocess = True
|
||||
|
||||
def __init__(self, core_sink: CoreSink, plugin: Optional[BasePlugin] = None, **kwargs):
|
||||
"""初始化 Napcat 适配器"""
|
||||
|
||||
@@ -25,7 +25,7 @@ from ..utils import *
|
||||
if TYPE_CHECKING:
|
||||
from ....plugin import NapcatAdapter
|
||||
|
||||
logger = get_logger("napcat_adapter.message_handler")
|
||||
logger = get_logger("napcat_adapter")
|
||||
|
||||
|
||||
class MessageHandler:
|
||||
@@ -234,27 +234,29 @@ class MessageHandler:
|
||||
return {"type": "text", "data": "[无法获取被引用的消息]"}
|
||||
|
||||
# 递归处理被引用的消息
|
||||
reply_segments = []
|
||||
reply_segments: List[SegPayload] = []
|
||||
for reply_seg in message_detail.get("message", []):
|
||||
if isinstance(reply_seg, dict):
|
||||
reply_result = await self.handle_single_segment(reply_seg, raw_message, in_reply=True)
|
||||
if reply_result:
|
||||
reply_segments.append(reply_result)
|
||||
|
||||
if not reply_segments:
|
||||
reply_text = "[无法获取被引用的消息]"
|
||||
else:
|
||||
# 简化处理,只取第一个segment的data
|
||||
reply_text = reply_segments[0].get("data", "") if reply_segments else ""
|
||||
|
||||
sender_info = message_detail.get("sender", {})
|
||||
sender_nickname = sender_info.get("nickname", "未知用户")
|
||||
sender_nickname = sender_info.get("nickname") or "未知用户"
|
||||
sender_id = sender_info.get("user_id")
|
||||
|
||||
if sender_id:
|
||||
return {"type": "text", "data": f"[回复<{sender_nickname}({sender_id})>:{reply_text}],说:"}
|
||||
else:
|
||||
return {"type": "text", "data": f"[回复<{sender_nickname}>:{reply_text}],说:"}
|
||||
prefix_text = f"[回复<{sender_nickname}({sender_id})>:" if sender_id else f"[回复<{sender_nickname}>:"
|
||||
suffix_text = "],说:"
|
||||
|
||||
# 将被引用的消息段落转换为可读的文本占位,避免嵌套的 base64 污染
|
||||
brief_segments = [
|
||||
{"type": seg.get("type", "text"), "data": seg.get("data", "")} for seg in reply_segments
|
||||
] or [{"type": "text", "data": "[无法获取被引用的消息]"}]
|
||||
|
||||
return {
|
||||
"type": "seglist",
|
||||
"data": [{"type": "text", "data": prefix_text}, *brief_segments, {"type": "text", "data": suffix_text}],
|
||||
}
|
||||
|
||||
async def _handle_record_message(self, segment: dict) -> SegPayload | None:
|
||||
"""处理语音消息"""
|
||||
|
||||
@@ -12,7 +12,7 @@ from ...event_models import MetaEventType
|
||||
if TYPE_CHECKING:
|
||||
from ....plugin import NapcatAdapter
|
||||
|
||||
logger = get_logger("napcat_adapter.meta_event_handler")
|
||||
logger = get_logger("napcat_adapter")
|
||||
|
||||
|
||||
class MetaEventHandler:
|
||||
|
||||
@@ -9,7 +9,7 @@ from src.common.logger import get_logger
|
||||
if TYPE_CHECKING:
|
||||
from ...plugin import NapcatAdapter
|
||||
|
||||
logger = get_logger("napcat_adapter.notice_handler")
|
||||
logger = get_logger("napcat_adapter")
|
||||
|
||||
|
||||
class NoticeHandler:
|
||||
|
||||
@@ -13,7 +13,7 @@ from src.plugin_system.apis import config_api
|
||||
from ...event_models import CommandType
|
||||
from ..utils import convert_image_to_gif, get_image_format
|
||||
|
||||
logger = get_logger("napcat_adapter.send_handler")
|
||||
logger = get_logger("napcat_adapter")
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from ....plugin import NapcatAdapter
|
||||
@@ -59,7 +59,6 @@ class SendHandler:
|
||||
logger.info("收到adapter_response消息,此消息应该由Bot端处理,跳过")
|
||||
return None
|
||||
|
||||
logger.info("处理普通消息")
|
||||
return await self.send_normal_message(envelope)
|
||||
|
||||
async def send_normal_message(self, envelope: MessageEnvelope) -> None:
|
||||
@@ -104,7 +103,6 @@ class SendHandler:
|
||||
else:
|
||||
logger.error("无法识别的消息类型")
|
||||
return
|
||||
logger.info("尝试发送到napcat")
|
||||
logger.debug(
|
||||
f"准备发送到napcat的消息体: action='{action}', {id_name}='{target_id}', message='{processed_message}'"
|
||||
)
|
||||
@@ -124,7 +122,7 @@ class SendHandler:
|
||||
"""
|
||||
处理命令类
|
||||
"""
|
||||
logger.info("处理命令中")
|
||||
logger.debug("处理命令中")
|
||||
message_info: Dict[str, Any] = envelope.get("message_info", {})
|
||||
group_info: Optional[Dict[str, Any]] = message_info.get("group_info")
|
||||
segment: SegPayload = envelope.get("message_segment", {}) # type: ignore[assignment]
|
||||
@@ -164,9 +162,9 @@ class SendHandler:
|
||||
logger.error("命令或参数缺失")
|
||||
return None
|
||||
|
||||
logger.info(f"准备向 Napcat 发送命令: command='{command}', args_dict='{args_dict}'")
|
||||
logger.debug(f"准备向 Napcat 发送命令: command='{command}', args_dict='{args_dict}'")
|
||||
response = await self.send_message_to_napcat(command, args_dict)
|
||||
logger.info(f"收到 Napcat 的命令响应: {response}")
|
||||
logger.debug(f"收到 Napcat 的命令响应: {response}")
|
||||
|
||||
if response.get("status") == "ok":
|
||||
logger.info(f"命令 {command_name} 执行成功")
|
||||
@@ -191,7 +189,7 @@ class SendHandler:
|
||||
logger.error("适配器命令缺少action参数")
|
||||
return
|
||||
|
||||
logger.info(f"执行适配器命令: {action}")
|
||||
logger.debug(f"执行适配器命令: {action}")
|
||||
|
||||
if action == "get_cookies":
|
||||
response = await self.send_message_to_napcat(action, params, timeout=40.0)
|
||||
@@ -241,7 +239,6 @@ class SendHandler:
|
||||
target_id = str(target_id)
|
||||
if target_id == "notice":
|
||||
return payload
|
||||
logger.info(target_id if isinstance(target_id, str) else "")
|
||||
new_payload = self.build_payload(payload, await self.handle_reply_message(target_id, user_info), True)
|
||||
elif seg_type == "text":
|
||||
text = seg.get("data")
|
||||
@@ -324,22 +321,22 @@ class SendHandler:
|
||||
|
||||
if not replied_user_id:
|
||||
logger.warning(f"无法获取消息 {message_id} 的发送者信息,跳过 @")
|
||||
logger.info(f"最终返回的回复段: {reply_seg}")
|
||||
logger.debug(f"最终返回的回复段: {reply_seg}")
|
||||
return reply_seg
|
||||
|
||||
if random.random() < config_api.get_plugin_config(self.plugin_config, "features.reply_at_rate", 0.5):
|
||||
at_seg = {"type": "at", "data": {"qq": str(replied_user_id)}}
|
||||
text_seg = {"type": "text", "data": {"text": " "}}
|
||||
result_seg = [reply_seg, at_seg, text_seg]
|
||||
logger.info(f"最终返回的回复段: {result_seg}")
|
||||
logger.debug(f"最终返回的回复段: {result_seg}")
|
||||
return result_seg
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"处理引用回复并尝试@时出错: {e}")
|
||||
logger.info(f"最终返回的回复段: {reply_seg}")
|
||||
logger.debug(f"最终返回的回复段: {reply_seg}")
|
||||
return reply_seg
|
||||
|
||||
logger.info(f"最终返回的回复段: {reply_seg}")
|
||||
logger.debug(f"最终返回的回复段: {reply_seg}")
|
||||
return reply_seg
|
||||
|
||||
def handle_text_message(self, message: str) -> dict:
|
||||
|
||||
@@ -90,7 +90,7 @@ async def _set_cached(section: str, key: str, data: Any) -> None:
|
||||
try:
|
||||
_save_cache_to_disk_locked()
|
||||
except Exception:
|
||||
logger.debug("Write napcat cache failed", exc_info=True)
|
||||
logger.debug("Write napcat cache failed")
|
||||
|
||||
|
||||
def _get_adapter(adapter: "NapcatAdapter | None" = None) -> "NapcatAdapter":
|
||||
|
||||
@@ -103,7 +103,7 @@ class ReminderTask(AsyncTask):
|
||||
logger.info(f"提醒任务 {self.task_name} 成功完成。")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"执行提醒任务 {self.task_name} 时出错: {e}", exc_info=True)
|
||||
logger.error(f"执行提醒任务 {self.task_name} 时出错: {e}")
|
||||
|
||||
|
||||
# =============================== Actions ===============================
|
||||
@@ -347,7 +347,7 @@ class SetEmojiLikeAction(BaseAction):
|
||||
return False, "设置表情回应失败"
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"设置表情回应时发生异常: {e}", exc_info=True)
|
||||
logger.error(f"设置表情回应时发生异常: {e}")
|
||||
await self.store_action_info(action_prompt_display=f"贴表情失败: {e}", action_done=False)
|
||||
return False, f"设置表情回应失败: {e}"
|
||||
|
||||
@@ -438,7 +438,7 @@ class RemindAction(BaseAction):
|
||||
target_time = parse_datetime(converted_time_str, fuzzy=False)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"[ReminderPlugin] 无法解析或转换时间字符串 '{remind_time_str}': {e}", exc_info=True)
|
||||
logger.error(f"[ReminderPlugin] 无法解析或转换时间字符串 '{remind_time_str}': {e}")
|
||||
await self.send_text(f"抱歉,我无法理解您说的时间 '{remind_time_str}',提醒设置失败。")
|
||||
return False, f"无法解析时间 '{remind_time_str}'"
|
||||
|
||||
@@ -541,7 +541,7 @@ class RemindAction(BaseAction):
|
||||
|
||||
return True, "提醒设置成功"
|
||||
except Exception as e:
|
||||
logger.error(f"[ReminderPlugin] 创建提醒任务时出错: {e}", exc_info=True)
|
||||
logger.error(f"[ReminderPlugin] 创建提醒任务时出错: {e}")
|
||||
await self.send_text("抱歉,设置提醒时发生了一点内部错误。")
|
||||
return False, "设置提醒时发生内部错误"
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ def _get_available_styles() -> list[str]:
|
||||
|
||||
return style_names if style_names else ["default"]
|
||||
except Exception as e:
|
||||
logger.error(f"动态加载TTS风格列表时出错: {e}", exc_info=True)
|
||||
logger.error(f"动态加载TTS风格列表时出错: {e}")
|
||||
return ["default"] # 出现任何错误都回退
|
||||
|
||||
|
||||
@@ -196,7 +196,7 @@ class TTSVoiceAction(BaseAction):
|
||||
return False, "语音合成失败"
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"{self.log_prefix} 语音合成过程中发生未知错误: {e!s}", exc_info=True)
|
||||
logger.error(f"{self.log_prefix} 语音合成过程中发生未知错误: {e!s}")
|
||||
await self.store_action_info(
|
||||
action_prompt_display=f"语音合成失败: {e!s}",
|
||||
action_done=False
|
||||
|
||||
@@ -71,6 +71,6 @@ class TTSVoiceCommand(PlusCommand):
|
||||
return False, "语音合成失败", True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"执行 /tts 命令时出错: {e}", exc_info=True)
|
||||
logger.error(f"执行 /tts 命令时出错: {e}")
|
||||
await self.send_text("❌ 语音合成时发生了意想不到的错误,请查看日志。")
|
||||
return False, "命令执行异常", True
|
||||
|
||||
@@ -82,7 +82,7 @@ class TTSVoicePlugin(BasePlugin):
|
||||
return value if value is not None else default
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to manually load '{key}' from config: {e}", exc_info=True)
|
||||
logger.error(f"Failed to manually load '{key}' from config: {e}")
|
||||
return default
|
||||
|
||||
return self.get_config(key, default)
|
||||
|
||||
@@ -41,7 +41,7 @@ class TTSService:
|
||||
else:
|
||||
logger.warning("TTS风格配置为空,请检查配置文件")
|
||||
except Exception as e:
|
||||
logger.error(f"TTS服务配置加载失败: {e}", exc_info=True)
|
||||
logger.error(f"TTS服务配置加载失败: {e}")
|
||||
|
||||
def _load_tts_styles(self) -> dict[str, dict[str, Any]]:
|
||||
"""加载 TTS 风格配置"""
|
||||
@@ -176,7 +176,7 @@ class TTSService:
|
||||
else:
|
||||
logger.info(f"成功切换 {weight_type} 模型为: {weights_path}")
|
||||
except Exception as e:
|
||||
logger.error(f"请求切换 {weight_type} 模型时发生网络异常: {e}", exc_info=True)
|
||||
logger.error(f"请求切换 {weight_type} 模型时发生网络异常: {e}")
|
||||
|
||||
await switch_model_weights(kwargs.get("gpt_weights"), "gpt")
|
||||
await switch_model_weights(kwargs.get("sovits_weights"), "sovits")
|
||||
@@ -218,7 +218,7 @@ class TTSService:
|
||||
logger.error("TTS服务请求超时")
|
||||
return None
|
||||
except Exception as e:
|
||||
logger.error(f"TTS API调用异常: {e}", exc_info=True)
|
||||
logger.error(f"TTS API调用异常: {e}")
|
||||
return None
|
||||
|
||||
async def _apply_spatial_audio_effect(self, audio_data: bytes) -> bytes | None:
|
||||
@@ -278,7 +278,7 @@ class TTSService:
|
||||
return processed_audio_data
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"应用空间效果时出错: {e}", exc_info=True)
|
||||
logger.error(f"应用空间效果时出错: {e}")
|
||||
return audio_data # 如果出错,返回原始音频
|
||||
|
||||
async def generate_voice(self, text: str, style_hint: str = "default", language_hint: str | None = None) -> str | None:
|
||||
|
||||
@@ -68,7 +68,7 @@ class MetasoClient:
|
||||
logger.error(f"HTTP error occurred while searching with Metaso Chat: {e.response.text}")
|
||||
return []
|
||||
except Exception as e:
|
||||
logger.error(f"An error occurred while searching with Metaso Chat: {e}", exc_info=True)
|
||||
logger.error(f"An error occurred while searching with Metaso Chat: {e}")
|
||||
return []
|
||||
|
||||
|
||||
@@ -103,5 +103,5 @@ class MetasoSearchEngine(BaseSearchEngine):
|
||||
|
||||
return await metaso_client.search(query)
|
||||
except Exception as e:
|
||||
logger.error(f"Metaso search failed: {e}", exc_info=True)
|
||||
logger.error(f"Metaso search failed: {e}")
|
||||
return []
|
||||
|
||||
@@ -76,7 +76,7 @@ class WEBSEARCHPLUGIN(BasePlugin):
|
||||
logger.info(f"❌ 不可用搜索引擎: {', '.join(unavailable_engines)}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ 搜索引擎初始化失败: {e}", exc_info=True)
|
||||
logger.error(f"❌ 搜索引擎初始化失败: {e}")
|
||||
config_file_name: str = "config.toml" # 配置文件名
|
||||
|
||||
# 配置节描述
|
||||
|
||||
@@ -126,7 +126,7 @@ class URLParserTool(BaseTool):
|
||||
logger.warning(f"本地解析URL '{url}' 失败 (HTTP {e.response.status_code})")
|
||||
return {"error": f"请求失败,状态码: {e.response.status_code}"}
|
||||
except Exception as e:
|
||||
logger.error(f"本地解析或总结URL '{url}' 时发生未知异常: {e}", exc_info=True)
|
||||
logger.error(f"本地解析或总结URL '{url}' 时发生未知异常: {e}")
|
||||
return {"error": f"发生未知错误: {e!s}"}
|
||||
|
||||
async def execute(self, function_args: dict[str, Any]) -> dict[str, Any]:
|
||||
@@ -183,7 +183,7 @@ class URLParserTool(BaseTool):
|
||||
func = functools.partial(exa_client.get_contents, urls, **exa_params)
|
||||
contents_response = await loop.run_in_executor(None, func)
|
||||
except Exception as e:
|
||||
logger.error(f"执行 Exa URL解析时发生严重异常: {e}", exc_info=True)
|
||||
logger.error(f"执行 Exa URL解析时发生严重异常: {e}")
|
||||
contents_response = None # 确保异常后为None
|
||||
|
||||
# 步骤 2: 处理Exa的响应
|
||||
|
||||
@@ -143,7 +143,7 @@ class WebSurfingTool(BaseTool):
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"执行并行网络搜索时发生异常: {e}", exc_info=True)
|
||||
logger.error(f"执行并行网络搜索时发生异常: {e}")
|
||||
return {"error": f"执行网络搜索时发生严重错误: {e!s}"}
|
||||
|
||||
async def _execute_fallback_search(
|
||||
|
||||
Reference in New Issue
Block a user