ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

AI多Agent协作系统实战(七):通知到了却不行动——AI Agent的行为缺陷与即时复核链路

AI多Agent协作系统实战(七):通知到了却不行动——AI Agent的行为缺陷与即时复核链路 系列第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())# 节流检查ifelapsedthrottle: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())# 节流前 ✅ifelapsedthrottle: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())# 节流前 ✅ ← 移到这里ifelapsedthrottle: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,passedTrue):# 更新TEST状态db.execute(UPDATE tasks SET status? WHERE task_id?,...)# 同步更新FIX状态新增iftest_task_id.startswith(TEST-):dev_task_idtest_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都有.doneauto_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_pathfname[:-5].json.doneifos.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标记。
返回列表