Skip to content

NNRP/1-preview3 协议设计

1. 定位

NNRP/1-preview3 不是在 NNRP/1 这条线内继续堆叠零散能力,而是用来冻结下一阶段真正缺失的协议主题:多 session 连接容器、profile-neutral 的 schema/profile registry,以及面向 operation/workflow 的统一运行时语义。

preview3 聚焦三类协议问题:

  1. 连接与会话模型:把单活 session 心智模型升级为一条连接承载多个 session、多个优先级和多个并发 operation 的统一容器。
  2. 扩展与数据语义:把 typed payload、schema/profile、cache/lease 纳入同一套稳定的公共协议边界,而不是继续靠实现侧各自补充。
  3. 生命周期与观测:把 operation/workflow 生命周期、流控、恢复和可观测字段冻结为跨语言一致的协议语义。

因此,本文只定义协议层边界:消息类型、fixed metadata、body layout、错误口径、状态机语义和 conformance 基线。

preview3 的正式定位是:NNRP/1 下一阶段的协议冻结文档,用来冻结下一阶段的公共协议语义,而不是规定某种具体实现形态。

1.1 总览图

这张图先把 preview3 的核心协议对象压缩到一个视图里:连接已经是多 session 容器,operation 成为显式生命周期对象,扩展方式由 schema/profile registry 控制。

2. preview3 明确负责的主题

NNRP/1-preview3 明确负责以下主题:

  1. 将连接模型从 preview2 的单活 session 主心智模型升级为可承载多活 session、多优先级流和多工作流操作的统一连接容器。
  2. 将 preview2 的对象缓存升级为带 lease、版本、依赖和可观测性的 AI 运行时缓存。
  3. 将 typed payload 从静态枚举扩展为 schema/profile registry 驱动的可协商类型系统。
  4. 将 tool delta、structured event 和多步推理结果提升为显式的 operation / workflow 运行时语义,而不是只把它们看成若干 payload frame。
  5. 冻结跨语言 conformance、golden vector、错误码、descriptor 布局和状态机口径,确保不同实现消费同一份协议基线。
  6. 明确流控、恢复和观测字段的公共边界,避免实现侧私设第二套运行时语义。

preview3 依然保持 preview1/preview2 的核心约束:

  1. 热路径继续保持二进制、固定布局、显式长度、可直接定位。
  2. 协议继续服务于实时 AI 运行时语义,而不是浏览器媒体栈或通用 RPC。
  3. 协议公共层在 preview3 中保持 profile-neutral;首轮标准 profile 至少包含 tensortoken,不再把 tensor 单独视为默认特权 profile。

3. preview3 不负责的主题

preview3 明确不负责以下内容:

  1. 浏览器媒体采集、回放、A/V sync、AEC、ABR、SFU/MCU 等传统媒体协议栈问题。
  2. 某个具体模型或推理框架私有的 GPU 内存页布局、KV-cache page 编码或 runtime 内部线程模型。
  3. 具体宿主环境的 UI / game-engine / notebook / web-framework 封装习惯。
  4. 具体实现的 API 形状、句柄管理、回调/轮询驱动、打包与发布策略。
  5. 把所有高层 AI 业务语义都硬编码成公共协议枚举;preview3 只定义公共运行时语义和标准扩展机制。

preview3 要避免的错误,是把“为了让不同实现都好接入”误解成“协议层必须一次性固化所有上层业务对象”。真正应冻结的是扩展边界、对象生命周期和一致性要求,而不是某个单一产品形态的高层对象树。

4. 设计原则

preview3 采用以下设计原则:

  1. 单一协议语义源头:跨语言公共语义必须先在协议文档与 conformance 基线上冻结,不允许各实现私设。
  2. 热路径零文本化:FRAME_SUBMITRESULT_PUSH、typed payload frame、缓存对象和 schema 描述仍坚持固定布局二进制路径,不引入 JSON/Protobuf 热路径回退。
  3. 协议概念先行:多 session、优先级、cache lease、schema registry、operation lifecycle 等一旦会影响跨语言互通,就必须先成为协议概念,而不是留给单个实现私有扩展。
  4. profile 与 schema 分层:公共层冻结连接、会话、缓存、预算、优先级和 operation 语义;具体 payload 结构通过 profile/schema registry 扩展,而不是不断膨胀公共枚举。
  5. 单一主版本线内覆盖式演进:同一主版本内的 preview 迭代直接覆盖当前 NNRP/1 语义,不保留并行双轨 preview 路径。
  6. 实现中立:协议只约束消息、metadata、错误口径、状态机和描述符边界,不规定具体实现形态。

5. 实现边界

本文只冻结协议对象、固定布局、状态机、错误码和 conformance 口径。

具体实现的 API 形状、句柄管理、回调或轮询驱动、打包和发布策略,不在本文冻结。

协议一致性测试套件本身的跨版本设计、分层结构、case 状态分类和实现接入边界,单独见 conformance-suite 设计文档;preview3 在本文中只声明它必须消费同一份公共 conformance 基线,不在这里重复定义整套测试框架。

6. NNRP/1 代码层身份与继承约束

6.1 代码层版本身份

preview3 作为 NNRP/1 这条线内的一份开发阶段文档,在代码层冻结的发包身份是 NNRP/1.0

  1. version_major = 1
  2. wire_format = 0
  3. ALPN nnrp/1

