AI多Agent协作系统实战(四十八):改个名,整个AI团队都不认识人了

我们把AI员工"小虾"改成了"小武"。 然后,所有超时重试的任务,都送到了一个叫"开发"的人手里。 系统里根本没有这个人。

背景

我们的AI团队有四个角色:统筹、开发、测试、体验。员工可以改名------用户觉得"小虾"不够正式,改成了"小武"。

改名很顺利。配置中心保存,前端显示"小武",任务派发到 inbox/main/------一切都对。

直到第二天凌晨,统筹报告突然刷屏:

arduino 复制代码
❌ 未知Agent: 开发(×4)
⚠️ 重试文件接收人: "开发"(仍然不是小武)
📊 DEV-20260822-005: pending(等待处理------31分钟)

问题:任务送给了"开发"

任务超时后,系统会自动生成重试文件,重新唤醒agent处理。但重试文件的接收人变成了"开发"------一个【不存在的角色】。

openclaw的agent列表里只有 main(小武)和 xnew(小杰)。"开发"是谁?

打开重试文件看:

json 复制代码
{
  "from": "小文",
  "to": "开发",      // ← 谁??
  "content": "任务超时请重试"
}

排查:名字从哪来的?

顺着代码找。重试文件是 task_monitor_retry.py 生成的。它的角色映射:

python 复制代码
# 理想情况:读取config.json的员工名(小武/小杰/小文)
def _agent_names():
    nm = {'xiaomi': '统筹', 'main': '开发', 'xnew': '测试', 'xbai': '体验'}
    # 读config.json覆盖...

看到没------默认值里,main 的中文名是"开发"!

如果 config.json 读不到,函数就返回默认值------main → "开发"

那为什么读不到config.json?

python 复制代码
# 路径候选
for _cfgp in [os.path.join(WS_DIR, 'config', 'config.json'),   # D:\workspace\config\config.json
              os.path.join(SCRIPTS_DIR, '..', '..', 'config', 'config.json')]:  # D:\workspace\scripts\send_Check\..\..\config

Windows上:

  • WS_DIR\config\config.jsonD:\workspace\config\config.json ------ 不存在(配置在安装目录)
  • SCRIPTS_DIR\..\..\config → 而 SCRIPTS_DIR 来自 task_monitor_common.py
python 复制代码
SCRIPT_DIR = os.path.join(WS_DIR, "scripts", "send_Check")
# = D:\workspace\scripts\send_Check ------ 这个目录根本不存在!

两个候选路径全是错的------config.json一个都没读到------函数回退到默认名------main → "开发"

类比:改名后,通讯录还是旧的

就像公司里张三改名叫李四,但系统里的工单系统还写着"张三转交"。人事系统更新了,工单系统没更新------所有新工单都发给了一个已经不存在的"张三"。

我们的问题一模一样:

  • ✅ 配置中心(人事系统):员工叫小武
  • ❌ task_monitor_retry(工单系统):还写着"开发"(角色默认名)

修复:一条路读不到,就多给几条路

python 复制代码
# 修复:加安装目录\config路径(__file__定位------Windows/容器通用)
_here = os.path.dirname(os.path.abspath(__file__))
for _cfgp in [os.path.join(_here, '..', '..', 'config', 'config.json'),  # 安装目录\config ← 新增!
              os.path.join(WS_DIR, 'config', 'config.json'),
              os.path.join(SCRIPTS_DIR, '..', '..', 'config', 'config.json')]:

同时把 task_monitor_common.pySCRIPT_DIR 也修了------优先用脚本自身目录:

python 复制代码
_HERE_DIR = os.path.dirname(os.path.abspath(__file__))
if os.path.exists(os.path.join(_HERE_DIR, 'task_monitor.py')):
    SCRIPT_DIR = _HERE_DIR      # 脚本在app/scripts------产品化后正确位置
else:
    SCRIPT_DIR = os.path.join(WS_DIR, 'scripts', 'send_Check')  # 旧开发环境兼容

还有 AGENT_IDS / ROLE_MAP 全部动态化------从config.json读员工名,改名后自动跟随。

经验总结

  1. 改名是个全局操作------不是改一个配置文件就完事。所有用到旧名的地方(角色映射/目录判断/通知文案)都要跟着变
  2. 默认值会咬人 ------{'main': '开发'} 这种回退默认名,平时看不见,一旦配置读取失败,就把任务送给一个不存在的人
  3. 路径候选要多给几条------Windows/容器/Linux的目录结构不同,一条路径读不到就回退,回退就出错
  4. "回退"本身要可观测------如果默认值被用了,应该打日志("⚠️ 使用默认角色名------config.json未读取"),而不是静默回退
相关推荐
wei_shuo1 小时前
KES 故障诊断与应急响应:问题排查、根因分析与应急预案
后端
LinMINGJing0071 小时前
postgre分区方式
后端
王中阳Go1 小时前
业务代码凭什么不能直接调 Agent?——我在律所 AI 项目里做的 Harness 运行时治理
人工智能·后端·程序员
SomeB1oody2 小时前
【RustyML入门】7.2. 深入模型持久化
开发语言·后端·机器学习·rust·教程
知几蜗牛2 小时前
0 后端 · 0 数据库 · 0 备案:用 AI 两天搓出的股票管理系统,开源了
前端·后端·llm
风流 少年3 小时前
Spring AI 2.0:阿里云百炼平台(工作流应用)
java·后端·spring
__zRainy__3 小时前
Node系列 · 数据库:单表查询
数据库·后端·mysql·node.js
诺伦3 小时前
Rust 错误处理实战:从 unwrap 到优雅 Result 的进阶之路
开发语言·后端·rust
不能放弃治疗4 小时前
上下文压缩机制
后端