open_router.rs

 1use crate::{LanguageModelCompletionError, LanguageModelProviderName};
 2use http_client::StatusCode;
 3use open_router::OpenRouterError;
 4
 5impl From<OpenRouterError> for LanguageModelCompletionError {
 6    fn from(error: OpenRouterError) -> Self {
 7        let provider = LanguageModelProviderName::new("OpenRouter");
 8        match error {
 9            OpenRouterError::SerializeRequest(error) => Self::SerializeRequest { provider, error },
10            OpenRouterError::BuildRequestBody(error) => Self::BuildRequestBody { provider, error },
11            OpenRouterError::HttpSend(error) => Self::HttpSend { provider, error },
12            OpenRouterError::DeserializeResponse(error) => {
13                Self::DeserializeResponse { provider, error }
14            }
15            OpenRouterError::ReadResponse(error) => Self::ApiReadResponseError { provider, error },
16            OpenRouterError::RateLimit { retry_after } => Self::RateLimitExceeded {
17                provider,
18                retry_after: Some(retry_after),
19            },
20            OpenRouterError::ServerOverloaded { retry_after } => Self::ServerOverloaded {
21                provider,
22                retry_after,
23            },
24            OpenRouterError::ApiError(api_error) => api_error.into(),
25        }
26    }
27}
28
29impl From<open_router::ApiError> for LanguageModelCompletionError {
30    fn from(error: open_router::ApiError) -> Self {
31        use open_router::ApiErrorCode::*;
32        let provider = LanguageModelProviderName::new("OpenRouter");
33        match error.code {
34            InvalidRequestError => Self::BadRequestFormat {
35                provider,
36                message: error.message,
37            },
38            AuthenticationError => Self::AuthenticationError {
39                provider,
40                message: error.message,
41            },
42            PaymentRequiredError => Self::AuthenticationError {
43                provider,
44                message: format!("Payment required: {}", error.message),
45            },
46            PermissionError => Self::PermissionError {
47                provider,
48                message: error.message,
49            },
50            RequestTimedOut => Self::HttpResponseError {
51                provider,
52                status_code: StatusCode::REQUEST_TIMEOUT,
53                message: error.message,
54            },
55            RateLimitError => Self::RateLimitExceeded {
56                provider,
57                retry_after: None,
58            },
59            ApiError => Self::ApiInternalServerError {
60                provider,
61                message: error.message,
62            },
63            OverloadedError => Self::ServerOverloaded {
64                provider,
65                retry_after: None,
66            },
67        }
68    }
69}