这不意味着设计阶段名不再叫 preview3,而是指 preview3 不应再引入新的 preview 专用 code-level stage byte 或 preview 专用 ALPN。preview3 的多 session、多优先级和 schema registry 等新增语义,必须通过显式协议概念和能力窗口协商表达,而不是编码成新的 preview 期版本号。

6.2 公共头与长度模型

preview3 继续保留 40 字节公共头与 meta_len + body_len 自描述长度模型。preview3 的主要演进点仍然放在:

  1. metadata 表的字段语义升级;
  2. control-plane 消息族的职责划分;
  3. body region 的扩展能力和 typed payload / schema 绑定关系;
  4. 连接与会话状态机语义。

6.2A 线级整数编码与 fixed metadata 打包规则

preview3 首轮冻结以下二进制编码规则:

  1. 所有多字节整数一律使用 little-endian 编码。
  2. 公共头与 fixed metadata 均为紧凑固定布局,不插入语言 ABI padding。
  3. 字段偏移以字节为单位,从该结构起始位置计算;表中 offset 是跨语言实现必须遵守的 wire offset。
  4. 所有 reserved 字段发送端必须清零;接收端在 strict / conformance 路径上遇到非零 reserved 字段必须拒绝。
  5. 所有位图字段只能设置本文已冻结的 bit;接收端在 strict / conformance 路径上遇到未知置位必须拒绝。

6.2B preview3 顶层消息类型编号冻结

preview3 首轮冻结以下 msg_type:u8 公共编号。已有 preview2 编号保持不变,preview3 新增 session 容器消息占用此前保留的 control-plane 空位。

名称metadata 长度body 口径说明
0x01CLIENT_HELLO既有 NNRP/1 长度可选扩展块连接级 hello、能力窗口、鉴权入口
0x02SERVER_HELLO_ACK既有 NNRP/1 长度可选扩展块连接级 hello ack 与能力协商结果
0x03SESSION_PATCH既有 NNRP/1 长度可选扩展块低频 session 更新路径
0x04SESSION_PATCH_ACK既有 NNRP/1 长度可选扩展块低频 session 更新确认
0x05CLOSE0 或既有关闭元数据可选扩展块连接级关闭;不再表示关闭单个 session
0x06ERROR既有 NNRP/1 长度可选错误扩展稳定协议错误返回
0x07SESSION_OPEN48resume_token_block + auth_block + session_extension_block显式打开一个 session
0x08SESSION_OPEN_ACK56resume_token_block + session_extension_block确认或拒绝 session open
0x09SESSION_CLOSE240 或关闭扩展块关闭单个 session
0x0ASESSION_CLOSE_ACK160 或关闭扩展块确认 session close 状态
0x10FRAME_SUBMIT既有 NNRP/1 submit 长度submit body / typed payload region数据面提交;preview3 通过 session/profile/schema 语义升级
0x11FRAME_CANCEL既有 NNRP/1 长度可选扩展块取消提交或 operation
0x12RESULT_PUSH既有 NNRP/1 result 长度result body / typed payload region结果、partial、terminal、stale/degraded 等返回
0x13RESULT_DROP既有 NNRP/1 长度可选扩展块显式丢弃或无法交付结果
0x14CACHE_PUT既有 NNRP/1 长度cache object body缓存对象写入
0x15CACHE_ACK既有 NNRP/1 长度可选扩展块缓存操作确认
0x16CACHE_INVALIDATE既有 NNRP/1 长度可选扩展块缓存或 schema 失效
0x17FLOW_UPDATE320三层 credit / backpressure 更新
0x18RESULT_HINT既有 NNRP/1 长度可选扩展块低频结果提示
0x19TRANSPORT_PROBE既有 NNRP/1 长度probe bodytransport probing
0x1ATRANSPORT_PROBE_ACK既有 NNRP/1 长度probe ack bodytransport probing ack
0x1BSESSION_MIGRATE既有 NNRP/1 长度migration body既有迁移控制路径
0x1CSESSION_MIGRATE_ACK既有 NNRP/1 长度migration ack body既有迁移确认路径
0x20PING00keepalive / smoke
0x21PONG00keepalive / smoke

首轮约束:

  1. 0x07-0x0A 是 preview3 新增的 session 容器消息编号;实现不得用这些值承载私有消息。
  2. 未列出的 msg_type 值均保留;接收端在 strict / conformance 路径上必须拒绝未知消息类型。
  3. 标注为“既有 NNRP/1 长度”的消息继续沿用当前 NNRP/1 已冻结布局;preview3 不在本文重排这些消息编号或旧字段偏移。
  4. SESSION_OPEN / SESSION_OPEN_ACK 的 body 分段顺序由 metadata 中的长度字段决定;若对应长度为 0,该分段不存在。

6.3 已冻结主题的延续原则

preview2 中以下设计原则在 preview3 继续成立:

  1. 规范 host 形态依然是 submit pump + result pump + control path,而不是同步 request-response。
  2. partial / stale_reuse / degraded / drop 的区别仍必须在协议层显式保留。
  3. 低频对象缓存与对象引用继续是一等公民,不回退到“稳定对象每帧全量内联”。
  4. typed payload 与 extension frame 继续保留,但扩展方式不再以“继续扩 payload kind 位图”为主要路径。

7. preview3 连接与会话模型

7.1 连接级 bootstrap 与多 session 容器

