跨会话投递与接收策略
处理回执状态转换、重复消息、限流和人工 hold 队列。
跨会话 delivered 只表示已经排队给模型,不证明已读、执行成功或产生了用户期望的结果。接收端回执是尽力发送,发送程序也必须容忍永久没有回执。
回执格式与转换
回执通过发送者的 from 地址和 replyToken 另建连接,使用 control 帧:
{
"msgV": 1,
"msgId": "receipt-123",
"type": "control",
"action": "delivery_status",
"status": "held",
"origMsgId": "5f1d0c9e-3b2a-4e8f-9c7d-1a2b3c4d5e6f",
"from": "/run/user/1000/qwen-socks/41337.sock",
"reason": "Waiting for recipient review."
}| status | 意义 | 发送方处理 |
|---|---|---|
| held | 等用户审核;释放失败时也可能保持扣留 | 等待后续决定或过期 |
| delivered | 已进入模型输入队列 | 不将它当执行回执 |
| denied | 用户看过并拒绝 | 不重复发送同一请求 |
| refused | 接收策略拒绝,未交用户查看 | 停止向此会话重试 |
| expired | 等待到期、退出时未读或关闭过程中到达 | 仍有需要时再择机发送 |
| misaddressed | sessionId 不匹配目标 | 重读注册记录 |
| dropped | 进入策略前被限流、判重或容量限制丢弃 | 合并成之后的一条,不循环重发 |
协议线上字段是 denied;不要把交互界面的拒绝提示文字当作可替换的 wire value。reason 只供人阅读,不用它驱动状态机。
不同连接的回执顺序没有保证。pending 可转到表中任意状态;held 只继续转 delivered、denied、expired、misaddressed;delivered 仍可变为 expired 或 misaddressed。其余转换当重复忽略,未知 status 不改变状态,从未发送过的 origMsgId 也忽略。
dropped 额外带 dropReason,值为 rate-limited、duplicate 或 queue-full;droppedMsgIds 可一次列出最多 256 个其他被丢弃 ID。发送程序应一并结束这些记录,而不是等待每条各自的回执。这两个字段在其他状态下无意义。
接收顺序
- 先做准入限流和正文去重。
- 对已有裁决的 msgId 返回旧裁决。
- 读取 agents.crossSessionInbound 的 accept、hold、refuse;未配置时,自身启动的进程与授权 controller 默认接受,普通 peer 需声明与接收方一致的 review class,否则 hold。
- hold 缓冲最多 50 条,满时拒收新条目而不移除旧条目。
- 接受后进入 peer 输入队列,最多 50 条;队列满也返回 dropped。
agents.crossSessionHeldExpiry 可选 1m、5m、10m、never,默认 5m。用户从 /peers 接受或拒绝,模式变化会重新评估等待消息。显式入站策略优先于令牌类别的默认放行。
限流与去重
单发送者初始突发 30 条,之后每 2 秒补一条;全体初始突发 32 条,之后每秒一条。发送者自报名称不能用来建立强身份,轮换它也无法绕过总额度。
30 秒内的相同消息正文受重复窗口限制;自身启动进程与 controller 豁免这一正文判重,但仍受限流。入口丢弃不进入 hold、不送模型,也不留下已裁决记录;稍后合理重试仍有机会接受。
多会话进程共享 from 地址,因此也共享接收方的发送者预算和重复窗口。繁忙的同进程会话可能用掉其他会话的额度,同一正文也可能不能马上发给其同进程兄弟会话。Qwen Code 的发送侧预估按地址限制,在写入前要求模型合并消息;自行实现的 peer 也应避免忙循环重试。
模型可见的来源
接收端把消息包在 cross_session_message 外部来源封套中,并追加授权类别说明。own-process、controller 及 controller 标签来自已认证连接,不采用发送帧里自称的 origin 或 fromName;正文中仿造的封套标记会被处理。
这些机制不把外部消息变成用户指令。应用仍需遵守接收会话权限,并将业务完成结果作为新的消息单独返回。
限流数字、队列容量、过期选项、行长和连接上限可能不升协议版本就改变。记录或帧的既有字段形状发生不兼容变化才提高版本,客户端应保留未知字段和状态的前向兼容处理。