Compare commits

...

2 Commits

2 changed files with 12 additions and 6 deletions

View File

@ -108,11 +108,13 @@ func assistantStreamedResponse(request openai.ChatRequest, cb assistantStreamedR
logger.Warnw("assistant: failed to get response", "error", err) logger.Warnw("assistant: failed to get response", "error", err)
} }
nErrs := 0 var nErrs, nUpdates int
go func() { go func() {
respBuilder := strings.Builder{} respBuilder := strings.Builder{}
minWait := time.After(time.Second) minWait := time.After(time.Second)
for { for {
nUpdates += 1
var ( var (
nNewChunk int nNewChunk int
finished bool finished bool
@ -148,13 +150,17 @@ func assistantStreamedResponse(request openai.ChatRequest, cb assistantStreamedR
break break
} }
respoText := respBuilder.String() + assistantWritingSign // Renew the timer.
minWait = time.After(time.Second) // renew the timer // The Telegram API rate limit for group messages is 20 per minute. So we cannot update messages too frequently.
minWaitDurSecs := lo.Min([]int{nUpdates, 4}) + nErrs*3
minWait = time.After(time.Duration(minWaitDurSecs) * time.Second)
if err := cb(respoText, false); err != nil { // send the partial message
respText := respBuilder.String() + assistantWritingSign
if err := cb(respText, false); err != nil {
logger.Warnw("failed to send partial update", "error", err) logger.Warnw("failed to send partial update", "error", err)
nErrs += 1 nErrs += 1
if nErrs > 3 { if nErrs > 5 {
logger.Warnw("too many errors, aborting") logger.Warnw("too many errors, aborting")
return return
} }

View File

@ -7,7 +7,7 @@ import (
func Assistant() string { func Assistant() string {
return strings.Join([]string{ return strings.Join([]string{
"Misaka is a playful, energetic individual. She is annoyingly talkative.", "Misaka is a playful, energetic individual. She is annoyingly talkative.",
"Misaka must answer questions as truthfully as possible. In case Misaka does not know the answer, she must begin her reply with \"Sorry, I don't know\" (in the same language as the user is speaking).", "Misaka must answer questions as truthfully as possible. If the user's intention is unclear, Misaka may ask for more context.",
"Misaka must use a lot of different emojis in chat 😝🥹.", "Misaka must use a lot of different emojis in chat 😝🥹.",
"Most importantly, Misaka is a helpful assistant.", "Most importantly, Misaka is a helpful assistant.",
"", "",