openrouter-rust 0.1.0

A modular, type-safe Rust client for the OpenRouter API
Documentation
use openrouter_rust::{OpenRouterClient, models::ListModelsParams};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = OpenRouterClient::builder()
        .api_key(std::env::var("OPENROUTER_API_KEY")?)
        .build()?;

    println!("Models API Examples\n");

    // Example 1: Get total model count
    println!("1. Total model count:");
    let count = client.get_models_count().await?;
    println!("   Total models available: {:.0}\n", count.data.count);

    // Example 2: List all models
    println!("2. Listing first 5 models:");
    let models = client.list_models(None).await?;

    for (i, model) in models.data.iter().take(5).enumerate() {
        println!("   {}. {}", i + 1, model.name);
        println!("       ID: {}", model.id);
        println!("       Description: {}", model.description);
        if let Some(context) = model.context_length {
            println!("       Context: {} tokens", context);
        }
        println!("       Supported params: {:?}", model.supported_parameters);
        println!();
    }

    // Example 3: Filter models by category
    println!("3. Programming models:");
    let params = ListModelsParams {
        category: Some("programming".to_string()),
        ..Default::default()
    };
    let programming_models = client.list_models(Some(params)).await?;

    for (i, model) in programming_models.data.iter().take(3).enumerate() {
        println!("   {}. {} - {}", i + 1, model.name, model.id);
    }
    println!("   ... {} total programming models\n", programming_models.data.len());

    // Example 4: List models for user (filtered by preferences)
    println!("4. Models available for user (filtered by preferences):");
    let user_models = client.list_models_user().await?;
    println!("   {} models available\n", user_models.data.len());

    // Example 5: Model details
    if let Some(first_model) = models.data.first() {
        println!("5. Detailed info for {}:", first_model.name);
        println!("   ID: {}", first_model.id);
        println!("   Canonical slug: {}", first_model.canonical_slug);
        if let Some(hf_id) = &first_model.hugging_face_id {
            println!("   HuggingFace ID: {}", hf_id);
        }
        println!("   Created: {}", first_model.created);
        println!("   Architecture:");
        println!("     Input modalities: {:?}", first_model.architecture.input_modalities);
        println!("     Output modalities: {:?}", first_model.architecture.output_modalities);
        if let Some(modality) = &first_model.architecture.modality {
            println!("     Primary modality: {}", modality);
        }
        println!("   Top provider:");
        println!("     Moderated: {}", first_model.top_provider.is_moderated);
        if let Some(context) = first_model.top_provider.context_length {
            println!("     Context length: {}", context);
        }
        println!("   Per-request limits:");
        println!("     Max prompt: {} tokens", first_model.per_request_limits.prompt_tokens);
        println!("     Max completion: {} tokens", first_model.per_request_limits.completion_tokens);
    }

    Ok(())
}