Skip to main content

llama_cpp_bindings/model/params/
kv_overrides.rs

1//! Key-value overrides for a model.
2
3use std::fmt::Debug;
4
5use crate::model::params::LlamaModelParams;
6use crate::model::params::kv_override_value_iterator::KvOverrideValueIterator;
7
8/// A struct implementing [`IntoIterator`] over the key-value overrides for a model.
9#[derive(Debug)]
10pub struct KvOverrides<'model_params> {
11    model_params: &'model_params LlamaModelParams,
12}
13
14impl KvOverrides<'_> {
15    /// Creates a new `KvOverrides` view over the given model parameters.
16    #[must_use]
17    pub const fn new(model_params: &LlamaModelParams) -> KvOverrides<'_> {
18        KvOverrides { model_params }
19    }
20}
21
22impl<'model_params> IntoIterator for KvOverrides<'model_params> {
23    type Item = <KvOverrideValueIterator<'model_params> as Iterator>::Item;
24    type IntoIter = KvOverrideValueIterator<'model_params>;
25
26    fn into_iter(self) -> Self::IntoIter {
27        KvOverrideValueIterator::new(self.model_params)
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use std::ffi::CString;
34    use std::pin::pin;
35
36    use crate::model::params::LlamaModelParams;
37    use crate::model::params::param_override_value::ParamOverrideValue;
38
39    #[test]
40    fn kv_overrides_empty_by_default() {
41        let params = LlamaModelParams::default();
42        let overrides = params.kv_overrides();
43        let count = overrides.into_iter().count();
44
45        assert_eq!(count, 0);
46    }
47
48    #[test]
49    fn kv_overrides_iterates_single_entry() {
50        let mut params = pin!(LlamaModelParams::default());
51        let key = CString::new("test_key").unwrap();
52
53        params
54            .as_mut()
55            .append_kv_override(&key, ParamOverrideValue::Int(42))
56            .unwrap();
57
58        let entries: Vec<_> = params.kv_overrides().into_iter().collect();
59
60        assert_eq!(entries.len(), 1);
61        let (entry_key, entry_value) = &entries[0];
62        assert_eq!(entry_key.to_bytes(), b"test_key");
63        assert_eq!(*entry_value, ParamOverrideValue::Int(42));
64    }
65
66    #[test]
67    fn kv_overrides_new_creates_view() {
68        let params = LlamaModelParams::default();
69        let overrides = super::KvOverrides::new(&params);
70        let count = overrides.into_iter().count();
71
72        assert_eq!(count, 0);
73    }
74
75    #[test]
76    fn kv_overrides_skips_entry_with_unknown_tag() {
77        let mut params = pin!(LlamaModelParams::default());
78        let key = CString::new("valid_key").unwrap();
79
80        params
81            .as_mut()
82            .append_kv_override(&key, ParamOverrideValue::Int(99))
83            .unwrap();
84
85        params.kv_overrides[0].tag = 9999;
86
87        assert_eq!(params.kv_overrides().into_iter().count(), 0);
88    }
89}