anthropic.rs

 1use crate::{LanguageModelCompletionError, LanguageModelProviderId, LanguageModelProviderName};
 2use anthropic::AnthropicError;
 3pub use anthropic::parse_prompt_too_long;
 4
 5pub const ANTHROPIC_PROVIDER_ID: LanguageModelProviderId =
 6    LanguageModelProviderId::new("anthropic");
 7pub const ANTHROPIC_PROVIDER_NAME: LanguageModelProviderName =
 8    LanguageModelProviderName::new("Anthropic");
 9
10impl From<AnthropicError> for LanguageModelCompletionError {
11    fn from(error: AnthropicError) -> Self {
12        let provider = ANTHROPIC_PROVIDER_NAME;
13        match error {
14            AnthropicError::SerializeRequest(error) => Self::SerializeRequest { provider, error },
15            AnthropicError::BuildRequestBody(error) => Self::BuildRequestBody { provider, error },
16            AnthropicError::HttpSend(error) => Self::HttpSend { provider, error },
17            AnthropicError::DeserializeResponse(error) => {
18                Self::DeserializeResponse { provider, error }
19            }
20            AnthropicError::ReadResponse(error) => Self::ApiReadResponseError { provider, error },
21            AnthropicError::HttpResponseError {
22                status_code,
23                message,
24            } => Self::HttpResponseError {
25                provider,
26                status_code,
27                message,
28            },
29            AnthropicError::RateLimit { retry_after } => Self::RateLimitExceeded {
30                provider,
31                retry_after: Some(retry_after),
32            },
33            AnthropicError::ServerOverloaded { retry_after } => Self::ServerOverloaded {
34                provider,
35                retry_after,
36            },
37            AnthropicError::ApiError(api_error) => api_error.into(),
38        }
39    }
40}
41
42impl From<anthropic::ApiError> for LanguageModelCompletionError {
43    fn from(error: anthropic::ApiError) -> Self {
44        use anthropic::ApiErrorCode::*;
45        let provider = ANTHROPIC_PROVIDER_NAME;
46        match error.code() {
47            Some(code) => match code {
48                InvalidRequestError => Self::BadRequestFormat {
49                    provider,
50                    message: error.message,
51                },
52                AuthenticationError => Self::AuthenticationError {
53                    provider,
54                    message: error.message,
55                },
56                PermissionError => Self::PermissionError {
57                    provider,
58                    message: error.message,
59                },
60                NotFoundError => Self::ApiEndpointNotFound { provider },
61                RequestTooLarge => Self::PromptTooLarge {
62                    tokens: parse_prompt_too_long(&error.message),
63                },
64                RateLimitError => Self::RateLimitExceeded {
65                    provider,
66                    retry_after: None,
67                },
68                ApiError => Self::ApiInternalServerError {
69                    provider,
70                    message: error.message,
71                },
72                OverloadedError => Self::ServerOverloaded {
73                    provider,
74                    retry_after: None,
75                },
76            },
77            None => Self::Other(error.into()),
78        }
79    }
80}