优化日志

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

@@ -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)
)

View File

@@ -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)

View File

@@ -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}")

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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,

View File

@@ -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}"

View File

@@ -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, "动作执行异常"

View File

@@ -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, "动作执行异常"

View File

@@ -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

View File

@@ -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个方法的字典")

View File

@@ -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):
"""

View File

@@ -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 适配器"""

View File

@@ -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:
"""处理语音消息"""

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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":

View File

@@ -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, "设置提醒时发生内部错误"

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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:

View File

@@ -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 []

View File

@@ -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" # 配置文件名
# 配置节描述

View File

@@ -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的响应

View File

@@ -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(