90 lines
2.8 KiB
Rust
90 lines
2.8 KiB
Rust
|
|
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.");
|
||
|
|
}
|
||
|
|
}
|