78 lines
1.9 KiB
Go
78 lines
1.9 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"regexp"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/samber/lo"
|
||
|
tele "gopkg.in/telebot.v3"
|
||
|
|
||
|
"git.gensokyo.cafe/kkyy/tgbot_misaka_5882f7/openai"
|
||
|
"git.gensokyo.cafe/kkyy/tgbot_misaka_5882f7/openai/prompts"
|
||
|
)
|
||
|
|
||
|
var kanjiRe = regexp.MustCompile(`\p{Han}`)
|
||
|
|
||
|
func handleKanjiCmd(c tele.Context) error {
|
||
|
msg := c.Message()
|
||
|
if msg == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
payload := strings.TrimSpace(msg.Payload)
|
||
|
if payload == "" {
|
||
|
return c.Reply("Usage: `/kanji <text>`", &tele.SendOptions{ParseMode: tele.ModeMarkdown}, tele.Silent)
|
||
|
}
|
||
|
if !kanjiRe.MatchString(payload) {
|
||
|
return c.Reply("// Your text does not contain any Kanji.")
|
||
|
}
|
||
|
|
||
|
req := openai.ChatRequest{
|
||
|
Model: openai.ModelGpt0305Turbo,
|
||
|
Messages: []openai.ChatMessage{
|
||
|
{
|
||
|
Role: openai.ChatRoleSystem,
|
||
|
Content: prompts.KanjiPronunciation(),
|
||
|
},
|
||
|
{
|
||
|
Role: openai.ChatRoleUser,
|
||
|
Content: payload,
|
||
|
},
|
||
|
{
|
||
|
Role: openai.ChatRoleSystem,
|
||
|
Content: `Reminder: Assistant should stick to the task of adding pronunciations for Kanji in the text sent by the user. If user's message seem irrelevant, just reply "IRRELEVANT"`,
|
||
|
},
|
||
|
},
|
||
|
Temperature: lo.ToPtr(0.2),
|
||
|
}
|
||
|
|
||
|
actionCh := setTyping(c)
|
||
|
var irrelevant = false
|
||
|
var replyMsg *tele.Message
|
||
|
err := assistantStreamedResponse(req, func(text string, finished bool) error {
|
||
|
<-actionCh
|
||
|
if strings.HasPrefix(text, `IRRELEVANT`) {
|
||
|
irrelevant = true
|
||
|
return nil // TODO interrupt response
|
||
|
}
|
||
|
var err error
|
||
|
if replyMsg == nil {
|
||
|
replyMsg, err = c.Bot().Reply(msg, text, tele.Silent)
|
||
|
} else {
|
||
|
replyMsg, err = c.Bot().Edit(replyMsg, text)
|
||
|
}
|
||
|
return err
|
||
|
})
|
||
|
|
||
|
if err != nil {
|
||
|
logger.Errorw("assistant: failed to complete conversation", "error", err)
|
||
|
_ = c.Reply("Sorry, there's a technical issue. 😵💫 Please try again later.", tele.Silent)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if irrelevant {
|
||
|
return c.Reply("Sorry, I don't know what to do with your input.")
|
||
|
}
|
||
|
return nil
|
||
|
}
|