Skip to main content

structured_output/
structured_output.rs

1use gemini_client_api::gemini::ask::Gemini;
2use gemini_client_api::gemini::types::sessions::Session;
3use gemini_client_api::gemini::utils::{gemini_schema, GeminiSchema};
4use serde::Deserialize;
5use std::env;
6
7/// Define your desired response structure.
8/// Use the `#[gemini_schema]` macro to automatically generate the JSON schema.
9#[derive(Debug, Deserialize)]
10#[gemini_schema]
11#[allow(dead_code)]
12struct MovieReview {
13    /// The title of the movie.
14    title: String,
15    /// A score from 1 to 10.
16    rating: u8,
17    /// A list of main actors.
18    cast: Vec<String>,
19    /// A short summary of the plot.
20    summary: String,
21}
22
23#[tokio::main]
24async fn main() {
25    let mut session = Session::new(2).set_remember_reply(false);
26    let api_key = env::var("GEMINI_API_KEY").expect("GEMINI_API_KEY must be set");
27    let ai = Gemini::new(api_key, "gemini-2.5-flash", None);
28
29    println!("--- Structured Output (JSON Mode) Example ---");
30
31    // Enable JSON mode by passing the generated schema
32    let ai = ai.set_json_mode(MovieReview::gemini_schema());
33
34    let prompt = "Give me a review for the movie Interstellar.";
35    println!("User: {}", prompt);
36
37    let response = ai.ask(session.ask(prompt)).await.unwrap();
38
39    // Extract and deserialize the JSON response
40    if let Ok(review) = response.get_json::<MovieReview>() {
41        println!("\nGemini (Structured):");
42        println!("{:#?}", review);
43    } else {
44        println!("\nFailed to parse JSON response: {}", response.get_chat().get_text_no_think(""));
45    }
46}