Files
sol/src/brain/personality.rs

90 lines
2.8 KiB
Rust
Raw Normal View History

use chrono::Utc;
pub struct Personality {
template: String,
}
impl Personality {
pub fn new(system_prompt: String) -> Self {
Self {
template: system_prompt,
}
}
pub fn build_system_prompt(
&self,
room_name: &str,
members: &[String],
) -> String {
let date = Utc::now().format("%Y-%m-%d").to_string();
let members_str = members.join(", ");
self.template
.replace("{date}", &date)
.replace("{room_name}", room_name)
.replace("{members}", &members_str)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_date_substitution() {
let p = Personality::new("Today is {date}.".to_string());
let result = p.build_system_prompt("general", &[]);
let today = Utc::now().format("%Y-%m-%d").to_string();
assert_eq!(result, format!("Today is {today}."));
}
#[test]
fn test_room_name_substitution() {
let p = Personality::new("You are in {room_name}.".to_string());
let result = p.build_system_prompt("design-chat", &[]);
assert!(result.contains("design-chat"));
}
#[test]
fn test_members_substitution() {
let p = Personality::new("Members: {members}".to_string());
let members = vec!["Alice".to_string(), "Bob".to_string(), "Carol".to_string()];
let result = p.build_system_prompt("room", &members);
assert_eq!(result, "Members: Alice, Bob, Carol");
}
#[test]
fn test_empty_members() {
let p = Personality::new("Members: {members}".to_string());
let result = p.build_system_prompt("room", &[]);
assert_eq!(result, "Members: ");
}
#[test]
fn test_all_placeholders() {
let template = "Date: {date}, Room: {room_name}, People: {members}".to_string();
let p = Personality::new(template);
let members = vec!["Sienna".to_string(), "Lonni".to_string()];
let result = p.build_system_prompt("studio", &members);
let today = Utc::now().format("%Y-%m-%d").to_string();
assert!(result.starts_with(&format!("Date: {today}")));
assert!(result.contains("Room: studio"));
assert!(result.contains("People: Sienna, Lonni"));
}
#[test]
fn test_no_placeholders_passthrough() {
let p = Personality::new("Static prompt with no variables.".to_string());
let result = p.build_system_prompt("room", &["Alice".to_string()]);
assert_eq!(result, "Static prompt with no variables.");
}
#[test]
fn test_multiple_same_placeholder() {
let p = Personality::new("{room_name} is great. I love {room_name}.".to_string());
let result = p.build_system_prompt("lounge", &[]);
assert_eq!(result, "lounge is great. I love lounge.");
}
}