#Tutorial 3: LLM Routing Route LLM requests to optimal providers based on task type and budget. ## Prerequisites - Complete [02-basic-agents.md](02-basic-agents.md) ## Learning Objectives - Configure multiple LLM providers - Route requests to optimal providers - Understand provider pricing - Handle fallback providers ## Provider Options | Provider | Cost | Quality | Speed | Best For | |----------|---------|---------|-------|----------| | Claude | $15/1M | Highest | Good | Complex reasoning | | GPT-4 | $10/1M | Very High | Good | General purpose | | Gemini | $5/1M | Good | Excellent | Budget-friendly | | Ollama | Free | Good | Depends | Local, privacy | ## Step 1: Create Router ```rust use vapora_llm_router::LLMRouter; let router = LLMRouter::default(); ``` ## Step 2: Configure Providers ```rust use std::collections::HashMap; let mut rules = HashMap::new(); rules.insert("coding", "claude"); // Complex tasks → Claude rules.insert("testing", "gpt-4"); // Testing → GPT-4 rules.insert("documentation", "ollama"); // Local → Ollama ``` ## Step 3: Select Provider ```rust let provider = if let Some(rule) = rules.get("coding") { *rule } else { "claude" // default }; println!("Selected provider: {}", provider); ``` ## Step 4: Cost Estimation ```rust // Token usage let input_tokens = 1500; let output_tokens = 800; // Claude pricing: $3/1M input, $15/1M output let input_cost = (input_tokens as f64 * 3.0) / 1_000_000.0; let output_cost = (output_tokens as f64 * 15.0) / 1_000_000.0; let total_cost = input_cost + output_cost; println!("Estimated cost: ${:.4}", total_cost); ``` ## Running the Example ```bash cargo run --example 01-provider-selection -p vapora-llm-router ``` ## Expected Output ``` === LLM Provider Selection Example === Available Providers: 1. claude (models: claude-opus-4-5, claude-sonnet-4) - Use case: Complex reasoning, code generation - Cost: $15 per 1M input tokens 2. gpt-4 (models: gpt-4-turbo, gpt-4) - Use case: General-purpose, multimodal - Cost: $10 per 1M input tokens 3. ollama (models: llama2, mistral) - Use case: Local execution, no cost - Cost: $0.00 (local/on-premise) Task: code_analysis Selected provider: claude Model: claude-opus-4-5 Cost: $0.075 per 1K tokens Fallback: gpt-4 (if budget exceeded) ``` ## Routing Strategies ### Rule-Based Routing ```rust match task_type { "code_generation" => "claude", "documentation" => "ollama", // Free "analysis" => "gpt-4", _ => "claude", // default } ``` ### Cost-Aware Routing ```rust if budget_remaining < 50 { // dollars "gemini" // cheaper } else if budget_remaining < 100 { "gpt-4" } else { "claude" // most capable } ``` ### Quality-Aware Routing ```rust match complexity_score { high if high > 0.8 => "claude", // Best quality medium if medium > 0.5 => "gpt-4", // Good balance _ => "ollama", // Fast & cheap } ``` ## Fallback Strategy Always have a fallback when budget is critical: ```rust let primary = "claude"; let fallback = "ollama"; let provider = if budget_exceeded { fallback } else { primary }; ``` ## Common Patterns ### Cost Optimization ```rust // Use cheaper models for high-volume tasks if task_count > 100 { "gemini" // $5/1M (cheaper than Claude $15/1M) } else { "claude" } ``` ### Multi-Step Tasks ```rust // Step 1: Claude (expensive, high quality) let analysis = route_to("claude", "analyze_code"); // Step 2: GPT-4 (medium cost) let design = route_to("gpt-4", "design_solution"); // Step 3: Ollama (free) let formatting = route_to("ollama", "format_output"); ``` ## Troubleshooting **Q: "Provider not available"** A: Check API keys in environment: ```bash export ANTHROPIC_API_KEY=sk-ant-... export OPENAI_API_KEY=sk-... ``` **Q: "Budget exceeded"** A: Use fallback provider or wait for budget reset ## Next Steps - Tutorial 4: [Learning Profiles](04-learning-profiles.md) - Example: `crates/vapora-llm-router/examples/02-budget-enforcement.rs` ## Reference - Source: `crates/vapora-llm-router/src/router.rs` - API: `cargo doc --open -p vapora-llm-router`