feat: 即刻追问 + 实时状态感知(issue #42) #51
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/42-immediate-followup-realtime-presence"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
这个 PR 做了什么
实现 issue #42「即刻追问 + 实时状态感知」(ADR-0025/0026)。这一片是
Phase 4 最后一片,范围明显小于 #41——ADR 已经把几乎所有实现决策钉死,
只给主动出口(issue #38 建好的 Recall/Drive Tick)多接一根触发线,不新开
任何独立主动出口。
即刻追问
send_message新增可选参数expects_reply: bool——模型显式声明这条消息是否在等待回应,不用"问号结尾"之类的文本启发式推断(同
quote_message_id一样的显式声明模式)。arise_immediate_followup_window_seconds)无回应,写一次"Recall 时机覆盖"(
immediate_followup.py新增RecallTimingOverride),Drive Tick 扫描时额外检查这个覆盖是否到期(
is_due_via_timing_override——判定"是否已回应"复用既有ReconnectCooldownState,不新开追踪),决策仍完整走 Recall 既有门控。覆盖一次性:评估完毕即清掉。
(同 debounce 先例)。到期检查"这期间有没有新消息"(活跃度信号只在
真正经过反应式入口——即
to_me()命中——的消息上更新,群里其他人之间的閒聊不算"回应机器人",同 ADR-0014 tier-1"群里多热闹"与"关于我自己
的判断"两码事的既有区分),无新消息则走一次事件驱动评估。
RuntimeLoop.run_immediate_followup():复用与 tier-2 环境信号(issue #39)完全相同的画像/召回/关系网组装管线——把共用部分抽成
_run_event_driven_turn私有方法,run_environment_signal/run_immediate_followup都只是喂不同的指令文案,不是两份平行实现。_evaluate_unified_gate(反应式消息也用这个),不是另开一套判断——两级门控级二本来就读得到
关系多轴快照,加上渐进解锁硬门槛,足够覆盖"不该跟陌生人瞎追问"这件事。
实时状态感知(私聊专属)
覆盖接入点——继"消息期待回应"之后第二个信号源。
typing_status.py):挂进反应式run()的冻结快照,供模型自己判断要不要等一等再发;不接入已读延迟窗,也不触发任何门控评估(有专门的 e2e 测试证明"对方开始输入"这个事件
本身不会导致任何一次评估被触发)。
capabilities.py新增独立能力位read_online_status/read_typing_status(同poke_send/reaction_send一路的颗粒度先例),IngressPort新增to_online_status_change/to_typing_status_change。新增/改动文件
immediate_followup.py(时机覆盖判定 + 事件驱动指令文案)、typing_status.py(输入状态纯参考事实)tools.py:send_messageschema 新增expects_replyruntime_loop.py:_PendingSend/SendResult透传expects_reply;提取
_run_event_driven_turn共用私有方法;run()冻结快照新增输入状态事实
capabilities.py/ports.py:新能力位 + ingress 方法storage.py/sent_log.py:RecallTimingOverride/TypingStatusState两张新表/结构的内存版 + 持久化版实现
__init__.py:_debounced_flush发送后按私聊/群聊分流挂追问检查;新增
_schedule_group_followup_check/_run_group_followup_check;_drive_tick扫描接入时机覆盖判定;新增_handle_presence_eventspostprocessor
config.py:新增短窗口/输入状态新鲜度窗口配置测试
新增 6 个测试文件:纯函数(时机覆盖判定的边界/回应即失效场景)、存储
契约(内存版+持久化版共用)、
run_immediate_followup的 RuntimeLoop级测试、
expects_reply透传测试、输入状态注入测试、实时状态感知的处理逻辑测试(绕开 OneBot v11 标准协议没有对应 notice 事件这一层,同
test_environmental_awareness_e2e.py先例)+ 端到端可演示场景(私聊/群聊
expects_reply无回应触发追问、群聊短窗口内被回应则不触发)。全部 807 个测试通过,
ty check/ruff check干净。