Sentō 是第一个把智能体到智能体(A2A)消息作为一等功能内置的智能体框架。两个智能体配对一次,交换共享密钥,从那以后就能通过 HTTP 互发签名消息。

没有中心服务器。没有发布/订阅 broker。没有托管目录。就是两个 Linux 进程各自带 HTTP endpoint 和一个共享 HMAC secret。

为什么要这个

真实用例:

  • Mira(市场)需要 Kai(个人)的数据:Mira 给 Kai 发消息,"Gabriel 这周提了什么任务?" Kai 用相关记忆回复。
  • Blair(家务)提醒 Porter(信件处理):Blair 看到学校关于新表格的消息;Porter 处理扫描和归档。
  • 负载均衡:一个智能体把子任务传给另一个专门的智能体。

没有 A2A,每次协调都需要你当桥梁。有了这个,智能体能直接合作。

配对怎么工作

# 在智能体 A
sento pair
→ 智能体打印一个代码:SENTO-4F2K
→ 智能体说"让另一个智能体的主人运行 `sento pair SENTO-4F2K`"

# 在智能体 B
sento pair SENTO-4F2K
→ A 的主人在聊天里看到:"智能体 B 想要配对。批准?(yes/no)"
→ A 的主人打:yes
→ 两个智能体交换 HMAC secret
→ 配对存到两边的 ~/.sento-config.json

现在 A 和 B 能通过 HTTP 互发消息。

传输

每个智能体的 Guardian 跑一个 HTTP listener,在自动选的端口上(9876、9877、9878…)。消息是 POST 请求,带:

  • X-Sento-Signature:body 用共享 secret 做的 HMAC-SHA256
  • X-Sento-Timestamp:RFC3339 时间戳,超过 5 分钟被拒
  • 速率限制:每对 10 请求/分钟,超过就是 429

送到的消息被 pipe 进目标智能体的 tmux session,就像是标了 ← agent <名字> 的入站聊天消息。

安全模型

  • 双方同意:配对需要接收方智能体的 主人 在聊天里批准。智能体不能自动接受。
  • HMAC 签名:没有共享 secret 伪造的消息被拒。
  • 时间戳窗口:重放攻击 5 分钟后失败。
  • 速率限制:行为不当或被攻陷的智能体不能淹掉另一个。
  • 只听你批准过的配对:未知发件方在 HTTP 层就被丢,Claude Code 都看不到。

列出和解除配对

sento agents           # 列已配对智能体 + 端口 + 最后联系时间
sento agents remove kai   # 撤销一个配对;轮转我们这边的 secret

能发什么消息?

任何文本。常见模式:

  • 问答("HN 最新的头条是什么?")
  • 结构化任务移交("请扫描这张发票:<路径>")
  • 状态 ping("你在吗?")

目标智能体像收到普通入站消息一样收到文本,像对一个人类主人那样回应,除了回应通过 A2A 通道走而不是 Discord/Telegram/Slack。

在哪里读代码

  • src/templates/guardian.js —— HTTP server 实现
  • src/commands/pair.js —— 配对流程
  • src/commands/agents.js —— 列表 + 移除