1use std::sync::Arc;
2use abu_base::chat::ChatMessage;
3use abu_skill::SkillLoader;
4
5pub struct ContextBuilder {
6 pub system_prompt: String,
7 pub skill_loader: Option<Arc<SkillLoader>>,
8}
9
10impl ContextBuilder {
11 pub fn new(system_prompt: impl Into<String>) -> Self {
12 Self {
13 system_prompt: system_prompt.into(),
14 skill_loader: None,
15 }
16 }
17
18 pub fn with_skill(&mut self, skill: Arc<SkillLoader>) {
19 self.skill_loader = Some(skill);
20 }
21
22 pub fn build(&self, query: &str, memories: Vec<ChatMessage>) -> Vec<ChatMessage> {
23 let system_prompt = self.build_system_prompt();
24 let mut messages = vec![ChatMessage::system(system_prompt)];
25 messages.extend(memories);
26 messages.push(ChatMessage::user(query));
27 messages
28 }
29
30 fn build_system_prompt(&self) -> String {
31 let mut contents = vec![self.system_prompt.clone()];
38 if let Some(skill_loader) = self.skill_loader.as_ref() {
39 contents.push(skill_loader.get_descriptions());
40 }
41 contents.join("\n\n")
42 }
43}
44