创建实例
let mut ai = match Model::new("model.darmodel") {
Ok(m) => m,
Err(e) => { eprintln!("加载失败: {}", e.message); return; }
};
match ai.open(None) {
Ok(true) => println!("已打开"),
Ok(false) => println!("打开未完成"),
Err(e) => eprintln!("打开失败: {}", e.message),
}
| 后缀 | 路由 |
|---|---|
| darmodel(不区分大小写) | 按加密容器打开 |
| 其它后缀 | 按明文模型打开 |
只读元信息
new()
pub fn new(model_path: impl Into<String>) -> Result<Self, AiError>
这是创建实例的唯一入口。model_path 传模型文件路径,未 open 前不占 GPU。
示例:
let mut ai = match Model::new("model.darmodel") {
Ok(m) => m,
Err(e) => { eprintln!("加载失败: {}", e.message); return; }
};
probe()
pub fn probe(model_path: impl AsRef<str>) -> Result<String, Error>
只读模型的元数据 JSON,返回 JSON 文本。
示例:
match Model::probe("model.onnx") {
Ok(json) => println!("{json}"),
Err(Error::IoNotFound { message, .. }) => eprintln!("文件不存在: {message}"),
Err(Error::BadContainer { message, hint }) => eprintln!("容器损坏: {message}|{hint}"),
Err(Error::MetaUnavailable { message, .. }) => eprintln!("元数据读不出: {message}"),
Err(e) => eprintln!("探测失败: {}", e.message()),
}
指名 Provider
指名的不可用时自动回落。open 后可用 selected_provider() 查看实际所选。
密码:唯一解锁
open()
pub fn open(&mut self, password: Option<&str>) -> Result<bool, AiError>
解锁并打开模型,是唯一的解锁入口。password 传激活码,不需要密码的容器传 None。
示例:
let mut m = Model::new("model.darmodel")?.provider("onnx-cuda");
match m.open(Some("pwd")) {
Ok(true) => println!("已打开,provider = {:?}", m.selected_provider()),
Ok(false) => println!("打开未完成"),
Err(e) => eprintln!("打开失败: {}", e.message),
}
加载结果
open 结果四种:
| 结果 | 含义 |
|---|---|
| 试用 | 可先用,有次数或期限限制 |
| 绑定 | 本次首次通过凭据并完成绑定 |
| 已绑定 | 之前已绑定,直接可用 |
| 未通过 | 打开失败,看错误信息 |
看 UnlockInfo 判断:trial 为真即试用;bound 为假即本次完成绑定;失败看 error_code 非 0。
示例:
let info = /* open 后的 UnlockInfo */;
if info.error_code != 0 {
eprintln!("未通过: {}", info.message);
} else if info.trial {
println!("试用,还剩 {} 次", info.trial_remaining);
} else if info.bound {
println!("已绑定,直接用");
} else {
println!("绑定完成,直接用");
}
装入类别名
可以把一张类别名表注入到会话里,用来覆盖显示时的名称。推理结果里如果某条缺少 label 字段,就按它的 class_id 从这张表里取名字。
set_labels()
pub fn set_labels<I, S>(&mut self, labels: I) -> Result<(), AiError>
where
I: IntoIterator<Item = S>,
S: Into<String>
随时可调,open 后生效。用一整张表替换注入的类别名,下标对应 class_id,只改显示用的名字;名字为空返回错误,传空表等于清空(同 clear_labels())。
示例:
ai.set_labels(["OK", "NG"])?;
clear_labels()
pub fn clear_labels(&mut self) -> Result<(), AiError>
随时可调,open 后生效。清掉注入的类别名表,回到模型自带的类别名,无参数;本来不注入就是这个状态。
示例:
ai.clear_labels()?;
取消
cancel()
pub fn cancel(&self) -> Result<(), AiError>
尝试取消正在执行的推理。深层推理不可中断,跑完结果被丢弃;幂等,不能当同步停止用。
资源释放
close()
pub fn close(&mut self)
关掉这个实例,任何状态调用都安全。
示例:
m.close();