go-wxhelper/tasks/summary/summary.go

100 lines
2.9 KiB
Go
Raw Normal View History

2024-04-12 11:37:21 +08:00
package summary
import (
"context"
"fmt"
"github.com/sashabaranov/go-openai"
"go-wechat/config"
2024-07-05 09:32:39 +08:00
"go-wechat/model/vo"
2024-04-12 11:37:21 +08:00
"go-wechat/service"
"go-wechat/utils"
"log"
"strings"
"time"
2024-04-12 11:37:21 +08:00
)
// AiSummary
// @description: AI总结群聊记录
func AiSummary() {
groups, err := service.GetAllEnableSummary()
if err != nil {
log.Printf("获取启用了聊天排行榜的群组失败, 错误信息: %v", err)
return
}
for _, group := range groups {
// 记录开始时间
var start = time.Now()
2024-04-12 11:37:21 +08:00
// 获取对话记录
var records []vo.TextMessageItem
if records, err = service.GetTextMessagesById(group.Wxid); err != nil {
log.Printf("获取群[%s]对话记录失败, 错误信息: %v", group.Wxid, err)
continue
}
if len(records) < 100 {
log.Printf("群[%s]对话记录不足100条跳过总结", group.Wxid)
continue
}
2024-04-12 11:37:21 +08:00
// 组装对话记录为字符串
var content []string
for _, record := range records {
2024-04-19 09:54:50 +08:00
content = append(content, fmt.Sprintf(`{"%s": "%s"}--end--`, record.Nickname, strings.ReplaceAll(record.Message, "\n", "。。")))
2024-04-12 11:37:21 +08:00
}
2024-04-19 09:54:50 +08:00
msgTmp := `请帮我总结一下一下的群聊内容的梗概生成的梗概需要尽可能详细需要带上一些聊天关键信息并且带上群友名字
注意他们可能是多个话题请仔细甄别
每一行代表一个人的发言每一行的的格式为 {"{nickname}": "{content}"}--end--
群名称: %s
聊天记录如下:
2024-04-19 09:54:50 +08:00
%s
`
msg := fmt.Sprintf(msgTmp, group.Nickname, strings.Join(content, "\n"))
2024-04-12 11:37:21 +08:00
// AI总结
messages := []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleUser,
Content: msg,
},
}
// 默认使用AI回复
conf := openai.DefaultConfig(config.Conf.Ai.ApiKey)
if config.Conf.Ai.BaseUrl != "" {
conf.BaseURL = fmt.Sprintf("%s/v1", config.Conf.Ai.BaseUrl)
}
ai := openai.NewClientWithConfig(conf)
var resp openai.ChatCompletionResponse
resp, err = ai.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: config.Conf.Ai.SummaryModel,
Messages: messages,
},
)
if err != nil {
log.Printf("群聊记录总结失败: %v", err.Error())
2024-07-24 14:11:14 +08:00
utils.SendMessage(group.Wxid, "", "#昨日消息总结\n\n群聊消息总结失败错误信息: "+err.Error(), 0)
2024-04-12 11:37:21 +08:00
continue
}
// 返回消息为空
if resp.Choices[0].Message.Content == "" {
2024-07-24 14:11:14 +08:00
utils.SendMessage(group.Wxid, "", "#昨日消息总结\n\n群聊消息总结失败AI返回结果为空", 0)
2024-04-12 11:37:21 +08:00
continue
}
replyMsg := fmt.Sprintf("#昨日消息总结\n又是一天过去了让我们一起来看看昨儿群友们都聊了什么有趣的话题吧~\n\n%s", resp.Choices[0].Message.Content)
//log.Printf("群[%s]对话记录总结成功,总结内容: %s", group.Wxid, replyMsg)
2024-04-12 11:37:21 +08:00
utils.SendMessage(group.Wxid, "", replyMsg, 0)
// 判断耗时是否达到15秒不足就等待
if used := time.Now().Sub(start); used < 15*time.Second {
time.Sleep(15*time.Second - used)
}
2024-04-12 11:37:21 +08:00
}
}