diff --git a/common/model-ratio.go b/common/model-ratio.go index 26eb9b5..96d8269 100644 --- a/common/model-ratio.go +++ b/common/model-ratio.go @@ -85,6 +85,7 @@ var defaultModelRatio = map[string]float64{ "claude-2.1": 4, // $8 / 1M tokens "claude-3-haiku-20240307": 0.125, // $0.25 / 1M tokens "claude-3-5-sonnet-20240620": 1.5, // $3 / 1M tokens + "claude-3-5-sonnet-20241022": 1.5, // $3 / 1M tokens "claude-3-sonnet-20240229": 1.5, // $3 / 1M tokens "claude-3-opus-20240229": 7.5, // $15 / 1M tokens "ERNIE-4.0-8K": 0.120 * RMB, diff --git a/relay/channel/aws/constants.go b/relay/channel/aws/constants.go index 2d6eaa1..d993d46 100644 --- a/relay/channel/aws/constants.go +++ b/relay/channel/aws/constants.go @@ -1,13 +1,14 @@ package aws var awsModelIDMap = map[string]string{ - "claude-instant-1.2": "anthropic.claude-instant-v1", - "claude-2.0": "anthropic.claude-v2", - "claude-2.1": "anthropic.claude-v2:1", - "claude-3-sonnet-20240229": "anthropic.claude-3-sonnet-20240229-v1:0", - "claude-3-opus-20240229": "anthropic.claude-3-opus-20240229-v1:0", - "claude-3-haiku-20240307": "anthropic.claude-3-haiku-20240307-v1:0", + "claude-instant-1.2": "anthropic.claude-instant-v1", + "claude-2.0": "anthropic.claude-v2", + "claude-2.1": "anthropic.claude-v2:1", + "claude-3-sonnet-20240229": "anthropic.claude-3-sonnet-20240229-v1:0", + "claude-3-opus-20240229": "anthropic.claude-3-opus-20240229-v1:0", + "claude-3-haiku-20240307": "anthropic.claude-3-haiku-20240307-v1:0", "claude-3-5-sonnet-20240620": "anthropic.claude-3-5-sonnet-20240620-v1:0", + "claude-3-5-sonnet-20241022": "anthropic.claude-3-5-sonnet-20241022-v2:0", } var ChannelName = "aws" diff --git a/relay/channel/aws/dto.go b/relay/channel/aws/dto.go index 7a267b1..5bf3551 100644 --- a/relay/channel/aws/dto.go +++ b/relay/channel/aws/dto.go @@ -1,6 +1,8 @@ package aws -import "one-api/relay/channel/claude" +import ( + "one-api/relay/channel/claude" +) type AwsClaudeRequest struct { // AnthropicVersion should be "bedrock-2023-05-31" @@ -12,4 +14,6 @@ type AwsClaudeRequest struct { TopP float64 `json:"top_p,omitempty"` TopK int `json:"top_k,omitempty"` StopSequences []string `json:"stop_sequences,omitempty"` + Tools []claude.Tool `json:"tools,omitempty"` + ToolChoice any `json:"tool_choice,omitempty"` } diff --git a/relay/channel/aws/relay-aws.go b/relay/channel/aws/relay-aws.go index f452d56..748a84e 100644 --- a/relay/channel/aws/relay-aws.go +++ b/relay/channel/aws/relay-aws.go @@ -53,7 +53,7 @@ func awsModelID(requestModel string) (string, error) { return awsModelID, nil } - return "", errors.Errorf("model %s not found", requestModel) + return requestModel, nil } func awsHandler(c *gin.Context, info *relaycommon.RelayInfo, requestMode int) (*relaymodel.OpenAIErrorWithStatusCode, *relaymodel.Usage) { diff --git a/relay/channel/claude/constants.go b/relay/channel/claude/constants.go index 7d86e66..8d73a3a 100644 --- a/relay/channel/claude/constants.go +++ b/relay/channel/claude/constants.go @@ -9,6 +9,7 @@ var ModelList = []string{ "claude-3-opus-20240229", "claude-3-haiku-20240307", "claude-3-5-sonnet-20240620", + "claude-3-5-sonnet-20241022", } var ChannelName = "claude" diff --git a/relay/relay-text.go b/relay/relay-text.go index 8497cf3..50a8a51 100644 --- a/relay/relay-text.go +++ b/relay/relay-text.go @@ -76,6 +76,7 @@ func TextHelper(c *gin.Context) *dto.OpenAIErrorWithStatusCode { } // map model name + isModelMapped := false modelMapping := c.GetString("model_mapping") //isModelMapped := false if modelMapping != "" && modelMapping != "{}" { @@ -85,6 +86,7 @@ func TextHelper(c *gin.Context) *dto.OpenAIErrorWithStatusCode { return service.OpenAIErrorWrapperLocal(err, "unmarshal_model_mapping_failed", http.StatusInternalServerError) } if modelMap[textRequest.Model] != "" { + isModelMapped = true textRequest.Model = modelMap[textRequest.Model] // set upstream model name //isModelMapped = true @@ -159,15 +161,23 @@ func TextHelper(c *gin.Context) *dto.OpenAIErrorWithStatusCode { adaptor.Init(relayInfo) var requestBody io.Reader - convertedRequest, err := adaptor.ConvertRequest(c, relayInfo, textRequest) - if err != nil { - return service.OpenAIErrorWrapperLocal(err, "convert_request_failed", http.StatusInternalServerError) + if relayInfo.ChannelType == common.ChannelTypeOpenAI && !isModelMapped { + body, err := common.GetRequestBody(c) + if err != nil { + return service.OpenAIErrorWrapperLocal(err, "get_request_body_failed", http.StatusInternalServerError) + } + requestBody = bytes.NewBuffer(body) + } else { + convertedRequest, err := adaptor.ConvertRequest(c, relayInfo, textRequest) + if err != nil { + return service.OpenAIErrorWrapperLocal(err, "convert_request_failed", http.StatusInternalServerError) + } + jsonData, err := json.Marshal(convertedRequest) + if err != nil { + return service.OpenAIErrorWrapperLocal(err, "json_marshal_failed", http.StatusInternalServerError) + } + requestBody = bytes.NewBuffer(jsonData) } - jsonData, err := json.Marshal(convertedRequest) - if err != nil { - return service.OpenAIErrorWrapperLocal(err, "json_marshal_failed", http.StatusInternalServerError) - } - requestBody = bytes.NewBuffer(jsonData) statusCodeMappingStr := c.GetString("status_code_mapping") resp, err := adaptor.DoRequest(c, relayInfo, requestBody)