refactor: Improve message content parsing with robust type handling
This commit is contained in:
@@ -190,72 +190,86 @@ func (m *Message) ParseContent() []MediaContent {
|
|||||||
if m.parsedContent != nil {
|
if m.parsedContent != nil {
|
||||||
return m.parsedContent
|
return m.parsedContent
|
||||||
}
|
}
|
||||||
|
|
||||||
var contentList []MediaContent
|
var contentList []MediaContent
|
||||||
defer func() {
|
|
||||||
if len(contentList) > 0 {
|
// 先尝试解析为字符串
|
||||||
m.parsedContent = contentList
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
var stringContent string
|
var stringContent string
|
||||||
if err := json.Unmarshal(m.Content, &stringContent); err == nil {
|
if err := json.Unmarshal(m.Content, &stringContent); err == nil {
|
||||||
contentList = append(contentList, MediaContent{
|
contentList = []MediaContent{{
|
||||||
Type: ContentTypeText,
|
Type: ContentTypeText,
|
||||||
Text: stringContent,
|
Text: stringContent,
|
||||||
})
|
}}
|
||||||
|
m.parsedContent = contentList
|
||||||
return contentList
|
return contentList
|
||||||
}
|
}
|
||||||
var arrayContent []json.RawMessage
|
|
||||||
|
// 尝试解析为数组
|
||||||
|
var arrayContent []map[string]interface{}
|
||||||
if err := json.Unmarshal(m.Content, &arrayContent); err == nil {
|
if err := json.Unmarshal(m.Content, &arrayContent); err == nil {
|
||||||
for _, contentItem := range arrayContent {
|
for _, contentItem := range arrayContent {
|
||||||
var contentMap map[string]any
|
contentType, ok := contentItem["type"].(string)
|
||||||
if err := json.Unmarshal(contentItem, &contentMap); err != nil {
|
if !ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
switch contentMap["type"] {
|
|
||||||
|
switch contentType {
|
||||||
case ContentTypeText:
|
case ContentTypeText:
|
||||||
if subStr, ok := contentMap["text"].(string); ok {
|
if text, ok := contentItem["text"].(string); ok {
|
||||||
contentList = append(contentList, MediaContent{
|
contentList = append(contentList, MediaContent{
|
||||||
Type: ContentTypeText,
|
Type: ContentTypeText,
|
||||||
Text: subStr,
|
Text: text,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
case ContentTypeImageURL:
|
case ContentTypeImageURL:
|
||||||
if subObj, ok := contentMap["image_url"].(map[string]any); ok {
|
imageUrl := contentItem["image_url"]
|
||||||
detail, ok := subObj["detail"]
|
switch v := imageUrl.(type) {
|
||||||
if ok {
|
case string:
|
||||||
subObj["detail"] = detail.(string)
|
|
||||||
} else {
|
|
||||||
subObj["detail"] = "high"
|
|
||||||
}
|
|
||||||
contentList = append(contentList, MediaContent{
|
contentList = append(contentList, MediaContent{
|
||||||
Type: ContentTypeImageURL,
|
Type: ContentTypeImageURL,
|
||||||
ImageUrl: MessageImageUrl{
|
ImageUrl: MessageImageUrl{
|
||||||
Url: subObj["url"].(string),
|
Url: v,
|
||||||
Detail: subObj["detail"].(string),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
} else if url, ok := contentMap["image_url"].(string); ok {
|
|
||||||
contentList = append(contentList, MediaContent{
|
|
||||||
Type: ContentTypeImageURL,
|
|
||||||
ImageUrl: MessageImageUrl{
|
|
||||||
Url: url,
|
|
||||||
Detail: "high",
|
Detail: "high",
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
case map[string]interface{}:
|
||||||
|
url, ok1 := v["url"].(string)
|
||||||
|
detail, ok2 := v["detail"].(string)
|
||||||
|
if !ok2 {
|
||||||
|
detail = "high"
|
||||||
|
}
|
||||||
|
if ok1 {
|
||||||
|
contentList = append(contentList, MediaContent{
|
||||||
|
Type: ContentTypeImageURL,
|
||||||
|
ImageUrl: MessageImageUrl{
|
||||||
|
Url: url,
|
||||||
|
Detail: detail,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case ContentTypeInputAudio:
|
case ContentTypeInputAudio:
|
||||||
if subObj, ok := contentMap["input_audio"].(map[string]any); ok {
|
if audioData, ok := contentItem["input_audio"].(map[string]interface{}); ok {
|
||||||
contentList = append(contentList, MediaContent{
|
data, ok1 := audioData["data"].(string)
|
||||||
Type: ContentTypeInputAudio,
|
format, ok2 := audioData["format"].(string)
|
||||||
InputAudio: MessageInputAudio{
|
if ok1 && ok2 {
|
||||||
Data: subObj["data"].(string),
|
contentList = append(contentList, MediaContent{
|
||||||
Format: subObj["format"].(string),
|
Type: ContentTypeInputAudio,
|
||||||
},
|
InputAudio: MessageInputAudio{
|
||||||
})
|
Data: data,
|
||||||
|
Format: format,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return contentList
|
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
|
if len(contentList) > 0 {
|
||||||
|
m.parsedContent = contentList
|
||||||
|
}
|
||||||
|
return contentList
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user