1use thiserror::Error;
4
5#[derive(Debug, Error)]
7pub enum RagError {
8 #[error("Embedding error ({provider}): {message}")]
10 EmbeddingError {
11 provider: String,
13 message: String,
15 },
16
17 #[error("Vector store error ({backend}): {message}")]
19 VectorStoreError {
20 backend: String,
22 message: String,
24 },
25
26 #[error("Chunking error: {0}")]
28 ChunkingError(String),
29
30 #[error("Reranker error ({reranker}): {message}")]
32 RerankerError {
33 reranker: String,
35 message: String,
37 },
38
39 #[error("Configuration error: {0}")]
41 ConfigError(String),
42
43 #[error("Pipeline error: {0}")]
45 PipelineError(String),
46
47 #[error(transparent)]
49 AdkError(#[from] adk_core::AdkError),
50}
51
52pub type Result<T> = std::result::Result<T, RagError>;
54
55impl From<RagError> for adk_core::AdkError {
56 fn from(err: RagError) -> Self {
57 use adk_core::{ErrorCategory, ErrorComponent};
58 if let RagError::AdkError(inner) = err {
60 return inner;
61 }
62 let (category, code) = match &err {
63 RagError::EmbeddingError { .. } => (ErrorCategory::Internal, "memory.embedding"),
64 RagError::VectorStoreError { .. } => (ErrorCategory::Internal, "memory.vector_store"),
65 RagError::ChunkingError(_) => (ErrorCategory::Internal, "memory.chunking"),
66 RagError::RerankerError { .. } => (ErrorCategory::Internal, "memory.reranker"),
67 RagError::ConfigError(_) => (ErrorCategory::InvalidInput, "memory.rag_config"),
68 RagError::PipelineError(_) => (ErrorCategory::Internal, "memory.rag_pipeline"),
69 RagError::AdkError(_) => unreachable!(),
70 };
71 adk_core::AdkError::new(ErrorComponent::Memory, category, code, err.to_string())
72 .with_source(err)
73 }
74}