gemini_adk_rs/tools/
url_context.rs

1//! URL context tool — built-in server-side URL context grounding.
2//!
3//! Mirrors ADK-Python's `url_context_tool`. Modifies the LLM request
4//! to include the URL context tool for Gemini models.
5
6use crate::llm::LlmRequest;
7use crate::utils::model_name::is_gemini2_or_above;
8use gemini_genai_rs::prelude::Tool;
9
10/// Built-in server-side URL context tool.
11///
12/// This tool does not perform any local execution. Instead, it modifies
13/// the outgoing [`LlmRequest`] to include the URL context tool
14/// configuration for Gemini 2.x+ models.
15#[derive(Debug, Clone, Copy, Default)]
16pub struct UrlContextTool;
17
18impl UrlContextTool {
19    /// Create a new `UrlContextTool`.
20    pub fn new() -> Self {
21        Self
22    }
23
24    /// Add URL context configuration to the given request.
25    ///
26    /// Only supported for Gemini 2.x+ models. Non-Gemini models are a no-op.
27    pub fn process_llm_request(&self, request: &mut LlmRequest, model: &str) {
28        if is_gemini2_or_above(model) {
29            request.tools.push(Tool::url_context());
30        }
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn gemini2_adds_url_context() {
40        let tool = UrlContextTool::new();
41        let mut request = LlmRequest::default();
42        tool.process_llm_request(&mut request, "gemini-2.5-flash");
43
44        assert_eq!(request.tools.len(), 1);
45        assert!(request.tools[0].url_context.is_some());
46    }
47
48    #[test]
49    fn gemini1_is_noop() {
50        let tool = UrlContextTool::new();
51        let mut request = LlmRequest::default();
52        tool.process_llm_request(&mut request, "gemini-1.5-pro");
53
54        assert!(request.tools.is_empty());
55    }
56
57    #[test]
58    fn non_gemini_is_noop() {
59        let tool = UrlContextTool::new();
60        let mut request = LlmRequest::default();
61        tool.process_llm_request(&mut request, "gpt-4");
62
63        assert!(request.tools.is_empty());
64    }
65}