Skip to content

C# — 枚举

所有枚举类型定义在 Nnrp.Core 命名空间中。与 Python SDK 的枚举一一对应,值完全相同(线路兼容)。

导入

csharp
using Nnrp.Core;

线路格式

WireFormat : byte

成员说明
Current0当前唯一支持的格式(NNRP/1)

消息类型

MessageType : byte

成员说明
ClientHello0x01客户端握手
ServerHelloAck0x02服务端握手应答
SessionPatch0x03会话参数补丁
SessionPatchAck0x04会话补丁应答
Close0x05优雅关闭
Error0x06协议错误
FrameSubmit0x10帧提交
FrameCancel0x11取消帧
ResultPush0x12推送结果
ResultDrop0x13丢弃结果通知
CachePut0x14存储缓存对象
CacheAck0x15缓存存储结果
CacheInvalidate0x16缓存失效
FlowUpdate0x17流控窗口更新
ResultHint0x18结果提示
TransportProbe0x19路径探测
TransportProbeAck0x1A路径探测应答
SessionMigrate0x1B会话迁移通知
SessionMigrateAck0x1C会话迁移确认
Ping0x20保活探测
Pong0x21保活应答
Cancel0x30取消操作
Abort0x31中止操作作用域
PriorityUpdate0x32更新操作优先级
Deadline0x33设置操作截止时间
ExpireAt0x34设置操作过期时间
Supersede0x35用新操作替换旧操作
BudgetUpdate0x36更新计算、内存、带宽或 token 预算
Progress0x37流式进度
PartialResult0x38流式部分结果
Backpressure0x39背压和重试提示
CreditUpdate0x3A更新运行时 credit
CapabilityNegotiation0x3B协商能力、成本和限制
DegradeProfile0x3C选择降级 profile
RouteHint0x3D路由提示
ExecutionHint0x3E执行提示
TraceContext0x3FTrace/span 上下文
ResultDropReason0x40说明结果丢弃原因
ObjectDeclare0x41声明运行时对象
ObjectRef0x42引用运行时对象
ObjectRelease0x43释放运行时对象
ObjectPatch0x44Patch 运行时对象
ObjectDelta0x45运行时对象增量
CacheReference0x46引用可复用缓存对象
CacheMiss0x47报告缓存 miss
ErrorRecoverable0x48可恢复错误
RetryAfter0x49请求延迟重试

包头标志

HeaderFlags : byte

成员位掩码说明
None0x00无标志
AckRequired0x01需要确认
CanDrop0x02允许丢弃
Stale0x04数据已过期
Eos0x08流结束
Retransmit0x10重传
Keyframe0x20关键帧

帧与输入

FrameClass : byte

成员说明
Keyframe0完整关键帧
Delta1增量帧
Retransmit2重传帧
Discardable3可丢弃帧

InputProfile : byte

成员说明
Unspecified0未指定
ChangedTilesLuma1变化瓦片亮度
DenseLumaFrame2完整帧亮度

TileIndexMode : byte

成员说明
DenseRange0密集连续区间
RawU161原始 uint16
DeltaU162增量 uint16
Bitset3位图

Tensor 数据枚举

TensorRole : byte

Tensor 在推理管道中的角色(由服务端 Profile 定义)。

CodecId : byte

编解码器 ID,具体值由 Profile 协商确定。

