1pub mod config;
2pub mod proxy;
3
4pub use config::{Config, OpenAIError, OpenAIErrorDetails};
5use proxy::{create_chat_completion, create_embeddings, health_check, list_models, ProxyState};
6
7use axum::{
8 http::Method,
9 routing::{get, post},
10 Router,
11};
12use std::sync::Arc;
13use tower::ServiceBuilder;
14use tower_http::{
15 cors::{Any, CorsLayer},
16 trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer},
17};
18use tracing::Level;
19
20pub fn create_app(config: Config) -> Router {
22 let state = Arc::new(ProxyState::new(config.clone()));
23
24 let mut app = Router::new()
25 .route("/health", get(health_check))
27 .route("/", get(health_check))
28 .route("/v1/models", get(list_models))
30 .route("/v1/chat/completions", post(create_chat_completion))
31 .route("/v1/embeddings", post(create_embeddings))
32 .with_state(state)
33 .layer(
34 ServiceBuilder::new().layer(
35 TraceLayer::new_for_http()
36 .make_span_with(DefaultMakeSpan::new().level(Level::INFO))
37 .on_response(DefaultOnResponse::new().level(Level::INFO)),
38 ),
39 );
40
41 if config.enable_cors {
43 app = app.layer(
44 CorsLayer::new()
45 .allow_origin(Any)
46 .allow_methods([Method::GET, Method::POST, Method::OPTIONS])
47 .allow_headers(Any),
48 );
49 }
50
51 app
52}