gemini_adk_rs/utils/
variant.rs

1/// The backend variant for Google LLM access.
2#[derive(Debug, Clone, Copy, PartialEq, Eq)]
3pub enum GoogleLlmVariant {
4    /// Vertex AI (enterprise, project-based).
5    VertexAi,
6    /// Gemini API (API-key based, consumer).
7    GeminiApi,
8}
9
10/// Determine the Google LLM variant from the environment.
11///
12/// Reads the `GOOGLE_GENAI_USE_VERTEXAI` environment variable.
13/// Returns [`GoogleLlmVariant::VertexAi`] when the variable is set to a
14/// truthy value (`"true"`, `"1"`, case-insensitive), and
15/// [`GoogleLlmVariant::GeminiApi`] otherwise (including when the variable
16/// is unset).
17pub fn get_google_llm_variant() -> GoogleLlmVariant {
18    match std::env::var("GOOGLE_GENAI_USE_VERTEXAI") {
19        Ok(val) => {
20            let lower = val.to_lowercase();
21            if lower == "true" || lower == "1" {
22                GoogleLlmVariant::VertexAi
23            } else {
24                GoogleLlmVariant::GeminiApi
25            }
26        }
27        Err(_) => GoogleLlmVariant::GeminiApi,
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    /// Helper: run a closure with `GOOGLE_GENAI_USE_VERTEXAI` set to `val`,
36    /// then restore the previous state. Tests using this must run serially
37    /// (the `#[serial]` attribute is not strictly needed here because each
38    /// test uses a unique value and env var reads are atomic, but callers
39    /// should be aware of the global-state nature of env vars).
40    fn with_env_var<F: FnOnce()>(val: Option<&str>, f: F) {
41        // Save old value
42        let old = std::env::var("GOOGLE_GENAI_USE_VERTEXAI").ok();
43        // Set / remove
44        match val {
45            Some(v) => std::env::set_var("GOOGLE_GENAI_USE_VERTEXAI", v),
46            None => std::env::remove_var("GOOGLE_GENAI_USE_VERTEXAI"),
47        }
48        f();
49        // Restore
50        match old {
51            Some(v) => std::env::set_var("GOOGLE_GENAI_USE_VERTEXAI", v),
52            None => std::env::remove_var("GOOGLE_GENAI_USE_VERTEXAI"),
53        }
54    }
55
56    #[test]
57    fn vertex_ai_true_lowercase() {
58        with_env_var(Some("true"), || {
59            assert_eq!(get_google_llm_variant(), GoogleLlmVariant::VertexAi);
60        });
61    }
62
63    #[test]
64    fn vertex_ai_true_uppercase() {
65        with_env_var(Some("TRUE"), || {
66            assert_eq!(get_google_llm_variant(), GoogleLlmVariant::VertexAi);
67        });
68    }
69
70    #[test]
71    fn vertex_ai_one() {
72        with_env_var(Some("1"), || {
73            assert_eq!(get_google_llm_variant(), GoogleLlmVariant::VertexAi);
74        });
75    }
76
77    #[test]
78    fn gemini_api_false() {
79        with_env_var(Some("false"), || {
80            assert_eq!(get_google_llm_variant(), GoogleLlmVariant::GeminiApi);
81        });
82    }
83
84    #[test]
85    fn gemini_api_zero() {
86        with_env_var(Some("0"), || {
87            assert_eq!(get_google_llm_variant(), GoogleLlmVariant::GeminiApi);
88        });
89    }
90
91    #[test]
92    fn gemini_api_unset() {
93        with_env_var(None, || {
94            assert_eq!(get_google_llm_variant(), GoogleLlmVariant::GeminiApi);
95        });
96    }
97
98    #[test]
99    fn gemini_api_empty_string() {
100        with_env_var(Some(""), || {
101            assert_eq!(get_google_llm_variant(), GoogleLlmVariant::GeminiApi);
102        });
103    }
104
105    #[test]
106    fn vertex_ai_mixed_case() {
107        with_env_var(Some("True"), || {
108            assert_eq!(get_google_llm_variant(), GoogleLlmVariant::VertexAi);
109        });
110    }
111}