diff --git a/relay/channel/claude/relay-claude.go b/relay/channel/claude/relay-claude.go index f5872011..a17dc75e 100644 --- a/relay/channel/claude/relay-claude.go +++ b/relay/channel/claude/relay-claude.go @@ -14,6 +14,7 @@ import ( "github.com/QuantumNous/new-api/relay/channel/openrouter" relaycommon "github.com/QuantumNous/new-api/relay/common" "github.com/QuantumNous/new-api/relay/helper" + "github.com/QuantumNous/new-api/relay/reasonmap" "github.com/QuantumNous/new-api/service" "github.com/QuantumNous/new-api/setting/model_setting" "github.com/QuantumNous/new-api/types" @@ -28,18 +29,7 @@ const ( ) func stopReasonClaude2OpenAI(reason string) string { - switch reason { - case "stop_sequence": - return "stop" - case "end_turn": - return "stop" - case "max_tokens": - return "length" - case "tool_use": - return "tool_calls" - default: - return reason - } + return reasonmap.ClaudeStopReasonToOpenAIFinishReason(reason) } func maybeMarkClaudeRefusal(c *gin.Context, stopReason string) { diff --git a/relay/reasonmap/reasonmap.go b/relay/reasonmap/reasonmap.go new file mode 100644 index 00000000..45b74bb1 --- /dev/null +++ b/relay/reasonmap/reasonmap.go @@ -0,0 +1,41 @@ +package reasonmap + +import ( + "strings" + + "github.com/QuantumNous/new-api/constant" +) + +func ClaudeStopReasonToOpenAIFinishReason(stopReason string) string { + switch strings.ToLower(stopReason) { + case "stop_sequence": + return "stop" + case "end_turn": + return "stop" + case "max_tokens": + return "length" + case "tool_use": + return "tool_calls" + case "refusal": + return constant.FinishReasonContentFilter + default: + return stopReason + } +} + +func OpenAIFinishReasonToClaudeStopReason(finishReason string) string { + switch strings.ToLower(finishReason) { + case "stop": + return "end_turn" + case "stop_sequence": + return "stop_sequence" + case "length", "max_tokens": + return "max_tokens" + case constant.FinishReasonContentFilter: + return "refusal" + case "tool_calls": + return "tool_use" + default: + return finishReason + } +} diff --git a/service/convert.go b/service/convert.go index f357f684..26534e40 100644 --- a/service/convert.go +++ b/service/convert.go @@ -10,6 +10,7 @@ import ( "github.com/QuantumNous/new-api/dto" "github.com/QuantumNous/new-api/relay/channel/openrouter" relaycommon "github.com/QuantumNous/new-api/relay/common" + "github.com/QuantumNous/new-api/relay/reasonmap" ) func ClaudeToOpenAIRequest(claudeRequest dto.ClaudeRequest, info *relaycommon.RelayInfo) (*dto.GeneralOpenAIRequest, error) { @@ -540,20 +541,7 @@ func ResponseOpenAI2Claude(openAIResponse *dto.OpenAITextResponse, info *relayco } func stopReasonOpenAI2Claude(reason string) string { - switch reason { - case "stop": - return "end_turn" - case "stop_sequence": - return "stop_sequence" - case "length": - fallthrough - case "max_tokens": - return "max_tokens" - case "tool_calls": - return "tool_use" - default: - return reason - } + return reasonmap.OpenAIFinishReasonToClaudeStopReason(reason) } func toJSONString(v interface{}) string {