qq_bot/handler/headmaster/headmaster.go

119 lines
3.9 KiB
Go

package headmaster
import (
"context"
"fmt"
"strings"
"time"
"git.lxtend.com/qqbot/config"
"git.lxtend.com/qqbot/constants"
"git.lxtend.com/qqbot/handler"
"git.lxtend.com/qqbot/model"
"git.lxtend.com/qqbot/util"
"github.com/sashabaranov/go-openai"
)
var (
histories = make(map[string][]openai.ChatCompletionMessage)
histories_time = make(map[string]time.Time)
)
func init() {
handler.RegisterHandler("校长", headmasterHandler, constants.LEVEL_USER)
handler.RegisterPrivateHandler(headmasterHandler)
}
func headmasterHandler(msg model.Message) (reply model.Reply) {
var from string
if msg.GroupInfo.IsGroupMsg {
from = util.From(msg.GroupInfo.GroupId, 0)
} else {
from = util.From(0, msg.UserId)
}
if len(msg.RawMsg) > 7 && msg.RawMsg[0:7] == "校长 " {
return model.Reply{
ReplyMsg: ask(from, fmt.Sprintf("{\"qqid\":%d,\"group_nickname\":\"%s\",\"nickname\":\"%s\",\"referid\":%d,\"received_time\":%s,\"msg\":\"%s\"}", msg.UserId, msg.GroupInfo.UserCard, msg.UserNickName, msg.OriginMsgId, time.Now().Format("2006-01-02 15:04:05"), msg.RawMsg[7:])),
ReferOriginMsg: false,
FromMsg: msg,
}
}
return model.Reply{
ReplyMsg: ask(from, fmt.Sprintf("{\"qqid\":%d,\"group_nickname\":\"%s\",\"nickname\":\"%s\",\"referid\":%d,\"received_time\":%s,\"msg\":\"%s\"}", msg.UserId, msg.GroupInfo.UserCard, msg.UserNickName, msg.OriginMsgId, time.Now().Format("2006-01-02 15:04:05"), msg.RawMsg)),
ReferOriginMsg: false,
FromMsg: msg,
}
}
func ask(from string, question string) (reply string) {
llmConfig := openai.DefaultAzureConfig(config.ConfigManager.GetConfig().OpenaiApiKey, config.ConfigManager.GetConfig().OpenaiApiBaseUrl)
llmConfig.APIType = openai.APITypeOpenAI
llmConfig.APIVersion = ""
client := openai.NewClientWithConfig(llmConfig)
resp, err := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: config.ConfigManager.GetConfig().OpenaiModelName,
Messages: GenRequestFromUsr(from, question),
// Tools: []openai.Tool{
// {
// Type: openai.ToolTypeFunction,
// Function: &openai.FunctionDefinition{
// Name: "try_get_qqid_by_nickname",
// Description: "尝试在群内获取昵称对应的qq号",
// Parameters: json.RawMessage(`{"type": "object", "properties": {"nickname": {"type": "string", "description": "用户的昵称"}}}`),
// },
// },
// },
// ToolChoice: &openai.ToolChoice{
// Type: openai.ToolTypeFunction,
// Function: openai.ToolFunction{
// Name: "try_get_qqid_by_nickname",
// },
// },
},
)
if err != nil {
fmt.Printf("ChatCompletion error: %v\n", err)
return
}
AppendReplyToHistory(from, resp.Choices[0].Message.Content)
return enterFormatter(resp.Choices[0].Message.Content)
}
func enterFormatter(msgIn string) string {
return strings.ReplaceAll(msgIn, "\\n", "\n")
}
func GenRequestFromUsr(from string, question string) []openai.ChatCompletionMessage {
if _, ok := histories[from]; !ok || histories_time[from].Add(10*time.Minute).Before(time.Now()) {
histories[from] = make([]openai.ChatCompletionMessage, 0)
histories[from] = append(histories[from], openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleSystem,
Content: config.ConfigManager.GetConfig().OpenaiPrompt,
},
)
}
histories[from] = append(histories[from], openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleUser,
Content: question,
})
return histories[from]
}
func AppendReplyToHistory(from string, reply string) {
histories[from] = append(histories[from], openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleAssistant,
Content: reply,
})
histories_time[from] = time.Now()
for len(histories[from]) > 20 {
histories[from] = histories[from][1:]
histories[from][0] = openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleSystem,
Content: config.ConfigManager.GetConfig().OpenaiPrompt,
}
}
}