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}