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保活应答

包头标志

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

TransportPolicy : byte

成员说明
Auto0自动
PreferQuic1优先 QUIC
PreferTcp2优先 TCP
ForceQuic3强制 QUIC
ForceTcp4强制 TCP

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