use std::collections::HashMap;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
pub mod hybrid_search;
pub use hybrid_search::*;
pub mod graph;
pub use graph::*;
pub mod file_upload;
pub use file_upload::*;
pub mod filter;
pub use filter::{
QdrantCondition, QdrantFilter, QdrantGeoBoundingBox, QdrantGeoPoint, QdrantGeoRadius,
QdrantMatchValue, QdrantRange, QdrantValuesCount,
};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DeleteByFilterReport {
pub scanned: usize,
pub matched: usize,
pub deleted: usize,
#[serde(default)]
pub results: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct BulkUpdateReport {
pub scanned: usize,
pub matched: usize,
pub updated: usize,
#[serde(default)]
pub results: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct CopyReport {
pub src: String,
pub dst: String,
pub requested: usize,
pub copied: usize,
pub failed: usize,
pub results: Vec<VectorOpResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ReencodeJob {
pub job_id: String,
pub collection: String,
pub state: String,
pub target_encoding: String,
pub progress: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct VectorOpResult {
#[serde(default)]
pub id: Option<String>,
pub status: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub index: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DeleteReport {
pub collection: String,
#[serde(default)]
pub count: usize,
pub deleted: usize,
pub failed: usize,
pub results: Vec<VectorOpResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct MoveReport {
pub src: String,
pub dst: String,
pub requested: usize,
pub moved: usize,
pub failed: usize,
pub results: Vec<VectorOpResult>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum ReadPreference {
Master,
#[default]
Replica,
Nearest,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HostConfig {
pub master: String,
pub replicas: Vec<String>,
}
#[derive(Debug, Clone, Default)]
pub struct ReadOptions {
pub read_preference: Option<ReadPreference>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum SimilarityMetric {
#[default]
Cosine,
Euclidean,
DotProduct,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Vector {
pub id: String,
pub data: Vec<f32>,
pub metadata: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub public_key: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Collection {
pub name: String,
pub dimension: usize,
#[serde(alias = "similarity_metric")]
pub metric: Option<String>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
#[serde(default)]
pub vector_count: usize,
#[serde(default)]
pub document_count: usize,
#[serde(default)]
pub embedding_provider: Option<String>,
#[serde(default)]
pub indexing_status: Option<serde_json::Value>,
#[serde(default)]
pub normalization: Option<serde_json::Value>,
#[serde(default)]
pub quantization: Option<serde_json::Value>,
#[serde(default)]
pub size: Option<serde_json::Value>,
#[serde(default)]
pub vector_count_history: Vec<VectorCountSample>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub struct VectorCountSample {
pub at: u64,
pub count: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollectionInfo {
pub name: String,
pub dimension: usize,
#[serde(default, alias = "similarity_metric")]
pub metric: String,
#[serde(default)]
pub vector_count: usize,
#[serde(default)]
pub document_count: usize,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub updated_at: String,
#[serde(default)]
pub indexing_status: Option<IndexingStatus>,
#[serde(default)]
pub size: Option<serde_json::Value>,
#[serde(default)]
pub quantization: Option<serde_json::Value>,
#[serde(default)]
pub normalization: Option<serde_json::Value>,
#[serde(default)]
pub status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IndexingStatus {
#[serde(default)]
pub status: String,
#[serde(default)]
pub progress: f32,
#[serde(default)]
pub total_documents: usize,
#[serde(default)]
pub processed_documents: usize,
#[serde(default)]
pub vector_count: usize,
#[serde(default)]
pub estimated_time_remaining: Option<String>,
#[serde(default)]
pub last_updated: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchResult {
pub id: String,
pub score: f32,
pub content: Option<String>,
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchResponse {
#[serde(default)]
pub results: Vec<SearchResult>,
#[serde(default)]
pub query_time_ms: f64,
#[serde(default)]
pub query: Option<String>,
#[serde(default)]
pub limit: Option<usize>,
#[serde(default)]
pub collection: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbeddingRequest {
pub text: String,
pub model: Option<String>,
pub parameters: Option<EmbeddingParameters>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbeddingParameters {
pub max_length: Option<usize>,
pub normalize: Option<bool>,
pub prefix: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbeddingResponse {
pub embedding: Vec<f32>,
pub model: String,
pub text: String,
pub dimension: usize,
pub provider: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthStatus {
pub status: String,
pub version: String,
pub timestamp: String,
pub uptime: Option<u64>,
pub collections: Option<usize>,
pub total_vectors: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollectionsResponse {
pub collections: Vec<Collection>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateCollectionResponse {
pub message: String,
pub collection: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DatabaseStats {
pub total_collections: usize,
pub total_vectors: usize,
pub total_memory_estimate_bytes: usize,
pub collections: Vec<CollectionStats>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollectionStats {
pub name: String,
pub vector_count: usize,
pub dimension: usize,
pub memory_estimate_bytes: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchTextRequest {
pub id: String,
pub text: String,
pub metadata: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchConfig {
pub max_batch_size: Option<usize>,
pub parallel_workers: Option<usize>,
pub atomic: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchInsertRequest {
pub texts: Vec<BatchTextRequest>,
pub config: Option<BatchConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchResponse {
#[serde(default)]
pub success: bool,
#[serde(default)]
pub collection: String,
#[serde(default)]
pub operation: String,
#[serde(default, alias = "count")]
pub total_operations: usize,
#[serde(default, alias = "inserted")]
pub successful_operations: usize,
#[serde(default, alias = "failed")]
pub failed_operations: usize,
#[serde(default)]
pub duration_ms: u64,
#[serde(default)]
pub errors: Vec<String>,
#[serde(default)]
pub results: Vec<BatchResultEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchResultEntry {
#[serde(default)]
pub client_id: String,
#[serde(default)]
pub index: usize,
#[serde(default)]
pub status: String,
#[serde(default)]
pub chunked: bool,
#[serde(default)]
pub vector_ids: Vec<String>,
#[serde(default)]
pub vectors_created: usize,
#[serde(default)]
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchSearchRequest {
pub queries: Vec<BatchSearchQuery>,
pub config: Option<BatchConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchSearchResponse {
pub success: bool,
pub collection: String,
pub total_queries: usize,
pub successful_queries: usize,
pub failed_queries: usize,
pub duration_ms: u64,
pub results: Vec<Vec<SearchResult>>,
pub errors: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchVectorUpdate {
pub id: String,
pub data: Option<Vec<f32>>,
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchUpdateRequest {
pub updates: Vec<BatchVectorUpdate>,
pub config: Option<BatchConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchDeleteRequest {
pub vector_ids: Vec<String>,
pub config: Option<BatchConfig>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum SummarizationMethod {
#[default]
Extractive,
Keyword,
Sentence,
Abstractive,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SummarizeTextRequest {
pub text: String,
pub method: Option<SummarizationMethod>,
pub max_length: Option<usize>,
pub compression_ratio: Option<f32>,
pub language: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SummarizeTextResponse {
pub summary_id: String,
pub original_text: String,
pub summary: String,
pub method: String,
pub original_length: usize,
pub summary_length: usize,
pub compression_ratio: f32,
pub language: String,
pub status: String,
pub message: String,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SummarizeContextRequest {
pub context: String,
pub method: Option<SummarizationMethod>,
pub max_length: Option<usize>,
pub compression_ratio: Option<f32>,
pub language: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SummarizeContextResponse {
pub summary_id: String,
pub original_context: String,
pub summary: String,
pub method: String,
pub original_length: usize,
pub summary_length: usize,
pub compression_ratio: f32,
pub language: String,
pub status: String,
pub message: String,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetSummaryResponse {
pub summary_id: String,
pub original_text: String,
pub summary: String,
pub method: String,
pub original_length: usize,
pub summary_length: usize,
pub compression_ratio: f32,
pub language: String,
pub created_at: String,
pub metadata: HashMap<String, String>,
pub status: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SummaryInfo {
pub summary_id: String,
pub method: String,
pub language: String,
pub original_length: usize,
pub summary_length: usize,
pub compression_ratio: f32,
pub created_at: String,
pub metadata: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListSummariesResponse {
pub summaries: Vec<SummaryInfo>,
pub total_count: usize,
pub status: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IndexingProgress {
pub is_indexing: bool,
pub overall_status: String,
pub collections: Vec<CollectionProgress>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollectionProgress {
pub collection_name: String,
pub status: String,
pub progress: f32,
pub vector_count: usize,
pub error_message: Option<String>,
pub last_updated: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntelligentSearchRequest {
pub query: String,
pub collections: Option<Vec<String>>,
pub max_results: Option<usize>,
pub domain_expansion: Option<bool>,
pub technical_focus: Option<bool>,
pub mmr_enabled: Option<bool>,
pub mmr_lambda: Option<f32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SemanticSearchRequest {
pub query: String,
pub collection: String,
pub max_results: Option<usize>,
pub semantic_reranking: Option<bool>,
pub cross_encoder_reranking: Option<bool>,
pub similarity_threshold: Option<f32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContextualSearchRequest {
pub query: String,
pub collection: String,
pub context_filters: Option<HashMap<String, serde_json::Value>>,
pub max_results: Option<usize>,
pub context_reranking: Option<bool>,
pub context_weight: Option<f32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MultiCollectionSearchRequest {
pub query: String,
pub collections: Vec<String>,
pub max_per_collection: Option<usize>,
pub max_total_results: Option<usize>,
pub cross_collection_reranking: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntelligentSearchResult {
pub id: String,
pub score: f32,
pub content: String,
pub metadata: Option<HashMap<String, serde_json::Value>>,
pub collection: Option<String>,
pub query_used: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntelligentSearchResponse {
pub results: Vec<IntelligentSearchResult>,
pub total_results: usize,
pub duration_ms: u64,
pub queries_generated: Option<Vec<String>>,
pub collections_searched: Option<Vec<String>>,
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SemanticSearchResponse {
pub results: Vec<IntelligentSearchResult>,
pub total_results: usize,
pub duration_ms: u64,
pub collection: String,
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContextualSearchResponse {
pub results: Vec<IntelligentSearchResult>,
pub total_results: usize,
pub duration_ms: u64,
pub collection: String,
pub context_filters: Option<HashMap<String, serde_json::Value>>,
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MultiCollectionSearchResponse {
pub results: Vec<IntelligentSearchResult>,
pub total_results: usize,
pub duration_ms: u64,
pub collections_searched: Vec<String>,
pub results_per_collection: Option<HashMap<String, usize>>,
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub enum ReplicaStatus {
Connected,
Syncing,
Lagging,
Disconnected,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReplicaInfo {
pub replica_id: String,
pub host: String,
pub port: u16,
pub status: String,
pub last_heartbeat: DateTime<Utc>,
pub operations_synced: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lag: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReplicationStats {
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bytes_sent: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bytes_received: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_sync: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub operations_pending: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub snapshot_size: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub connected_replicas: Option<usize>,
pub master_offset: u64,
pub replica_offset: u64,
pub lag_operations: u64,
pub total_replicated: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReplicationStatusResponse {
pub status: String,
pub stats: ReplicationStats,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReplicaListResponse {
pub replicas: Vec<ReplicaInfo>,
pub count: usize,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorPage {
#[serde(default)]
pub vectors: Vec<serde_json::Value>,
#[serde(default)]
pub total: usize,
#[serde(default)]
pub limit: usize,
#[serde(default)]
pub offset: usize,
#[serde(default)]
pub message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateVectorRequest {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchInsertItem {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub text: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchInsertReport {
pub collection: String,
#[serde(alias = "inserted")]
pub successful: usize,
pub failed: usize,
#[serde(default, alias = "count")]
pub total: usize,
#[serde(default)]
pub results: Vec<BatchResultEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorUpdate {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vector: Option<Vec<f32>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub payload: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchUpdateReport {
pub collection: String,
#[serde(default, alias = "count")]
pub total: usize,
#[serde(alias = "updated")]
pub successful: usize,
pub failed: usize,
#[serde(default)]
pub results: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RawVectorInsert {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub embedding: Vec<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub payload: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchSearchQuery {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub query: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vector: Option<Vec<f32>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limit: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub threshold: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchByFileRequest {
pub file_path: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limit: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BroadDiscoveryRequest {
pub queries: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub k: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BroadDiscoveryResponse {
#[serde(default)]
pub chunks: Vec<serde_json::Value>,
#[serde(default)]
pub count: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SemanticFocusRequest {
pub collection: String,
pub queries: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub k: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SemanticFocusResponse {
#[serde(default)]
pub chunks: Vec<serde_json::Value>,
#[serde(default)]
pub count: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromoteReadmeRequest {
pub chunks: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromoteReadmeResponse {
#[serde(default)]
pub promoted_chunks: Vec<serde_json::Value>,
#[serde(default)]
pub count: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompressEvidenceRequest {
pub chunks: Vec<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_bullets: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_per_doc: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompressEvidenceResponse {
#[serde(default)]
pub bullets: Vec<serde_json::Value>,
#[serde(default)]
pub count: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AnswerPlanRequest {
pub bullets: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AnswerPlan {
#[serde(default)]
pub sections: Vec<serde_json::Value>,
#[serde(default)]
pub total_bullets: usize,
#[serde(default)]
pub sources: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RenderPromptRequest {
pub plan: AnswerPlan,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LlmPrompt {
pub prompt: String,
#[serde(default)]
pub length: usize,
#[serde(default)]
pub estimated_tokens: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Stats {
#[serde(default)]
pub collections: usize,
#[serde(default)]
pub total_vectors: usize,
#[serde(default)]
pub uptime_seconds: u64,
#[serde(default)]
pub version: String,
#[serde(default = "default_quantization_label")]
pub default_quantization: String,
#[serde(default = "default_compression_ratio")]
pub compression_ratio: f32,
}
fn default_quantization_label() -> String {
"none".to_string()
}
fn default_compression_ratio() -> f32 {
1.0
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RuntimeMetrics {
#[serde(default)]
pub cpu_percent: f64,
#[serde(default)]
pub memory_rss_bytes: u64,
#[serde(default)]
pub memory_total_bytes: u64,
#[serde(default)]
pub memory_percent: f64,
#[serde(default)]
pub active_connections: usize,
#[serde(default)]
pub uptime_seconds: u64,
#[serde(default)]
pub qps_window_60s: f64,
#[serde(default)]
pub error_rate_5xx_60s: f64,
#[serde(default)]
pub throughput_by_route: Vec<RouteStats>,
#[serde(default)]
pub wal: WalSnapshot,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RouteStats {
#[serde(default)]
pub route: String,
#[serde(default)]
pub qps: f64,
#[serde(default)]
pub p50_ms: f64,
#[serde(default)]
pub p99_ms: f64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct WalSnapshot {
#[serde(default)]
pub current_seq: u64,
#[serde(default)]
pub size_bytes: u64,
#[serde(default)]
pub last_checkpoint_at: u64,
#[serde(default)]
pub last_checkpoint_seq: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerStatus {
#[serde(default)]
pub online: bool,
#[serde(default)]
pub version: String,
#[serde(default)]
pub uptime_seconds: u64,
#[serde(default)]
pub collections_count: usize,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct LogsQuery {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub lines: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub level: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogEntry {
#[serde(default)]
pub timestamp: String,
#[serde(default)]
pub level: String,
#[serde(default)]
pub message: String,
#[serde(default)]
pub source: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CleanupReport {
#[serde(default)]
pub success: bool,
#[serde(default)]
pub removed: usize,
#[serde(default)]
pub collections: Vec<String>,
#[serde(default)]
pub message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConfigSnapshot(pub serde_json::Value);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConfigPatch(pub serde_json::Value);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BackupInfo {
pub id: String,
pub name: String,
pub date: String,
#[serde(default)]
pub size: u64,
#[serde(default)]
pub collections: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateBackupRequest {
pub name: String,
#[serde(default)]
pub collections: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RestoreBackupRequest {
pub backup_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkspaceConfig(pub serde_json::Value);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddWorkspaceRequest {
pub path: String,
pub collection_name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
pub user_id: String,
pub username: String,
#[serde(default)]
pub roles: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JwtToken {
pub access_token: String,
pub token_type: String,
pub expires_in: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PasswordPolicyReport {
pub valid: bool,
#[serde(default)]
pub errors: Vec<String>,
#[serde(default)]
pub strength: u8,
#[serde(default)]
pub strength_label: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateApiKeyRequest {
pub name: String,
#[serde(default)]
pub permissions: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires_in: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiKey {
pub id: String,
pub name: String,
#[serde(default)]
pub permissions: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub api_key: Option<String>,
#[serde(default)]
pub created_at: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_used: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires_at: Option<u64>,
#[serde(default)]
pub active: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub warning: Option<String>,
#[serde(default)]
pub usage_count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ApiKeyScope {
pub collection: String,
#[serde(default)]
pub permissions: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateApiKeyPermissionsRequest {
pub permissions: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scopes: Option<Vec<ApiKeyScope>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiKeyView {
pub id: String,
pub name: String,
pub user_id: String,
#[serde(default)]
pub permissions: Vec<String>,
#[serde(default)]
pub scopes: Vec<ApiKeyScope>,
pub created_at: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_used: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires_at: Option<u64>,
#[serde(default)]
pub active: bool,
#[serde(default)]
pub usage_count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ApiKeyUsageBucket {
pub date: String,
pub count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiKeyUsageReport {
pub key: ApiKeyView,
pub buckets: Vec<ApiKeyUsageBucket>,
pub window_total: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateUserRequest {
pub username: String,
pub password: String,
#[serde(default)]
pub roles: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReplicationStatus {
pub role: String,
pub enabled: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stats: Option<ReplicationStats>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub replicas: Option<Vec<ReplicaInfo>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReplicationConfig {
pub role: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bind_address: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub master_address: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub heartbeat_interval: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub log_size: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserBackup {
pub id: String,
pub user_id: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default)]
pub collections: Vec<String>,
pub created_at: String,
#[serde(default)]
pub size: u64,
#[serde(default)]
pub status: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateUserBackupRequest {
pub user_id: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub collections: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RestoreUserBackupRequest {
pub user_id: String,
pub backup_id: String,
#[serde(default)]
pub overwrite: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UploadUserBackupRequest {
pub user_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip)]
pub data: Vec<u8>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsageStatistics {
#[serde(default)]
pub success: bool,
#[serde(default)]
pub message: String,
#[serde(default)]
pub stats: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuotaInfo {
#[serde(default)]
pub success: bool,
#[serde(default)]
pub message: String,
#[serde(default)]
pub quota: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReindexParams {
pub m: u32,
pub ef_construction: u32,
pub ef_search: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ReindexJob {
pub job_id: String,
pub collection: String,
pub state: String,
pub params: serde_json::Value,
pub progress: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct NativeSnapshotInfo {
pub id: String,
pub collection: String,
pub created_at: String,
pub size_bytes: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExplainRequest {
pub vector: Vec<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub k: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ExplainTrace {
pub visited_nodes: usize,
pub ef_search: usize,
pub hnsw_search_ms: f64,
pub payload_filter_evals: usize,
pub quantization_score_ms: f64,
pub total_ms: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExplainResponse {
pub collection: String,
pub k: usize,
#[serde(default)]
pub results: Vec<serde_json::Value>,
pub trace: ExplainTrace,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SlowQueryEntry {
pub timestamp: String,
pub collection: String,
pub k: usize,
pub duration_ms: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct SlowQueryConfig {
pub threshold_ms: u64,
pub capacity: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HubApiKeyValidation {
pub valid: bool,
#[serde(default)]
pub tenant_id: String,
#[serde(default)]
pub tenant_name: String,
#[serde(default)]
pub permissions: Vec<String>,
#[serde(default)]
pub validated_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct FailoverReport {
pub promoted_replica_id: String,
pub master_offset_at_promotion: u64,
pub replica_offset_at_promotion: u64,
pub residual_lag_operations: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ResyncJob {
pub replica_id: String,
pub snapshot_offset: u64,
pub full_snapshot: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PeerInfo {
pub node_id: String,
pub address: String,
pub role: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddPeerRequest {
pub address: String,
#[serde(default)]
pub role: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RebalanceJob {
pub job_id: String,
pub status: String,
pub shards_to_move: usize,
pub shards_moved: usize,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_checkpoint_node: Option<String>,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RotatedKey {
pub old_key_id: String,
pub new_key_id: String,
pub new_token: String,
pub grace_until: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateScopedApiKeyRequest {
pub name: String,
#[serde(default)]
pub permissions: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires_in: Option<u64>,
#[serde(default)]
pub scopes: Vec<TokenScope>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenScope {
pub collection: String,
#[serde(default)]
pub permissions: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenIntrospection {
pub active: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scope: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sub: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exp: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuditEntry {
pub actor: String,
pub action: String,
pub target: String,
pub at: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub correlation_id: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct AuditQuery {
#[serde(skip_serializing_if = "Option::is_none")]
pub actor: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub action: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub since: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub until: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<usize>,
}