|
@@ -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{
|
|
|
|
|
- Type: "text",
|
|
|
|
|
- Text: common.GetPointer[string](message.StringContent()),
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ if text := message.StringContent(); text != "" {
|
|
|
|
|
+ systemMessages = append(systemMessages, dto.ClaudeMediaMessage{
|
|
|
|
|
+ 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{
|
|
|
|
|
- Type: "text",
|
|
|
|
|
- Text: common.GetPointer[string](mediaMessage.Text),
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ if mediaMessage.Text != "" {
|
|
|
|
|
+ claudeMediaMessages = append(claudeMediaMessages, dto.ClaudeMediaMessage{
|
|
|
|
|
+ Type: "text",
|
|
|
|
|
+ Text: common.GetPointer[string](mediaMessage.Text),
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
default:
|
|
default:
|
|
|
source := mediaMessage.ToFileSource()
|
|
source := mediaMessage.ToFileSource()
|
|
|
if source == nil {
|
|
if source == nil {
|