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}