preview3 将连接明确视为会话容器,而不是单活 session 的专用通道。

最小要求:

  1. 一条连接允许承载多个活跃 session。
  2. CLIENT_HELLO / SERVER_HELLO_ACK 负责连接级能力协商、鉴权、feature window、基础缓存与 schema 能力声明。
  3. 新增 SESSION_OPEN / SESSION_OPEN_ACK 作为显式会话创建流程,用于声明 profile、schema、预算窗口、优先级类和缓存/租约要求。
  4. SESSION_PATCH / SESSION_PATCH_ACK 继续保留为低频会话更新路径。
  5. CLOSE 继续可用于连接级关闭;preview3 额外要求显式会话关闭语义,避免“关闭一个 session 等于关闭整条连接”的 preview1/2 习惯继续泄漏到多 session 模型中。

7.1A SESSION_OPEN / SESSION_OPEN_ACK fixed metadata 冻结

preview3 首轮将 SESSION_OPENSESSION_OPEN_ACK 固定为最小可实现、可扩展的会话打开元数据,而不是让实现侧私自拼装 session open body。

SESSION_OPEN fixed metadata 首轮固定为 48 字节:

字段类型说明
requested_session_idu32客户端期望的 session id;0 表示由服务端分配
profile_idu16请求使用的标准或扩展 profile
priority_classu8会话优先级类,取值见后文冻结枚举
session_flagsu8会话级能力/行为标志
schema_idu32默认 schema id;无则为 0
schema_versionu32默认 schema version;无则为 0
default_deadline_msu32默认 operation deadline 或延迟预算
max_in_flight_operationsu16客户端期望的最大并行 operation 数
reserved0u16保留,发送端清零
lease_ttl_hint_msu32客户端期望的默认 lease TTL;0 表示未指定
resume_token_bytesu32resume_token_block 长度;无则为 0
auth_bytesu32auth_block 长度;无则为 0
session_extension_bytesu32session_extension_block 长度;无则为 0
client_session_tagu64客户端本地可观测 tag,用于日志与跨层关联

SESSION_OPEN_ACK fixed metadata 首轮固定为 56 字节:

字段类型说明
session_idu32实际分配或确认后的 session id
accepted_profile_idu16服务端接受的 profile id
accepted_priority_classu8服务端接受后的优先级类
session_statusu8打开结果状态
schema_idu32服务端确认后的默认 schema id
schema_versionu32服务端确认后的默认 schema version
granted_operation_creditu16初始授予的 operation credit
max_in_flight_operationsu16服务端允许的最大并行 operation 数
lease_ttl_msu32服务端接受后的默认 lease TTL
resume_window_msu32恢复窗口;无则为 0
resume_token_bytesu32resume_token_block 长度;无则为 0
session_extension_bytesu32session_extension_block 长度;无则为 0
server_session_tagu64服务端本地可观测 tag
route_scope_idu32服务端确认后的最小路由域
session_error_codeu32session_status 非成功,返回稳定错误码
session_flags_acku32服务端接受后的会话标志位

首轮额外约束:

  1. SESSION_OPEN 只负责建立 session 默认上下文,不承载首个 operation 提交正文。
  2. schema_id / schema_version 表示 session 默认 schema,而不是禁止后续 operation 覆盖。
  3. 更高层的 profile 私有 session 参数仍通过 session_extension_block 或 schema/profile 对象扩展进入,而不是继续膨胀 fixed metadata。

7.1B session open 状态位与错误码冻结

preview3 首轮冻结以下 session_flags:u8 位定义:

bit掩码含义
00x01allow_resume:客户端请求该 session 支持 resume token / resume window
10x02allow_background_results:允许后台结果/事件泵在 submit 调用之外持续投递
20x04allow_cache_leases:允许该 session 创建或续租 cache/schema lease
30x08allow_schema_override:允许 operation 级覆盖 session 默认 schema
4-7保留发送端清零,接收端收到非零保留位必须拒绝

preview3 首轮冻结以下 session_status:u8 枚举值:

名称含义
0openedsession 成功建立
1rejected服务端拒绝建立该 session
2retry_later当前无法建立,可按 retry/reuse 相关策略稍后重试
3resumed该 session 以恢复模式建立成功

preview3 首轮冻结以下 session_flags_ack:u32 位定义:

bit掩码含义
00x00000001resume_enabled:服务端允许 resume
10x00000002background_results_enabled:服务端允许后台结果/事件泵
20x00000004cache_leases_enabled:服务端允许 cache/schema lease
30x00000008schema_override_enabled:服务端允许 operation 级 schema 覆盖
40x00000010priority_downgraded:服务端降低了请求优先级
5-31保留发送端清零,接收端收到未知置位必须拒绝

preview3 首轮冻结以下 session_error_code:u32 族:

名称含义
0x00000000none无错误
0x00010001auth_failed鉴权失败
0x00010002profile_unsupported请求的 profile 不被支持
0x00010003schema_unsupported请求的 schema 或版本不被支持
0x00010004priority_rejected请求的 priority class 不被允许
0x00010005lease_policy_rejected请求的 lease 策略不被允许
0x00010006resume_rejected请求的恢复模式或 token 不被允许
0x00010007session_limit_reached当前连接或服务端的 session 上限已满

