API
会话元信息与释放。全部来自容器头或明文探测,用户零配置。头里缺的字段派生 JSON 里为 null / 缺席,不编默认 640/80/17。
功能概览
| 类别 | 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|---|
| 元信息 | meta | Result<String, Error> | 方法 | 会话元信息 UTF-8 JSON。微秒级 |
meta_json | Result<Value, Error> | 方法 | 同 meta,feature json 下解析为 serde_json::Value | |
| 只读(从 meta 派生) | task | Result<Option<String>, Error> | 只读 | 任务短名。缺席为 None |
labels | Result<Vec<String>, Error> | 只读 | 类别标签。缺席为空 Vec | |
input_width | Result<u32, Error> | 只读 | 模型输入宽。未知为 0 | |
input_height | Result<u32, Error> | 只读 | 模型输入高。未知为 0 | |
channels | Result<u32, Error> | 只读 | 模型输入通道。未知为 0 | |
layout | Result<Option<String>, Error> | 只读 | 张量布局。先读 input.layout,再读顶层 layout | |
payload_kind | Result<Option<String>, Error> | 只读 | 载荷类型。含 paddle。Windows 上 rknn 打不开 | |
provider_id | Result<Option<String>, Error> | 只读 | 实际选中的 Provider,不是 prefer 入参 | |
encrypted | Result<bool, Error> | 只读 | 是否加密容器会话。明文模型为 false | |
| 释放 | Drop | () | 释放 | 离开作用域调用 darra_session_close。Session 不可 Clone |
元信息
meta()
pub fn meta(&self) -> Result<String, Error>
读会话元信息 JSON。调用代价:读会话缓存的头信息,微秒级。
返回值:
Result<String, Error>— UTF-8 JSON 字符串
示例:
let json = session.meta()?;
eprintln!("[meta] {json}");
meta_json()
#[cfg(feature = "json")]
pub fn meta_json(&self) -> Result<serde_json::Value, Error>
同 meta,feature json 下解析为 serde_json::Value。默认 feature 已打开 json。
返回值:
Result<serde_json::Value, Error>— 解析后的 JSON 值
只读属性
全部从 meta JSON 派生,每次调用会再读一次 meta(再解析)。
task()
pub fn task(&self) -> Result<Option<String>, Error>
任务短名:detect / classify / segment / pose / ocr / anomaly。缺席为 None。
返回值:
Result<Option<String>, Error>— 有则Some,缺席None
labels()
pub fn labels(&self) -> Result<Vec<String>, Error>
类别标签列表。缺席为空 Vec。
返回值:
Result<Vec<String>, Error>— 标签;缺席为空
input_width()
pub fn input_width(&self) -> Result<u32, Error>
模型输入宽。未知为 0(容器头未写,不编默认 640)。
返回值:
Result<u32, Error>— 宽;未知为 0
input_height()
pub fn input_height(&self) -> Result<u32, Error>
模型输入高。未知为 0。
返回值:
Result<u32, Error>— 高;未知为 0
channels()
pub fn channels(&self) -> Result<u32, Error>
模型输入通道数。未知为 0。
返回值:
Result<u32, Error>— 通道;未知为 0
layout()
pub fn layout(&self) -> Result<Option<String>, Error>
张量布局(如 NCHW / NHWC)。先读 input.layout,再读顶层 layout。缺席为 None。
返回值:
Result<Option<String>, Error>— 有则Some,缺席None
payload_kind()
pub fn payload_kind(&self) -> Result<Option<String>, Error>
载荷类型。可能为 onnx / trt-engine / openvino / paddle / rknn。缺席为 None。
Paddle 是运行时载荷(paddle)。Windows 上 rknn 载荷打不开(UnsupportedPayload),本属性只在会话已成功打开后可读。
返回值:
Result<Option<String>, Error>— 有则Some,缺席None
provider_id()
pub fn provider_id(&self) -> Result<Option<String>, Error>
实际选中的 Provider ID(不是 prefer_provider 入参)。缺席为 None。
返回值:
Result<Option<String>, Error>— 有则Some,缺席None
encrypted()
pub fn encrypted(&self) -> Result<bool, Error>
是否加密容器会话。明文模型为 false。
返回值:
Result<bool, Error>— 加密容器为true,明文为false
示例:
let _ = session.task()?;
let _ = session.provider_id()?;
let _ = session.encrypted()?;
let _ = session.payload_kind()?;
释放
Drop
Session 离开作用域时调用 darra_session_close(NULL 安全)。close 后句柄失效。禁止与任何在飞调用并发——安全 Rust 借用检查保证 Drop 时没有未完成的 &self 方法;Arc<Session> 则等最后一个引用释放才 Drop。Session 不可 Clone,没有第二份裸句柄可在 close 后继续用。
示例:
{
let session = Session::open("model.darmodel", Some("model.darmkey"), None, None)?;
let _ = session.infer_image(&jpeg, &darra_ai::ImageDesc::auto())?;
} // 此处 Drop → close