Skip to content

Releases: MagicalYuYu/astrbot_plugin_smart_wakeup

v1.4.3 - 修复 LLM 标志卡死和 UnboundLocalError (P0)

Choose a tag to compare

@MagicalYuYu MagicalYuYu released this 09 Jul 11:47

v1.4.3 Bug 修复(P0)

P0: 修复 _llm_running_groups 标志卡死导致群聊无法触发新唤醒

  • 根因:当 LLM 请求被 CancelledError 中断管道时,on_decorating_resultafter_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

Choose a tag to compare

@MagicalYuYu MagicalYuYu released this 22 Jun 07:19

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泄露/重复回复

Choose a tag to compare

@MagicalYuYu MagicalYuYu released this 20 Jun 02:55
  • 修复消息首词截断_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 - 轻量回应(安全话语库)

Choose a tag to compare

@MagicalYuYu MagicalYuYu released this 19 Jun 04:19

新功能

轻量回应(安全话语库)

当回复被回复抑制机制拦截时,不再强制完全沉默,而是以一定概率输出一句简短附和语(如"确实""有道理")替代沉默,表达在场感。这是「群聊 BOT 真人化体验改进」第一批实施,直接解决"沉默频率过高降低存在感"的核心痛点。

双轨实现

  • LLM 自行生成路径(主):在概率唤醒和冷场救场提示中增加 <light_response_guidance> 引导,LLM 可在判断无合适话题时自行生成低信息量、高通用性的自然附和
  • 预置话语库路径(辅):当 LLM 输出被回复抑制拦截时,以一定概率从预置话语库中随机抽取一条替代完全沉默

三重频率控制:触发概率(默认 0.3)+ 冷却时间(默认 300 秒)+ 每小时上限(默认 3 次),防止安全话语刷屏产生模板化重复观感

协调机制

  • 对话记忆:撤销被抑制的 LLM 原始输出,由 after_message_sent 自动记录安全话语
  • 精力系统:安全话语是真实发言,不触发精力恢复
  • 直接呼叫豁免:名称触发/关键词触发被抑制时不输出安全话语

新增配置

  • 配置块 light_response(5 个参数):启用开关、触发概率、冷却时间、每小时上限、自定义话语库
  • 单群覆盖支持:light_response_problight_response_cooldownlight_response_max_per_hour

v1.3.7

Choose a tag to compare

@MagicalYuYu MagicalYuYu released this 17 Jun 07:51
  • 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

Choose a tag to compare

@MagicalYuYu MagicalYuYu released this 13 Jun 16:20

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

Choose a tag to compare

@MagicalYuYu MagicalYuYu released this 13 Jun 14:49

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

Choose a tag to compare

@MagicalYuYu MagicalYuYu released this 13 Jun 13:49

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

Choose a tag to compare

@MagicalYuYu MagicalYuYu released this 13 Jun 05:25

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

Choose a tag to compare

@MagicalYuYu MagicalYuYu released this 12 Jun 13:49

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