use crate::model::params::kv_overrides::KvOverrides;
use std::ffi::{c_char, CStr};
use std::fmt::{Debug, Formatter};
use std::pin::Pin;
use std::ptr::null;
pub mod kv_overrides;
#[allow(clippy::module_name_repetitions)]
pub struct LlamaModelParams {
pub(crate) params: llama_cpp_sys_4::llama_model_params,
kv_overrides: Vec<llama_cpp_sys_4::llama_model_kv_override>,
}
impl Debug for LlamaModelParams {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LlamaModelParams")
.field("n_gpu_layers", &self.params.n_gpu_layers)
.field("main_gpu", &self.params.main_gpu)
.field("vocab_only", &self.params.vocab_only)
.field("use_mmap", &self.params.use_mmap)
.field("use_mlock", &self.params.use_mlock)
.field("kv_overrides", &"vec of kv_overrides")
.finish()
}
}
impl LlamaModelParams {
#[must_use]
pub fn kv_overrides(&self) -> KvOverrides<'_> {
KvOverrides::new(self)
}
#[allow(clippy::missing_panics_doc)] pub fn append_kv_override(
mut self: Pin<&mut Self>,
key: &CStr,
value: kv_overrides::ParamOverrideValue,
) {
let kv_override = self
.kv_overrides
.get_mut(0)
.expect("kv_overrides did not have a next allocated");
assert_eq!(kv_override.key[0], 0, "last kv_override was not empty");
for (i, &c) in key.to_bytes_with_nul().iter().enumerate() {
kv_override.key[i] = c_char::try_from(c).expect("invalid character in key");
}
kv_override.tag = value.tag();
kv_override.__bindgen_anon_1 = value.value();
self.params.kv_overrides = null();
self.kv_overrides
.push(llama_cpp_sys_4::llama_model_kv_override {
key: [0; 128],
tag: 0,
__bindgen_anon_1: llama_cpp_sys_4::llama_model_kv_override__bindgen_ty_1 {
val_i64: 0,
},
});
self.params.kv_overrides = self.kv_overrides.as_ptr();
eprintln!("saved ptr: {:?}", self.params.kv_overrides);
}
}
impl LlamaModelParams {
#[must_use]
pub fn n_gpu_layers(&self) -> i32 {
self.params.n_gpu_layers
}
#[must_use]
pub fn main_gpu(&self) -> i32 {
self.params.main_gpu
}
#[must_use]
pub fn vocab_only(&self) -> bool {
self.params.vocab_only
}
#[must_use]
pub fn use_mmap(&self) -> bool {
self.params.use_mmap
}
#[must_use]
pub fn use_mlock(&self) -> bool {
self.params.use_mlock
}
#[must_use]
pub fn with_n_gpu_layers(mut self, n_gpu_layers: u32) -> Self {
let n_gpu_layers = i32::try_from(n_gpu_layers).unwrap_or(i32::MAX);
self.params.n_gpu_layers = n_gpu_layers;
self
}
#[must_use]
pub fn with_main_gpu(mut self, main_gpu: i32) -> Self {
self.params.main_gpu = main_gpu;
self
}
#[must_use]
pub fn with_vocab_only(mut self, vocab_only: bool) -> Self {
self.params.vocab_only = vocab_only;
self
}
#[must_use]
pub fn with_use_mlock(mut self, use_mlock: bool) -> Self {
self.params.use_mlock = use_mlock;
self
}
}
impl Default for LlamaModelParams {
fn default() -> Self {
let default_params = unsafe { llama_cpp_sys_4::llama_model_default_params() };
LlamaModelParams {
params: default_params,
kv_overrides: vec![llama_cpp_sys_4::llama_model_kv_override {
key: [0; 128],
tag: 0,
__bindgen_anon_1: llama_cpp_sys_4::llama_model_kv_override__bindgen_ty_1 {
val_i64: 0,
},
}],
}
}
}