| Crates.io | llm-optimizer-api-rest |
| lib.rs | llm-optimizer-api-rest |
| version | 0.1.1 |
| created_at | 2025-11-11 02:40:14.756612+00 |
| updated_at | 2025-11-11 02:40:14.756612+00 |
| description | Production-ready REST API with OpenAPI documentation |
| homepage | https://github.com/globalbusinessadvisors/llm-auto-optimizer |
| repository | https://github.com/globalbusinessadvisors/llm-auto-optimizer |
| max_upload_size | |
| id | 1926625 |
| size | 284,299 |
Production-ready REST API implementation for the LLM Auto Optimizer with enterprise-grade features.
GET /health - Comprehensive health checkGET /health/live - Liveness probe (Kubernetes)GET /health/ready - Readiness probe (Kubernetes)POST /api/v1/optimize - Create optimizationGET /api/v1/optimize - List optimizationsGET /api/v1/optimize/:id - Get optimization detailsPOST /api/v1/optimize/:id/deploy - Deploy optimizationPOST /api/v1/optimize/:id/rollback - Rollback optimizationGET /api/v1/config/:key - Get configurationPUT /api/v1/config/:key - Update configurationPOST /api/v1/config/batch - Batch update configurationsPOST /api/v1/metrics/query - Query metricsGET /api/v1/metrics/performance - Get performance metricsGET /api/v1/metrics/cost - Get cost metricsGET /api/v1/metrics/quality - Get quality metricsPOST /api/v1/integrations - Create integrationGET /api/v1/integrations - List integrationsGET /api/v1/integrations/:id - Get integration detailsPUT /api/v1/integrations/:id - Update integrationDELETE /api/v1/integrations/:id - Delete integrationPOST /api/v1/integrations/:id/test - Test integrationGET /api/v1/admin/stats - Get system statisticsPOST /api/v1/admin/cache/flush - Flush cachePOST /api/v1/admin/api-keys - Create API keyGET /api/v1/admin/api-keys - List API keysDELETE /api/v1/admin/api-keys/:id - Revoke API keyGET /api/v1/admin/audit-logs - Query audit logsAdd to your Cargo.toml:
[dependencies]
llm-optimizer-api-rest = { path = "../api-rest" }
use llm_optimizer_api_rest::{start_server, ServerConfig};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = ServerConfig::new(
"0.0.0.0:8080".parse()?,
"your-jwt-secret".to_string(),
);
start_server(config).await?;
Ok(())
}
use llm_optimizer_api_rest::{
start_server, ServerConfig,
middleware::{CorsConfig, RateLimitConfig, development_cors},
};
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = ServerConfig::new(
"0.0.0.0:8080".parse()?,
std::env::var("JWT_SECRET")?,
)
.with_cors(development_cors())
.with_rate_limit(RateLimitConfig::new(
10000, // Global: 10k req/min
1000, // Authenticated: 1k req/min
100, // Anonymous: 100 req/min
5000, // API key: 5k req/min
));
start_server(config).await?;
Ok(())
}
# Obtain token (example)
TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
# Use token in requests
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:8080/api/v1/optimize
# Use API key in requests
curl -H "X-API-Key: your-api-key" \
http://localhost:8080/api/v1/optimize
Permissions are automatically assigned based on roles:
use llm_optimizer_api_rest::middleware::{Role, Permission};
let admin_permissions = Permission::for_role(&Role::Admin);
// Includes: OptimizeWrite, AdminExecute, IntegrationDelete, etc.
let readonly_permissions = Permission::for_role(&Role::ReadOnly);
// Includes: OptimizeRead, ConfigRead, MetricsRead
The API automatically generates OpenAPI 3.0 documentation accessible at:
# Run the example to generate specs
cargo run --example generate_openapi
# This creates:
# - openapi.yaml
# - openapi.json
Rate limits are applied at two levels:
Default limits:
Rate limit headers in responses:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 995
X-RateLimit-Reset: 1609459200
use llm_optimizer_api_rest::middleware::development_cors;
let config = ServerConfig::default()
.with_cors(development_cors());
use llm_optimizer_api_rest::middleware::CorsConfig;
use std::time::Duration;
let cors = CorsConfig::new()
.with_origins(vec![
"https://app.example.com".to_string(),
"https://dashboard.example.com".to_string(),
])
.with_credentials(true)
.with_max_age(Duration::from_secs(3600));
let config = ServerConfig::default()
.with_cors(cors);
All errors return consistent JSON responses:
{
"error": "validation_error",
"message": "Invalid request: field 'name' is required",
"request_id": "req-abc123",
"details": {
"field": "name",
"constraint": "required"
}
}
authentication_error (401)authorization_error (403)validation_error (400)not_found (404)conflict (409)rate_limit_exceeded (429)internal_error (500)service_unavailable (503)timeout (504)Every request is assigned a unique ID:
curl -v http://localhost:8080/health
# Response includes:
# X-Request-ID: 550e8400-e29b-41d4-a716-446655440000
Use request IDs to track requests across logs and distributed systems.
# Server configuration
BIND_ADDRESS=0.0.0.0:8080
JWT_SECRET=your-secret-key
# Logging
RUST_LOG=info,llm_optimizer_api_rest=debug
# Optional
CORS_ORIGINS=https://app.example.com,https://dashboard.example.com
RATE_LIMIT_GLOBAL=10000
RATE_LIMIT_AUTHENTICATED=1000
RATE_LIMIT_ANONYMOUS=100
# Unit tests
cargo test
# Integration tests
cargo test --test integration_tests
# With logging
RUST_LOG=debug cargo test
use axum_test::TestServer;
use llm_optimizer_api_rest::{build_app, ServerConfig};
#[tokio::test]
async fn test_health_check() {
let config = ServerConfig::default();
let app = build_app(config);
let server = TestServer::new(app).unwrap();
let response = server.get("/health").await;
assert_eq!(response.status_code(), 200);
}
FROM rust:1.75 as builder
WORKDIR /app
COPY . .
RUN cargo build --release --package llm-optimizer-api-rest
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/release/llm-optimizer-api-rest /usr/local/bin/
EXPOSE 8080
CMD ["llm-optimizer-api-rest"]
apiVersion: apps/v1
kind: Deployment
metadata:
name: llm-optimizer-api
spec:
replicas: 3
selector:
matchLabels:
app: llm-optimizer-api
template:
metadata:
labels:
app: llm-optimizer-api
spec:
containers:
- name: api
image: llm-optimizer-api-rest:latest
ports:
- containerPort: 8080
env:
- name: JWT_SECRET
valueFrom:
secretKeyRef:
name: api-secrets
key: jwt-secret
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 3
┌─────────────────────────────────────────────────────────┐
│ Client Request │
└───────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Middleware Stack │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Request ID → Logging → Tracing → Timeout │ │
│ └────────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ CORS → Compression → Auth → Rate Limit │ │
│ └────────────────────────────────────────────────────┘ │
└───────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Route Handlers │
│ ┌──────────┬──────────┬─────────┬──────────────────┐ │
│ │Optimize │ Config │ Metrics │ Integrations │ │
│ │ │ │ │ │ │
│ │ Health │ Admin │ │ │ │
│ └──────────┴──────────┴─────────┴──────────────────┘ │
└───────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Business Logic Layer │
│ (Processor, Analyzer, Decision, Actuator) │
└─────────────────────────────────────────────────────────┘
Apache 2.0
See CONTRIBUTING.md for details.