rust-genai 0.3.1

Rust SDK for the Google Gemini API and Vertex AI
Documentation
use rust_genai::types::content::{Content, Part};
use rust_genai::types::models::GenerateContentConfig;
use rust_genai::types::tool::{CodeExecution, Tool};
use rust_genai::Client;
use std::path::Path;

fn guess_mime_type(path: &Path) -> Option<&'static str> {
    let ext = path.extension()?.to_str()?.to_ascii_lowercase();
    match ext.as_str() {
        "png" => Some("image/png"),
        "jpg" | "jpeg" => Some("image/jpeg"),
        "webp" => Some("image/webp"),
        "gif" => Some("image/gif"),
        "bmp" => Some("image/bmp"),
        "tiff" | "tif" => Some("image/tiff"),
        _ => None,
    }
}

#[tokio::main]
async fn main() -> rust_genai::Result<()> {
    let client = Client::from_env()?;
    let models = client.models();

    let tools = vec![Tool {
        code_execution: Some(CodeExecution::default()),
        ..Default::default()
    }];

    let Ok(image_path) = std::env::var("GENAI_IMAGE_PATH") else {
        eprintln!("请设置 GENAI_IMAGE_PATH 指向本地图片文件。");
        return Ok(());
    };
    let image_path = Path::new(&image_path);
    let mime_type = if let Ok(value) = std::env::var("GENAI_IMAGE_MIME") {
        value
    } else {
        let Some(value) = guess_mime_type(image_path) else {
            eprintln!("无法推断图片 MIME,请设置 GENAI_IMAGE_MIME(如 image/png)。");
            return Ok(());
        };
        value.to_string()
    };
    let image_bytes = std::fs::read(image_path)?;
    let image_part = Part::inline_data(image_bytes, mime_type);
    let prompt = Part::text("请分析这张图并用代码计算主色值。");
    let contents = vec![Content::from_parts(
        vec![image_part, prompt],
        rust_genai::types::content::Role::User,
    )];

    let config = GenerateContentConfig {
        tools: Some(tools),
        ..Default::default()
    };

    let response = models
        .generate_content_with_config("gemini-3-flash-preview", contents, config)
        .await?;

    println!("{:#?}", response.candidates);
    Ok(())
}