Skip to content

Commit 864bf8b

Browse files
authored
fix(telegram): split long messages (#146)
Signed-off-by: mudler <mudler@localai.io>
1 parent 60c53c8 commit 864bf8b

File tree

1 file changed

+33
-5
lines changed

1 file changed

+33
-5
lines changed

services/connectors/telegram.go

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
)
2929

3030
const telegramThinkingMessage = "🤔 thinking..."
31+
const telegramMaxMessageLength = 3000
3132

3233
type Telegram struct {
3334
Token string
@@ -218,6 +219,14 @@ func formatResponseWithURLs(response string, urls []string) string {
218219
func (t *Telegram) handleUpdate(ctx context.Context, b *bot.Bot, a *agent.Agent, update *models.Update) {
219220
username := update.Message.From.Username
220221

222+
internalError := func(err error, msg *models.Message) {
223+
xlog.Error("Error updating final message", "error", err)
224+
b.EditMessageText(ctx, &bot.EditMessageTextParams{
225+
ChatID: update.Message.Chat.ID,
226+
MessageID: msg.ID,
227+
Text: "there was an internal error. try again!",
228+
})
229+
}
221230
if len(t.admins) > 0 && !slices.Contains(t.admins, username) {
222231
xlog.Info("Unauthorized user", "username", username)
223232
_, err := b.SendMessage(ctx, &bot.SendMessageParams{
@@ -334,19 +343,38 @@ func (t *Telegram) handleUpdate(ctx context.Context, b *bot.Bot, a *agent.Agent,
334343
}
335344

336345
// Update the message with the final response
346+
formattedResponse := formatResponseWithURLs(res.Response, urls)
347+
348+
// Split the message if it's too long
349+
messages := xstrings.SplitParagraph(formattedResponse, telegramMaxMessageLength)
350+
351+
if len(messages) == 0 {
352+
internalError(errors.New("empty response from agent"), msg)
353+
return
354+
}
355+
356+
// Update the first message
337357
_, err = b.EditMessageText(ctx, &bot.EditMessageTextParams{
338358
ChatID: update.Message.Chat.ID,
339359
MessageID: msg.ID,
340-
Text: formatResponseWithURLs(res.Response, urls),
360+
Text: messages[0],
341361
ParseMode: models.ParseModeMarkdown,
342362
})
343363
if err != nil {
344-
xlog.Error("Error updating final message", "error", err)
345-
b.EditMessageText(ctx, &bot.EditMessageTextParams{
364+
internalError(fmt.Errorf("internal error: %w", err), msg)
365+
return
366+
}
367+
368+
// Send additional chunks as new messages
369+
for i := 1; i < len(messages); i++ {
370+
_, err = b.SendMessage(ctx, &bot.SendMessageParams{
346371
ChatID: update.Message.Chat.ID,
347-
MessageID: msg.ID,
348-
Text: "there was an internal error. try again!",
372+
Text: messages[i],
373+
ParseMode: models.ParseModeMarkdown,
349374
})
375+
if err != nil {
376+
internalError(fmt.Errorf("internal error: %w", err), msg)
377+
}
350378
}
351379
}
352380

0 commit comments

Comments
 (0)