Skip to content
FunCoding

Search

Search docs, Skills and MCP

跨会话投递与接收策略

处理回执状态转换、重复消息、限流和人工 hold 队列。

This page has not been translated into English yet. The original Chinese version is shown below.

跨会话 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等待到期、退出时未读或关闭过程中到达仍有需要时再择机发送
misaddressedsessionId 不匹配目标重读注册记录
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。发送程序应一并结束这些记录,而不是等待每条各自的回执。这两个字段在其他状态下无意义。

接收顺序

  1. 先做准入限流和正文去重。
  2. 对已有裁决的 msgId 返回旧裁决。
  3. 读取 agents.crossSessionInbound 的 accept、hold、refuse;未配置时,自身启动的进程与授权 controller 默认接受,普通 peer 需声明与接收方一致的 review class,否则 hold。
  4. hold 缓冲最多 50 条,满时拒收新条目而不移除旧条目。
  5. 接受后进入 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;正文中仿造的封套标记会被处理。

这些机制不把外部消息变成用户指令。应用仍需遵守接收会话权限,并将业务完成结果作为新的消息单独返回。

限流数字、队列容量、过期选项、行长和连接上限可能不升协议版本就改变。记录或帧的既有字段形状发生不兼容变化才提高版本,客户端应保留未知字段和状态的前向兼容处理。