pub mod cache_config;
pub mod cache_key;
pub mod client;
pub mod distributed;
pub mod stats;
pub mod warming;
pub use cache_config::{CacheConfig, CacheConfigBuilder, EvictionPolicy};
pub use cache_key::{CacheKey, CacheKeyGenerator};
pub use client::CachedLLMClient;
pub use distributed::{DistributedCache, DistributedCacheStats, L1Cache};
pub use stats::{CacheHealth, CacheMetrics, CacheStatistics};
pub use warming::{CacheWarmer, WarmingConfig, WarmingStrategy};
use crate::core::GraphRAGError;
pub use crate::core::traits::{GenerationParams, LanguageModel, ModelInfo};
#[derive(Debug, thiserror::Error)]
pub enum CacheError {
#[error("Cache initialization failed: {0}")]
InitializationFailed(String),
#[error("Cache key generation failed: {0}")]
KeyGenerationFailed(String),
#[error("Cache operation failed: {0}")]
OperationFailed(String),
#[error("Cache warming failed: {0}")]
WarmingFailed(String),
#[error("Serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("Configuration error: {0}")]
Configuration(String),
}
impl From<CacheError> for GraphRAGError {
fn from(err: CacheError) -> Self {
GraphRAGError::Generation {
message: format!("Cache error: {err:?}"),
}
}
}
pub type CacheResult<T> = std::result::Result<T, CacheError>;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CacheEntry {
pub response: String,
pub created_at: chrono::DateTime<chrono::Utc>,
pub access_count: u64,
pub last_accessed: chrono::DateTime<chrono::Utc>,
pub metadata: std::collections::HashMap<String, String>,
}
impl CacheEntry {
pub fn new(response: String) -> Self {
let now = chrono::Utc::now();
Self {
response,
created_at: now,
access_count: 1,
last_accessed: now,
metadata: std::collections::HashMap::new(),
}
}
pub fn access(&mut self) {
self.access_count += 1;
self.last_accessed = chrono::Utc::now();
}
pub fn age(&self) -> chrono::Duration {
chrono::Utc::now() - self.created_at
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cache_entry() {
let mut entry = CacheEntry::new("test response".to_string());
assert_eq!(entry.response, "test response");
assert_eq!(entry.access_count, 1);
entry.access();
assert_eq!(entry.access_count, 2);
assert!(entry.age().num_seconds() >= 0);
}
}