Skip to content

运行时控制与对象

C# Preview 4 API 固定 NNRP/1 托管侧必须实现的运行时控制和对象引用接口。命名采用 C# 风格, 热路径使用 ReadOnlySpan<byte>,语义与 Rust metadata 保持一致。

导入

csharp
using Nnrp.Core;
using Nnrp.Runtime;

NnrpRuntimeControl.Encode

编码一个 Preview 4 控制面 metadata。

参数类型必填说明
messageTypeMessageTypePreview 4 控制消息类型。
metadata运行时控制 metadatamessageType 匹配的数据结构。
tailReadOnlySpan<byte>扩展字节、诊断字节、进度 body 或 partial result body。
返回
byte[]
csharp
var payload = NnrpRuntimeControl.Encode(
    MessageType.Progress,
    new ProgressMetadata(
        OperationId: 42,
        ProgressSequence: 1,
        StageCode: 2,
        PercentX100: 2500,
        ObjectId: 0,
        BodyBytes: 0));

NnrpRuntimeControl.Decode

解码一个控制面 metadata payload。

参数类型必填说明
messageTypeMessageType决定 metadata 布局的消息类型。
payloadReadOnlySpan<byte>metadata 字节和声明的 tail。
返回
DecodedRuntimeControlMetadata

NnrpRuntimeObject.Encode

编码对象、对象引用、对象增量、缓存引用和缓存 miss metadata。

参数类型必填说明
messageTypeMessageTypeObjectDeclareObjectRefObjectReleaseObjectPatchObjectDeltaCacheReferenceCacheMiss
metadata运行时对象 metadatamessageType 匹配的数据结构。
tailReadOnlySpan<byte>扩展字节、诊断字节或 delta payload。
返回
byte[]

NnrpRuntimeObject.Decode

解码一个运行时对象或缓存 metadata payload。

参数类型必填说明
messageTypeMessageType决定 metadata 布局的消息类型。
payloadReadOnlySpan<byte>metadata 字节和声明的 tail。
返回
DecodedRuntimeObjectMetadata

NnrpWebSocketFrameCodec.Encode

NnrpWebSocketFrameCodecNnrp.Transport.WebSocket 导出。它构建一个 WebSocket binary message 承载的二进制 runtime frame;text message 永远不能作为 NNRP data。

参数类型必填说明
headerRuntimeFrameHeader除 metadata/body 长度之外的 header 字段;函数从 buffer 长度推导。
metadataReadOnlySpan<byte>metadata payload。
bodyReadOnlySpan<byte>body payload。
返回
byte[]

NnrpWebSocketFrameCodec.Decode

把一个 WebSocket 二进制帧解码为 header,以及由 decoder 持有的 metadata/body 副本。

参数类型必填说明
frameReadOnlySpan<byte>一个完整 WebSocket binary message。
返回
DecodedRuntimeFrame

NnrpWebSocketFrameCodec.DecodeBatch

解码本地 buffer 或测试夹具里的连续二进制帧。

参数类型必填说明
batchReadOnlySpan<byte>连续帧。
limitint最大解码帧数;0 表示不限制。
返回
IReadOnlyList<DecodedRuntimeFrame>

DecodedRuntimeFrame 暴露以下不可变投影:

属性类型说明
HeaderRuntimeFrameHeader由调用方控制的 common-header 字段。
MetadataReadOnlyMemory<byte>由 decoder 持有的 metadata 副本。
BodyReadOnlyMemory<byte>由 decoder 持有的 body 副本。

两个字节区域的 backing storage 均由 decoder 持有,不会借用输入 buffer。Decode 会拒绝截断 header、metadata/body 长度不匹配、reserved header 值、single-frame decode 中的 trailing byte, 以及超过 limit 的 frame 数量。

NnrpRuntimeEvent

NnrpRuntimeEvent 是 client/server event union 携带的不可变 wire event。它的公开属性严格为 HeaderMetadataTail。消息类型只通过 Header.MessageType 暴露;event 不重复 common-header 或 tail 字段。

NnrpRuntimeEventMetadata 是由 Kind 和 typed Get<T>() 组成的闭合 union。 NnrpRuntimeEventTail 是由 KindMatch<TResult>(...) 组成的闭合 union,包含下列变体。 Match 要求为每一行提供 callback,因此应用代码不会静默忽略新增 tail 形态。

