Skip to main content

multi_provider/
multi_provider.rs

1//! Demonstrates using the trait interface to swap providers.
2//!
3//! Run with: `cargo run --example multi_provider`
4//!
5//! Requires at least one of: `GOOGLE_API_KEY`, `BFL_API_KEY`,
6//! `XAI_API_KEY`, or `OPENAI_API_KEY`.
7
8use genviz::{GenerationRequest, ImageProvider};
9
10#[tokio::main]
11async fn main() -> genviz::Result<()> {
12    // Try to build whichever provider has a key available
13    let provider: Box<dyn ImageProvider> = if std::env::var("GOOGLE_API_KEY").is_ok() {
14        println!("Using Gemini provider");
15        Box::new(genviz::GeminiProvider::builder().build()?)
16    } else if std::env::var("BFL_API_KEY").is_ok() {
17        println!("Using Flux provider");
18        Box::new(genviz::FluxProvider::builder().build()?)
19    } else if std::env::var("XAI_API_KEY").is_ok() {
20        println!("Using Grok provider");
21        Box::new(genviz::GrokProvider::builder().build()?)
22    } else if std::env::var("OPENAI_API_KEY").is_ok() {
23        println!("Using OpenAI provider");
24        Box::new(genviz::OpenAiImageProvider::builder().build()?)
25    } else {
26        eprintln!("Set at least one API key environment variable.");
27        std::process::exit(1);
28    };
29
30    println!("Provider: {} ({:?})", provider.name(), provider.kind());
31
32    let request = GenerationRequest::new("A serene mountain lake at dawn");
33    let image = provider.generate(&request).await?;
34
35    let filename = format!("{:?}_output.png", provider.kind());
36    image.save(&filename)?;
37    println!("Saved to {} ({} bytes)", filename, image.size());
38
39    Ok(())
40}