Skip to main content

abu_agent/context/
mod.rs

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        /*
32        TODO:
33            用 占位符 替代硬编码处理时间、路径等环境上下文。
34            用 push_str 优化字符串拼接。
35            加一道 Memory 长度/Token 保护机制。
36        */
37        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