astrbot_plugin_retry_v2
重构后的基于事件钩子的、处理空回复和非完整响应的插件
这是一个为 AstrBot 设计的插件,旨在提高大型语言模型(LLM)响应的稳定性和可靠性。 当机器人从LLM收到的响应为空、不完整或包含特定错误信息时,此插件会自动进行重试,从而对用户屏蔽底层模型的瞬时故障。
主要功能
- 自动重试:在LLM响应失败时,插件会自动重新发送请求,无需人工干预。
- 双重失败检测机制:
- 响应内容检测:监控LLM的直接输出。如果响应为空、不完整(例如,因长度限制被截断)或API返回了非正常的终止原因,插件将启动重试。
- 错误关键词检测:监控经过 AstrBot 框架处理后的最终消息。如果在发送给用户的消息中检测到预设的错误关键词(如 “API 返回的内容为空”),插件同样会触发重试。
- 可配置性:用户可以自定义最大重试次数、重试之间的延迟时间、是否启用指数退避策略(即每次重试的间隔时间加倍)以及触发重试的错误关键词。
- 最终回退消息:如果所有重试尝试均告失败,插件会向用户发送一条可定制的友好提示信息,告知用户请求未能成功处理。
逻辑
插件通过监听 AstrBot 内部的事件钩子来无缝地集成到消息处理流程中:
备份请求:当一个LLM请求即将发出时 (
on_llm_request事件),插件会完整备份原始的请求数据。执行失败检测:
- 检测点A (
on_llm_response):在收到LLM的原始响应后,检查响应体中的finish_reason字段是否为 "stop" 或 "tool_calls",如果不是则将其标记为一次失败的响应。 - 检测点B (
on_decorating_result):检查最终的文本内容。如果内容中包含了用户在配置文件中定义的任何“重试关键词”,则同样视为失败。
- 检测点A (
执行重试循环:
- 一旦检测到失败,插件会启动一个重试循环。
- 它会根据配置的延迟策略(固定延迟或指数退避)等待一段时间。
- 使用步骤1中备份的原始请求数据,向LLM重新发起一次完全相同的请求。
- 收到新响应后,再次进行有效性检查。如果成功,则用新响应替换掉原来的失败响应,并中断重试循环。
- 如果依然失败,则重复此过程,直到达到最大重试次数。
最终处理:
- 重试成功:新的、成功的LLM响应将无缝地继续其在 AstrBot 中的正常处理流程,用户将收到一个看起来一次就成功的回复。
- 重试失败:如果达到最大重试次数后仍然失败,插件将放弃重试,并生成一条预设的“后备回复”(Fallback Reply)发送给用户,同时阻止后续的消息处理,以避免发送不完整或错误的信息。
清理:一旦最终消息成功发送给用户 (
after_message_sent事件),插件会清除之前备份的请求数据,以防止内存泄漏。