function_calling/
function_calling.rs1use gemini_client_api::gemini::ask::Gemini;
2use gemini_client_api::gemini::types::request::Tool;
3use gemini_client_api::gemini::types::sessions::Session;
4use gemini_client_api::gemini::utils::{GeminiSchema, execute_function_calls, gemini_function};
5use std::env;
6use std::error::Error;
7
8#[gemini_function]
11fn add_numbers(
13 a: f64,
15 b: f64,
17) -> f64 {
18 println!("[Executing Tool] adding {} + {}", a, b);
19 a + b
20}
21
22#[gemini_function]
23fn get_temperature(location: String) -> String {
25 println!("[Executing Tool] getting temperature for {}", location);
26 format!("25°C in {}", location)
27}
28
29#[tokio::main]
30async fn main() -> Result<(), Box<dyn Error>> {
31 let mut session = Session::new(10);
32 let api_key = env::var("GEMINI_API_KEY").expect("GEMINI_API_KEY must be set");
33
34 let ai =
36 Gemini::new(api_key, "gemini-2.5-flash", None).set_tools(vec![Tool::FunctionDeclarations(
37 vec![
38 add_numbers::gemini_schema(),
39 get_temperature::gemini_schema(),
40 ],
41 )]);
42
43 println!("--- Function Calling Example ---");
44 let prompt = "What is 123.45 plus 678.9, and what's the weather like in London?";
45 println!("User: {}\n", prompt);
46
47 let mut response = ai.ask(session.ask(prompt)).await?;
49
50 loop {
52 if response.get_chat().has_function_call() {
53 println!("Gemini requested function calls...");
54
55 let results = execute_function_calls!(session, add_numbers, get_temperature);
58
59 for (idx, res) in results.iter().enumerate() {
60 if let Some(r) = res {
61 println!(" Call #{} result: {:?}", idx, r);
62 }
63 }
64
65 response = ai.ask(&mut session).await?;
67 } else {
68 println!("\nGemini: {}", response.get_chat().get_text_no_think(""));
70 break;
71 }
72 }
73
74 Ok(())
75}
76
77#[tokio::test]
78async fn function_calls_with_erros() {
79 use gemini_proc_macros::execute_function_calls_with_callback;
80 use serde_json::json;
81
82 let mut session = Session::new(10);
83 let api_key = env::var("GEMINI_API_KEY").expect("GEMINI_API_KEY must be set");
84
85 let ai =
87 Gemini::new(api_key, "gemini-2.5-flash", None).set_tools(vec![Tool::FunctionDeclarations(
88 vec![
89 add_numbers::gemini_schema(),
90 get_temperature::gemini_schema(),
91 ],
92 )]);
93
94 println!("--- Function Calling Example ---");
95 let prompt = "What is 123.45 plus 678.9, and what's the weather like in London?";
96 println!("User: {}\n", prompt);
97
98 let mut response = ai.ask(session.ask(prompt)).await.unwrap();
100
101 loop {
103 if response.get_chat().has_function_call() {
104 println!("Gemini requested function calls...");
105
106 let results = execute_function_calls_with_callback!(
109 session,
110 |result| {
111 match result {
112 Ok(value) => value,
113 Err(e) => json!({"Error":e}),
114 }
115 },
116 add_numbers,
117 get_temperature
118 );
119
120 for (idx, res) in results.iter().enumerate() {
121 if let Some(r) = res {
122 println!(" Call #{} result: {:?}", idx, r);
123 }
124 }
125
126 response = ai.ask(&mut session).await.unwrap();
128 } else {
129 println!("\nGemini: {}", response.get_chat().get_text_no_think(""));
131 break;
132 }
133 }
134}