1use 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
34pub 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}