1use crate::types::metadata::Metadata;
2use thiserror::Error;
3
4#[derive(Clone, Debug, Error)]
5pub enum ChatError {
6 #[error("network error: {0}")]
7 Network(String),
8
9 #[error("provider error: {0}")]
10 Provider(String),
11
12 #[error("rate limited")]
13 RateLimited,
14
15 #[error("exceeded maximum steps")]
16 MaxStepsExceeded,
17
18 #[error("invalid response: {0}")]
19 InvalidResponse(String),
20
21 #[error("error in callback function: {0}")]
22 Callback(String),
23
24 #[error("unknown error: {0}")]
25 Other(String),
26}
27
28impl ChatError {
29 pub fn is_retryable(&self) -> bool {
35 matches!(self, ChatError::RateLimited | ChatError::Network(_))
36 }
37}
38
39#[derive(Clone, Debug, Error)]
40#[error("Chat engine failed: {err}")]
41pub struct ChatFailure {
42 pub metadata: Option<Metadata>,
43 #[source]
44 pub err: ChatError,
45}
46
47impl ChatFailure {
48 pub fn from_err<E: Into<ChatError>>(err: E) -> Self {
49 Self {
50 metadata: None,
51 err: err.into(),
52 }
53 }
54}