DTypeId : byte(对应 TensorDType

成员说明
Fp160FP16
Fp321FP32
Fp8E4M32FP8 E4M3
Fp8E5M23FP8 E5M2
Int84INT8
UInt85UINT8
Int166INT16
UInt167UINT16

TensorLayoutId : byte

成员说明
Nhwc0NHWC
Nchw1NCHW

ScalePolicy : byte

成员说明
None0无缩放
Linear1线性缩放
ZeroPoint2带零点缩放

结果枚举

ResultStatusCode : ushort

成员说明
Success处理成功
Degraded降质处理成功
Rejected请求被拒绝
Failed处理失败

ResultFlags : ushort

成员位掩码说明
None0x0000无标志
Stale0x0001来自过期数据
Fallback0x0002降级 fallback
Partial0x0004不完整结果

BudgetPolicy : byte

成员位掩码说明
None0x00严格模式
AllowPartial0x01允许部分结果
AllowStaleReuse0x02允许重用过期缓存
AllowDegraded0x04允许降质
AllowDrop0x08允许丢弃

SubmitMode : byte

成员说明
Inline0内联
Reference1引用缓存
Mixed2混合

ResultClass : byte

成员说明
Complete0完整
Partial1部分
StaleReuse2缓存重用
Degraded3降质

载荷类型

PayloadKind : byte

成员位掩码说明
None0x00
Tensor0x01Tensor
TokenChunk0x02Token 流块
AudioChunk0x04音频块
VideoChunk0x08视频块
StructuredEvent0x10结构化事件
ToolDelta0x20Tool 增量
OpaqueBytes0x40不透明字节

错误枚举

ErrorCode : ushort

成员说明
UnsupportedVersion0x0001不支持的版本
AuthFailed0x0002认证失败
InvalidState0x0003非法状态
MalformedHeader0x0004包头格式错误
MalformedBody0x0005包体格式错误
UnsupportedCapability0x0006不支持的能力
LimitExceeded0x0007超出限制
FrameExpired0x0008帧已过期
FrameCancelled0x0009帧已取消
CacheMiss0x000A缓存未命中
ServerBusy0x000B服务端繁忙
InternalError0x000C内部错误

传输与连接枚举

TransportId : byte

成员说明
Unspecified0未指定
Quic1QUIC
Tcp2TCP
Ipc3本地 IPC
WebSocket4WebSocket

TransportPolicy : byte

成员说明
Auto0自动
PreferQuic1优先 QUIC
PreferTcp2优先 TCP
PreferIpc3优先 IPC
PreferWebSocket4优先 WebSocket
ForceQuic5强制 QUIC
ForceTcp6强制 TCP
ForceIpc7强制 IPC
ForceWebSocket8强制 WebSocket

LossTolerance : byte

成员说明
Strict0不允许丢包
BestEffort1尽力而为
LowLatency2低延迟优先
FireAndForget3高丢包容忍

流控枚举

FlowUpdateScopeKind : byte

成员说明
Connection0连接级
Session1会话级
Operation2操作级

FlowUpdateReason : byte

成员说明
Grant0授予配额
Reduce1降低配额
Pause2暂停
Resume3恢复
Congestion4拥塞

FlowUpdateBackpressureLevel : byte

成员说明
None0无背压
Soft1软背压
Hard2硬背压

FlowUpdateFlags : byte

成员位掩码说明
None0x00
CreditValid0x01credit 有效
RetryAfterValid0x02retry_after 有效
BackgroundOnly0x04仅影响后台操作
DrainInFlightOnly0x08排空在途后生效

会话补丁枚举

SessionPatchField : byte

成员位掩码说明
None0x00无字段
TargetCadence0x01目标帧率
QualityTier0x02质量档位
DegradePolicy0x04降质策略
ActiveLaneMask0x08活跃视角掩码
PreferredCodec0x10首选编解码器
PreferredCompression0x20首选压缩
ProfilePatch0x40完整 Profile 更新

SessionPatchAckStatus : byte

成员说明
Accepted0全部接受
PartiallyApplied1部分接受
Rejected2拒绝

SessionPatchRejectReason : byte

成员说明
None0
UnsupportedField1不支持的字段
InvalidRange2值越界
UnsupportedStrategy3不支持的策略
InvalidLaneMask4非法视角掩码
RateLimited5频率受限

缓存枚举

CacheObjectKind : ushort

成员说明
CameraBlock0x0001相机参数块
TileIndexBlock0x0002瓦片索引块
TensorSectionTable0x0003Tensor 分区表
CodecTable0x0004编解码辅助表
ReusableResultObject0x0005可复用结果对象
PayloadLayoutTemplate0x0006载荷布局模板
PromptSegment0x0007Prompt 段
ToolSchema0x0008Tool Schema
StructuredEventSchema0x0009结构化事件 Schema

CacheAckStatus : byte

成员说明
Accepted0接受
Rejected1拒绝
Replaced2替换旧条目

CacheInvalidateScope : byte

成员说明
WholeSession0整个会话
Namespace1命名空间
ObjectKind2对象类型
ObjectKey3单个条目

CachePutFlags : byte

成员位掩码说明
None0x00默认
Pinned0x01固定
Reusable0x02跨帧可复用

使用场景指南

连接与传输选择

csharp
var profile = new NnrpClientProfile
{
    TransportPolicy = TransportPolicy.PreferQuic,
    LossTolerance   = LossTolerance.LowLatency,
};

坑点

  • ForceQuic 在 TCP-only 防火墙下直接握手失败,生产环境请用 PreferQuic
  • LossTolerance.FireAndForget 不保证顺序,不要用于帧提交主路径。

提交帧与预算策略

csharp
var req = new NnrpSubmitRequest
{
    FrameId         = frameId,
    TileIds         = changedTiles,
    Sections        = new[] { tensorSection },
    InputProfile    = InputProfile.ChangedTilesLuma,
    SubmitMode      = SubmitMode.Inline,
    BudgetPolicy    = BudgetPolicy.AllowPartial | BudgetPolicy.AllowStaleReuse,
    InferenceBudgetMs = 8,
};
var result = await session.SubmitAsync(req);

坑点

  • BudgetPolicy 是位掩码,多值用 | 组合,不是逗号分隔。
  • SubmitMode.Reference 要求提前调用 session.PutCacheAsync(),否则服务端返回 ErrorCode.CacheMiss

结果处理

csharp
switch (result.ResultClass)
{
    case ResultClass.Complete:  ApplyFull(result);   break;
    case ResultClass.Partial:   ApplyPartial(result); break;
    case ResultClass.StaleReuse: break; // 复用上帧
    case ResultClass.Degraded:
        Log.Warn("Degraded with policy: {0}", result.AppliedBudgetPolicy);
        break;
}
if (result.ResultFlags.HasFlag(ResultFlags.Fallback))
    metrics.IncrementDegradedFallback();

错误处理

csharp
try
{
    await session.SubmitAsync(req);
}
catch (NnrpProtocolException ex)
{
    if (ex.ErrorScope == ErrorScope.Connection)
    {
        // 连接级错误,致命,必须重建连接
        await session.DisposeAsync();
        session = await client.ConnectAsync(host, port);
    }
    else if (ex.ErrorCode == ErrorCode.FrameExpired)
    {
        // 帧级错误,跳过继续
    }
}

坑点

  • ErrorScope.Connection 错误不可在同一 Session 上重试。
  • 捕获到 NnrpProtocolException 后忘记检查 ErrorScope,仍向旧 session 发送数据,会导致后续请求全部失败。

NNRP Documentation