diff --git a/assistant.go b/assistant.go index 1849115..6fd09c3 100644 --- a/assistant.go +++ b/assistant.go @@ -108,11 +108,13 @@ func assistantStreamedResponse(request openai.ChatRequest, cb assistantStreamedR logger.Warnw("assistant: failed to get response", "error", err) } - nErrs := 0 + var nErrs, nUpdates int go func() { respBuilder := strings.Builder{} minWait := time.After(time.Second) for { + nUpdates += 1 + var ( nNewChunk int finished bool @@ -148,13 +150,17 @@ func assistantStreamedResponse(request openai.ChatRequest, cb assistantStreamedR break } - respoText := respBuilder.String() + assistantWritingSign - minWait = time.After(time.Second) // renew the timer + // 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) nErrs += 1 - if nErrs > 3 { + if nErrs > 5 { logger.Warnw("too many errors, aborting") return }