package summary import ( "context" "fmt" "github.com/sashabaranov/go-openai" "go-wechat/config" "go-wechat/service" "go-wechat/utils" "go-wechat/vo" "log" "strings" ) // AiSummary // @description: AI总结群聊记录 func AiSummary() { groups, err := service.GetAllEnableSummary() if err != nil { log.Printf("获取启用了聊天排行榜的群组失败, 错误信息: %v", err) return } for _, group := range groups { // 获取对话记录 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 } // 组装对话记录为字符串 var content []string for _, record := range records { content = append(content, fmt.Sprintf(`{"%s": "%s"}--end--`, record.Nickname, strings.ReplaceAll(record.Message, "\n", "。。"))) } msgTmp := `请帮我总结一下一下的群聊内容的梗概,生成的梗概需要尽可能详细,需要带上一些聊天关键信息,并且带上群友名字。 注意,他们可能是多个话题,请仔细甄别。 每一行代表一个人的发言,每一行的的格式为: {"{nickname}": "{content}"}--end-- 聊天记录如下: %s ` msg := fmt.Sprintf(msgTmp, strings.Join(content, "\n")) // 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()) continue } // 返回消息为空 if resp.Choices[0].Message.Content == "" { continue } replyMsg := fmt.Sprintf("#昨日消息总结\n又是一天过去了,让我们一起来看看昨儿群友们都聊了什么有趣的话题吧~\n\n%s", resp.Choices[0].Message.Content) utils.SendMessage(group.Wxid, "", replyMsg, 0) } }