Skip to content

[Feature] 「用户是否唤醒我」与「插件是否匹配到消息」应拆成两个独立状态 #10699

Open

Description

@820552750

功能描述

目前 waking_check 阶段里,只要任意插件的 handler filter 通过,就会把 is_wake 置为 True。建议拆成两个字段:

event.matched_handlers = activated_handlers   # 插件匹配
event.is_wake = <仅由 @ / 唤醒词 / 私聊决定>    # 用户意图

需要「handler 匹配即唤醒」的旧行为,可以由具体 handler 自己声明(例如 filter 上加参数)。

使用场景

我写了一个插件注册 @filter.event_message_type(EventMessageType.ALL)(监听所有消息,很常见的写法),结果群里每一句正常聊天都会被置为 is_wake = True,后果:

  1. bot 把群友之间的闲聊全推进了 LLM 回复链路。本地模型上每条烧 15 秒,还占显存。
  2. 插件里所有 event.is_wake_up() 判断全部失真。我只能自己在插件里重新判断"消息里有没有指向自己的 At 段",绕过框架提供的字段。

复现方式(10 行最小插件,与具体插件无关):

@filter.event_message_type(filter.EventMessageType.ALL)
async def on_msg(self, event: AstrMessageEvent):
    logger.info(f"wake={event.is_wake_up()} text={event.get_message_str()}")

群里两人正常聊天,日志:

wake=True text='今天中午吃什么'
wake=True text='这游戏今天更新了'

都不是 @,也不是私聊。

参考位置

astrbot/core/pipeline/waking_check/stage.py 第 215-216 行(v4.29.1):

if passed:
    ...
    is_wake = True
    event.is_wake = True

这里判断的是 handler 的 event_filters 是否通过,通过就把 is_wake 顶成 True。

检查清单

  • 我已在 Issue 列表中搜索过相关功能,确认该功能想法从未被提出过。
  • 我建议的功能与 AstrBot 本体相关,而非在建议某一插件的功能。
  • 我已阅读并同意本项目的贡献者行为准则。
  • (可选)我愿意提交 PR 以帮助实现该功能。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions