|
@@ -51,16 +51,19 @@ func (r *ChatResult) ParseContentAs(target any) error {
|
|
return errors.New("parseContent err: content is empty or unavailable")
|
|
return errors.New("parseContent err: content is empty or unavailable")
|
|
}
|
|
}
|
|
|
|
|
|
- // (可选)清理可能的 Markdown ```json ``` 包装
|
|
|
|
- if strings.HasPrefix(content, "```json") && strings.HasSuffix(content, "```") {
|
|
|
|
- content = strings.TrimSuffix(strings.TrimPrefix(content, "```json"), "```")
|
|
|
|
- content = strings.TrimSpace(content)
|
|
|
|
|
|
+ if !IsOpenaiModel(r.Model) { //不支持Response Schema的要特殊处理一下
|
|
|
|
+ var isJsonContent bool
|
|
|
|
+ content, isJsonContent = ExtractJSONContent(content)
|
|
|
|
+ if !isJsonContent {
|
|
|
|
+ return errors.New("invalid json content")
|
|
|
|
+ }
|
|
}
|
|
}
|
|
-
|
|
|
|
err = json.Unmarshal([]byte(content), target)
|
|
err = json.Unmarshal([]byte(content), target)
|
|
if err != nil {
|
|
if err != nil {
|
|
- return fmt.Errorf("parseContent err: failed to unmarshal content JSON into target type '%w'", err)
|
|
|
|
|
|
+ return fmt.Errorf("parseContent err: failed to unmarshal content JSON "+
|
|
|
|
+ "into target type '%w'", err)
|
|
}
|
|
}
|
|
|
|
+
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
@@ -158,3 +161,48 @@ func WrapJSON(input any, warpKey string, checkValid bool) ([]byte, error) {
|
|
}
|
|
}
|
|
return outputBytes, nil
|
|
return outputBytes, nil
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+func ParseContentAs(content string, target any) error {
|
|
|
|
+ // 清理可能的 Markdown ```json ``` 包装
|
|
|
|
+ if strings.HasPrefix(content, "```json") && strings.HasSuffix(content, "```") {
|
|
|
|
+ content = strings.TrimSuffix(strings.TrimPrefix(content, "```json"), "```")
|
|
|
|
+ content = strings.TrimSpace(content)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if err := json.Unmarshal([]byte(content), target); err != nil {
|
|
|
|
+ return fmt.Errorf("parseContent err:failed to unmarshal"+
|
|
|
|
+ " content JSON into target type '%w'", err)
|
|
|
|
+ }
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func ExtractJSONContent(s string) (string, bool) {
|
|
|
|
+ startMarker := "```json"
|
|
|
|
+ endMarker := "```"
|
|
|
|
+
|
|
|
|
+ // 寻找起始标记
|
|
|
|
+ startIdx := strings.Index(s, startMarker)
|
|
|
|
+ if startIdx == -1 {
|
|
|
|
+ return "", false // 没有起始标记
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 寻找结束标记(需在起始标记之后查找)
|
|
|
|
+ endIdx := strings.LastIndex(s, endMarker)
|
|
|
|
+ if endIdx == -1 || endIdx <= startIdx {
|
|
|
|
+ return "", false // 没有结束标记或标记顺序错误
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 计算内容范围
|
|
|
|
+ contentStart := startIdx + len(startMarker)
|
|
|
|
+ contentEnd := endIdx
|
|
|
|
+
|
|
|
|
+ // 提取内容并去除前后空白
|
|
|
|
+ content := strings.TrimSpace(s[contentStart:contentEnd])
|
|
|
|
+
|
|
|
|
+ // 若内容为空视为无效
|
|
|
|
+ if content == "" {
|
|
|
|
+ return "", false
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return content, true
|
|
|
|
+}
|