gemini_adk_rs/tools/
preload_memory.rs1use crate::llm::LlmRequest;
7
8#[derive(Debug, Clone, Default)]
14pub struct PreloadMemoryTool;
15
16impl PreloadMemoryTool {
17 pub fn new() -> Self {
19 Self
20 }
21
22 pub fn process_llm_request(&self, request: &mut LlmRequest, memories: &[String]) {
26 if memories.is_empty() {
27 return;
28 }
29
30 let memory_context = format!(
31 "\n\nRelevant memories from previous interactions:\n{}",
32 memories
33 .iter()
34 .map(|m| format!("- {m}"))
35 .collect::<Vec<_>>()
36 .join("\n")
37 );
38
39 if let Some(ref mut instruction) = request.system_instruction {
40 instruction.push_str(&memory_context);
41 } else {
42 request.system_instruction = Some(memory_context);
43 }
44 }
45}
46
47#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[test]
52 fn injects_memories_into_instruction() {
53 let tool = PreloadMemoryTool::new();
54 let mut request = LlmRequest {
55 system_instruction: Some("You are helpful.".into()),
56 ..Default::default()
57 };
58
59 tool.process_llm_request(
60 &mut request,
61 &["User likes Rust".into(), "User is a developer".into()],
62 );
63
64 let instruction = request.system_instruction.unwrap();
65 assert!(instruction.contains("User likes Rust"));
66 assert!(instruction.contains("User is a developer"));
67 }
68
69 #[test]
70 fn empty_memories_noop() {
71 let tool = PreloadMemoryTool::new();
72 let mut request = LlmRequest {
73 system_instruction: Some("Original".into()),
74 ..Default::default()
75 };
76
77 tool.process_llm_request(&mut request, &[]);
78 assert_eq!(request.system_instruction.unwrap(), "Original");
79 }
80
81 #[test]
82 fn creates_instruction_if_none() {
83 let tool = PreloadMemoryTool::new();
84 let mut request = LlmRequest::default();
85
86 tool.process_llm_request(&mut request, &["Memory 1".into()]);
87 assert!(request.system_instruction.is_some());
88 assert!(request.system_instruction.unwrap().contains("Memory 1"));
89 }
90}