1use serde_json::Value;
2use surf::StatusCode;
3use thiserror::Error;
4
5#[derive(Error, Debug)]
6pub enum OpenRouterError {
7 #[error("HTTP request failed: {0}")]
8 HttpRequest(surf::Error),
9 #[error("API error: {code}, message: {message}")]
10 ApiError { code: StatusCode, message: String },
11 #[error(
12 "Moderation error: {message}, reasons: {reasons:?}, flagged input: {flagged_input}, provider: {provider_name}, model: {model_slug}"
13 )]
14 ModerationError {
15 code: StatusCode,
16 message: String,
17 reasons: Vec<String>,
18 flagged_input: String,
19 provider_name: String,
20 model_slug: String,
21 },
22 #[error("Provider error: {message}, provider: {provider_name}, raw: {raw:?}")]
23 ProviderError {
24 code: StatusCode,
25 message: String,
26 provider_name: String,
27 raw: Value,
28 },
29 #[error("API error with metadata: {message}, metadata: {metadata:?}")]
30 ApiErrorWithMetadata {
31 code: StatusCode,
32 message: String,
33 metadata: Value,
34 },
35 #[error("Serialization error: {0}")]
36 Serialization(#[from] serde_json::Error),
37 #[error("IO error: {0}")]
38 Io(#[from] std::io::Error),
39 #[error("Unknown error: {0}")]
40 Unknown(String),
41}
42
43impl From<surf::Error> for OpenRouterError {
44 fn from(err: surf::Error) -> Self {
45 OpenRouterError::HttpRequest(err)
46 }
47}