首轮约束:

  1. session_error_code 只在 session_status != opened 或存在降级/恢复相关异常时返回非零值。
  2. session_flags_ack 只能确认或降级客户端请求,不能私设未请求的新能力。
  3. 后续若要扩展该错误码族,必须按高位 family 预留策略继续扩展,不得重排已冻结值。

7.1C SESSION_CLOSE / SESSION_CLOSE_ACK 与最小路由字段冻结

preview3 首轮将 session close 冻结为标准控制消息对,而不再复用 connection CLOSE 的隐含习惯。

SESSION_CLOSE fixed metadata 首轮固定为 24 字节:

字段类型说明
close_reasonu16关闭原因,取值见下文冻结枚举
in_flight_policyu8对现有 in-flight operation 的处理策略
reserved0u8保留,发送端清零
drain_timeout_msu32允许排空现有 operation 的超时窗口;0 表示立即应用策略
last_operation_idu64发送端最后确认的 operation 水位;无则为 0
session_error_codeu32若因错误关闭 session,则返回稳定错误码;否则为 0
session_close_tagu32本地可观测关闭关联标识

SESSION_CLOSE_ACK fixed metadata 首轮固定为 16 字节:

字段类型说明
close_statusu8关闭确认状态,取值见下文冻结枚举
reserved0u8保留,发送端清零
reserved1u16保留,发送端清零
last_operation_idu64服务端确认后的 operation 水位
session_error_codeu32若关闭过程中出现稳定错误,则返回错误码;否则为 0

close_reason:u16 首轮冻结为:

名称语义
0normal正常关闭
1client_shutdown客户端主动关闭
2server_shutdown服务端主动关闭
3idle_timeout因空闲超时关闭
4protocol_error因稳定协议错误关闭
5auth_revoked因鉴权撤销或凭证失效关闭

in_flight_policy:u8 首轮冻结为:

名称语义
0drain允许现有 in-flight operation 在 drain_timeout_ms 内排空
1abort立即终止现有 in-flight operation

close_status:u8 首轮冻结为:

名称语义
0acknowledged关闭请求已接受并开始执行
1draining当前仍在排空已有 operation
2closedsession 已完成关闭
3rejected关闭请求被拒绝

首轮额外约束:

  1. connection-scope 控制消息必须使用 header.session_id = 0
  2. session-scope 控制、数据、结果消息必须使用 header.session_id = 目标 session
  3. operation-scope 消息必须同时携带 header.session_id 与其固定 metadata 中的 operation_id
  4. SESSION_CLOSE 只关闭单个 session,不隐含关闭整条连接。
  5. SESSION_CLOSE_ACK.close_status = draining,发送方必须继续按已知 operation 水位处理后续终结事件,直到收到 closed 或更高水位的关闭确认。

7.2 优先级与流等级

preview3 引入显式优先级与流等级语义,用于同连接多会话和同会话多 operation 的调度。

协议层至少要能表达:

  1. 会话优先级类,例如 interactive / balanced / background
  2. operation 优先级与 deadline 窗口。
  3. 动态 credit 在会话级与连接级的双层约束。
  4. 服务端对优先级降级、限流或抢占的显式回执。

preview3 不要求把具体调度算法写死成单一实现,但必须冻结这些语义对象和错误口径,避免不同实现对“背压”“抢占”“过期”的解释继续分叉。

7.2A 调度标准枚举冻结

preview3 首轮冻结以下标准枚举值:

session_priority_class:u8

名称语义
0interactive面向前台低时延交互,优先保证 deadline 与响应性
1balanced默认优先级,平衡吞吐与时延
2background面向后台任务或预取任务,可被更高优先级抢占

operation_state:u8

名称语义
0accepted已被接受并进入调度系统
1running已开始执行
2partial已产生可消费但未终结的部分结果
3waiting_tool等待工具或外部依赖继续执行
4superseded被新 operation 或新上下文替代
5cancelled被显式取消
6failed以错误终结
7completed正常完成

cancel_scope:u8

名称语义
0operation仅取消单个 operation
1subtree取消该 operation 及其子操作树
2group取消同一 operation_group_id 下的所有 operation
3session取消整个 session 下仍活跃的 operation

首轮约束:

  1. 所有实现都必须把这些数值视为协议枚举,而不是局部私有状态码。
  2. partialcompleted 允许在同一 operation 生命周期中先后出现;failed / cancelled / superseded / completed 属于终结状态。
  3. interactive 只表达调度优先级与 credit 倾向,不保证绝对资源独占。

8. preview3 高级缓存模型

preview2 已经有 cache object 与 object reference;preview3 需要把它升级为可租约、可版本化、可依赖追踪的 AI 运行时缓存。

preview3 缓存模型至少包含以下能力:

  1. lease:缓存对象或 schema 对象必须能声明 TTL、续租、到期策略和拥有者范围。
  2. version:对象引用必须能区分 object_idobject_version,不再把“换内容但沿用旧 key”留给宿主私下约定。
  3. dependency:对象、结果和 schema 必须能声明依赖关系,用于结果复用、缓存失效和一致性检查。
  4. observability:协议层必须能表达 cache miss、lease expired、dependency invalid、schema mismatch 等稳定错误原因。
  5. host-visible policy:客户端可以主动声明 prefetch、touch、lease renew、evict hint 或 result reuse 偏好。

preview3 不要求公共层直接冻结模型私有 KV-cache page 编码;这类对象仍应作为 profile-local 或 runtime-private object kind 存在。公共层负责冻结 lease contract、版本口径、依赖语义和错误行为。

