use std::os::raw::c_char;
use ik_llama_cpp_sys as sys;
use crate::model::LlamaModel;
fn read_ffi_string<F: Fn(*mut c_char, usize) -> i32>(fill: F) -> Option<String> {
let needed = fill(std::ptr::null_mut(), 0);
if needed < 0 {
return None;
}
let cap = needed as usize + 1;
let mut buf = vec![0u8; cap];
let written = fill(buf.as_mut_ptr().cast::<c_char>(), cap);
if written < 0 {
return None;
}
buf.truncate(written as usize);
String::from_utf8(buf).ok()
}
impl LlamaModel {
#[must_use]
pub fn meta_val_str(&self, key: &str) -> Option<String> {
let c_key = std::ffi::CString::new(key).ok()?;
let model = self.model.as_ptr();
read_ffi_string(|buf, size| unsafe {
sys::llama_model_meta_val_str(model, c_key.as_ptr(), buf, size)
})
}
#[must_use]
pub fn meta_count(&self) -> i32 {
unsafe { sys::llama_model_meta_count(self.model.as_ptr()) }
}
#[must_use]
pub fn meta_key_by_index(&self, index: i32) -> Option<String> {
let model = self.model.as_ptr();
read_ffi_string(|buf, size| unsafe {
sys::llama_model_meta_key_by_index(model, index, buf, size)
})
}
#[must_use]
pub fn meta_val_str_by_index(&self, index: i32) -> Option<String> {
let model = self.model.as_ptr();
read_ffi_string(|buf, size| unsafe {
sys::llama_model_meta_val_str_by_index(model, index, buf, size)
})
}
#[must_use]
pub fn desc(&self) -> String {
let model = self.model.as_ptr();
read_ffi_string(|buf, size| unsafe { sys::llama_model_desc(model, buf, size) })
.unwrap_or_default()
}
#[must_use]
pub fn size(&self) -> u64 {
unsafe { sys::llama_model_size(self.model.as_ptr()) }
}
#[must_use]
pub fn n_params(&self) -> u64 {
unsafe { sys::llama_model_n_params(self.model.as_ptr()) }
}
#[must_use]
pub fn n_ctx_train(&self) -> i32 {
unsafe { sys::llama_n_ctx_train(self.model.as_ptr()) }
}
#[must_use]
pub fn n_embd(&self) -> i32 {
unsafe { sys::llama_model_n_embd(self.model.as_ptr()) }
}
#[must_use]
pub fn n_layer(&self) -> i32 {
unsafe { sys::llama_n_layer(self.model.as_ptr()) }
}
#[must_use]
pub fn rope_type(&self) -> sys::llama_rope_type {
unsafe { sys::llama_rope_type(self.model.as_ptr()) }
}
}