use thiserror::Error;
#[derive(Debug, Error)]
pub enum RagError {
#[error("Embedding error ({provider}): {message}")]
EmbeddingError {
provider: String,
message: String,
},
#[error("Vector store error ({backend}): {message}")]
VectorStoreError {
backend: String,
message: String,
},
#[error("Chunking error: {0}")]
ChunkingError(String),
#[error("Reranker error ({reranker}): {message}")]
RerankerError {
reranker: String,
message: String,
},
#[error("Configuration error: {0}")]
ConfigError(String),
#[error("Pipeline error: {0}")]
PipelineError(String),
#[error(transparent)]
AdkError(#[from] adk_core::AdkError),
}
pub type Result<T> = std::result::Result<T, RagError>;
impl From<RagError> for adk_core::AdkError {
fn from(err: RagError) -> Self {
use adk_core::{ErrorCategory, ErrorComponent};
if let RagError::AdkError(inner) = err {
return inner;
}
let (category, code) = match &err {
RagError::EmbeddingError { .. } => (ErrorCategory::Internal, "memory.embedding"),
RagError::VectorStoreError { .. } => (ErrorCategory::Internal, "memory.vector_store"),
RagError::ChunkingError(_) => (ErrorCategory::Internal, "memory.chunking"),
RagError::RerankerError { .. } => (ErrorCategory::Internal, "memory.reranker"),
RagError::ConfigError(_) => (ErrorCategory::InvalidInput, "memory.rag_config"),
RagError::PipelineError(_) => (ErrorCategory::Internal, "memory.rag_pipeline"),
RagError::AdkError(_) => unreachable!(),
};
adk_core::AdkError::new(ErrorComponent::Memory, category, code, err.to_string())
.with_source(err)
}
}