Skip to content

Commit 3cad6b9

Browse files
committed
fix(claude): improve handling of empty string content in OpenAI to Claude message conversion
1 parent 8aaec8b commit 3cad6b9

1 file changed

Lines changed: 19 additions & 11 deletions

File tree

relay/channel/claude/relay-claude.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe
258258
formatMessages = formatMessages[:len(formatMessages)-1]
259259
}
260260
}
261-
if fmtMessage.Content == nil {
261+
if fmtMessage.Content == nil || (fmtMessage.IsStringContent() && fmtMessage.StringContent() == "") {
262262
fmtMessage.SetStringContent("...")
263263
}
264264
formatMessages = append(formatMessages, fmtMessage)
@@ -274,14 +274,16 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe
274274
if message.Role == "system" {
275275
// 根据Claude API规范,system字段使用数组格式更有通用性
276276
if message.IsStringContent() {
277-
systemMessages = append(systemMessages, dto.ClaudeMediaMessage{
278-
Type: "text",
279-
Text: common.GetPointer[string](message.StringContent()),
280-
})
277+
if text := message.StringContent(); text != "" {
278+
systemMessages = append(systemMessages, dto.ClaudeMediaMessage{
279+
Type: "text",
280+
Text: common.GetPointer[string](text),
281+
})
282+
}
281283
} else {
282284
// 支持复合内容的system消息(虽然不常见,但需要考虑完整性)
283285
for _, ctx := range message.ParseContent() {
284-
if ctx.Type == "text" {
286+
if ctx.Type == "text" && ctx.Text != "" {
285287
systemMessages = append(systemMessages, dto.ClaudeMediaMessage{
286288
Type: "text",
287289
Text: common.GetPointer[string](ctx.Text),
@@ -339,16 +341,22 @@ func RequestOpenAI2ClaudeMessage(c *gin.Context, textRequest dto.GeneralOpenAIRe
339341
}
340342
}
341343
} else if message.IsStringContent() && message.ToolCalls == nil {
342-
claudeMessage.Content = message.StringContent()
344+
text := message.StringContent()
345+
if text == "" {
346+
text = "..."
347+
}
348+
claudeMessage.Content = text
343349
} else {
344350
claudeMediaMessages := make([]dto.ClaudeMediaMessage, 0)
345351
for _, mediaMessage := range message.ParseContent() {
346352
switch mediaMessage.Type {
347353
case "text":
348-
claudeMediaMessages = append(claudeMediaMessages, dto.ClaudeMediaMessage{
349-
Type: "text",
350-
Text: common.GetPointer[string](mediaMessage.Text),
351-
})
354+
if mediaMessage.Text != "" {
355+
claudeMediaMessages = append(claudeMediaMessages, dto.ClaudeMediaMessage{
356+
Type: "text",
357+
Text: common.GetPointer[string](mediaMessage.Text),
358+
})
359+
}
352360
default:
353361
source := mediaMessage.ToFileSource()
354362
if source == nil {

0 commit comments

Comments
 (0)