use crate::server::AppState;
use axum::{
extract::{Query, State},
http::StatusCode,
response::Json,
};
use otelite_core::api::{ErrorResponse, TokenUsageResponse};
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, utoipa::IntoParams, utoipa::ToSchema)]
pub struct TokenUsageQuery {
pub start_time: Option<i64>,
pub end_time: Option<i64>,
}
#[utoipa::path(
get,
path = "/api/genai/usage",
params(TokenUsageQuery),
responses(
(status = 200, description = "Token usage summary", body = TokenUsageResponse),
(status = 500, description = "Internal server error", body = ErrorResponse)
),
tag = "genai"
)]
pub async fn get_token_usage(
State(state): State<AppState>,
Query(query): Query<TokenUsageQuery>,
) -> Result<Json<TokenUsageResponse>, (StatusCode, Json<ErrorResponse>)> {
let (summary, by_model, by_system) = state
.storage
.query_token_usage(query.start_time, query.end_time)
.await
.map_err(|e| {
(
StatusCode::INTERNAL_SERVER_ERROR,
Json(ErrorResponse::storage_error(format!(
"query token usage: {}",
e
))),
)
})?;
Ok(Json(TokenUsageResponse {
summary,
by_model,
by_system,
}))
}