Skip to main content

cerno_server/
router.rs

1//! Router assembly.
2
3use crate::routes;
4use crate::state::AppState;
5use axum::Router;
6use axum::routing::{get, post};
7use cerno_types::{
8    Answer, Calibration, ChoiceSpec, ErrorCode, ErrorResponse, LevelProbability, LevelSpec,
9    ModelInfo, ModelsResponse, OptionProbability, Question, QuestionKind, ScoreSpec,
10    SystemOneRequest, SystemOneResponse, Timing, Usage,
11};
12use tower_http::trace::TraceLayer;
13use utoipa::OpenApi;
14use utoipa_swagger_ui::SwaggerUi;
15
16#[derive(OpenApi)]
17#[openapi(
18    paths(routes::systemone, routes::models),
19    components(schemas(
20        SystemOneRequest, SystemOneResponse, Question, QuestionKind, ChoiceSpec, ScoreSpec,
21        LevelSpec, Calibration, Answer, OptionProbability, LevelProbability, Usage, Timing,
22        ModelsResponse, ModelInfo, ErrorResponse, ErrorCode,
23    )),
24    tags((name = "cerno", description = "System-one decisions over local models")),
25    info(
26        title = "cerno",
27        description = "Noul, Choice and Score against a locally hosted model. \
28                       Each question is one forward pass: the answer is read from the \
29                       probability distribution over the first generated token.",
30    ),
31)]
32pub struct ApiDoc;
33
34/// Build the application.
35///
36/// `/health` is registered on the outer router, outside `TraceLayer`, because `Router::layer`
37/// only wraps routes registered before it. Health checks therefore produce no log lines at any
38/// `RUST_LOG` level, which keeps a container's logs about requests that mean something.
39pub fn build_router(state: AppState) -> Router {
40    let traced = Router::new()
41        .route("/v1/systemone", post(routes::systemone))
42        .route("/v1/models", get(routes::models))
43        .layer(TraceLayer::new_for_http())
44        .with_state(state);
45
46    Router::new()
47        .route("/health", get(routes::health))
48        .merge(SwaggerUi::new("/docs").url("/openapi.json", ApiDoc::openapi()))
49        .merge(traced)
50}