NnrpRuntimeEventTailKindMatch 传入的 active value
None无值
Body一个 owned ReadOnlyMemory<byte> body
Diagnostic一个 owned ReadOnlyMemory<byte> diagnostic
MetadataBodyAndDelta相互独立的 owned metadataBodydelta

Event 和 tail 类型不公开扁平的 BodyDiagnosticCapabilityEntriesHintBodyTraceAttributesObjectMetadataDeltaCacheMetadata 属性。调用方先判别 Metadata.KindTail.Kind,再使用 Metadata.Get<T>()Tail.Match

事件不暴露 raw native buffer。Native-owned 数据必须复制,或在到达应用前放进显式 lifetime guard。

NnrpPreview4CapabilityTokens

NnrpPreview4CapabilityTokens 是 Preview4 冻结 capability 与 transport 目录的 C# 映射。常量必须 保留协议原始字符串;SDK 代码不得自行推导或改名。

常量分组C# 常量冻结值
控制面ControlCancelAbortControlSupersedeControlPriorityUpdateControlDeadlineExpireControlProgressPartialControlCreditBackpressureControlCapabilityCostsControlRouteExecutionHintControlTraceContextControlResultDropReasonControlDegradeProfileControlBudgetUpdateControlRecoverableErrorcontrol.cancel_abortcontrol.supersedecontrol.priority_updatecontrol.deadline_expirecontrol.progress_partialcontrol.credit_backpressurecontrol.capability_costscontrol.route_execution_hintcontrol.trace_contextcontrol.result_drop_reasoncontrol.degrade_profilecontrol.budget_updatecontrol.recoverable_error
运行时对象与缓存ObjectLifecycleObjectDeltaObjectCostObjectOwnershipCacheReferenceobject.lifecycleobject.deltaobject.costobject.ownershipcache.reference
传输TransportTcpTransportQuicTransportIpcTransportWebSockettcpquicipcwebsocket

该类还公开只读 ControlRuntimeObjectAndCacheTransportsAllCapabilities 集合。 AllCapabilities 不包含 transport 名称,因为 transport 可用性与协议 capability 声明分开上报。

运行时控制 Metadata

类型消息类型冻结属性
ControlRequestMetadataCancel, AbortOperationId, ControlSequence, ReasonCode, SourceRole, Flags, DiagnosticBytes
SchedulingMetadataPriorityUpdate, Deadline, ExpireAtOperationId, ControlSequence, PriorityClass, PriorityDelta, DeadlineUnixMs, Flags
SupersedeMetadataSupersedeOldOperationId, NewOperationId, ControlSequence, DropReasonCode, Flags, DiagnosticBytes
BudgetMetadataBudgetUpdateOperationId, ComputeBudgetUnits, MemoryBudgetBytes, BandwidthBudgetBytes, TokenBudget, Flags
ProgressMetadataProgressOperationId, ProgressSequence, StageCode, PercentX100, ObjectId, BodyBytes
PartialResultMetadataPartialResultOperationId, ResultSequence, ObjectId, DeltaSequence, BodyBytes, Flags
PressureMetadataBackpressure, CreditUpdateScopeId, CreditWindow, PressureLevel, PressureReason, RetryAfterMs, Flags
CapabilityMetadataCapabilityNegotiation, DegradeProfileProfileId, CapabilityCount, CostModelId, PreferenceRank, LimitBytes, LimitUnits, BodyBytes, Flags
RouteHintMetadataRouteHint, ExecutionHintOperationId, RouteId, ExecutorClass, AffinityClass, DeadlineUnixMs, BodyBytes, Flags
TraceContextMetadataTraceContextTraceId, SpanId, ParentSpanId, StageCode, Flags, BodyBytes
ResultDropReasonMetadataResultDropReasonOperationId, ResultSequence, DropReasonCode, SourceRole, Flags, DiagnosticBytes
RecoverableErrorMetadataErrorRecoverableErrorCode, ErrorScope, RecoveryAction, SourceRole, Flags, RetryAfterMs, RelatedSessionId, RelatedFrameId, RelatedViewId, DiagnosticBytes
RetryAfterMetadataRetryAfterScopeId, ControlSequence, RetryAfterMs, JitterMs, ReasonCode, SourceRole, Flags, DiagnosticBytes

SupersedeMetadata.DropReasonCodeResultDropReasonMetadata.DropReasonCode 的类型固定为 NnrpResultDropReasonCode,不再暴露裸 ushort。编码器与解码器必须拒绝保留范围 0x000a..0x7fff;根据运行时控制取值注册表,0x8000..0xffff 仍用于私有扩展。

