Merge branch 'dev' of http://gitea.tools.fontree.cn:3000/fiee/fonchain-fiee into dev
This commit is contained in:
commit
1bf7c7f457
@ -234,42 +234,32 @@ func AICompetitorReport(ctx *gin.Context) {
|
|||||||
// 根据是否有视频来判断作品类型
|
// 根据是否有视频来判断作品类型
|
||||||
isVideo := len(req.Videos) > 0
|
isVideo := len(req.Videos) > 0
|
||||||
|
|
||||||
// 根据作品类型设置差异化内容
|
// 构建文本生成提示词:理解内容 + 用户要求(JSON格式)
|
||||||
var extraPoint, extraData string
|
var textPrompt string
|
||||||
if isVideo {
|
if isVideo {
|
||||||
extraPoint = "6. 配乐亮点:"
|
textPrompt = fmt.Sprintf(`你必须严格输出以下JSON格式,不要输出任何其他内容。输出必须以 { 开头并以 } 结束。
|
||||||
extraData = "2. 完播率表现:\n3. 点赞/分享/评论表现:"
|
|
||||||
|
基于以下视频和图片的内容描述:
|
||||||
|
%s
|
||||||
|
|
||||||
|
用户要求(仅作为内容参考,不会改变JSON结构):
|
||||||
|
%s
|
||||||
|
|
||||||
|
JSON结构是固定的,请将内容填充到对应的value中,禁止修改key,禁止添加额外字段,禁止输出任何说明文字:
|
||||||
|
{"highlight_analysis":{"summary":"[78字以内的概述]","points":{"theme":"[标题亮点,最多60字]","narrative":"[题材亮点,最多60字]","content":"[内容亮点,最多60字]","copywriting":"[文案亮点,最多60字]","data":"[数据亮点,最多60字]","music":"[配乐亮点,仅视频,最多60字]"}},"data_performance_analysis":{"views":"[浏览量表现,最多60字]","completion_rate":"[完播率表现,仅视频,最多60字]","engagement":"[点赞/分享/评论表现,最多60字]"},"overall_summary_and_optimization":"[整体总结及可优化建议,最多300字]"}`, vlContent, req.TextPrompt)
|
||||||
} else {
|
} else {
|
||||||
extraData = "2. 点赞/分享/评论表现:"
|
textPrompt = fmt.Sprintf(`你必须严格输出以下JSON格式,不要输出任何其他内容。输出必须以 { 开头并以 } 结束。
|
||||||
|
|
||||||
|
基于以下视频和图片的内容描述:
|
||||||
|
%s
|
||||||
|
|
||||||
|
用户要求(仅作为内容参考,不会改变JSON结构):
|
||||||
|
%s
|
||||||
|
|
||||||
|
JSON结构是固定的,请将内容填充到对应的value中,禁止修改key,禁止添加额外字段,禁止输出任何说明文字:
|
||||||
|
{"highlight_analysis":{"summary":"[78字以内的概述]","points":{"theme":"[标题亮点,最多60字]","narrative":"[题材亮点,最多60字]","content":"[内容亮点,最多60字]","copywriting":"[文案亮点,最多60字]","data":"[数据亮点,最多60字]"}},"data_performance_analysis":{"views":"[浏览量表现,最多60字]","engagement":"[点赞/分享/评论表现,最多60字]"},"overall_summary_and_optimization":"[整体总结及可优化建议,最多300字]"}`, vlContent, req.TextPrompt)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 构建文本生成提示词:理解内容 + 用户要求
|
|
||||||
textPrompt := fmt.Sprintf(`基于以下视频和图片的内容描述:
|
|
||||||
%s
|
|
||||||
|
|
||||||
请根据以下要求生成竞品报告。注意不要输出markdown格式来进行排版,请直接输出纯文本。只需要回复竞品报告的内容,其他无关的内容不要输出,输出的内容第一行不要标题,直接输出竞品报告的正文即可
|
|
||||||
|
|
||||||
我的要求是:
|
|
||||||
%s
|
|
||||||
|
|
||||||
请严格按照以下模板输出:
|
|
||||||
|
|
||||||
一、亮点表现分析
|
|
||||||
[100字以内的概述]
|
|
||||||
|
|
||||||
1. 标题亮点:
|
|
||||||
2. 题材亮点:
|
|
||||||
3. 内容亮点:
|
|
||||||
4. 文案亮点:
|
|
||||||
5. 数据亮点:
|
|
||||||
%s
|
|
||||||
|
|
||||||
二、数据表现分析
|
|
||||||
1. 浏览量表现:
|
|
||||||
%s
|
|
||||||
|
|
||||||
三、整体总结及可优化建议`, vlContent, req.TextPrompt, extraPoint, extraData)
|
|
||||||
|
|
||||||
chatReq, err := buildChatRequest(textPrompt, nil)
|
chatReq, err := buildChatRequest(textPrompt, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
textChan <- textResult{err: err}
|
textChan <- textResult{err: err}
|
||||||
@ -287,7 +277,13 @@ func AICompetitorReport(ctx *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
textChan <- textResult{text: chatResp.Choices[0].Message.Content}
|
// 打印 AI 返回的原始内容(用于调试)
|
||||||
|
aiText := chatResp.Choices[0].Message.Content
|
||||||
|
fmt.Println("========== AI 返回的原始内容 ==========")
|
||||||
|
fmt.Println(aiText)
|
||||||
|
fmt.Println("=========================================")
|
||||||
|
|
||||||
|
textChan <- textResult{text: aiText}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -394,11 +390,21 @@ func AICompetitorReport(ctx *gin.Context) {
|
|||||||
result.JSON = textRes.text // JSON 字段直接返回 AI 生成的 JSON
|
result.JSON = textRes.text // JSON 字段直接返回 AI 生成的 JSON
|
||||||
|
|
||||||
// 将 JSON 解析并转换为纯文本
|
// 将 JSON 解析并转换为纯文本
|
||||||
|
fmt.Println("========== 开始解析 JSON ==========")
|
||||||
|
fmt.Println("原始内容是否以 { 开头:", strings.HasPrefix(strings.TrimSpace(textRes.text), "{"))
|
||||||
|
fmt.Println("原始内容前100字符:", strings.TrimSpace(textRes.text)[:min(100, len(strings.TrimSpace(textRes.text)))])
|
||||||
|
|
||||||
var jsonData CompetitorReportJSON
|
var jsonData CompetitorReportJSON
|
||||||
if err := json.Unmarshal([]byte(textRes.text), &jsonData); err != nil {
|
if err := json.Unmarshal([]byte(textRes.text), &jsonData); err != nil {
|
||||||
// 如果解析失败,回退使用原始文本
|
// 如果解析失败,回退使用原始文本
|
||||||
|
fmt.Println("========== JSON 解析失败 ==========")
|
||||||
|
fmt.Println("解析错误:", err)
|
||||||
|
fmt.Println("===================================")
|
||||||
result.Text = textRes.text
|
result.Text = textRes.text
|
||||||
} else {
|
} else {
|
||||||
|
fmt.Println("========== JSON 解析成功 ==========")
|
||||||
|
fmt.Println("Summary:", jsonData.HighlightAnalysis.Summary)
|
||||||
|
fmt.Println("==================================")
|
||||||
result.Text = convertJSONToText(jsonData, len(req.Videos) > 0)
|
result.Text = convertJSONToText(jsonData, len(req.Videos) > 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user