gproxy_protocol/transform/openai/model_list/claude/
utils.rs1use http::StatusCode;
2
3use crate::claude::types::{BetaError, BetaErrorResponse, BetaModelInfo};
4use crate::openai::types::{
5 OpenAiApiError, OpenAiApiErrorResponse, OpenAiModel, OpenAiModelObject,
6};
7
8fn claude_error_type(error: &BetaError) -> &'static str {
9 match error {
10 BetaError::InvalidRequest(_) => "invalid_request_error",
11 BetaError::Authentication(_) => "authentication_error",
12 BetaError::Billing(_) => "billing_error",
13 BetaError::Permission(_) => "permission_error",
14 BetaError::NotFound(_) => "not_found_error",
15 BetaError::RateLimit(_) => "rate_limit_error",
16 BetaError::GatewayTimeout(_) => "timeout_error",
17 BetaError::Api(_) => "api_error",
18 BetaError::Overloaded(_) => "overloaded_error",
19 }
20}
21
22fn claude_error_message(error: &BetaError) -> String {
23 match error {
24 BetaError::InvalidRequest(err) => err.message.clone(),
25 BetaError::Authentication(err) => err.message.clone(),
26 BetaError::Billing(err) => err.message.clone(),
27 BetaError::Permission(err) => err.message.clone(),
28 BetaError::NotFound(err) => err.message.clone(),
29 BetaError::RateLimit(err) => err.message.clone(),
30 BetaError::GatewayTimeout(err) => err.message.clone(),
31 BetaError::Api(err) => err.message.clone(),
32 BetaError::Overloaded(err) => err.message.clone(),
33 }
34}
35
36pub fn openai_model_from_claude_model(model: BetaModelInfo) -> OpenAiModel {
37 OpenAiModel {
38 id: model.id,
39 created: u64::try_from(model.created_at.unix_timestamp()).unwrap_or_default(),
40 object: OpenAiModelObject::Model,
41 owned_by: "anthropic".to_string(),
42 }
43}
44
45pub fn openai_error_response_from_claude(
46 _status_code: StatusCode,
47 body: BetaErrorResponse,
48) -> OpenAiApiErrorResponse {
49 OpenAiApiErrorResponse {
50 error: OpenAiApiError {
51 message: claude_error_message(&body.error),
52 type_: claude_error_type(&body.error).to_string(),
53 param: None,
54 code: None,
55 },
56 }
57}