use std::sync::Arc;
use async_trait::async_trait;
use synaptic_core::{ChatModel, ChatRequest, ChatResponse, ChatStream, SynapticError};
use crate::LlmCache;
pub struct CachedChatModel {
inner: Arc<dyn ChatModel>,
cache: Arc<dyn LlmCache>,
}
impl CachedChatModel {
pub fn new(inner: Arc<dyn ChatModel>, cache: Arc<dyn LlmCache>) -> Self {
Self { inner, cache }
}
}
#[async_trait]
impl ChatModel for CachedChatModel {
async fn chat(&self, request: ChatRequest) -> Result<ChatResponse, SynapticError> {
let key = serde_json::to_string(&request)
.map_err(|e| SynapticError::Cache(format!("failed to serialize request: {e}")))?;
if let Some(cached) = self.cache.get(&key).await? {
return Ok(cached);
}
let response = self.inner.chat(request).await?;
self.cache.put(&key, &response).await?;
Ok(response)
}
fn stream_chat(&self, request: ChatRequest) -> ChatStream<'_> {
self.inner.stream_chat(request)
}
}