///|
/// 已加载模型的共享 owner。
///
/// 复制 `Model` 只会共享同一个 owner,不会复制模型权重。最后一个关联引用消失后,
/// owner 会自动释放原生 model;调用者不需要显式 `free`。
pub struct Model {
priv owner : ModelOwner
}
///|
/// 加载本地 GGUF 模型。
pub fn Model::load(path : StringView) -> Model raise LlamaError {
let backend = backend_owner
let raw_ref = @raw.llama_model_load_from_file(
@utf8.encode(path),
vocab_only=false,
)
guard !raw_ref.is_null() else { raise ModelLoadFailed(path.to_owned()) }
{ owner: ModelOwner::new(raw_ref, backend) }
}
///|
/// 创建一个单序列、有状态的 Session。
///
/// `context_size=0U` 时由 llama.cpp 选择默认容量。返回的 Session 会保留当前 Model
/// 的 owner,因此即使原来的 `Model` binding 离开作用域,原生 model 仍会保持有效。
pub fn Model::new_session(
self : Model,
context_size~ : UInt,
) -> Session raise LlamaError {
let context_ref = @raw.llama_init_from_model(
self.owner.get_raw_ref(),
context_size,
)
guard !context_ref.is_null() else { raise ContextCreateFailed(context_size) }
{ owner: SessionOwner::new(context_ref, self.owner) }
}