8.1 lease / version / 错误口径冻结

preview3 首轮进一步冻结以下缓存公共口径:

  1. object_id 表示逻辑对象身份;在对象内容更新但逻辑身份不变时保持不变。
  2. object_version 表示同一 object_id 下的内容修订号;语义变化时必须单调递增。
  3. lease_id:u64 表示一次成功租约授予的稳定身份;续租保持同一 lease_id,重新授予产生新的 lease_id
  4. lease_owner_scope:u8 首轮冻结为 connection=0 / session=1 / operation=2
  5. host-visible policy 中的 prefetch / touch / renew / evict_hint / reuse_preference 都是显式提示,不得被解释为绕过版本、依赖或 schema 校验的强制命令。

cache_error_code:u32 首轮冻结为:

名称含义
0x00030000none无缓存错误
0x00030001cache_miss请求引用的对象不存在
0x00030002lease_expired请求引用的租约已过期
0x00030003version_mismatch请求引用的 object_version 与当前可用版本不一致
0x00030004dependency_invalid依赖对象或依赖 schema 已失效
0x00030005schema_mismatch对象与所需 schema/profile 解释不兼容

首轮约束:

  1. cache_miss / lease_expired / version_mismatch / dependency_invalid / schema_mismatch 必须在所有实现路径上保持稳定错误口径,不得被局部实现改写成私有字符串错误。
  2. 结果复用若依赖某个 object_id + object_version 或 schema 版本,则该依赖必须进入可观测关系图;依赖失效时必须返回稳定错误码或显式失效事件。
  3. runtime-private object kind 可以继续存在,但不得绕过上述 object_id / object_version / lease_id / cache_error_code 公共语义。

9. preview3 Schema / Profile Registry

preview3 不再把“继续增加 payload kind 枚举”当作主要扩展方式,而是引入标准 schema/profile registry。

设计目标:

  1. 公共层不预设单一默认 profile;首轮标准 profile 至少包含 tensortoken,并继续允许 structured_eventtool_deltaopaque_bytes 等 payload family 挂到 schema/profile registry 上。
  2. 具体 payload 语义通过 schema_id + schema_version + profile_id + stream_semantics 绑定,而不是每来一种新数据都新增一个公共 payload kind。
  3. schema object 进入 cache / lease 生命周期,可预装、引用、失效和版本回退。
  4. 不同实现不得各自解释 descriptor 私有字段,必须按统一 schema registry 规则处理。

preview3 因此至少需要标准化以下信息:

  1. schema descriptor object 的通用头。
  2. schema registry 的协商、安装、失效与版本冲突处理。
  3. typed payload descriptor 中与 schema/profile 绑定相关的标准字段。
  4. 未知 schema、未知 version、关键 schema 不兼容时的错误处理。

9.3 schema descriptor 通用头冻结

preview3 首轮将 schema descriptor 通用头固定为 32 字节,用于在不解析 profile 私有 body 的前提下完成版本、适用范围与路由判断。

字段类型说明
schema_idu32schema 标识
schema_versionu32schema 版本
profile_idu16该 schema 所属 profile
schema_flagsu16schema 行为标志
min_version_majoru8最低适用主版本
max_version_majoru8最高适用主版本
reserved0u16保留,发送端清零
body_bytesu32schema body 长度
dependency_countu16依赖 schema / object 条目数
default_stream_semanticsu16默认 stream semantics
schema_hashu64schema body 的稳定摘要

首轮约束:

  1. 通用头只解决“这个 schema 是谁、属于哪个 profile、适用于哪个主版本、body 多长、依赖多少对象”这类公共问题。
  2. 任何 profile 私有解释字段都必须进入 schema body,不得继续膨胀通用头。
  3. schema_hash 用于一致性校验与缓存去重,不直接替代 schema_id + schema_version 的逻辑身份。
  4. default_stream_semantics 只提供默认语义;具体 payload descriptor 仍可在单帧或单 operation 上覆盖。

schema_flags:u16 首轮冻结以下位定义:

bit掩码含义
00x0001cacheable:该 schema 可进入 cache / lease 生命周期
10x0002critical:未知或不兼容时必须拒绝
20x0004default_bindable:允许作为 session 默认 schema
30x0008hash_stable:相同 schema_id + schema_version 必须与相同 schema_hash 绑定
4-15保留发送端清零,接收端收到未知置位必须拒绝

stream_semantics:u16 / default_stream_semantics:u16 首轮冻结为:

名称语义
0default继承 profile/schema 默认解释
1snapshot当前 payload 为完整快照
2append当前 payload 追加到既有序列或流
3replace当前 payload 覆盖既有逻辑片段
4event当前 payload 表示离散事件语义
5tool_update当前 payload 表示工具调用或工具结果增量

9.1 首轮标准 profile 冻结

preview3 首轮标准 profile 先冻结为 tensor profiletoken profile,两者在公共层并列成立。

tensor profile 的最小标准语义保持:

  1. 面向块化或区域化数值载荷,而不是强制绑定渲染场景。
  2. 允许通过 schema/profile descriptor 声明 shape、dtype、layout、section/layout 解释与覆盖语义。
  3. partial / degraded / stale_reuse 在 tensor profile 下仍允许带 coverage 语义,但 coverage 不再是所有 profile 的默认要求。

