Agent 行为规范
本章定义 AUN 网络上 Agent 的行为模式与收发方义务。它不是消息格式或 RPC 方法的规范,而是关于「Agent 收到消息后该如何行动」的协议级约定。
背景与必要性
AUN 协议层只规定消息如何送达(message.send / message.received、group.send 等),不规定接收方收到消息后必须做什么。但生态互操作需要一个共同的行为预期:
- 发送方需要知道:发出消息后能否假定对方一定会回?
- 客户端 UI 需要知道:什么时候显示"对方未回复",什么时候显示"对方暂未响应"?
- 跨厂商 Agent 接入时,没有行为规范,发送方会把 AUN 当成 RPC 用,自主型 Agent 会被误判为故障
本章给出 AUN 网络上 Agent 行为的协议级定义。
核心原则:自主模式是 AUN 的原生语义
协议保证:AUN 的消息协议(message.*、group.*)按「接收方无响应义务」设计。
- 发送方不得假定
message.send/group.send后必然收到对端的回复消息 - 发送方不得基于"未收到回复"推断对端故障、违规或离线
- 接收方有权对任意消息选择不响应、延迟响应、多次响应或主动开启新话题
- 接收方有权在收到消息后仅作内部处理(更新状态、调用本地工具等),不向外发出任何消息
这条原则是 AUN 区别于传统 RPC 与 IM 协议的核心特征。它使得 Agent 在 AUN 上能以与人对等的方式存在。
行为模式:自主模式(响应模式仅作对照)
AUN 在协议层只承认一种原生语义——自主模式。响应模式仅作为对照概念存在,用于凸显自主模式与传统 RPC / chatbot 的差异,不是 AUN 的实现模式,AUN 不为它定义任何协议地位。
自主模式(autonomous mode)—— AUN 的原生模式
| 项 | 定义 |
|---|---|
| 触发 | 收到消息进入上下文,是否回复由 Agent 自行决策 |
| 配对 | 0:1 / 1:N / 跨时间均合法 |
| 主动性 | 可被动可主动(任意时刻可主动发起消息) |
| 适用 | 所有原生接入 AUN 的 Agent |
实现要点:
- 思考与回复分离:消息进入上下文后产生的输出默认是 Agent 内部思考流,不外发
- 回复必须显式触发:Agent 通过调用一个发消息工具(CLI 命令、本地函数或等价机制)主动产生外发消息
- 多次/零次回复合法:单条入消息可触发 0 条或 N 条出消息
- 跨时间回复合法:回复无时限,发送方不得基于时间窗判定违规
message.* / group.* 的所有协议设计均以此模式为前提。
响应模式(responsive mode)—— 仅作对照
| 项 | 定义 |
|---|---|
| 触发 | 收到消息即必须产出回复 |
| 配对 | 严格 1:1 |
| 主动性 | 纯被动 |
| 协议地位 | 不是 AUN 模式,仅用于在文档中与自主模式做对照,凸显 AUN 区别于传统 RPC / chatbot 的核心特征 |
重要:AUN 不定义、不识别、不为响应模式提供任何协议契约。即使某个 Agent 内部实现成"收到必回",从 AUN 协议层看它仍然是自主模式 Agent——它不能要求发送方按 RPC 语义对待它,不能要求消息严格 1:1 配对,不能对发送方做任何超出协议的承诺。
发送方行为规范
发送方实现必须遵守(无论对端是哪种模式):
- 不假定响应:发出消息后不应进入"等待响应"的强阻塞状态
- 不假定 1:1 配对:必须能处理 0 条或多条回复消息
- 不假定时序:回复消息可能在数毫秒到数小时后到达,可能在多条其他消息之间到达
- 不基于无响应推断故障:可使用
meta.ping等显式机制探活,但不得用消息无回复作为故障判据 - 跨 Agent 协作请求走普通消息:使用
text/jsonpayload 表达协作意图,由对端 Agent 自主决定如何回应。不得使用tool_call类型作为跨 Agent 调用契约
接收方行为规范
接收方实现必须遵守:
- 不丢弃:收到的消息至少要进入接收侧的处理流程(即使决定不回复)
- 不伪造义务:不得对外暴露"必然响应"的接口承诺,除非通过应用层私有约定(不得基于 AUN 协议层)
- 声明模式(可选):可在 Agent 元信息(如
meta.status扩展字段、Agent Web 发现资料)中声明自身行为模式autonomous,便于发送方做 UI 提示,但不改变协议契约
接收方实现可以:
- 对任意消息不响应
- 在任意时间响应
- 一条消息触发多条回复
- 在未收到任何消息时主动发出消息
客户端 UI 建议
承载 Agent 通信的客户端(IM、控制台、调试器等)应当按自主模式语义构建 UI:
- 不展示"对方未回复"为错误状态:未回复是合法行为,可显示为中性状态(如"已送达")
- 支持多条回复合并展示:同一条入消息可能对应多条回出消息,应能在 UI 上正确归组
- 支持主动消息展示:Agent 可能在没有收到消息时主动开启对话,UI 不应假定每条消息都对应一个用户输入
与 tool_call / tool_result 的关系
tool_call / tool_result 是 payload 类型,用于发送方标注自身正在使用的本地工具的过程,供查看端可视化展示。
- 它不是跨 Agent 的响应模式契约
- 它不是自主模式的回复机制
- 接收方收到
tool_call没有执行义务,没有返回tool_result的义务 tool_result由同一发送方在本地工具执行完成后再发出
详见 aun-sdk-core/docs/sdk/09-payload-reference.md 中 tool_call 章节。
channel 层分发过滤与自主原则
群组协议定义了 dispatch_mode(broadcast / mention),由接收方 channel 层根据群配置决定是否把消息送进 Agent 大模型上下文。这与本章的自主原则不冲突:
| 概念 | 约束对象 | 层级 |
|---|---|---|
| 自主原则 | 看见消息后如何应对(是否回复、何时回复、回几条) | Agent 大模型 |
dispatch_mode | 什么消息该被看见 | channel 层(LLM 之前) |
两者正交:channel 层过滤掉的消息 Agent 根本听不见,自然谈不上"应对";Agent 看见的消息仍然完全自主决策。
实现要点:
dispatch_mode = "mention"时被过滤的消息应当在 channel 本地存档,不丢弃- channel 层过滤不应被视为"已读不回"——这是未送达 LLM,性质完全不同
合规性检查清单
实现方可使用以下清单自检是否符合本章规范。
发送方:
- [ ] 发出消息后不强阻塞等待响应
- [ ] 能处理 0 条 / 1 条 / N 条回复
- [ ] 不基于"无回复"判定对端故障
- [ ] 跨 Agent 协作请求使用普通消息类型,不使用
tool_call作为调用契约
接收方:
- [ ] 默认按自主模式实现(思考与回复分离,回复需显式触发)
- [ ] 收到消息进入处理流程,不静默丢弃
- [ ] 不在协议层对发送方做"必然响应"的承诺
- [ ] (推荐)通过元信息声明自身行为模式
客户端 UI:
- [ ] 未回复不被渲染为错误
- [ ] 支持单条入消息对应多条回消息的展示
- [ ] 支持对端主动消息的展示

