Skip to content

Python — Client API

Client 文档按使用路径组织:连接、提交、收结果、关闭。数据结构只在参数表里链接到对应声明,代码块只用于示例。

导入

python
from nnrp.client import (
    ClientProfile,
    ClientSession,
    NativeClientSessionOpenOptions,
    SubmitRequest,
    connect_client_control,
    connect_client_control_with_probe,
    connect_native_client_connection,
)

Client 使用流程

生产 host 路径使用 Rust-backed native runtime:

  1. 选择或发现 native transport provider。
  2. 调用 connect_native_client_connection
  3. 通过 NativeClientConnection.open_session 打开 session。
  4. 用粗粒度 native 方法提交、轮询结果、发送运行时控制帧。
  5. 调用 close() 释放 connection 和 session。

Packet transport helper 仍然公开,但主要用于 smoke、诊断和自定义 transport:

  1. 构造 ClientProfile
  2. 选择 TCP、QUIC 或 probe-based bootstrap。
  3. 调用 connect_client_controlconnect_client_control_with_probe
  4. 使用返回 bootstrap session 内的 ClientSession;多帧并发用 send_submit + receive_result
  5. 在 client control session 生命周期内保持 async context manager 打开。

connect_native_client_connection

加载已安装的 preview4 native artifact,创建 native runtime connection,并返回 NativeClientConnection 上下文管理器。

参数类型必填说明
optionsNativeClientSessionOptions | NoneConnection id、generation、transport id 等底层 session 选项。
artifact_pathPath | str | None显式 native library 路径;通常不需要。
rootPath | str | NoneNative artifact 根目录。
native_platformNativePlatform | None诊断或测试时覆盖平台选择。
transportstr | Nonetcpquicipcwebsocket;为空时按默认 artifact 解析。
libraryAny | None测试注入用 library。
fallbackNativeRuntimeBackend | None测试或诊断 fallback。
require_nativebool生产路径建议设为 True,native 不可用时直接失败。
python
with connect_native_client_connection(require_native=True, transport="tcp") as connection:
    session = connection.open_session(NativeClientSessionOpenOptions(requested_session_id=42))
    result = connection.submit_and_poll_result(session, operation_id=1001, frame_id=1, payload=b"payload")

NativeClientConnection

Native client connection 是 preview4 Python host API 的主入口。它不让 Python 为每个小字段跨一次 ABI,而是通过 session、operation、event 和 owned buffer 走粗粒度 native 调用。

NativeClientConnection.open_session

参数类型必填说明
optionsNativeClientSessionOpenOptions | NoneSession id、generation、profile、schema 等打开参数。
返回
NativeRuntimeSession

NativeClientConnection.submit_and_poll_result

参数类型必填说明
sessionNativeRuntimeSession已打开的 native session。
operation_idintOperation id。
frame_idintFrame id。
payloadbytes | bytearray | memoryviewSubmit payload。
result_payloadbytes | bytearray | memoryview | None测试或 loopback 结果 payload。
parent_operation_idint | None父 operation。
operation_group_idint | NoneOperation 分组。
max_eventsint | None本次 poll 最多处理事件数。
返回
NativeRuntimeResult

Runtime control helper

方法消息类型
cancel_runtime_operationCANCEL
abort_runtime_operationABORT
update_runtime_priorityPRIORITY_UPDATE
update_runtime_deadlineDEADLINE
expire_runtime_operation_atEXPIRE_AT
supersede_runtime_operationSUPERSEDE
update_runtime_budgetBUDGET_UPDATE
send_runtime_route_hintROUTE_HINT
send_runtime_execution_hintEXECUTION_HINT
negotiate_runtime_capabilitiesCAPABILITY_NEGOTIATION
degrade_runtime_profileDEGRADE_PROFILE

Event pump helper 包括 dispatch_eventsdispatch_credit_updatesdispatch_result_hintsdispatch_structured_eventsdispatch_tool_deltasdispatch_workflow_states

