fix: 结构化渲染审查总结,替换原始JSON显示
- 后端发送结构化数据(score/overall/findings/recommendations)而非格式化文本 - 增加灵活JSON解析,兼容LLM返回recommendations为数组的情况 - 前端渲染带样式的审查总结:评分徽章(颜色分级)、分区展示 - 两个页面统一处理:repo页面的内联审查和review页面的完整审查
This commit is contained in:
+45
-13
@@ -287,9 +287,9 @@ func GenerateReview(db *sql.DB, repoPath, base, head string, topN, concurrency i
|
||||
"score": 7,
|
||||
"overall": "总体评价(2-3 句话)",
|
||||
"findings": "按严重程度排序的主要发现汇总",
|
||||
"recommendations": "改进建议优先级列表"
|
||||
"recommendations": "改进建议,用换行分隔多条建议"
|
||||
}
|
||||
请用中文回复。`, strings.Join(reviewParts, "\n\n"))
|
||||
注意:所有字段必须是字符串类型,不要使用数组。请用中文回复。`, strings.Join(reviewParts, "\n\n"))
|
||||
|
||||
messages := []goopenai.ChatCompletionMessage{
|
||||
{Role: goopenai.ChatMessageRoleUser, Content: summaryPrompt},
|
||||
@@ -299,20 +299,52 @@ func GenerateReview(db *sql.DB, repoPath, base, head string, topN, concurrency i
|
||||
if err == nil {
|
||||
jsonStr := extractJSON(summaryResponse)
|
||||
if json.Unmarshal([]byte(jsonStr), &summary) == nil {
|
||||
summaryText := fmt.Sprintf("整体评分: %d/10\n\n%s", summary.Score, summary.Overall)
|
||||
if summary.Findings != "" {
|
||||
summaryText += "\n\n**主要发现:**\n" + summary.Findings
|
||||
}
|
||||
if summary.Recommendations != "" {
|
||||
summaryText += "\n\n**改进建议:**\n" + summary.Recommendations
|
||||
}
|
||||
if callback != nil {
|
||||
callback("summary", map[string]interface{}{"content": summaryText})
|
||||
callback("summary", map[string]interface{}{
|
||||
"score": summary.Score,
|
||||
"overall": summary.Overall,
|
||||
"findings": summary.Findings,
|
||||
"recommendations": summary.Recommendations,
|
||||
})
|
||||
}
|
||||
} else {
|
||||
// If parsing fails, send raw response as summary
|
||||
if callback != nil {
|
||||
callback("summary", map[string]interface{}{"content": summaryResponse})
|
||||
// Try flexible parsing (handle recommendations as array)
|
||||
var raw map[string]json.RawMessage
|
||||
if json.Unmarshal([]byte(jsonStr), &raw) == nil {
|
||||
var flexible struct {
|
||||
Score int `json:"score"`
|
||||
Overall string `json:"overall"`
|
||||
Findings string `json:"findings"`
|
||||
}
|
||||
json.Unmarshal(raw["score"], &flexible.Score)
|
||||
json.Unmarshal(raw["overall"], &flexible.Overall)
|
||||
json.Unmarshal(raw["findings"], &flexible.Findings)
|
||||
|
||||
recommendations := ""
|
||||
if rec, ok := raw["recommendations"]; ok {
|
||||
var arr []string
|
||||
if json.Unmarshal(rec, &arr) == nil {
|
||||
recommendations = strings.Join(arr, "\n")
|
||||
} else {
|
||||
var s string
|
||||
json.Unmarshal(rec, &s)
|
||||
recommendations = s
|
||||
}
|
||||
}
|
||||
|
||||
if callback != nil {
|
||||
callback("summary", map[string]interface{}{
|
||||
"score": flexible.Score,
|
||||
"overall": flexible.Overall,
|
||||
"findings": flexible.Findings,
|
||||
"recommendations": recommendations,
|
||||
})
|
||||
}
|
||||
} else {
|
||||
// If all parsing fails, send raw response as summary
|
||||
if callback != nil {
|
||||
callback("summary", map[string]interface{}{"content": summaryResponse})
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user