token profile 的最小标准语义冻结为:

  1. 面向离散 token 或 token chunk 的增量输出,不要求把 token 序列伪装成 tensor section。
  2. 标准结果路径至少允许表达增量 token 片段、序列位置范围、完成状态与 stop/reason 口径。
  3. token profile 首轮不强制把 logits、全量候选分布或模型私有采样状态纳入公共必选字段;这些内容只能通过 schema/profile 扩展进入。
  4. token profile 的 partial 语义默认表示“序列尚未完成但当前 chunk 可消费”,而不是 tensor-style coverage 缺口。

9.1A 首轮标准注册表编号冻结

仅冻结结构布局还不够;如果标准 profile 与标准 schema 的公共编号不落表,conformance 向量、多语言 helper 和宿主封装仍会各自占号。preview3 首轮因此把当前已经进入公共互通面的最小标准注册表也一起冻结。

profile_id:u16 首轮冻结以下公共编号:

名称含义
0x0000unspecified当前 session 或 payload 未显式绑定标准 profile
0x0001tensor标准 tensor profile
0x0002token标准 token profile

首轮约束:

  1. 新的标准 profile 在进入 canonical vector、conformance baseline 或多语言 SDK 公共 API 前,必须先在此表中占号。
  2. profile_id = 0 只表示“未显式绑定标准 profile”,不得被任何实现偷换成“默认就是 tensor”或别的 runtime 私有 profile。
  3. 任意语言绑定若暴露 tensor / token 的公共常量,必须使用上述编号,不得各自重排。

schema_id:u32 + schema_version:u32 首轮至少冻结以下公共 registry 锚点:

profile_idschema_idschema_version名称默认 stream_semantics说明
0x00020x000010013llm.chat.delta.v1append首轮标准 token 增量 schema,用于 token chunk 的最小公共解释路径

首轮约束:

  1. 上表是当前 canonical vector 与跨语言 conformance 已消费的最小标准 schema 锚点;在新增公共向量或 host API 前,不得私自给别的“标准 schema”占号。
  2. schema_id = 0 继续表示“当前上下文未绑定默认 schema”;它不是某个隐式标准 schema 的别名。
  3. 若后续要补 tensor 或其他标准 profile 的公共 schema,占号必须先回填到协议设计,再进入 conformance 与 SDK。

9.2 首轮 descriptor 最小字段边界

preview3 首轮要求 typed payload descriptor 至少能稳定绑定以下公共字段:

  1. profile_id
  2. schema_id
  3. schema_version
  4. stream_semantics
  5. offset
  6. length
  7. flags

在此之上,不同标准 profile 的最小语义字段边界冻结为:

  1. tensor profile descriptor 必须能唯一确定 payload 的数值解释方式,包括 shape/layout 解释入口、dtype 解释入口,以及是否存在 profile-local coverage/section 语义。
  2. token profile descriptor 必须能唯一确定 payload 的序列解释方式,包括 token 单位、位置/范围口径、增量/终止语义,以及 stop-reason 是否在本帧显式给出。
  3. 除上述最小字段外,任何更高层 profile 私有字段都必须通过 schema/profile 扩展进入,不得把某个单一 runtime 的私有采样或张量布局字段直接抬升为公共必选字段。

9.2A typed payload descriptor 固定布局冻结

preview3 首轮将 typed payload descriptor 的公共布局固定为 24 字节:

字段类型说明
profile_idu16该 payload 所属 profile
descriptor_flagsu16descriptor 行为标志
schema_idu32解释该 payload 的 schema id
schema_versionu32解释该 payload 的 schema version
stream_semanticsu16该 payload 的流语义
reserved0u16保留,发送端清零
offsetu32相对 typed payload frame region 的字节偏移
lengthu32payload 字节长度

descriptor_flags:u16 首轮冻结以下位定义:

bit掩码含义
00x0001terminal:该 payload 携带当前 profile/operation 的终止片段
10x0002partial:该 payload 为可消费但未终结的增量片段
20x0004schema_override:本 descriptor 显式覆盖 session 默认 schema
30x0008profile_hint_present:profile-local 解释所需的附加 hint 存在于 schema/profile body 中
4-15保留发送端清零,接收端收到未知置位必须拒绝

首轮约束:

  1. 所有标准 profile 都必须使用同一 24B descriptor 公共头,不得按语言或 profile 自行改字节布局。
  2. tensor 与 token 的最小解释入口由 profile_id + schema_id + schema_version + stream_semantics + descriptor_flags 共同决定;更细粒度字段继续走 schema/profile body。
  3. offset / length 一律相对 typed payload frame region 解释,不允许某个绑定改成相对整包 body 或私有子区域。
  4. terminalpartial 可以同时为零,但不能同时表示互相冲突的终结语义;profile 私有终结细节继续由 schema/profile 解释。

这使 preview3 可以支持更多数据类型,但不需要每次都重新冻结一张不断膨胀的公共位图表。

9.4 schema registry 流程与错误行为冻结

preview3 首轮将 schema registry 的最小流程冻结为:

  1. install:当 schema_id + schema_version + schema_hash 尚未存在时安装新 schema。
  2. update:同一 schema_id 引入更高 schema_version 的新 schema;旧版本是否保留由 policy 决定,但不得改变已安装版本的 schema_hash
  3. invalidate:按 schema_id + schema_version 或依赖关系显式失效 schema。
  4. version_conflict:若收到相同 schema_id + schema_version 但不同 schema_hash,必须拒绝并返回稳定错误。

