| Crates.io | llm-edge-routing |
| lib.rs | llm-edge-routing |
| version | 0.1.0 |
| created_at | 2025-11-09 01:51:40.806864+00 |
| updated_at | 2025-11-09 01:51:40.806864+00 |
| description | Intelligent routing engine for LLM Edge Agent |
| homepage | |
| repository | https://github.com/globalbusinessadvisors/llm-edge-agent |
| max_upload_size | |
| id | 1923502 |
| size | 71,855 |
Intelligent routing engine for LLM Edge Agent, providing smart request distribution across multiple LLM providers with built-in resilience and failover capabilities.
llm-edge-providers interfaceAdd this to your Cargo.toml:
[dependencies]
llm-edge-routing = "0.1.0"
Routes requests to the provider with the lowest cost per token:
use llm_edge_routing::strategy::RoutingStrategy;
let strategy = RoutingStrategy::CostBased;
Use Case: Budget-conscious applications where cost optimization is the primary concern.
Routes requests to the fastest available provider based on historical latency:
use llm_edge_routing::strategy::RoutingStrategy;
let strategy = RoutingStrategy::LatencyBased;
Use Case: Real-time applications requiring the fastest possible response times.
Routes based on multiple weighted factors (cost, latency, reliability):
use llm_edge_routing::strategy::RoutingStrategy;
// Create hybrid strategy with custom weights
let strategy = RoutingStrategy::Hybrid {
cost_weight: 0.4,
latency_weight: 0.4,
reliability_weight: 0.2,
};
// Or use default balanced weights
let strategy = RoutingStrategy::default_hybrid();
Use Case: Production applications requiring balanced performance across multiple criteria.
Weight Guidelines:
cost_weight: 0.0-1.0 (higher = prioritize lower costs)latency_weight: 0.0-1.0 (higher = prioritize lower latency)reliability_weight: 0.0-1.0 (higher = prioritize higher uptime)Distributes requests evenly across all available providers:
use llm_edge_routing::strategy::RoutingStrategy;
let strategy = RoutingStrategy::RoundRobin;
Use Case: Testing, development, or uniform load distribution scenarios.
use llm_edge_routing::{RoutingStrategy, RoutingDecision};
#[tokio::main]
async fn main() {
// Initialize routing strategy
let strategy = RoutingStrategy::default_hybrid();
// Make routing decision (implementation would query provider metrics)
// This is a simplified example showing the return type
let decision = RoutingDecision {
provider_name: "openai".to_string(),
model: "gpt-4".to_string(),
score: 0.85,
reason: "Best hybrid score: low cost (0.9) + good latency (0.8)".to_string(),
};
println!("Selected provider: {}", decision.provider_name);
println!("Model: {}", decision.model);
println!("Routing score: {}", decision.score);
println!("Reason: {}", decision.reason);
}
Prevent cascading failures by automatically opening the circuit after repeated failures:
use llm_edge_routing::circuit_breaker::{CircuitBreaker, CircuitState};
use std::time::Duration;
#[tokio::main]
async fn main() {
// Create circuit breaker: open after 3 failures, retry after 30 seconds
let circuit_breaker = CircuitBreaker::new(3, Duration::from_secs(30));
// Check circuit state before making request
match circuit_breaker.state() {
CircuitState::Closed => {
// Normal operation - make request
println!("Circuit closed, proceeding with request");
}
CircuitState::Open => {
// Circuit open - fail fast
println!("Circuit open, using fallback provider");
}
CircuitState::HalfOpen => {
// Testing recovery - allow one request
println!("Circuit half-open, testing recovery");
}
}
// Record success or failure
circuit_breaker.record_success(); // Resets after 3 consecutive successes
// circuit_breaker.record_failure(); // Opens after threshold reached
}
Circuit Breaker States:
Configuration Parameters:
threshold: Number of consecutive failures before opening circuit (recommended: 3-5)timeout: Duration to wait before testing recovery (recommended: 30-60 seconds)use llm_edge_routing::{RoutingError, RoutingResult};
async fn route_request() -> RoutingResult<String> {
// Example error scenarios
Err(RoutingError::NoProvidersAvailable)
// or Err(RoutingError::AllProvidersFailed)
// or Err(RoutingError::CircuitBreakerOpen("openai".to_string()))
}
#[tokio::main]
async fn main() {
match route_request().await {
Ok(result) => println!("Success: {}", result),
Err(RoutingError::NoProvidersAvailable) => {
eprintln!("No providers configured");
}
Err(RoutingError::AllProvidersFailed) => {
eprintln!("All providers failed, check system health");
}
Err(RoutingError::CircuitBreakerOpen(provider)) => {
eprintln!("Provider {} is temporarily unavailable", provider);
}
Err(e) => eprintln!("Routing error: {}", e),
}
}
use llm_edge_routing::{
RoutingStrategy,
RoutingDecision,
circuit_breaker::{CircuitBreaker, CircuitState},
RoutingError,
};
use std::time::Duration;
use std::collections::HashMap;
#[tokio::main]
async fn main() {
// Setup routing strategy
let strategy = RoutingStrategy::Hybrid {
cost_weight: 0.3,
latency_weight: 0.5,
reliability_weight: 0.2,
};
// Setup circuit breakers for each provider
let mut circuit_breakers = HashMap::new();
circuit_breakers.insert(
"openai".to_string(),
CircuitBreaker::new(3, Duration::from_secs(30))
);
circuit_breakers.insert(
"anthropic".to_string(),
CircuitBreaker::new(3, Duration::from_secs(30))
);
// Provider priority list for failover
let providers = vec!["openai", "anthropic"];
// Attempt routing with fallback
for provider in &providers {
if let Some(cb) = circuit_breakers.get(*provider) {
match cb.state() {
CircuitState::Closed | CircuitState::HalfOpen => {
println!("Attempting provider: {}", provider);
// Make actual request here
// On success: cb.record_success()
// On failure: cb.record_failure() and continue to next provider
break;
}
CircuitState::Open => {
println!("Provider {} circuit open, trying fallback", provider);
continue;
}
}
}
}
}
This crate is designed to work seamlessly with the LLM Edge Agent ecosystem:
use llm_edge_routing::RoutingStrategy;
use llm_edge_providers::ProviderConfig;
// Configure providers
let provider_configs = vec![
ProviderConfig::openai("your-api-key"),
ProviderConfig::anthropic("your-api-key"),
];
// Setup intelligent routing
let routing_strategy = RoutingStrategy::default_hybrid();
// The routing engine will automatically select the best provider
// based on current costs, latency, and reliability metrics
The routing engine integrates with standard Rust observability tools:
// Tracing integration
tracing::info!(
provider = %decision.provider_name,
score = decision.score,
"Routing decision made"
);
// Metrics integration (via the metrics crate)
metrics::counter!("routing.decisions", 1, "strategy" => "hybrid");
Licensed under the Apache License, Version 2.0. See LICENSE for details.
Contributions are welcome! Please see the Contributing Guide for details.
llm-edge-providers - Provider abstraction layerllm-edge-core - Core types and utilitiesllm-edge-protocol - Protocol definitions