mod convert;
mod error;
mod handlers;
pub mod ratelimit;
pub mod types;
use crate::log::Logger;
use crate::router::Router;
use axum::routing::{get, post};
use ratelimit::{build_limiter, Backpressure, RateLimiter};
use std::sync::Arc;
use tower_http::cors::CorsLayer;
pub struct AppState {
pub router: Router,
pub logger: Option<Logger>,
pub limiter: Arc<dyn RateLimiter>,
pub backpressure: Backpressure,
}
impl AppState {
pub fn from_env(router: Router, logger: Option<Logger>) -> Self {
Self {
router,
logger,
limiter: build_limiter(),
backpressure: Backpressure::from_env(),
}
}
}
pub fn app(router: Router, logger: Option<Logger>) -> axum::Router {
app_with_state(Arc::new(AppState::from_env(router, logger)))
}
pub fn app_with_state(state: Arc<AppState>) -> axum::Router {
axum::Router::new()
.route("/v1/chat", post(handlers::chat))
.route("/v1/chat/stream", post(handlers::chat_stream))
.route("/v1/models", get(handlers::list_models))
.route("/health", get(handlers::health))
.layer(CorsLayer::permissive())
.with_state(state)
}