运行时对象 Metadata

类型消息类型冻结属性
ObjectDescriptorMetadataObjectDeclareObjectId, ObjectKind, ProducerRole, ConsumerRole, SessionId, ByteSize, ComputeCostUnits, MemoryLocationHint, OwnershipHint, LifetimeHintMs, MetadataBytes
ObjectReferenceMetadataObjectRefObjectId, OperationId, ObjectVersion, Offset, Length, Flags, MetadataBytes
ObjectReleaseMetadataObjectReleaseObjectId, OperationId, ReleaseReason, SourceRole, Flags, DiagnosticBytes
ObjectDeltaMetadataObjectPatch, ObjectDeltaObjectId, DeltaSequence, RegionOffset, RegionBytes, DeltaBytes, Flags, MetadataBytes
CacheReferenceMetadataCacheReferenceCacheNamespace, CacheKeyHi, CacheKeyLo, ProfileId, ReuseScope, LeaseId, ProducerTraceId, ExpirationHintMs, MetadataBytes, Flags
CacheMissMetadataCacheMissCacheNamespace, CacheKeyHi, CacheKeyLo, MissReason, ProfileId, DiagnosticBytes

CacheNamespace 类型为 uint,两个 cache-key word 类型均为 ulongCachePutMetadataCacheAckMetadataCacheInvalidateMetadataObjectReferenceBlock 使用相同字段宽度与命名。

本地缓存租约状态

NnrpCacheLease 是已经授予租约的 C# 本地校验值,不是 wire payload,也不是 native handle。

C# 属性类型协议字段
ObjectIdNnrpCacheObjectIdobject_id
ObjectVersionulongobject_version
LeaseIdulonglease_id
OwnerScopeCacheLeaseOwnerScopeowner_scope
OwnerIdulongowner_id
GrantedAtMillisecondsulonggranted_at_ms
TtlMillisecondsuintttl_ms

NnrpCacheObjectId 包含 CacheNamespace: uintCacheKeyHigh: ulongCacheKeyLow: ulongObjectKind: CacheObjectKindCacheLeaseOwnerScope 的取值为 Connection = 0Session = 1Operation = 2。本地校验应使用 ExpiresAtMillisecondsTryValidateLiveAtTryValidateVersion

NnrpCacheObjectVersion 将完整对象身份与 ObjectVersionSchemaIdSchemaVersion 绑定。Native 缓存操作统一返回封闭结果 NnrpCacheLeaseResult

C# 属性类型
ObjectIdNnrpCacheObjectId
OutcomeNnrpCacheLeaseOutcome
LeaseNnrpCacheLease?
ObjectVersionNnrpCacheObjectVersion?
Diagnosticstring?

NnrpCacheLeaseOutcome 包含 ValidExpiredRenewedReleasedMissing。如果结果中 存在 lease 或 object-version,它们必须与 ObjectId 使用同一份完整对象身份。

CachePolicyOptions

CachePolicyOptions 是 runtime-control profile 定义的本地显式启用策略。它本身不会执行查询, 也不会自动序列化缓存帧。

C# 属性类型默认值
Enabledboolfalse
ReuseScopeCacheReuseScope?null
ExpirationHintMillisecondsulong0
InvalidationReasonCachePolicyInvalidationReasonExplicit

CachePolicyInvalidationReason 包含 ExplicitDependencyInvalidatedLeaseExpiredVersionMismatchSchemaMismatch。启用策略时必须提供 ReuseScope;禁用时要求 ReuseScope == nullExpirationHintMilliseconds == 0

连接与会话生命周期

NnrpConnectionLifecycle 是面向应用的 Preview4 生命周期模型。它从 Open 开始,按 session id 稳定排序会话,并通过 SessionsTryGetSessionSnapshot 暴露不可变会话快照。 TryCloseConnection 会将连接及其全部已安装会话迁移到 Closed

NnrpSessionLifecycle 暴露冻结的会话快照字段:SessionIdStateProfileIdPriorityClassSchemaIdSchemaVersionMaxInFlightOperationsRouteScopeIdLastOperationIdSessionErrorCodeAcceptsSessionScopedMessagesAcceptsNewOperations 是 C# 的派生便利属性,不是额外线路字段。

状态迁移方法包括 TryApplySessionOpenAckTryBeginSessionCloseTryApplySessionCloseAckTryValidateFlowUpdate。关闭确认被拒绝时,会话必须恢复到此前建立的 OpenResumed 状态。未知 close-status 返回 NnrpProtocolFailureTry 方法不会把对端的 非法状态转换为语言异常。

