Skip to content

Commit f3d6e99

Browse files
authored
Merge pull request #2863 from prnake/feat/claude-opus-4-6
feat: add claude-opus-4-6
2 parents 6de8dea + 8e6071f commit f3d6e99

File tree

10 files changed

+60
-4
lines changed

10 files changed

+60
-4
lines changed

relay/channel/aws/constants.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package aws
33
import "strings"
44

55
var awsModelIDMap = map[string]string{
6-
"claude-3-sonnet-20240229": "anthropic.claude-3-sonnet-20240229-v1:0",
6+
"claude-3-sonnet-20240229": "anthropic.claude-3-sonnet-20240229-v1:0",
77
"claude-3-opus-20240229": "anthropic.claude-3-opus-20240229-v1:0",
88
"claude-3-haiku-20240307": "anthropic.claude-3-haiku-20240307-v1:0",
99
"claude-3-5-sonnet-20240620": "anthropic.claude-3-5-sonnet-20240620-v1:0",
@@ -16,6 +16,7 @@ var awsModelIDMap = map[string]string{
1616
"claude-sonnet-4-5-20250929": "anthropic.claude-sonnet-4-5-20250929-v1:0",
1717
"claude-haiku-4-5-20251001": "anthropic.claude-haiku-4-5-20251001-v1:0",
1818
"claude-opus-4-5-20251101": "anthropic.claude-opus-4-5-20251101-v1:0",
19+
"claude-opus-4-6": "anthropic.claude-opus-4-6-v1",
1920
// Nova models
2021
"nova-micro-v1:0": "amazon.nova-micro-v1:0",
2122
"nova-lite-v1:0": "amazon.nova-lite-v1:0",
@@ -79,6 +80,11 @@ var awsModelCanCrossRegionMap = map[string]map[string]bool{
7980
"ap": true,
8081
"eu": true,
8182
},
83+
"anthropic.claude-opus-4-6-v1": {
84+
"us": true,
85+
"ap": true,
86+
"eu": true,
87+
},
8288
"anthropic.claude-haiku-4-5-20251001-v1:0": {
8389
"us": true,
8490
"ap": true,

relay/channel/aws/dto.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type AwsClaudeRequest struct {
2626
Tools any `json:"tools,omitempty"`
2727
ToolChoice any `json:"tool_choice,omitempty"`
2828
Thinking *dto.Thinking `json:"thinking,omitempty"`
29+
OutputConfig json.RawMessage `json:"output_config,omitempty"`
2930
}
3031

3132
func formatRequest(requestBody io.Reader, requestHeader http.Header) (*AwsClaudeRequest, error) {

relay/channel/claude/constants.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ var ModelList = []string{
2020
"claude-sonnet-4-5-20250929-thinking",
2121
"claude-opus-4-5-20251101",
2222
"claude-opus-4-5-20251101-thinking",
23+
"claude-opus-4-6",
24+
"claude-opus-4-6-max",
25+
"claude-opus-4-6-high",
26+
"claude-opus-4-6-medium",
27+
"claude-opus-4-6-low",
2328
}
2429

2530
var ChannelName = "claude"

relay/channel/claude/relay-claude.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/QuantumNous/new-api/relay/reasonmap"
1818
"github.com/QuantumNous/new-api/service"
1919
"github.com/QuantumNous/new-api/setting/model_setting"
20+
"github.com/QuantumNous/new-api/setting/reasoning"
2021
"github.com/QuantumNous/new-api/types"
2122

2223
"github.com/gin-gonic/gin"
@@ -141,7 +142,16 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe
141142
claudeRequest.MaxTokens = uint(model_setting.GetClaudeSettings().GetDefaultMaxTokens(textRequest.Model))
142143
}
143144

144-
if model_setting.GetClaudeSettings().ThinkingAdapterEnabled &&
145+
if baseModel, effortLevel, ok := reasoning.TrimEffortSuffix(textRequest.Model); ok && effortLevel != "" &&
146+
strings.HasPrefix(textRequest.Model, "claude-opus-4-6") {
147+
claudeRequest.Model = baseModel
148+
claudeRequest.Thinking = &dto.Thinking{
149+
Type: "adaptive",
150+
}
151+
claudeRequest.OutputConfig = json.RawMessage(fmt.Sprintf(`{"effort":"%s"}`, effortLevel))
152+
claudeRequest.TopP = 0
153+
claudeRequest.Temperature = common.GetPointer[float64](1.0)
154+
} else if model_setting.GetClaudeSettings().ThinkingAdapterEnabled &&
145155
strings.HasSuffix(textRequest.Model, "-thinking") {
146156

147157
// 因为BudgetTokens 必须大于1024

relay/channel/vertex/adaptor.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ var claudeModelMap = map[string]string{
4242
"claude-sonnet-4-5-20250929": "claude-sonnet-4-5@20250929",
4343
"claude-haiku-4-5-20251001": "claude-haiku-4-5@20251001",
4444
"claude-opus-4-5-20251101": "claude-opus-4-5@20251101",
45+
"claude-opus-4-6": "claude-opus-4-6",
4546
}
4647

4748
const anthropicVersion = "vertex-2023-10-16"

relay/channel/vertex/dto.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package vertex
22

33
import (
4+
"encoding/json"
5+
46
"github.com/QuantumNous/new-api/dto"
57
)
68

@@ -17,6 +19,7 @@ type VertexAIClaudeRequest struct {
1719
Tools any `json:"tools,omitempty"`
1820
ToolChoice any `json:"tool_choice,omitempty"`
1921
Thinking *dto.Thinking `json:"thinking,omitempty"`
22+
OutputConfig json.RawMessage `json:"output_config,omitempty"`
2023
}
2124

2225
func copyRequest(req *dto.ClaudeRequest, version string) *VertexAIClaudeRequest {
@@ -33,5 +36,6 @@ func copyRequest(req *dto.ClaudeRequest, version string) *VertexAIClaudeRequest
3336
Tools: req.Tools,
3437
ToolChoice: req.ToolChoice,
3538
Thinking: req.Thinking,
39+
OutputConfig: req.OutputConfig,
3640
}
3741
}

relay/claude_handler.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package relay
22

33
import (
44
"bytes"
5+
"encoding/json"
56
"fmt"
67
"io"
78
"net/http"
@@ -14,6 +15,7 @@ import (
1415
"github.com/QuantumNous/new-api/relay/helper"
1516
"github.com/QuantumNous/new-api/service"
1617
"github.com/QuantumNous/new-api/setting/model_setting"
18+
"github.com/QuantumNous/new-api/setting/reasoning"
1719
"github.com/QuantumNous/new-api/types"
1820

1921
"github.com/gin-gonic/gin"
@@ -49,7 +51,17 @@ func ClaudeHelper(c *gin.Context, info *relaycommon.RelayInfo) (newAPIError *typ
4951
request.MaxTokens = uint(model_setting.GetClaudeSettings().GetDefaultMaxTokens(request.Model))
5052
}
5153

52-
if model_setting.GetClaudeSettings().ThinkingAdapterEnabled &&
54+
if baseModel, effortLevel, ok := reasoning.TrimEffortSuffix(request.Model); ok && effortLevel != "" &&
55+
strings.HasPrefix(request.Model, "claude-opus-4-6") {
56+
request.Model = baseModel
57+
request.Thinking = &dto.Thinking{
58+
Type: "adaptive",
59+
}
60+
request.OutputConfig = json.RawMessage(fmt.Sprintf(`{"effort":"%s"}`, effortLevel))
61+
request.TopP = 0
62+
request.Temperature = common.GetPointer[float64](1.0)
63+
info.UpstreamModelName = request.Model
64+
} else if model_setting.GetClaudeSettings().ThinkingAdapterEnabled &&
5365
strings.HasSuffix(request.Model, "-thinking") {
5466
if request.Thinking == nil {
5567
// 因为BudgetTokens 必须大于1024

setting/ratio_setting/cache_ratio.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ var defaultCacheRatio = map[string]float64{
6060
"claude-sonnet-4-5-20250929-thinking": 0.1,
6161
"claude-opus-4-5-20251101": 0.1,
6262
"claude-opus-4-5-20251101-thinking": 0.1,
63+
"claude-opus-4-6": 0.1,
64+
"claude-opus-4-6-thinking": 0.1,
65+
"claude-opus-4-6-max": 0.1,
66+
"claude-opus-4-6-high": 0.1,
67+
"claude-opus-4-6-medium": 0.1,
68+
"claude-opus-4-6-low": 0.1,
6369
}
6470

6571
var defaultCreateCacheRatio = map[string]float64{
@@ -82,6 +88,12 @@ var defaultCreateCacheRatio = map[string]float64{
8288
"claude-sonnet-4-5-20250929-thinking": 1.25,
8389
"claude-opus-4-5-20251101": 1.25,
8490
"claude-opus-4-5-20251101-thinking": 1.25,
91+
"claude-opus-4-6": 1.25,
92+
"claude-opus-4-6-thinking": 1.25,
93+
"claude-opus-4-6-max": 1.25,
94+
"claude-opus-4-6-high": 1.25,
95+
"claude-opus-4-6-medium": 1.25,
96+
"claude-opus-4-6-low": 1.25,
8597
}
8698

8799
//var defaultCreateCacheRatio = map[string]float64{}

setting/ratio_setting/model_ratio.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,11 @@ var defaultModelRatio = map[string]float64{
142142
"claude-sonnet-4-20250514": 1.5,
143143
"claude-sonnet-4-5-20250929": 1.5,
144144
"claude-opus-4-5-20251101": 2.5,
145+
"claude-opus-4-6": 2.5,
146+
"claude-opus-4-6-max": 2.5,
147+
"claude-opus-4-6-high": 2.5,
148+
"claude-opus-4-6-medium": 2.5,
149+
"claude-opus-4-6-low": 2.5,
145150
"claude-3-opus-20240229": 7.5, // $15 / 1M tokens
146151
"claude-opus-4-20250514": 7.5,
147152
"claude-opus-4-1-20250805": 7.5,

setting/reasoning/suffix.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"github.com/samber/lo"
77
)
88

9-
var EffortSuffixes = []string{"-high", "-medium", "-low", "-minimal"}
9+
var EffortSuffixes = []string{"-max", "-high", "-medium", "-low", "-minimal"}
1010

1111
// TrimEffortSuffix -> modelName level(low) exists
1212
func TrimEffortSuffix(modelName string) (string, string, bool) {

0 commit comments

Comments
 (0)