1use reqwest::StatusCode;
2
3#[derive(thiserror::Error, Debug)]
4pub enum Error {
5 #[error(transparent)]
6 Http(#[from] reqwest::Error),
7
8 #[error(transparent)]
9 Json(#[from] serde_json::Error),
10
11 #[error(transparent)]
12 Io(#[from] std::io::Error),
13
14 #[error("invalid header value for {0}: {1}")]
15 InvalidHeaderValue(String, reqwest::header::InvalidHeaderValue),
16
17 #[error("No API key for provider: {0}")]
18 MissingApiKey(String),
19
20 #[error("unsupported api: {0}")]
21 UnsupportedApi(String),
22
23 #[error("provider {provider} does not support {capability}")]
24 UnsupportedCapability {
25 provider: String,
26 capability: &'static str,
27 },
28
29 #[error("provider returned HTTP {status}: {body}")]
30 ApiStatus { status: StatusCode, body: String },
31
32 #[error("provider error: {0}")]
33 Provider(String),
34
35 #[error("invalid provider response: {0}")]
36 InvalidProviderResponse(String),
37
38 #[error("{0}")]
39 Validation(String),
40
41 #[error("request was cancelled")]
42 Cancelled,
43
44 #[error("stream ended before producing a final assistant message")]
45 StreamClosed,
46}
47
48pub type Result<T> = std::result::Result<T, Error>;
49
50impl Error {
51 pub fn unsupported_capability(provider: impl Into<String>, capability: &'static str) -> Self {
52 Self::UnsupportedCapability {
53 provider: provider.into(),
54 capability,
55 }
56 }
57}