Schema Registry

NnrpSchemaDescriptorHeader 是冻结 schema descriptor header 的 32 字节 C# 投影,包含 schema 身份与版本、profile 绑定、flags、支持的协议版本范围、body 大小、依赖数量、默认流语义和 schema hash。使用 TryParseTryWrite 进行带校验的线路读写。

NnrpSchemaRegistry(SchemaId, SchemaVersion) 保存 descriptor。WithStandardProfiles 安装标准绑定;TryInstallTryGetTryInvalidateTryValidateDescriptorBinding 实现公开的 registry 生命周期。SchemaRegistryAction 区分新增、已存在、更新和失效,SchemaErrorCode 承载协议定义的失败原因。

Native Object Delta Metadata Copies

NnrpNativeRuntimeObjects 负责 Rust-backed metadata buffer helper。两个方法都返回必须释放的 NnrpNativeObjectMetadataBuffer

方法参数Payload 布局
AcquireObjectPatchMetadataCopyObjectDeltaMetadata metadata, byte[] metadataTail, byte[] deltaObjectPatch metadata + metadata tail + delta bytes
AcquireObjectDeltaMetadataCopyObjectDeltaMetadata metadata, byte[] metadataTail, byte[] deltaObjectDelta metadata + metadata tail + delta bytes

两个 helper 都会在申请 native-owned copy 前校验 MetadataBytesDeltaBytes

运行时枚举

枚举成员
NnrpOperationState : byteAccepted = 0Running = 1Partial = 2WaitingTool = 3Superseded = 4Cancelled = 5Failed = 6Completed = 7
NnrpResultTerminalState : byteSuccess = 0Cancelled = 1Dropped = 2Error = 3
NnrpResultDropReasonCode : ushortNone = 0DeadlineExpired = 1Superseded = 2PeerCancelled = 3Backpressure = 4CapabilityMismatch = 5BudgetExceeded = 6ObjectInvalidated = 7TransportClosed = 8ConformanceInjection = 9
RuntimeObjectKindUnspecified, Tensor, TokenBlock, ImageTile, FeatureMap, ToolResult, TraceSegment, OpaqueBytes, DocumentChunk, AudioChunk, VideoChunk, RoutePlan, CacheManifest
RuntimeRoleUnspecified, Client, Server, Runtime, Subagent, Tool, Scheduler, ConformanceRunner
MemoryLocationHintUnspecified, HostMemory, DeviceMemory, SharedMemory, RemoteMemory, MmapFile, ObjectStore
OwnershipHintUnspecified, ProducerOwned, ConsumerOwned, SessionOwned, Borrowed, TransferOnRef, ReleaseOnDrop
ObjectReleaseReasonCompleted, Cancelled, Expired, Replaced, Invalidated, OwnerClosed, LeaseExpired, ConformanceInjection
CacheReuseScopeOperation, Session, Connection, Global, Tenant, Profile
CacheMissReasonUnknown, NotFound, Expired, Invalidated, SchemaMismatch, ProducerUnavailable, LeaseRequired, PermissionDenied

NnrpOperationStateNnrpResultTerminalState 严格映射 canonical Rust 的 OperationStateResultTerminalState 注册表。终态映射固定为 Completed -> SuccessCancelled -> CancelledSuperseded -> DroppedFailed -> Error;非终态 operation 不存在 terminal result state。

RuntimeFrameHeader

RuntimeFrameHeaderNnrp.Core 以不可变 record struct 导出,是 runtime event 和 NnrpWebSocketFrameCodec 共用的 role-neutral header projection,不是第二套协议 header。它包含 所有调用方可控的公共头字段,不包含 native handle 或 session 的 generation 状态。

属性类型说明
MessageTypeMessageType帧消息类型。
FlagsHeaderFlagsHeader flags。
SessionIduintSession id。
FrameIduintFrame id。
ViewIdushort逻辑 lane 或 view id。
RouteIdushort路由或调度 id。
TraceIdulong端到端 trace id。
VersionMajorbyte协议主版本;默认使用 NnrpHeader.CurrentVersionMajor
WireFormatbyteWire format;默认使用 NnrpHeader.CurrentWireFormat

MessageType 必填,其余值使用协议零值或当前版本默认值。Codec 写入固定 magic 和 40-byte header length,并从传入 buffer 推导 metadata/body 长度。Decode 必须无损返回上述九个调用方可控字段。

NNRP Documentation