gemini_adk_rs/tools/retrieval/
base.rs1use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5
6use crate::error::ToolError;
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct RetrievalResult {
11 pub content: String,
13 pub source: String,
15 pub score: f64,
17 #[serde(default)]
19 pub metadata: serde_json::Value,
20}
21
22#[async_trait]
27pub trait BaseRetrievalTool: Send + Sync {
28 fn name(&self) -> &str;
30
31 async fn retrieve(&self, query: &str, top_k: usize) -> Result<Vec<RetrievalResult>, ToolError>;
33}
34
35#[cfg(test)]
36mod tests {
37 use super::*;
38
39 fn _assert_object_safe(_: &dyn BaseRetrievalTool) {}
40
41 #[test]
42 fn retrieval_result_serde() {
43 let result = RetrievalResult {
44 content: "Test content".into(),
45 source: "doc.txt".into(),
46 score: 0.95,
47 metadata: serde_json::json!({"page": 1}),
48 };
49 let json = serde_json::to_string(&result).unwrap();
50 let deserialized: RetrievalResult = serde_json::from_str(&json).unwrap();
51 assert!((deserialized.score - 0.95).abs() < f64::EPSILON);
52 }
53}