从流式响应中查找最有可能的完整内容
(lines []string, reqID string)
| 1081 | |
| 1082 | // 从流式响应中查找最有可能的完整内容 |
| 1083 | func findMostLikelyContent(lines []string, reqID string) string { |
| 1084 | // 如果行数少于2,无法使用此方法 |
| 1085 | if len(lines) < 2 { |
| 1086 | return "" |
| 1087 | } |
| 1088 | |
| 1089 | // 先解析所有有效的JSON行 |
| 1090 | var jsonObjects []map[string]interface{} |
| 1091 | |
| 1092 | for _, line := range lines { |
| 1093 | line = strings.TrimSpace(line) |
| 1094 | if !strings.HasPrefix(line, "data:") { |
| 1095 | continue |
| 1096 | } |
| 1097 | |
| 1098 | jsonStr := strings.TrimPrefix(line, "data:") |
| 1099 | jsonStr = strings.TrimSpace(jsonStr) |
| 1100 | |
| 1101 | if jsonStr == "[DONE]" || jsonStr == "" { |
| 1102 | continue |
| 1103 | } |
| 1104 | |
| 1105 | var obj map[string]interface{} |
| 1106 | if err := json.Unmarshal([]byte(jsonStr), &obj); err != nil { |
| 1107 | // 尝试修复JSON |
| 1108 | fixedJson := sanitizeJsonString(jsonStr, reqID) |
| 1109 | if err := json.Unmarshal([]byte(fixedJson), &obj); err != nil { |
| 1110 | continue |
| 1111 | } |
| 1112 | } |
| 1113 | |
| 1114 | jsonObjects = append(jsonObjects, obj) |
| 1115 | } |
| 1116 | |
| 1117 | // 如果没有有效JSON对象,返回空 |
| 1118 | if len(jsonObjects) == 0 { |
| 1119 | return "" |
| 1120 | } |
| 1121 | |
| 1122 | // 提取每个对象中的所有字符串值 |
| 1123 | allValues := make([]map[string]string, len(jsonObjects)) |
| 1124 | |
| 1125 | for i, obj := range jsonObjects { |
| 1126 | allValues[i] = make(map[string]string) |
| 1127 | extractAllStringValues(obj, allValues[i], "") |
| 1128 | } |
| 1129 | |
| 1130 | // 分析哪些路径出现频率最高 |
| 1131 | pathFrequency := make(map[string]int) |
| 1132 | for _, values := range allValues { |
| 1133 | for path := range values { |
| 1134 | pathFrequency[path]++ |
| 1135 | } |
| 1136 | } |
| 1137 | |
| 1138 | // 找出最常见的路径 |
| 1139 | var mostCommonPath string |
| 1140 | var maxFrequency int = 0 |
no test coverage detected