NativeRuntimeSession Preview4 Frame

NativeClientConnection.open_session() 返回的 session 持有高层 Preview4 发送接口。普通应用 使用以下方法,不自行调用 codec 函数构造 frame:

方法消息
cancel_operation(metadata, diagnostic=b""), abort_operation(...)CANCEL, ABORT
update_priority(metadata), update_deadline(metadata), expire_at(metadata)scheduling 消息
supersede(metadata, diagnostic=b""), update_budget(metadata)SUPERSEDE, BUDGET_UPDATE
negotiate_capabilities(metadata, body=b""), degrade_profile(...)capability 消息
send_route_hint(metadata, body=b""), send_execution_hint(...)routing 消息
send_trace_context(metadata, body=b"")TRACE_CONTEXT
declare_object(metadata, body=b""), reference_object(...)OBJECT_DECLARE, OBJECT_REF
release_object(metadata, diagnostic=b"")OBJECT_RELEASE
patch_object(metadata, delta, metadata_body=b"")OBJECT_PATCH
send_object_delta(metadata, delta, metadata_body=b"")OBJECT_DELTA
reference_cache(metadata, body=b""), report_cache_miss(...)cache reference/miss
invalidate_cache(metadata)CACHE_INVALIDATE

每个方法返回 None,校验声明长度,并只调用一次粗粒度 Rust runtime。底层与角色无关的 frame-send 原语仅供 SDK 内部使用,不在 NativeRuntimeSession 上公开。

connect_client_control

打开选中的 transport,完成控制面握手,并 yield ClientControlBootstrapSession

参数类型必填取值 / 范围说明
hoststrhostname 或 IP远端 NNRP endpoint。
quic_portint | NoneQUIC port提供后启用 QUIC。
tcp_portint | NoneTCP port提供后启用 TCP。
quic_configurationQuicConfiguration | Noneaioquic configQUIC client 配置。
tcp_configurationNnrpTcpClientConfiguration | NoneTCP configTCP client 配置。
client_profileClientProfile默认 SDK profile客户端 capability 和 cache 偏好。
selected_transport_idTransportIdUNSPECIFIED, QUIC, TCP没有 probe result 时的选中 transport。
forced_transport_idTransportIdUNSPECIFIED, QUIC, TCP受控部署里的强制 transport。
auth_blockbytes默认 b""应用自定义认证负载。
timeoutfloat秒,默认 10.0连接和握手 timeout。
返回可能抛出
AsyncIterator[ClientControlBootstrapSession]transport、握手解析、capability 拒绝错误。
python
profile = ClientProfile(max_views=1, enable_cache=True)
async with connect_client_control(
    "render.example.com",
    quic_port=4433,
    client_profile=profile,
) as bootstrap:
    result = await bootstrap.session.submit(request)

connect_client_control_with_probe

连接前执行 QUIC/TCP 探测,并把选中的 transport 写入握手。

参数类型必填取值 / 范围说明
hoststrhostname 或 IP远端 NNRP endpoint。
quic_portintQUIC portQUIC probe/connect port。
tcp_portintTCP portTCP probe/connect port。
quic_configurationQuicConfiguration | Noneaioquic configQUIC client 配置。
tcp_configurationNnrpTcpClientConfiguration | NoneTCP configTCP client 配置。
client_profileClientProfile默认 SDK profilecapability 和 cache 偏好。
probe_payload_bytesint默认 32768每次 probe 的 payload 大小。
probe_sample_countint默认 3参与评分的 probe sample 数量。
include_warmup_probebool默认 False评分前增加 warmup sample。
auth_blockbytes默认 b""应用认证负载。
timeoutfloat秒,默认 10.0probe、连接和握手 timeout。
返回可能抛出
AsyncIterator[ClientControlBootstrapSession]probe、transport 或握手失败。
python
async with connect_client_control_with_probe(
    "render.example.com",
    quic_port=4433,
    tcp_port=4434,
    client_profile=ClientProfile(),
) as bootstrap:
    result = await bootstrap.session.submit(request)

