openrouter-rust 0.1.0

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

#[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!("Embeddings API Examples\n");

    // Example 1: Single text embedding
    println!("1. Single text embedding:");
    let request = EmbeddingBuilder::new(
        "text-embedding-ada-002",
        "The quick brown fox jumps over the lazy dog"
    ).build();

    let response = client.create_embedding(request).await?;

    println!("   Model: {}", response.model);
    println!("   Object: {}", response.object);
    println!("   Items: {}", response.data.len());

    for item in &response.data {
        match &item.embedding {
            openrouter_rust::embeddings::EmbeddingData::FloatArray(vec) => {
                println!("   Embedding dimensions: {}", vec.len());
                println!("   First 5 values: {:?}", &vec[..5.min(vec.len())]);
            }
            openrouter_rust::embeddings::EmbeddingData::Base64String(s) => {
                println!("   Base64 embedding (length: {})", s.len());
            }
        }
    }

    println!("   Usage: {} tokens", response.usage.total_tokens);
    if let Some(cost) = response.usage.cost {
        println!("   Cost: ${:.6}", cost);
    }

    // Example 2: Batch embeddings
    println!("\n2. Batch embeddings:");
    let texts = vec![
        "First text to embed".to_string(),
        "Second text to embed".to_string(),
        "Third text to embed".to_string(),
    ];

    let batch_request = EmbeddingBuilder::new_with_array("text-embedding-ada-002", texts).build();

    let batch_response = client.create_embedding(batch_request).await?;
    println!("   Generated {} embeddings", batch_response.data.len());

    for (i, item) in batch_response.data.iter().enumerate() {
        match &item.embedding {
            openrouter_rust::embeddings::EmbeddingData::FloatArray(vec) => {
                println!("   Embedding {}: {} dimensions", i, vec.len());
            }
            _ => {}
        }
    }

    // Example 3: List embedding models
    println!("\n3. Available embedding models:");
    let models = client.list_embedding_models().await?;

    for (i, model) in models.data.iter().take(5).enumerate() {
        println!("   {}. {} - {}", i + 1, model.id, model.name);
        println!("       Description: {}", model.description);
    }

    if models.data.len() > 5 {
        println!("   ... and {} more models", models.data.len() - 5);
    }

    Ok(())
}