use async_trait::async_trait;
use futures::stream::Stream;
use std::pin::Pin;
use crate::error::RagError;
use crate::types::config::RagEngineInfo;
use crate::types::rag::{RagRequest, RagResponse, RagStreamEvent};
use crate::types::retrieval::{RetrieveRequest, RetrieveResult};
#[async_trait]
pub trait RagEngine: Send + Sync {
async fn retrieve(&self, request: &RetrieveRequest) -> Result<RetrieveResult, RagError>;
async fn retrieve_and_generate(&self, request: &RagRequest) -> Result<RagResponse, RagError>;
async fn retrieve_and_generate_stream(
&self,
request: &RagRequest,
) -> Result<Pin<Box<dyn Stream<Item = Result<RagStreamEvent, RagError>> + Send>>, RagError>;
fn engine_info(&self) -> RagEngineInfo;
}