use axum::{Json, response::IntoResponse};
use utoipa::{
Modify, OpenApi,
openapi::{
Components,
security::{ApiKey, ApiKeyValue, HttpAuthScheme, HttpBuilder, SecurityScheme},
},
};
#[derive(OpenApi)]
#[openapi(
info(
title = "Cognee API",
version = "1.0.0",
description = "Cognee HTTP API — Rust port of the Python FastAPI server."
),
modifiers(&SecurityAddon),
paths(
// E-02 — typed-entry remember
crate::routers::remember::post_remember_entry,
// P4 read-path handlers
crate::routers::search::get_search_history,
crate::routers::search::post_search,
crate::routers::recall::get_recall_history,
crate::routers::recall::post_recall,
// E-09 — sessions list
crate::routers::sessions::list_sessions,
// E-10 — sessions stats
crate::routers::sessions::get_stats,
// E-11 — sessions cost-by-model
crate::routers::sessions::cost_by_model,
// E-12 — sessions detail
crate::routers::sessions::get_session_detail,
crate::routers::llm::post_custom_prompt,
crate::routers::llm::post_infer_schema,
crate::routers::visualize::get_visualize,
crate::routers::visualize::post_visualize_multi,
// P5 admin handlers (settings stays OSS; configuration +
// the permissions/users/auth/api-keys families moved to the
// closed `cognee-http-cloud` crate, which publishes its own
// OpenAPI overlay).
crate::routers::settings::get_settings,
crate::routers::settings::save_settings,
// P7 notebooks + responses
crate::routers::notebooks::list_notebooks,
crate::routers::notebooks::create_notebook,
crate::routers::notebooks::update_notebook,
crate::routers::notebooks::delete_notebook,
crate::routers::notebooks::run_notebook_cell,
crate::routers::responses::create_response,
),
components(schemas(
// E-02 — typed-entry remember DTOs
crate::dto::remember_entry::RememberEntryRequestDTO,
crate::dto::remember::RememberResultDTO,
crate::dto::remember::RememberItemDTO,
crate::dto::remember::WireRememberStatus,
// E-09 — sessions DTOs (snake_case wire — Python parity carve-out)
crate::dto::sessions::SessionListResponseDTO,
crate::dto::sessions::SessionRowDTO,
crate::dto::sessions::OrderBy,
crate::dto::sessions::RangeWindow,
// E-10 — sessions stats DTO (StatsQuery is `IntoParams`-only)
crate::dto::sessions::SessionStatsDTO,
// E-11 — sessions cost-by-model DTO (CostByModelQuery is `IntoParams`-only)
crate::dto::sessions::CostByModelDTO,
// E-12 — sessions detail DTO (snake_case wire — Python parity carve-out)
crate::dto::sessions::SessionDetailDTO,
// P5 settings DTOs
crate::dto::settings::SettingsDTO,
crate::dto::settings::SettingsPayloadDTO,
crate::dto::settings::LLMConfigOutputDTO,
crate::dto::settings::LLMConfigInputDTO,
crate::dto::settings::VectorDBConfigOutputDTO,
crate::dto::settings::VectorDBConfigInputDTO,
crate::dto::settings::ConfigChoice,
crate::dto::settings::LlmProvider,
crate::dto::settings::VectorDbProvider,
// P7 notebook + responses DTOs
crate::dto::notebooks::NotebookDTO,
crate::dto::notebooks::NotebookCellDTO,
crate::dto::notebooks::NotebookDataDTO,
crate::dto::notebooks::RunCodeDataDTO,
crate::dto::notebooks::RunCodeOutcomeDTO,
crate::dto::responses::ResponseRequestDTO,
crate::dto::responses::CogneeModelDTO,
crate::dto::responses::ToolFunctionDTO,
crate::dto::responses::FunctionDTO,
crate::dto::responses::FunctionParametersDTO,
crate::dto::responses::ResponseBodyDTO,
crate::dto::responses::ResponseToolCallDTO,
crate::dto::responses::FunctionCallDTO,
crate::dto::responses::ToolCallOutputDTO,
crate::dto::responses::ChatUsageDTO,
))
)]
pub struct ApiDoc;
struct SecurityAddon;
impl Modify for SecurityAddon {
fn modify(&self, openapi: &mut utoipa::openapi::OpenApi) {
let components = openapi.components.get_or_insert_with(Components::default);
components.add_security_scheme(
"BearerAuth",
SecurityScheme::Http(
HttpBuilder::new()
.scheme(HttpAuthScheme::Bearer)
.bearer_format("JWT")
.build(),
),
);
components.add_security_scheme(
"ApiKeyAuth",
SecurityScheme::ApiKey(ApiKey::Header(ApiKeyValue::new("X-Api-Key"))),
);
}
}
pub async fn openapi_json() -> impl IntoResponse {
Json(ApiDoc::openapi())
}