use async_trait::async_trait;
use toolkit_macros::domain_model;
#[domain_model]
#[derive(Debug, Clone)]
pub struct RetrievedChunk {
pub source_uri: String,
pub title: String,
pub text: String,
pub score: f32,
}
#[domain_model]
#[derive(Debug, Clone)]
pub struct RetrievalRequest {
pub query: String,
pub top_k: usize,
pub chat_id: String,
pub vector_store_id: String,
pub upstream_alias: String,
pub api_version: String,
}
#[domain_model]
#[derive(Debug, thiserror::Error)]
pub enum RetrievalError {
#[error("retrieval provider rejected: {0}")]
Rejected(String),
#[error("retrieval provider unavailable: {0}")]
Unavailable(String),
#[error("retrieval configuration error: {0}")]
Configuration(String),
}
#[async_trait]
pub trait KnowledgeRetriever: Send + Sync {
async fn retrieve(
&self,
ctx: toolkit_security::SecurityContext,
req: RetrievalRequest,
) -> Result<Vec<RetrievedChunk>, RetrievalError>;
}