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::*;
#[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>,
}
#[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 BatchSearchQuery {
pub query: String,
pub limit: Option<usize>,
pub score_threshold: Option<f32>,
}
#[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,
}