schema_error_code:u32 首轮冻结为:

名称含义
0x00040000none无 schema 错误
0x00040001schema_unknown请求的 schema_id 不存在
0x00040002schema_version_unknown请求的 schema_version 不存在
0x00040003schema_hash_conflict相同 schema_id + schema_version 对应不同 schema_hash
0x00040004schema_incompatibleschema 与当前 profile、主版本或关键约束不兼容
0x00040005schema_dependency_missingschema 依赖项不存在或不可用
0x00040006schema_update_rejectedschema 更新或失效请求被策略拒绝

首轮约束:

  1. schema_flags.critical 置位且接收方无法识别 schema、版本或依赖时,必须返回稳定 schema_error_code,不得静默跳过。
  2. typed payload descriptor 与 schema_id / schema_version / profile_id 的绑定是强约束;不得在实现侧改写为“看起来差不多就继续解析”。
  3. install / update / invalidate / version_conflict 的标准流程必须在所有实现中保持一致;宿主封装不得私自改写冲突结果。

10. preview3 Agent / Workflow 运行时语义

preview2 已经能携带 structured_eventtool_delta;preview3 要补的是它们在运行时中的生命周期语义。

preview3 至少要表达以下对象:

  1. operation_id:一次推理、生成、工具调用或多步工作流操作的唯一标识。
  2. parent_operation_id:用于表达操作树、子任务和依赖链。
  3. operation_group_id:用于一组操作的调度、取消或结果订阅。
  4. operation_state:例如 accepted / running / partial / waiting_tool / superseded / cancelled / failed / completed
  5. cancel_scope:允许取消单 operation、子树、group 或整个 session。

这些语义的目标不是把所有 agent 框架都写成统一 DSL,而是为“多步 AI 工作流在单连接长会话中运行”提供跨语言统一的生命周期语义。

10.1 structured_event / tool_delta 归属冻结

preview3 首轮明确冻结以下边界:

  1. structured_eventtool_delta 默认仍是 payload family,不自动提升为独立 profile。
  2. 只有当某个事件会影响跨语言可互通的 operation lifecycle 时,它的最小语义才进入公共 operation 模型;否则仍留在 schema/profile payload 层。
  3. operation_idparent_operation_idoperation_group_idoperation_statecancel_scope 属于公共 lifecycle 语义,必须可脱离具体 payload 单独解释。
  4. 工具调用参数、工具结果正文、富事件负载等高层内容默认继续留在 structured_event / tool_delta payload 中,通过 schema/profile registry 解释。
  5. 因此,preview3 不把工具调用正文或事件正文硬编码成公共固定 metadata;公共层只冻结 lifecycle、路由、取消和状态迁移语义。

11. preview3 流控、恢复与观测

preview3 需要把 preview2 的 flow control 与 migration 再向前推进一层。

至少应补齐:

  1. 连接级 credit 与会话级 credit 的双层回执。
  2. 优先级感知的 FLOW_UPDATE,允许服务端对不同 session / operation 单独调整窗口。
  3. 多 session 场景下的恢复、resume token 与 resume_from_operation 语义。
  4. 统一的 result / event / control 观测字段,使多语言宿主可稳定记录 queue、compute、transport、backpressure、cache 命中与 lease 事件。

preview3 首轮将恢复对象明确冻结为 session;frame 不是恢复对象,operation 只是 session 恢复内的水位与可观测边界。

11.1 FLOW_UPDATE 三层 scope 与 metadata 冻结

preview3 首轮将 FLOW_UPDATE 固定为 32 字节 fixed metadata,用于统一表达 connection、session、operation 三层 credit 与 backpressure 更新,而不是让不同实现各自定义私有 credit 包。

字段类型说明
scope_kindu8更新作用域,取值见下文冻结枚举
update_reasonu8更新原因,取值见下文冻结枚举
backpressure_levelu8当前背压等级,取值见下文冻结枚举
reserved0u8保留,发送端清零
connection_creditu16连接级可并发 credit
session_creditu16会话级可并发 credit
operation_creditu16operation 级可并发 credit
reserved1u16保留,发送端清零
operation_idu64scope_kind=operation 时指向目标 operation;否则为 0
retry_after_msu32建议重试或重新探测窗口;无则为 0
credit_epochu32单调递增的 credit 更新代号
flow_flagsu32flow-control 行为位图

scope_kind:u8 首轮冻结为:

名称语义
0connection更新整条连接的总 credit 或总背压状态
1session更新某个 session 的 credit 或背压状态
2operation更新某个 operation 的 credit 或背压状态

update_reason:u8 首轮冻结为:

名称语义
0grant新授予 credit 或放宽限制
1reduce收紧 credit 窗口
2pause暂停继续发送新操作
3resume从暂停状态恢复
4congestion因拥塞进入限流或背压状态

backpressure_level:u8 首轮冻结为:

名称语义
0none无背压
1soft建议发送方主动降速,但不强制停止
2hard发送方应停止提交新 operation,直到收到后续放宽更新

flow_flags:u32 首轮冻结以下位定义:

