151 lines
4.6 KiB
Go
151 lines
4.6 KiB
Go
package common
|
|
|
|
// OpenAI stop reason / finish_reason 取值
|
|
const (
|
|
OpenAIStop = "stop"
|
|
OpenAILength = "length"
|
|
OpenAIToolCalls = "tool_calls"
|
|
OpenAIContentFilter = "content_filter"
|
|
)
|
|
|
|
// Claude stop_reason 取值
|
|
const (
|
|
ClaudeEndTurn = "end_turn"
|
|
ClaudeMaxTokens = "max_tokens"
|
|
ClaudeToolUse = "tool_use"
|
|
ClaudeStopSequence = "stop_sequence"
|
|
ClaudePauseTurn = "pause_turn" // 扩展思考暂停
|
|
ClaudeRefusal = "refusal" // 内容拒绝
|
|
)
|
|
|
|
// Gemini finishReason 取值
|
|
const (
|
|
GeminiSTOP = "STOP"
|
|
GeminiMAX_TOKENS = "MAX_TOKENS"
|
|
GeminiSAFETY = "SAFETY"
|
|
GeminiRECITATION = "RECITATION"
|
|
GeminiOTHER = "OTHER"
|
|
GeminiBLOCKLIST = "BLOCKLIST"
|
|
GeminiPROHIBITED = "PROHIBITED"
|
|
GeminiSPII = "SPII"
|
|
GeminiMALFORMED_FUNCTION_CALL = "MALFORMED_FUNCTION_CALL"
|
|
GeminiLANGUAGE = "LANGUAGE"
|
|
GeminiIMAGE_SAFETY = "IMAGE_SAFETY"
|
|
GeminiIMAGE_PROHIBITED_CONTENT = "IMAGE_PROHIBITED_CONTENT"
|
|
GeminiIMAGE_OTHER = "IMAGE_OTHER"
|
|
GeminiNO_IMAGE = "NO_IMAGE"
|
|
GeminiIMAGE_RECITATION = "IMAGE_RECITATION"
|
|
GeminiUNEXPECTED_TOOL_CALL = "UNEXPECTED_TOOL_CALL"
|
|
GeminiTOO_MANY_TOOL_CALLS = "TOO_MANY_TOOL_CALLS"
|
|
GeminiMISSING_THOUGHT_SIGNATURE = "MISSING_THOUGHT_SIGNATURE"
|
|
GeminiMALFORMED_RESPONSE = "MALFORMED_RESPONSE"
|
|
GeminiFINISH_REASON_UNSPECIFIED = "FINISH_REASON_UNSPECIFIED"
|
|
)
|
|
|
|
// OpenAIFinishReasonToClaude 将 OpenAI finish_reason 转换为 Claude stop_reason
|
|
func OpenAIFinishReasonToClaude(reason string) string {
|
|
switch reason {
|
|
case OpenAIStop:
|
|
return ClaudeEndTurn
|
|
case OpenAILength:
|
|
return ClaudeMaxTokens
|
|
case OpenAIToolCalls:
|
|
return ClaudeToolUse
|
|
case OpenAIContentFilter:
|
|
return ClaudeRefusal
|
|
default:
|
|
if reason != "" {
|
|
return reason
|
|
}
|
|
return ClaudeEndTurn
|
|
}
|
|
}
|
|
|
|
// ClaudeStopReasonToOpenAI 将 Claude stop_reason 转换为 OpenAI finish_reason
|
|
func ClaudeStopReasonToOpenAI(reason string) string {
|
|
switch reason {
|
|
case ClaudeEndTurn, ClaudeStopSequence, ClaudePauseTurn:
|
|
return OpenAIStop
|
|
case ClaudeMaxTokens:
|
|
return OpenAILength
|
|
case ClaudeToolUse:
|
|
return OpenAIToolCalls
|
|
case ClaudeRefusal:
|
|
return OpenAIContentFilter
|
|
default:
|
|
return reason
|
|
}
|
|
}
|
|
|
|
// GeminiFinishReasonToOpenAI 将 Gemini finishReason 转换为 OpenAI finish_reason
|
|
func GeminiFinishReasonToOpenAI(reason string) string {
|
|
switch reason {
|
|
case GeminiSTOP, GeminiFINISH_REASON_UNSPECIFIED:
|
|
return OpenAIStop
|
|
case GeminiMAX_TOKENS:
|
|
return OpenAILength
|
|
case GeminiSAFETY, GeminiRECITATION, GeminiOTHER, GeminiBLOCKLIST, GeminiPROHIBITED, GeminiSPII,
|
|
GeminiLANGUAGE, GeminiIMAGE_SAFETY, GeminiIMAGE_PROHIBITED_CONTENT, GeminiIMAGE_OTHER,
|
|
GeminiNO_IMAGE, GeminiIMAGE_RECITATION:
|
|
return OpenAIContentFilter
|
|
case GeminiMALFORMED_FUNCTION_CALL, GeminiUNEXPECTED_TOOL_CALL, GeminiTOO_MANY_TOOL_CALLS:
|
|
return OpenAIToolCalls
|
|
case "TOOL_CALLS":
|
|
return OpenAIToolCalls
|
|
case GeminiMISSING_THOUGHT_SIGNATURE, GeminiMALFORMED_RESPONSE:
|
|
return OpenAIStop
|
|
default:
|
|
return reason
|
|
}
|
|
}
|
|
|
|
// OpenAIFinishReasonToGemini 将 OpenAI finish_reason 转换为 Gemini finishReason
|
|
func OpenAIFinishReasonToGemini(reason string) string {
|
|
switch reason {
|
|
case OpenAIStop:
|
|
return GeminiSTOP
|
|
case OpenAILength:
|
|
return GeminiMAX_TOKENS
|
|
case OpenAIContentFilter:
|
|
return GeminiSAFETY
|
|
case OpenAIToolCalls:
|
|
return GeminiSTOP
|
|
default:
|
|
return reason
|
|
}
|
|
}
|
|
|
|
// ClaudeStopReasonToGemini 将 Claude stop_reason 转换为 Gemini finishReason
|
|
func ClaudeStopReasonToGemini(reason string) string {
|
|
switch reason {
|
|
case ClaudeEndTurn, ClaudeStopSequence, ClaudePauseTurn:
|
|
return GeminiSTOP
|
|
case ClaudeMaxTokens:
|
|
return GeminiMAX_TOKENS
|
|
case ClaudeToolUse:
|
|
return GeminiSTOP
|
|
case ClaudeRefusal:
|
|
return GeminiSAFETY
|
|
default:
|
|
return reason
|
|
}
|
|
}
|
|
|
|
// GeminiFinishReasonToClaude 将 Gemini finishReason 转换为 Claude stop_reason
|
|
func GeminiFinishReasonToClaude(reason string) string {
|
|
switch reason {
|
|
case GeminiSTOP, GeminiFINISH_REASON_UNSPECIFIED, GeminiMISSING_THOUGHT_SIGNATURE, GeminiMALFORMED_RESPONSE:
|
|
return ClaudeEndTurn
|
|
case GeminiMAX_TOKENS:
|
|
return ClaudeMaxTokens
|
|
case GeminiSAFETY, GeminiRECITATION, GeminiOTHER, GeminiBLOCKLIST, GeminiPROHIBITED, GeminiSPII,
|
|
GeminiLANGUAGE, GeminiIMAGE_SAFETY, GeminiIMAGE_PROHIBITED_CONTENT, GeminiIMAGE_OTHER,
|
|
GeminiNO_IMAGE, GeminiIMAGE_RECITATION:
|
|
return ClaudeRefusal
|
|
case GeminiMALFORMED_FUNCTION_CALL, GeminiUNEXPECTED_TOOL_CALL, GeminiTOO_MANY_TOOL_CALLS:
|
|
return ClaudeToolUse
|
|
default:
|
|
return reason
|
|
}
|
|
}
|