use rig::client::{CompletionClient, ProviderClient};
use rig::providers::gemini;
use rig::providers::gemini::completion::gemini_api_types::{
AdditionalParameters, GenerationConfig,
};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, JsonSchema, Serialize)]
struct Person {
pub first_name: Option<String>,
pub last_name: Option<String>,
pub job: Option<FooString>,
}
#[derive(Debug, Deserialize, JsonSchema, Serialize)]
pub struct FooString {
string: String,
}
#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
tracing_subscriber::fmt()
.with_max_level(tracing::Level::DEBUG)
.with_target(false)
.init();
let gen_cfg = GenerationConfig::default();
let cfg = AdditionalParameters::default().with_config(gen_cfg);
let client = gemini::Client::from_env();
let data_extractor = client
.extractor::<Person>(gemini::completion::GEMINI_2_0_FLASH)
.additional_params(serde_json::to_value(cfg).unwrap())
.build();
let person = data_extractor
.extract("Hello my name is John Doe! I am a software engineer.")
.await?;
println!("GEMINI: {}", serde_json::to_string_pretty(&person).unwrap());
Ok(())
}