use crate::handlers::AppState;
use axum::{Json, extract::State, response::IntoResponse};
use super::types::{ModelObject, ModelsListResponse};
pub async fn handler(State(state): State<AppState>) -> impl IntoResponse {
let mut models = vec![
ModelObject::new("auto", "octoroute"),
ModelObject::new("fast", "octoroute"),
ModelObject::new("balanced", "octoroute"),
ModelObject::new("deep", "octoroute"),
];
for endpoint in &state.config().models.fast {
models.push(ModelObject::new(endpoint.name(), "user"));
}
for endpoint in &state.config().models.balanced {
models.push(ModelObject::new(endpoint.name(), "user"));
}
for endpoint in &state.config().models.deep {
models.push(ModelObject::new(endpoint.name(), "user"));
}
Json(ModelsListResponse::new(models))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_model_object_tier() {
let model = ModelObject::new("fast", "octoroute");
assert_eq!(model.id, "fast");
assert_eq!(model.object, "model");
assert_eq!(model.owned_by, "octoroute");
assert_eq!(model.created, 0);
}
#[test]
fn test_model_object_endpoint() {
let model = ModelObject::new("qwen3-8b", "user");
assert_eq!(model.id, "qwen3-8b");
assert_eq!(model.object, "model");
assert_eq!(model.owned_by, "user");
}
#[test]
fn test_models_list_response() {
let models = vec![
ModelObject::new("auto", "octoroute"),
ModelObject::new("fast", "octoroute"),
];
let response = ModelsListResponse::new(models);
assert_eq!(response.object, "list");
assert_eq!(response.data.len(), 2);
}
}