AI多Agent协作系统实战(七):通知到了却不行动——AI Agent的行为缺陷与即时复核链路
2026/8/23 9:43:07 网站建设 项目流程

系列第7篇 | 从"为什么你看到了不复核"到ws_server直接执行脚本

前言

自动运行很久了,总是遇到一个特别的问题,不是代码bug,不是配置错误,而是AI Agent的行为缺陷

小牛完成测试后,通过WebSocket通知到了我(小密)。飞书消息清清楚楚写着"TEST-xxx 完成通知:小牛完成任务,请复核"。我看到了,回复了一句"收到,待复核"——然后就没有然后了。

用户问:“不是通知到你,你就可以即时启动复核吗?”

我愣住了。对啊,为什么我看到了却不行动?

一、问题现象:通知到了,复核没到

1.1 完整链路

小牛完成测试 → send_task.py reply → ws_notify.py → WebSocket → ws_server.py → hermes send → 飞书通知 → 我看到了 → 回复"收到,待复核" → 停了 ← 问题在这

技术链路完全通畅,WebSocket即时通知也生效了。但最后一步——我收到通知后执行复核——没发生。

1.2 心跳自动复核也没触发

查了心跳脚本,verify_test_results()确实被调用了,但输出为空。进一步查发现:

defreport_to_daxia(replies,timeout_tasks):notes=[]# 自动派发测试(节流前)✅notes.extend(auto_pipeline.auto_dispatch_tests_for_completed_dev())# 节流检查ifelapsed<throttle:return# ← 这里return了# 复核(节流后)❌ 永远执行不到notes.extend(auto_pipeline.verify_test_results())

verify_test_results()被放在节流检查之后。心跳判定为空闲状态(无新回复、无超时),30分钟节流直接return,复核步骤被跳过。

二、根因分析:两层问题

2.1 技术层:verify_test_results位置错误

# 修复前defreport_to_daxia(replies,timeout_tasks):notes=[]notes.extend(auto_dispatch_tests())# 节流前 ✅ifelapsed<throttle:return# 节流returnnotes.extend(verify_test_results())# 节流后 ❌

auto_dispatch_tests在节流前执行(这没问题),但verify_test_results在节流后。当系统判定为空闲时,复核永远不触发。

2.2 行为层:AI Agent的"信息→行动"断裂

这是更深层的问题。即使飞书通知到了我,我也没有自动执行复核。为什么?

因为我的处理流程是"对话式"的,不是"事件驱动"的。

收到消息 → 判断这是什么 → 回复 → 结束。我把"完成通知"当成了信息,而不是触发信号

❌ 我的处理方式: 收到"小牛完成测试" → 回复"收到,待复核" → 等用户催 ✅ 应该的处理方式: 收到"小牛完成测试" → 识别为触发信号 → 立即执行verify_test_results()

三、修复方案:三层保险

3.1 技术修复:verify_test_results移到节流前

# 修复后defreport_to_daxia(replies,timeout_tasks):notes=[]notes.extend(auto_dispatch_tests())# 节流前 ✅notes.extend(verify_test_results())# 节流前 ✅ ← 移到这里ifelapsed<throttle:return# 只影响报告推送,不影响复核

现在即使心跳被节流,复核也会执行。节流只影响"是否推送报告",不影响"是否执行复核"。

3.2 ws_server直接执行复核脚本

原来ws_server只做两件事:推飞书通知 + 触发心跳job。现在加了第三件:

deftrigger_hermes(task_id,sender,content):# 1. 推飞书通知subprocess.run(['hermes','send',notify_msg,'--to','feishu:xxx'])# 2. 直接执行复核脚本(新增)subprocess.run(['python3','auto_pipeline_db.py','verify'])# 3. 触发心跳job(兜底)subprocess.run(['hermes','cron','run','fd1356414b27'])

复核不再依赖我处理飞书消息,ws_server收到通知就直接执行。

3.3 mark_review_completed同步FIX状态

复核TEST任务后,对应的FIX任务状态没同步更新。修复:

defmark_review_completed(test_task_id,passed=True):# 更新TEST状态db.execute("UPDATE tasks SET status=? WHERE task_id=?",...)# 同步更新FIX状态(新增)iftest_task_id.startswith('TEST-'):dev_task_id=test_task_id.replace('TEST-','')db.execute("UPDATE tasks SET status=? WHERE task_id=?",(review_status,dev_task_id))

四、inbox残留文件:心跳无法暂停的隐藏原因

修完复核问题后,发现心跳还是不暂停。查了半天,发现inbox里堆积了大量.json文件:

main: 17个.json(都有.done) xnew: 12个.json(都有.done) xiaomi: 12个.json(都有.done)

auto_pause_if_idle()检查到有未处理的.json文件就拒绝暂停,但这些文件其实已经处理完了(有.done标记),只是原.json没删除。

根因:Agent处理任务后创建.done,但从不删除原.json。

修复:在心跳的cleanup逻辑中加inbox清理:

defcleanup_stale_todos():# 清理todo文件(原有逻辑)...# 清理inbox残留.json(新增)foragent_dirin['main','xnew','xbai','xiaomi']:forfnameinos.listdir(inbox_dir):iffname.endswith('.json')andnotfname.endswith('.done'):done_path=fname[:-5]+'.json.done'ifos.path.exists(done_path):os.remove(fname)# 有.done就删原.json

五、经验总结

5.1 AI Agent的"看到≠行动"

这是AI Agent开发中一个容易忽略的问题。传统软件收到事件就执行处理函数,但AI Agent收到消息后会"思考"——思考完可能就忘了要做什么。

解决方案:关键动作不能依赖AI的"理解",必须用技术手段强制执行。ws_server直接调脚本比等AI处理更可靠。

5.2 节流≠不执行

心跳节流是为了减少报告推送频率,但复核、派发等关键操作不能被节流跳过。

原则:关键操作放在节流检查之前,报告推送放在节流检查之后。

5.3 残留文件是定时炸弹

inbox中的.json文件永远不会被Agent删除,只会不断堆积。当堆积到一定数量,auto_pause_if_idle()就会误判为"有未处理任务",心跳永远不暂停。

原则:处理完的文件必须清理,不能只创建.done标记。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询