Releases: MagicalYuYu/astrbot_plugin_smart_wakeup
Release list
v1.4.3 - 修复 LLM 标志卡死和 UnboundLocalError (P0)
v1.4.3 Bug 修复(P0)
P0: 修复 _llm_running_groups 标志卡死导致群聊无法触发新唤醒
- 根因:当 LLM 请求被
CancelledError中断管道时,on_decorating_result和after_message_sent均不被调用,导致 LLM 执行中标志永久残留,该群长时间无法触发任何新的唤醒 - 修复:新增 asyncio 主动超时定时器机制(三层防护防误清)
- 新增
_start_llm_flag_timer/_cancel_llm_flag_timer/_auto_clear_llm_flag三个方法 _trigger_wake设置标志时同步启动 60 秒主动超时定时器(与 httpx timeout=60 对齐)- 正常路径(
on_decorating_result/after_message_sent)主动取消定时器 - 被动路径(概率唤醒 / 冷场救场)120 秒超时检查时同步取消定时器
terminate完整清理所有定时器,防止插件卸载时悬挂任务- 三层防护:sleep 可中断 + 二次存在性检查 +
elapsed >= timeout严格判断
- 新增
P0: 修复 UnboundLocalError: 'Plain' 导致 LLM 结果替换失败
- 根因:
on_decorating_result中使用小模型回复替换主模型输出时,函数内部有局部from astrbot.core.agent.message import Plain导入,使 Python 将Plain视为整个函数的局部变量,在导入语句之前访问即触发UnboundLocalError - 修复:移除局部 import,统一使用文件顶部 L17 全局导入的
Plain
v1.4.2
v1.4.2 Bug 修复
P0: 修复思考标签泄漏(含 ToolCall 场景)
- 新增
_filter_tool_args_text方法,在on_using_llm_tool中对send_message_to_user的 tool_args 文本统一过滤思考标签、上下文标签和重复回复 - 修复 ToolCall 场景下 LLM 在 tool_args 中混入
<arg_key>标签导致标签泄漏到用户消息的问题
P1: 修复重复输出根因
- 根因:对话记忆中 BOT 的回复被原样注入 LLM,LLM 看到自己说过的原文措辞后倾向于延续相同表达,导致重复输出
- 新增
_summarize_bot_reply_for_memory方法,对 BOT 回复做要点化处理,只保留话题要点而非原文措辞 - 从根源上切断 LLM 复制自身表达的倾向,而非简单抑制发言频率
P1: 修复上下文发言人识别错误
- 优化压缩 prompt,增加约束:禁止使用代词指代他人行为,必须用具体昵称明确行为主体
- 增加约束:转述他人对 BOT 的行为时,必须标注 BOT 为承受方
- 修复因代词指代歧义导致发言者识别错误的问题
P1: 增加调试标记引导
- 在
<conversation_guidance>中增加对【调试定位】等方括号标记的引导 - LLM 识别到调试标记后会意识到此前对话可能存在发言者识别错误
P2: LLM 执行超时标志清除优化
- 将超时时间从 300 秒(5分钟)缩短为 120 秒(2分钟)
- 正常 LLM 调用应在 60 秒内完成
v1.4.1 - 修复首词截断/Think泄露/重复回复
- 修复消息首词截断:
_filter_duplicate_response使用" response"作为 GLM 多段草稿分隔符时,会误匹配英文常见词汇(如"few responses"),导致输出以截断的"s, ..."开头。改用正则负向前瞻r" response(?!\w)",仅当" response"后不紧跟单词字符时才判定为草稿分隔符 - 修复 Think 内容泄露:GLM-4 使用
直接跟在文字后面作为多段草稿分隔符,但原有正则要求前后有换行,无法匹配此新模式,导致标记残留在用户端输出中。新增内联模式检测,并在_filter_thinking_tags末尾增加 ``` 残留兜底清理 - 修复
_filter_thinking_tags的" response"同样误匹配:同步改用r" response(?!\w)"正则 - 修复概率唤醒语义重复回复:两次独立的概率唤醒触发两次 LLM 调用时,LLM 基于相似上下文可能生成语义重复的回复。采用三层机制从根源解决:
- 源头预防(主):在
on_llm_request中注入<anti_repeat_guidance>提示,告知 LLM 最近一次回复内容,引导其主动避免重复 - 重新生成(兜底):输出阶段检测到语义相似度≥0.55时,注入防重复提示重新调用 LLM 生成不同内容,而非直接堵住输出
- 最终抑制(保底):重新生成仍重复或 LLM 主动输出
[SKIP]时才抑制回复 - 仅对非直接呼叫场景生效,直接呼叫不受影响
- 源头预防(主):在
v1.4.0 - 轻量回应(安全话语库)
新功能
轻量回应(安全话语库)
当回复被回复抑制机制拦截时,不再强制完全沉默,而是以一定概率输出一句简短附和语(如"确实""有道理")替代沉默,表达在场感。这是「群聊 BOT 真人化体验改进」第一批实施,直接解决"沉默频率过高降低存在感"的核心痛点。
双轨实现:
- LLM 自行生成路径(主):在概率唤醒和冷场救场提示中增加
<light_response_guidance>引导,LLM 可在判断无合适话题时自行生成低信息量、高通用性的自然附和 - 预置话语库路径(辅):当 LLM 输出被回复抑制拦截时,以一定概率从预置话语库中随机抽取一条替代完全沉默
三重频率控制:触发概率(默认 0.3)+ 冷却时间(默认 300 秒)+ 每小时上限(默认 3 次),防止安全话语刷屏产生模板化重复观感
协调机制:
- 对话记忆:撤销被抑制的 LLM 原始输出,由
after_message_sent自动记录安全话语 - 精力系统:安全话语是真实发言,不触发精力恢复
- 直接呼叫豁免:名称触发/关键词触发被抑制时不输出安全话语
新增配置:
- 配置块
light_response(5 个参数):启用开关、触发概率、冷却时间、每小时上限、自定义话语库 - 单群覆盖支持:
light_response_prob、light_response_cooldown、light_response_max_per_hour
v1.3.7
- LLM 工具调用重复输出根治:修复当 LLM 返回 finish_reason='tool_calls' 且同时包含 content 和 send_message_to_user 工具调用时,框架先通过 on_decorating_result 发送 content(经分段器),再通过 tool_loop 的 send_message_to_user 发送相同内容,导致用户看到重复消息的顽固问题。此前声称根治但实际未解决,本次采用全新三层拦截机制:
- 防线1:在 on_using_llm_tool 中检测 send_message_to_user,提取其消息文本与已发送内容缓存比对,若重复则清空 tool_args 替换为零宽空格
- 防线2:临时替换 tool.handler 为空操作函数(返回 None),阻止工具实际执行发送;替换后通过 asyncio.create_task 延迟 0.5s 恢复原始 handler,避免影响后续正常工具调用
- 防线3:现有 dedup 机制继续拦截第二轮 on_decorating_result 调用中的重复内容
v1.3.6
v1.3.6 Bug 修复
"昵称:内容"引用模式导致 LLM 发言人识别错乱
修复当用户消息以"昵称:"开头(如 某群友:服务器不插网线...)时,LLM 误判被引用者为实际发言者,导致回复对象错误的问题。
异常表现:用户 A 发送 某群友:xxx,BOT 回复时却直接对被引用的群友说话,而非对实际发送者用户 A 回应。
根因:上下文格式 [用户A]: 某群友:xxx 中存在双重冒号结构。LLM 将 某群友: 误解析为第二层发送者标注,认为被引用者是实际发言者,而非用户 A 消息中被引用/转述的内容。
修复内容:
- 在
_format_context和_format_conversation_memory中增加歧义消除 - 检测到消息内容以"昵称:"模式开头时,用引号包裹内容(
「某群友:xxx」) - 修复后格式:
[用户A]: 「某群友:xxx」,LLM 可清晰区分发送者标注与被引用内容
完整更新日志: https://github.com/MagicalYuYu/astrbot_plugin_smart_wakeup/blob/main/CHANGELOG.md
v1.3.5
v1.3.5 Bug 修复
GLM 孤立 </think> 标签导致内容重复输出
修复 GLM-4 模型在 content 字段中输出"实际回复</think>实际回复"模式时,_filter_thinking_tags 无法识别孤立 </think> 标签(无对应开标签 <think>),导致 </think> 标签和重复内容直接泄露给用户的问题。
异常表现:用户看到的消息包含 </think> 标签文本和两份相同的回复内容。
根因:GLM-4 模型在 content 字段中先输出回复内容,再输出一个孤立的 </think> 闭合标签(无开标签 <think>),然后重复输出相同内容。现有 _filter_thinking_tags 的模式1仅处理完整的 <think>...</think> 标签对,模式2仅处理 response 分隔符,均无法匹配此模式。
修复内容:
- 新增模式1.5:检测到孤立
</think>标签(无对应<think>开标签)时,移除标签及其之前的所有内容,仅保留标签后的最终版本 - 若
</think>后无内容,则仅移除标签本身,保留标签前的内容
完整更新日志: https://github.com/MagicalYuYu/astrbot_plugin_smart_wakeup/blob/main/CHANGELOG.md
v1.3.4
v1.3.4 Bug 修复
对话记忆发送者归属修复
修复对话记忆中所有用户消息统一标记为「用户」导致 LLM 错误归因消息发送人的严重问题。
异常表现:某用户发送消息后,LLM 却将其归因于另一位群成员,导致回复对象完全错误。
根因:_record_user_message 不记录发送者名称,_format_conversation_memory 仅用通用「用户」标签,LLM 无法区分不同发言者。
修复内容:
_record_user_message新增sender_name参数- 对话历史元组从 3 元素扩展为
(role, text, timestamp, sender_name) _format_conversation_memory和_maybe_summarize_history改用具体发送者名称- 向后兼容旧的 3 元素元组
完整更新日志: https://github.com/MagicalYuYu/astrbot_plugin_smart_wakeup/blob/main/CHANGELOG.md
v1.3.3
v1.3.3 Bug 修复
GLM 多段草稿输出过滤
修复 GLM-4-7-251222 模型在回复中将推理过程的多段草稿混入 content 字段导致异常输出的问题。
异常表现:用户看到的消息包含用户消息回显、上下文元数据(「[发送时间:...]」)、多个版本的回复草稿和 response 分隔符。
根因:GLM 模型将推理过程的多段草稿全部写入 content 字段,用 response 分隔,而现有 _filter_thinking_tags 仅处理单个 response 分隔符。
修复内容:
_filter_thinking_tags改为两步检测:先非贪婪移除第一个response段,若残留仍含response则贪婪移除全部,仅保留最终版- 新增 LLM 元数据回显过滤:移除
[发送时间:...]、[平台:...]等模式 _filter_duplicate_response新增response多段草稿模式处理
完整更新日志: https://github.com/MagicalYuYu/astrbot_plugin_smart_wakeup/blob/main/CHANGELOG.md
v1.3.2
v1.3.2 Bug 修复
重复输出根治
修复 LLM 使用 send_message_to_user 工具调用(finish_reason='tool_calls')时消息被发送两次的严重问题。
根因:AstrBot 的 tool_loop 机制会独立发送完整消息,而 on_decorating_result 中的分段模块也会通过正常流程发送,两个独立发送通道导致重复。
修复方案:多策略 tool_call 检测,检测到时清空 result.chain(用零宽空格替代,防止 intelligent_retry 插件重试),让 tool_loop 成为唯一发送通道。
- 策略1:
on_llm_response中检测finish_reason='tool_calls'并设置 event flag - 策略2:
on_decorating_result中检查result对象的tool_calls/finish_reason属性 - 策略3:检查
event对象的 LLM 响应相关属性 - 策略4:深度遍历
event所有属性查找finish_reason/tool_calls信息 - 新增
on_using_llm_tool钩子检测send_message_to_user工具调用 _splitter_process增加 tool_call 保护,检测到时跳过分段- 首次运行时添加属性探测日志,确认框架中 tool_call 信息的实际存储位置
优化
- 去重时间窗口从 30 秒扩大到 60 秒,覆盖 tool_loop 执行延迟
完整更新日志: https://github.com/MagicalYuYu/astrbot_plugin_smart_wakeup/blob/main/CHANGELOG.md