ClientSession

已建立的客户端 session。

ClientSession.submit

提交一帧并等待匹配的结果。

参数类型必填取值 / 范围说明
requestSubmitRequestframe_id 在 in-flight 中唯一结构化提交请求。
timeoutfloat | None秒;None 表示不超时等待结果的最长时间。
返回可能抛出
Resultasyncio.TimeoutError、transport、协议关联错误。
python
result = await session.submit(request, timeout=0.05)

ClientSession.send_submit

只发送,不等待结果。适合多帧并发。

参数类型必填取值 / 范围说明
requestSubmitRequestframe_id 在 in-flight 中唯一要发送的请求。
返回可能抛出
int序列化或 transport 错误。
python
await session.send_submit(request)

ClientSession.receive_result

接收下一条服务端结果。

参数类型必填取值 / 范围说明
timeoutfloat | None秒;None 表示不超时等待结果的最长时间。
返回可能抛出
Result超时、结果格式错误、关联错误。
python
result = await session.receive_result(timeout=0.05)

ClientSession.patch_session

运行时更新 session 参数。

参数类型必填取值 / 范围说明
patch_fieldsSessionPatchFieldbitmask指定哪些字段生效。
target_cadenceint0 表示不变目标帧率或 cadence。
quality_tierint0..255应用自定义质量档位。
active_lane_maskintbitmask活跃 lane/view。
preferred_codecintcodec id偏好的 codec。
preferred_compressionintcompression id偏好的压缩方式。
返回可能抛出
SessionPatchAckMetadata拒绝、超时或 ack 解析错误。
python
ack = await session.patch_session(
    SessionPatchField.TARGET_CADENCE | SessionPatchField.QUALITY_TIER,
    target_cadence=60,
    quality_tier=2,
)

ClientSession.close

关闭 session 和底层连接。

参数类型必填取值 / 范围说明
---无参数。
返回可能抛出
Nonetransport close 错误。
python
try:
    await session.submit(request)
finally:
    await session.close()

核心类型

ClientProfile

字段类型默认值说明
max_viewsint1最大并发 view 数。
enable_cacheboolTrue是否协商服务端 cache。
max_cache_entriesint256请求的最大 cache 条目数。
max_cache_bytesint8388608请求的最大 cache 字节数。

ClientDialPolicy

字段类型说明
selected_transport_idTransportId已选择 transport。
forced_transport_idTransportId强制 transport;UNSPECIFIED 表示不强制。

SubmitRequest

字段类型必填说明
frame_idintin-flight 内唯一。
tile_idstuple[int, ...]提交的 tile id。
sectionstuple[TensorSectionData, ...]Tensor sections,见 packet types
typed_payloadstuple[TypedPayload, ...]非 tensor payload。
input_profileInputProfile输入数据 profile。
submit_modeSubmitModeInline 或 reference。
budget_policyBudgetPolicy允许的降级策略。
inference_budget_msint相对推理预算;0 表示无限制。
deadline_msint绝对 Unix 毫秒时间戳。

Result

字段类型说明
packetNnrpPacket原始结果包。
metadataResultPushMetadata解析后的结果 metadata。
sectionstuple[TensorSectionData, ...]Tensor 结果 sections。
typed_payloadstuple[TypedPayload, ...]非 tensor 结果 payload。

常见坑

WARNING

  1. 一定要关闭 ClientSession,否则服务端资源会等到超时才释放。
  2. 不要让多个 coroutine 直接并发写同一个 session;使用应用层队列。
  3. deadline_ms 是绝对 Unix 毫秒时间戳,inference_budget_ms 是相对时间。
  4. 生产环境优先使用探测或 fallback 策略,避免在 TCP-only 网络里强制 QUIC。 :::

NNRP Documentation