fix(claude): improve handling of empty string content in OpenAI to Claude message conversion
This commit is contained in:
@@ -258,7 +258,7 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe
|
|||||||
formatMessages = formatMessages[:len(formatMessages)-1]
|
formatMessages = formatMessages[:len(formatMessages)-1]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if fmtMessage.Content == nil {
|
if fmtMessage.Content == nil || (fmtMessage.IsStringContent() && fmtMessage.StringContent() == "") {
|
||||||
fmtMessage.SetStringContent("...")
|
fmtMessage.SetStringContent("...")
|
||||||
}
|
}
|
||||||
formatMessages = append(formatMessages, fmtMessage)
|
formatMessages = append(formatMessages, fmtMessage)
|
||||||
@@ -274,14 +274,16 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe
|
|||||||
if message.Role == "system" {
|
if message.Role == "system" {
|
||||||
// 根据Claude API规范,system字段使用数组格式更有通用性
|
// 根据Claude API规范,system字段使用数组格式更有通用性
|
||||||
if message.IsStringContent() {
|
if message.IsStringContent() {
|
||||||
systemMessages = append(systemMessages, dto.ClaudeMediaMessage{
|
if text := message.StringContent(); text != "" {
|
||||||
Type: "text",
|
systemMessages = append(systemMessages, dto.ClaudeMediaMessage{
|
||||||
Text: common.GetPointer[string](message.StringContent()),
|
Type: "text",
|
||||||
})
|
Text: common.GetPointer[string](text),
|
||||||
|
})
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// 支持复合内容的system消息(虽然不常见,但需要考虑完整性)
|
// 支持复合内容的system消息(虽然不常见,但需要考虑完整性)
|
||||||
for _, ctx := range message.ParseContent() {
|
for _, ctx := range message.ParseContent() {
|
||||||
if ctx.Type == "text" {
|
if ctx.Type == "text" && ctx.Text != "" {
|
||||||
systemMessages = append(systemMessages, dto.ClaudeMediaMessage{
|
systemMessages = append(systemMessages, dto.ClaudeMediaMessage{
|
||||||
Type: "text",
|
Type: "text",
|
||||||
Text: common.GetPointer[string](ctx.Text),
|
Text: common.GetPointer[string](ctx.Text),
|
||||||
@@ -339,16 +341,22 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if message.IsStringContent() && message.ToolCalls == nil {
|
} else if message.IsStringContent() && message.ToolCalls == nil {
|
||||||
claudeMessage.Content = message.StringContent()
|
text := message.StringContent()
|
||||||
|
if text == "" {
|
||||||
|
text = "..."
|
||||||
|
}
|
||||||
|
claudeMessage.Content = text
|
||||||
} else {
|
} else {
|
||||||
claudeMediaMessages := make([]dto.ClaudeMediaMessage, 0)
|
claudeMediaMessages := make([]dto.ClaudeMediaMessage, 0)
|
||||||
for _, mediaMessage := range message.ParseContent() {
|
for _, mediaMessage := range message.ParseContent() {
|
||||||
switch mediaMessage.Type {
|
switch mediaMessage.Type {
|
||||||
case "text":
|
case "text":
|
||||||
claudeMediaMessages = append(claudeMediaMessages, dto.ClaudeMediaMessage{
|
if mediaMessage.Text != "" {
|
||||||
Type: "text",
|
claudeMediaMessages = append(claudeMediaMessages, dto.ClaudeMediaMessage{
|
||||||
Text: common.GetPointer[string](mediaMessage.Text),
|
Type: "text",
|
||||||
})
|
Text: common.GetPointer[string](mediaMessage.Text),
|
||||||
|
})
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
source := mediaMessage.ToFileSource()
|
source := mediaMessage.ToFileSource()
|
||||||
if source == nil {
|
if source == nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user