pub(crate) const DEFAULT_MAX_NEW_TOKENS: usize = 256;
pub(crate) fn resolve_max_new_tokens(requested: Option<u32>) -> usize {
requested.map(|tokens| tokens as usize).unwrap_or(DEFAULT_MAX_NEW_TOKENS)
}
pub(crate) fn resolve_eos_token_id(
im_end: Option<u32>,
gguf_eos_metadata: Option<u32>,
endoftext: Option<u32>,
) -> Option<u32> {
im_end.or(gguf_eos_metadata).or(endoftext)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resolve_max_new_tokens_honours_an_explicit_request() {
assert_eq!(resolve_max_new_tokens(Some(32)), 32);
}
#[test]
fn resolve_max_new_tokens_falls_back_to_the_documented_default() {
assert_eq!(resolve_max_new_tokens(None), DEFAULT_MAX_NEW_TOKENS);
}
#[test]
fn resolve_max_new_tokens_honours_an_explicit_zero() {
assert_eq!(resolve_max_new_tokens(Some(0)), 0);
}
#[test]
fn resolve_eos_token_id_prefers_im_end_over_everything_else() {
assert_eq!(resolve_eos_token_id(Some(151_645), Some(999), Some(1)), Some(151_645));
}
#[test]
fn resolve_eos_token_id_falls_back_to_gguf_metadata_when_im_end_is_absent() {
assert_eq!(resolve_eos_token_id(None, Some(999), Some(1)), Some(999));
}
#[test]
fn resolve_eos_token_id_falls_back_to_endoftext_last() {
assert_eq!(resolve_eos_token_id(None, None, Some(151_643)), Some(151_643));
}
#[test]
fn resolve_eos_token_id_is_none_when_nothing_is_available() {
assert_eq!(resolve_eos_token_id(None, None, None), None);
}
type EosPriorityCase = (Option<u32>, Option<u32>, Option<u32>, Option<u32>);
#[test]
fn resolve_eos_token_id_priority_table() {
let cases: &[EosPriorityCase] = &[
(Some(1), Some(2), Some(3), Some(1)),
(None, Some(2), Some(3), Some(2)),
(None, None, Some(3), Some(3)),
(None, None, None, None),
(Some(1), None, None, Some(1)),
(Some(1), None, Some(3), Some(1)),
];
for &(im_end, gguf_eos, endoftext, expected) in cases {
assert_eq!(
resolve_eos_token_id(im_end, gguf_eos, endoftext),
expected,
"im_end={im_end:?} gguf_eos={gguf_eos:?} endoftext={endoftext:?}"
);
}
}
}