use crate::message::{CompletionRequest, Effort, Message};
#[derive(Debug, Clone)]
pub struct QuarantinedPass {
model: String,
system: Option<String>,
max_tokens: u32,
effort: Option<Effort>,
cache_prompt: bool,
}
impl QuarantinedPass {
pub fn new(model: impl Into<String>, max_tokens: u32) -> Self {
QuarantinedPass {
model: model.into(),
system: None,
max_tokens,
effort: None,
cache_prompt: false,
}
}
pub fn system(mut self, system: impl Into<String>) -> Self {
self.system = Some(system.into());
self
}
pub fn effort(mut self, effort: Option<Effort>) -> Self {
self.effort = effort;
self
}
pub fn cache_prompt(mut self, cache: bool) -> Self {
self.cache_prompt = cache;
self
}
pub fn model(&self) -> &str {
&self.model
}
pub fn ask(&self, user: impl Into<String>) -> CompletionRequest {
CompletionRequest {
model: self.model.clone(),
system: self.system.clone(),
messages: vec![Message::user(user.into())],
tools: Vec::new(),
max_tokens: self.max_tokens,
effort: self.effort,
thinking: false,
cache_prompt: self.cache_prompt,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_quarantined_request_carries_no_tools_and_exactly_one_user_turn() {
let req = QuarantinedPass::new("m", 4096).ask("what is this?");
assert!(req.tools.is_empty());
assert_eq!(req.messages.len(), 1);
assert_eq!(req.messages[0].role, crate::message::Role::User);
assert_eq!(req.messages[0].text(), "what is this?");
assert!(!req.thinking);
}
#[test]
fn the_frame_is_absent_until_asked_for_and_nothing_is_cached_by_default() {
let bare = QuarantinedPass::new("m", 128).ask("q");
assert_eq!(bare.system, None);
assert!(!bare.cache_prompt);
let framed = QuarantinedPass::new("m", 128)
.system("you are a classifier")
.cache_prompt(true)
.ask("q");
assert_eq!(framed.system.as_deref(), Some("you are a classifier"));
assert!(framed.cache_prompt);
}
#[test]
fn asking_twice_does_not_accumulate_a_conversation() {
let pass = QuarantinedPass::new("m", 128);
let first = pass.ask("attempt one");
let second = pass.ask("attempt two");
assert_eq!(first.messages.len(), 1);
assert_eq!(second.messages.len(), 1);
assert_eq!(second.messages[0].text(), "attempt two");
assert!(second.tools.is_empty());
}
}