bit掩码含义
00x00000001credit_valid:对应 scope 的 credit 字段有效
10x00000002retry_after_validretry_after_ms 有效
20x00000004background_only:只允许后台或低优先级 operation 继续推进
30x00000008drain_in_flight_only:仅允许现有 in-flight operation 排空,不再接受新 operation
4-31保留发送端清零,接收端收到未知置位必须拒绝

首轮约束:

  1. scope_kind=connection 时,header session_id 必须为 0operation_id 必须为 0;发送方只读取 connection_credit
  2. scope_kind=session 时,header session_id 必须为目标 session,operation_id 必须为 0;发送方优先读取 session_credit
  3. scope_kind=operation 时,header session_id 必须为目标 session,operation_id 必须非零;发送方优先读取 operation_credit
  4. credit_epoch 必须在同一 scope 上单调递增;接收方不得接受比当前 epoch 更旧的 update。
  5. hard 背压不是错误,它表示新的提交窗口被临时收紧;发送方应等待后续 grant / resume 或更高 epoch 的 FLOW_UPDATE
  6. 该 fixed metadata 只解决统一 credit/backpressure 路由和控制,不承载 profile 私有排队指标;更细粒度可观测数据仍应通过 schema/profile 或专用 observability 路径扩展。

11.2 恢复对象与 resume_from_operation 语义冻结

preview3 首轮冻结以下恢复语义:

  1. resume_token 始终绑定到 session,而不是 connection 或 frame。
  2. resume_from_operation_id 是 session 恢复内的可选水位,用于声明“从哪个 operation 之后重新同步终结结果与事件”。
  3. 成功恢复时,SESSION_OPEN_ACK.session_status 必须返回 resumed,且服务端必须以恢复后的 session 继续投递未完成或未确认的 operation 生命周期事件。
  4. resume_token 无效、过期、越权或与请求的 profile/schema/session 能力不兼容,服务端必须返回 session_error_code = resume_rejected
  5. 恢复不得把历史 frame 视为独立恢复对象;任何 frame 级或单包级补偿都必须从属于 session 恢复语义。

12. preview3 固定布局 offset registry

本节把前文已经冻结的 fixed metadata / descriptor 布局集中成 offset registry,供实现、golden vector 和 conformance runner 直接消费。所有 offset 均从对应结构的第 0 字节开始计算,所有多字节字段均为 little-endian。

12.1 SESSION_OPEN metadata,48 字节

offset字段类型
0requested_session_idu32
4profile_idu16
6priority_classu8
7session_flagsu8
8schema_idu32
12schema_versionu32
16default_deadline_msu32
20max_in_flight_operationsu16
22reserved0u16
24lease_ttl_hint_msu32
28resume_token_bytesu32
32auth_bytesu32
36session_extension_bytesu32
40client_session_tagu64

12.2 SESSION_OPEN_ACK metadata,56 字节

offset字段类型
0session_idu32
4accepted_profile_idu16
6accepted_priority_classu8
7session_statusu8
8schema_idu32
12schema_versionu32
16granted_operation_creditu16
18max_in_flight_operationsu16
20lease_ttl_msu32
24resume_window_msu32
28resume_token_bytesu32
32session_extension_bytesu32
36server_session_tagu64
44route_scope_idu32
48session_error_codeu32
52session_flags_acku32

12.3 SESSION_CLOSE metadata,24 字节

offset字段类型
0close_reasonu16
2in_flight_policyu8
3reserved0u8
4drain_timeout_msu32
8last_operation_idu64
16session_error_codeu32
20session_close_tagu32

12.4 SESSION_CLOSE_ACK metadata,16 字节

offset字段类型
0close_statusu8
1reserved0u8
2reserved1u16
4last_operation_idu64
12session_error_codeu32

12.5 FLOW_UPDATE metadata,32 字节

offset字段类型
0scope_kindu8
1update_reasonu8
2backpressure_levelu8
3reserved0u8
4connection_creditu16
6session_creditu16
8operation_creditu16
10reserved1u16
12operation_idu64
20retry_after_msu32
24credit_epochu32
28flow_flagsu32

12.6 Schema descriptor header,32 字节

offset字段类型
0schema_idu32
4schema_versionu32
8profile_idu16
10schema_flagsu16
12min_version_majoru8
13max_version_majoru8
14reserved0u16
16body_bytesu32
20dependency_countu16
22default_stream_semanticsu16
24schema_hashu64

12.7 Typed payload descriptor,24 字节

offset字段类型
0profile_idu16
2descriptor_flagsu16
4schema_idu32
8schema_versionu32
12stream_semanticsu16
14reserved0u16
16offsetu32
20lengthu32

13. 协议冻结摘要

本文档当前冻结的是以下协议主题:

  1. NNRP/1.0 代码层身份、40B 公共头、msg_type 编号表和 meta_len + body_len 长度模型。
  2. 连接/会话/operation 的分层边界,以及 SESSION_OPEN / SESSION_OPEN_ACK、显式 session close、恢复对象与路由字段语义。
  3. FLOW_UPDATE、优先级、取消范围、operation 生命周期和恢复水位等运行时语义。
  4. cache lease、schema/profile registry、32B schema descriptor、24B typed payload descriptor、固定 offset registry 及其标准错误口径。
  5. structured_event / tool_delta 与公共 lifecycle 语义之间的边界,以及跨语言 conformance、golden vector、枚举值和错误码基线。

具体实现的 API 形状、打包和发布策略,不属于本文冻结范围。

NNRP Documentation