use bamboo_agent_core::{Message, Role, Session};
pub fn prepare_session_for_execution(
session: &mut Session,
system_prompt: Option<&str>,
model: Option<&str>,
) {
if let Some(prompt) = system_prompt {
match session.messages.first() {
Some(first) if matches!(first.role, Role::System) => {
session.messages[0] = Message::system(prompt.to_string());
}
_ => session
.messages
.insert(0, Message::system(prompt.to_string())),
}
}
if let Some(model) = model {
session.model = model.to_string();
}
}
#[cfg(test)]
mod tests {
use super::*;
use bamboo_agent_core::Message;
fn session_with(messages: Vec<Message>) -> Session {
let mut s = Session::new("test-session", "old-model");
s.messages = messages;
s
}
#[test]
fn empty_session_with_prompt_inserts_at_index_zero() {
let mut session = session_with(vec![Message::user("hello")]);
prepare_session_for_execution(&mut session, Some("you are helpful"), None);
assert_eq!(session.messages.len(), 2);
assert!(matches!(session.messages[0].role, Role::System));
assert_eq!(session.messages[0].content, "you are helpful");
assert!(matches!(session.messages[1].role, Role::User));
}
#[test]
fn leading_system_is_replaced_not_duplicated() {
let mut session = session_with(vec![
Message::system("stale prompt"),
Message::user("hello"),
]);
prepare_session_for_execution(&mut session, Some("authoritative prompt"), None);
assert_eq!(session.messages.len(), 2);
assert!(matches!(session.messages[0].role, Role::System));
assert_eq!(session.messages[0].content, "authoritative prompt");
assert!(matches!(session.messages[1].role, Role::User));
}
#[test]
fn leading_non_system_gets_prompt_inserted_at_zero() {
let mut session =
session_with(vec![Message::user("hello"), Message::assistant("hi", None)]);
prepare_session_for_execution(&mut session, Some("you are helpful"), None);
assert_eq!(session.messages.len(), 3);
assert!(matches!(session.messages[0].role, Role::System));
assert_eq!(session.messages[0].content, "you are helpful");
assert!(matches!(session.messages[1].role, Role::User));
assert!(matches!(session.messages[2].role, Role::Assistant));
}
#[test]
fn model_is_set_when_some() {
let mut session = session_with(vec![Message::user("hello")]);
prepare_session_for_execution(&mut session, None, Some("new-model"));
assert_eq!(session.model, "new-model");
assert_eq!(session.messages.len(), 1);
assert!(matches!(session.messages[0].role, Role::User));
}
#[test]
fn none_inputs_leave_session_untouched() {
let mut session = session_with(vec![Message::user("hello")]);
prepare_session_for_execution(&mut session, None, None);
assert_eq!(session.model, "old-model");
assert_eq!(session.messages.len(), 1);
}
}