Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
new-api
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
f5cbab77
authored
Feb 25, 2025
by
Calcium-Ion
Committed by
GitHub
Feb 25, 2025
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #788 from MartialBE/main
feat: Add Claude 3.7 Sonnet thinking mode support
parents
6c8016e5
d4706d6b
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
43 additions
and
2 deletions
+43
-2
common/model-ratio.go
+1
-0
relay/channel/claude/constants.go
+1
-0
relay/channel/claude/dto.go
+3
-0
relay/channel/claude/relay-claude.go
+38
-2
No files found.
common/model-ratio.go
View file @
f5cbab77
...
@@ -109,6 +109,7 @@ var defaultModelRatio = map[string]float64{
...
@@ -109,6 +109,7 @@ var defaultModelRatio = map[string]float64{
"claude-3-5-sonnet-20240620"
:
1.5
,
"claude-3-5-sonnet-20240620"
:
1.5
,
"claude-3-5-sonnet-20241022"
:
1.5
,
"claude-3-5-sonnet-20241022"
:
1.5
,
"claude-3-7-sonnet-20250219"
:
1.5
,
"claude-3-7-sonnet-20250219"
:
1.5
,
"claude-3-7-sonnet-20250219-thinking"
:
1.5
,
"claude-3-opus-20240229"
:
7.5
,
// $15 / 1M tokens
"claude-3-opus-20240229"
:
7.5
,
// $15 / 1M tokens
"ERNIE-4.0-8K"
:
0.120
*
RMB
,
"ERNIE-4.0-8K"
:
0.120
*
RMB
,
"ERNIE-3.5-8K"
:
0.012
*
RMB
,
"ERNIE-3.5-8K"
:
0.012
*
RMB
,
...
...
relay/channel/claude/constants.go
View file @
f5cbab77
...
@@ -12,6 +12,7 @@ var ModelList = []string{
...
@@ -12,6 +12,7 @@ var ModelList = []string{
"claude-3-5-sonnet-20240620"
,
"claude-3-5-sonnet-20240620"
,
"claude-3-5-sonnet-20241022"
,
"claude-3-5-sonnet-20241022"
,
"claude-3-7-sonnet-20250219"
,
"claude-3-7-sonnet-20250219"
,
"claude-3-7-sonnet-20250219-thinking"
,
}
}
var
ChannelName
=
"claude"
var
ChannelName
=
"claude"
relay/channel/claude/dto.go
View file @
f5cbab77
...
@@ -11,6 +11,9 @@ type ClaudeMediaMessage struct {
...
@@ -11,6 +11,9 @@ type ClaudeMediaMessage struct {
Usage
*
ClaudeUsage
`json:"usage,omitempty"`
Usage
*
ClaudeUsage
`json:"usage,omitempty"`
StopReason
*
string
`json:"stop_reason,omitempty"`
StopReason
*
string
`json:"stop_reason,omitempty"`
PartialJson
string
`json:"partial_json,omitempty"`
PartialJson
string
`json:"partial_json,omitempty"`
Thinking
string
`json:"thinking,omitempty"`
Signature
string
`json:"signature,omitempty"`
Delta
string
`json:"delta,omitempty"`
// tool_calls
// tool_calls
Id
string
`json:"id,omitempty"`
Id
string
`json:"id,omitempty"`
Name
string
`json:"name,omitempty"`
Name
string
`json:"name,omitempty"`
...
...
relay/channel/claude/relay-claude.go
View file @
f5cbab77
...
@@ -92,6 +92,25 @@ func RequestOpenAI2ClaudeMessage(textRequest dto.GeneralOpenAIRequest) (*ClaudeR
...
@@ -92,6 +92,25 @@ func RequestOpenAI2ClaudeMessage(textRequest dto.GeneralOpenAIRequest) (*ClaudeR
Stream
:
textRequest
.
Stream
,
Stream
:
textRequest
.
Stream
,
Tools
:
claudeTools
,
Tools
:
claudeTools
,
}
}
if
strings
.
HasSuffix
(
textRequest
.
Model
,
"-thinking"
)
{
if
claudeRequest
.
MaxTokens
==
0
{
claudeRequest
.
MaxTokens
=
8192
}
// 因为BudgetTokens 必须大于1024
if
claudeRequest
.
MaxTokens
<
1280
{
claudeRequest
.
MaxTokens
=
1280
}
// BudgetTokens 为 max_tokens 的 80%
claudeRequest
.
Thinking
=
&
Thinking
{
Type
:
"enabled"
,
BudgetTokens
:
int
(
float64
(
claudeRequest
.
MaxTokens
)
*
0.8
),
}
claudeRequest
.
Model
=
strings
.
TrimSuffix
(
textRequest
.
Model
,
"-thinking"
)
}
if
claudeRequest
.
MaxTokens
==
0
{
if
claudeRequest
.
MaxTokens
==
0
{
claudeRequest
.
MaxTokens
=
4096
claudeRequest
.
MaxTokens
=
4096
}
}
...
@@ -308,12 +327,20 @@ func StreamResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) (*
...
@@ -308,12 +327,20 @@ func StreamResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) (*
if
claudeResponse
.
Delta
!=
nil
{
if
claudeResponse
.
Delta
!=
nil
{
choice
.
Index
=
claudeResponse
.
Index
choice
.
Index
=
claudeResponse
.
Index
choice
.
Delta
.
SetContentString
(
claudeResponse
.
Delta
.
Text
)
choice
.
Delta
.
SetContentString
(
claudeResponse
.
Delta
.
Text
)
if
claudeResponse
.
Delta
.
Type
==
"input_json_delta"
{
switch
claudeResponse
.
Delta
.
Type
{
case
"input_json_delta"
:
tools
=
append
(
tools
,
dto
.
ToolCall
{
tools
=
append
(
tools
,
dto
.
ToolCall
{
Function
:
dto
.
FunctionCall
{
Function
:
dto
.
FunctionCall
{
Arguments
:
claudeResponse
.
Delta
.
PartialJson
,
Arguments
:
claudeResponse
.
Delta
.
PartialJson
,
},
},
})
})
case
"signature_delta"
:
// 加密的不处理
signatureContent
:=
"
\n
"
choice
.
Delta
.
ReasoningContent
=
&
signatureContent
case
"thinking_delta"
:
thinkingContent
:=
claudeResponse
.
Delta
.
Thinking
choice
.
Delta
.
ReasoningContent
=
&
thinkingContent
}
}
}
}
}
else
if
claudeResponse
.
Type
==
"message_delta"
{
}
else
if
claudeResponse
.
Type
==
"message_delta"
{
...
@@ -352,6 +379,8 @@ func ResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) *dto.Ope
...
@@ -352,6 +379,8 @@ func ResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) *dto.Ope
responseText
=
claudeResponse
.
Content
[
0
]
.
Text
responseText
=
claudeResponse
.
Content
[
0
]
.
Text
}
}
tools
:=
make
([]
dto
.
ToolCall
,
0
)
tools
:=
make
([]
dto
.
ToolCall
,
0
)
thinkingContent
:=
""
if
reqMode
==
RequestModeCompletion
{
if
reqMode
==
RequestModeCompletion
{
content
,
_
:=
json
.
Marshal
(
strings
.
TrimPrefix
(
claudeResponse
.
Completion
,
" "
))
content
,
_
:=
json
.
Marshal
(
strings
.
TrimPrefix
(
claudeResponse
.
Completion
,
" "
))
choice
:=
dto
.
OpenAITextResponseChoice
{
choice
:=
dto
.
OpenAITextResponseChoice
{
...
@@ -367,7 +396,8 @@ func ResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) *dto.Ope
...
@@ -367,7 +396,8 @@ func ResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) *dto.Ope
}
else
{
}
else
{
fullTextResponse
.
Id
=
claudeResponse
.
Id
fullTextResponse
.
Id
=
claudeResponse
.
Id
for
_
,
message
:=
range
claudeResponse
.
Content
{
for
_
,
message
:=
range
claudeResponse
.
Content
{
if
message
.
Type
==
"tool_use"
{
switch
message
.
Type
{
case
"tool_use"
:
args
,
_
:=
json
.
Marshal
(
message
.
Input
)
args
,
_
:=
json
.
Marshal
(
message
.
Input
)
tools
=
append
(
tools
,
dto
.
ToolCall
{
tools
=
append
(
tools
,
dto
.
ToolCall
{
ID
:
message
.
Id
,
ID
:
message
.
Id
,
...
@@ -377,6 +407,11 @@ func ResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) *dto.Ope
...
@@ -377,6 +407,11 @@ func ResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) *dto.Ope
Arguments
:
string
(
args
),
Arguments
:
string
(
args
),
},
},
})
})
case
"thinking"
:
// 加密的不管, 只输出明文的推理过程
thinkingContent
=
message
.
Thinking
case
"text"
:
responseText
=
message
.
Text
}
}
}
}
}
}
...
@@ -391,6 +426,7 @@ func ResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) *dto.Ope
...
@@ -391,6 +426,7 @@ func ResponseClaude2OpenAI(reqMode int, claudeResponse *ClaudeResponse) *dto.Ope
if
len
(
tools
)
>
0
{
if
len
(
tools
)
>
0
{
choice
.
Message
.
SetToolCalls
(
tools
)
choice
.
Message
.
SetToolCalls
(
tools
)
}
}
choice
.
Message
.
ReasoningContent
=
thinkingContent
fullTextResponse
.
Model
=
claudeResponse
.
Model
fullTextResponse
.
Model
=
claudeResponse
.
Model
choices
=
append
(
choices
,
choice
)
choices
=
append
(
choices
,
choice
)
fullTextResponse
.
Choices
=
choices
fullTextResponse
.
Choices
=
choices
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment