ReliabilityRail 异常探测
团队里某个成员卡住、打转、模型不可用时,怎么自动发现:信号 → 探测器 → 严重度 → 动作,自动处理只做可撤销的纠偏。
依据 agent-core 0.1.20 · develop@fbe6a0d9(2026-11-13)核实
解决什么问题
多个智能体组成团队协作时(openJiuwen 里叫 agent_teams),常见的故障不是报错,而是不报错地卡住:某个成员反复调同一个工具、两个成员互相踢皮球、输出越写越长、上下文被频繁压缩、模型组全部不可用……没人盯着就会一直耗下去。
ReliabilityRail 给每个成员装一个"监护仪":在生命周期事件上采集信号,交给一组探测器判断,再按严重度决定怎么处理。
四步:信号、探测、严重度、动作
一、信号。 Rail 在模型调用前后、工具调用前后、模型和工具异常时各产生一条信号,记录工具名、参数哈希、结果哈希、输出长度等。
二、探测器。 默认几种:
| 探测器 | 发现什么 |
|---|---|
| 工具错误率 | 一段时间内工具频繁失败、连续失败 |
| 重复调用 | 同一调用反复出现;A-B-A-B 交替;同参同结果原地打转 |
| 模型错误 | 模型调用频繁失败;模型组不可用 |
| 输出长度 | 回复或思考内容过长 |
| 频繁压缩 | 短时间内上下文被压缩多次 |
| 互相踢皮球 | 两个成员之间来回传话 |
以重复调用为例,默认阈值是:同一调用出现 10 次记 LOW;A-B 交替 10 次记 MEDIUM;末尾连续 20 次"同参同结果"记 HIGH;30 次记 CRITICAL。只有严重度上升时才发出,避免刷屏。结果每次都不同的重复不算打转。
源码RepeatToolCallDetectoragent-core/openjiuwen/agent_teams/reliability/detectors/repeat_tool.py:15@fbe6a0d9三、严重度到动作。 默认策略:
| 严重度 | 动作 |
|---|---|
| LOW | 只记日志 |
| MEDIUM | 上报 leader |
| HIGH | 本地纠偏 + 上报 leader |
| CRITICAL | 本地纠偏 + 上报用户 |
四、本地纠偏有三道限制:
- 只做
push_steering:往成员自己的模型里塞一条提示,不改参数、不停执行 - 有预算:默认 60 秒内最多 5 次,超出就不再纠偏,交给 leader 和用户
- 模型不可用、模型已被路由切换这两类异常不纠偏,给模型塞提示解决不了问题
开启方式
它是团队级的可选配置,默认关闭:
ReliabilityConfig(
enabled=True, # 默认 False
monitor_roles=["leader", "teammate"], # 默认两种角色都监护
# detectors=...、policy=...、restart_intensity=... 可以按需调阈值
)
示意代码,字段名取自 ReliabilityConfig;具体挂到哪个团队对象上以 agent_teams 的接口为准。本站没有运行它。
动手:预测它会怎么做
三段成员行为,预测在默认配置下 ReliabilityRail 的反应。
小结
- 团队里最麻烦的故障是不报错的卡住,ReliabilityRail 用"信号 → 探测器 → 严重度 → 动作"自动发现。
- 自动处理只有可撤销的纠偏,而且有预算;破坏性动作留给 leader。
- 默认关闭,按团队开启,阈值都能调。
源码出处
- agent-core/openjiuwen/agent_teams/reliability/rail.py:84
class ReliabilityRail采集成员内部信号,优先级 5 - agent-core/openjiuwen/agent_teams/reliability/anomaly.py:45
class AnomalyKind异常种类 - agent-core/openjiuwen/agent_teams/reliability/detectors/repeat_tool.py:15
class RepeatToolCallDetector重复与打转的四级判定 - agent-core/openjiuwen/agent_teams/reliability/remediation/policy.py:16
DEFAULT_SEVERITY_ACTIONS严重度到动作的默认映射 - agent-core/openjiuwen/agent_teams/reliability/remediation/local.py:22
class LocalAutoRemediator本地纠偏与预算 - agent-core/openjiuwen/agent_teams/reliability/config.py:99
class ReliabilityConfig开关与各探测器阈值
链接指向固定提交,仓库后续更新不影响这里的行号。
过关测验
1. ReliabilityRail 默认是开着的吗?
2. ReliabilityRail 能做的最强的自动动作是什么?
3. 为什么 ReliabilityRail 的 priority 只有 5?