use crate::client::{QdrantConfig, QdrantHandle};
use crate::embedder::{DummyEmbedder, Embedder};
use crate::long_term::QdrantLongTerm;
use klieo_core::error::MemoryError;
use klieo_core::memory::LongTermMemory;
use std::sync::Arc;
pub struct MemoryQdrant {
pub long_term: Arc<dyn LongTermMemory>,
pub qdrant_long_term: Arc<QdrantLongTerm>,
}
impl MemoryQdrant {
pub async fn connect(url: impl Into<String>) -> Result<Self, MemoryError> {
Self::new(QdrantConfig::new(url), Arc::new(DummyEmbedder)).await
}
pub async fn new(cfg: QdrantConfig, embedder: Arc<dyn Embedder>) -> Result<Self, MemoryError> {
let handle = QdrantHandle::connect(&cfg)?;
let embedder_id = cfg.embedder_id().to_string();
let qdrant_long_term = Arc::new(QdrantLongTerm::new(handle, embedder, embedder_id));
let long_term: Arc<dyn LongTermMemory> = qdrant_long_term.clone();
Ok(Self {
long_term,
qdrant_long_term,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
use klieo_core::error::MemoryError;
#[tokio::test]
async fn connect_refuses_plaintext_remote_by_default() {
let result = MemoryQdrant::connect("http://qdrant.example.com:6334").await;
match result {
Err(MemoryError::Store(_)) => {}
Err(other) => {
panic!("expected MemoryError::Store from plaintext-remote refusal, got {other:?}")
}
Ok(_) => panic!("non-loopback http:// must be rejected by default"),
}
}
}