我构建了一个没有治理的 multi-agent system——这是我希望拥有的三层堆栈
发布: (2026年4月26日 GMT+8 10:54)
5 分钟阅读
原文: Dev.to
Source: Dev.to
问题
您已经构建了一个多代理系统。它能够运行:协调器向专职代理分配任务,它们调用外部 API,您就发布了它。
三周后,您发现您的支付代理:
- 在周六凌晨 1:47 处理了一笔 $4,200 的退款,且没有获得批准;
- 让本不应拥有该权限的代理访问了客户数据;以及
- 留下 零日志,让您无法查明触发这些行为的原因。
这并非假设情景。当在生产环境中缺少保持安全的三层基础设施时,这就是默认的结果。
第1层 – 操作:Conduit
Conduit 用 可视化流水线工作室 替代临时脚本:
- 只需一次连接您的 MCP 服务器,即可在画布上构建流水线。
- 为每一步提供实时执行日志(延迟、令牌消耗、输入、输出)。
- API 密钥存储在 AES‑256 加密金库 中,仅在内存中解密使用。
- 流水线配置集中存储,不再分散在各台机器上。
实际区别 – 当工作流出现故障时,打开 Conduit 的追踪视图,而不是手动在各服务的日志中进行关联。每一步都会按执行顺序显示。
第2层 – 信任:Codios
Codios 为每个代理分配一个 Ed25519 身份(did:key),并签发 签名合约,明确规定调用方在被调用方上可以执行的操作。
# 发行合约(服务器端)
contract = codios.contracts.issue(
caller_did=order_agent.did,
callee_did=payment_agent.did,
scopes=["payment:charge:max_10000usd"], # 故意排除退款
ttl_seconds=3600,
)
# 验证合约(代理端,无网络请求)
contract = verify_contract(
token=request.headers.get("X-Codios-Contract"),
required_scope="payment:charge",
platform_public_key=CODIOS_PUBLIC_KEY,
)
- 范围限制 加密绑定 —— 支付代理即使在请求体中包含退款信息,也无法使用此合约进行退款。
- 强制执行在验证时完成,而不是通过数据库查找。
- 其他保护措施自动生效:重放攻击、配置错误的代理以及未授权调用都会被阻止。
第3层 – 治理:A2A
即使有可视化(Conduit)和信任(Codios),仍然需要一个监控代理行为并在出现异常时进行干预的层。A2A 增加了四个模块:
- 分布式追踪 – 包装任何代理循环(≈5 行)。每一次 LLM 调用、工具调用和交接都会成为一个带有时间和 I/O 的 span。
- YAML 规则 – 在动作执行前评估(≤5 ms)。示例:阻止超过 5 万美元的付款,标记读取 PII 的代理,拒绝未具备适当范围的外部 HTTP 调用。
- 人工审批工作流 – 代理创建审批请求,暂停,并在审阅者批准或拒绝后异步恢复。
- 消息扫描 – 每条发送到 LLM 的消息都会在本地进行扫描。
Message scanning – every message reaching an LLM is scanned locally
( $500? → [A2A Approval] → Human review → ✓ )
├─ Fulfillment Agent reads shipping address
│ └─ [A2A Firewall] scans for injection → ✓ → LLM call
└─ A2A Observe captures full trace of everything above
三层比较
| 层 | 工具 | 阻止的内容 |
|---|---|---|
| 构建 / 运行 | Conduit | 不可见的管道、分散的配置、缺乏执行可视性 |
| 信任 | Codios | 未授权的代理调用、重放攻击、范围蔓延 |
| 治理 | A2A | 失控的操作、缺失审计轨迹、提示注入 |
你不需要在第一天就拥有全部三项,但在生产环境中运行代理而没有任何这些工具,就只差一次事故,就要向你的 CTO 解释为什么某个代理做了不该做的事——没有日志来支持你。
免费层可用性
所有三个都在免费层可用:
- Conduit –
- Codios –
- A2A –
如有实现方面的问题,欢迎在评论中提问。