feat: add kanji command
This commit is contained in:
		
							parent
							
								
									f6f8563aba
								
							
						
					
					
						commit
						2a8605631b
					
				| 
						 | 
				
			
			@ -91,6 +91,8 @@ func matchAssistantConversation(botUsr *tele.User, msg *tele.Message) []*tele.Me
 | 
			
		|||
 | 
			
		||||
type assistantStreamedResponseCb func(text string, finished bool) error
 | 
			
		||||
 | 
			
		||||
// TODO interrupt response with context.
 | 
			
		||||
 | 
			
		||||
func assistantStreamedResponse(request openai.ChatRequest, cb assistantStreamedResponseCb) error {
 | 
			
		||||
	logger.Debugw("Openai chat request", "req", request)
 | 
			
		||||
	ai := openai.NewClient(config.OpenAIApiKey)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								bot.go
								
								
								
								
							
							
						
						
									
										1
									
								
								bot.go
								
								
								
								
							| 
						 | 
				
			
			@ -42,6 +42,7 @@ func initBot() (*tele.Bot, error) {
 | 
			
		|||
	for _, tbtn := range translateBtns {
 | 
			
		||||
		b.Handle(tbtn, handleTranslateBtn)
 | 
			
		||||
	}
 | 
			
		||||
	b.Handle("/kanji", handleKanjiCmd)
 | 
			
		||||
 | 
			
		||||
	b.Handle(tele.OnText, handleGeneralMessage)
 | 
			
		||||
	b.Handle(tele.OnSticker, handleGeneralMessage)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,77 @@
 | 
			
		|||
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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								main.go
								
								
								
								
							
							
						
						
									
										1
									
								
								main.go
								
								
								
								
							| 
						 | 
				
			
			@ -42,6 +42,7 @@ func runBot() {
 | 
			
		|||
 | 
			
		||||
		if err = bot.SetCommands([]tele.Command{
 | 
			
		||||
			{Text: "tr", Description: "Translate text"},
 | 
			
		||||
			{Text: "kanji", Description: "Help with pronunciation of Kanji"},
 | 
			
		||||
			{Text: "xr", Description: "Currency exchange rates"},
 | 
			
		||||
			{Text: "year_progress", Description: "Time doesn't wait."},
 | 
			
		||||
			{Text: "traffic", Description: "Show traffic usage."},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,3 +31,18 @@ func Translate(targetLang string) string {
 | 
			
		|||
		targetLang,
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func KanjiPronunciation() string {
 | 
			
		||||
	return strings.Join([]string{
 | 
			
		||||
		`You are a helpful assistant. Your task is to help with pronunciation of Kanji in Japanese.`,
 | 
			
		||||
		``,
 | 
			
		||||
		`The user must send text in Japanese, otherwise it would be irrelevant to your task, and you must ignore them.`,
 | 
			
		||||
		``,
 | 
			
		||||
		`You must then reply with the exact same text as sent by the user, with pronunciations (hiragana) added for every occurrence of Kanji in the text.`,
 | 
			
		||||
		``,
 | 
			
		||||
		`Example`,
 | 
			
		||||
		``,
 | 
			
		||||
		`User: 藤原書記は、漫画『かぐや様は告らせたい~天才たちの恋愛頭脳戦~』に`,
 | 
			
		||||
		`Assistant: 藤原(ふじわら)書記(しょき)は、漫画(まんが)『かぐや様(さま)は告(こく)らせたい~天才(てんさい)たちの恋愛(れんあい)頭脳戦(ずのうせん)~』に`,
 | 
			
		||||
	}, "\n")
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue