Skip to content

Split long Telegram responses into multiple messages#71

Open
MarcosLM11 wants to merge 1 commit into
ClawRunr:mainfrom
MarcosLM11:fix/telegram-message-too-large
Open

Split long Telegram responses into multiple messages#71
MarcosLM11 wants to merge 1 commit into
ClawRunr:mainfrom
MarcosLM11:fix/telegram-message-too-large

Conversation

@MarcosLM11

Copy link
Copy Markdown

Summary

  • Telegram rejects sendMessage calls over 4096 characters, so agent replies longer than that limit were failing to send.
  • TelegramChannel.sendMessage now splits the response into chunks (respecting line boundaries, with a hard-split fallback for oversized single lines) and sends each chunk as a separate Telegram message.

Fixes #62

Test plan

  • Added unit tests covering: long responses get split into multiple messages within the size limit and reconstruct back to the original content; short responses are still sent as a single message.
  • ./gradlew :plugins:telegram:test passes.

Telegram rejects messages over 4096 characters, causing agent replies
that exceed the limit to fail to send. Split responses into chunks
that respect line boundaries (falling back to a hard split for
oversized lines) before sending, so long replies are delivered across
multiple messages instead of erroring out.

Fixes ClawRunr#62
for (String line : message.split("\n", -1)) {
while (line.length() > maxLength) {
flush(chunks, current);
chunks.add(line.substring(0, maxLength));

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can split a surrogate pair (emoji) → invalid string, Telegram rejects it. Check Character.isHighSurrogate(line.charAt(maxLength - 1)) and back off by one.

}

public void sendMessage(long chatId, Integer messageThreadId, String message) {
for (String chunk : splitMessage(message, MAX_MESSAGE_LENGTH)) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Splitting happens on raw markdown, but chunks are HTML-converted after escaping (< → <) and tags (** → ) make the rendered text longer, so a 4000-char chunk can still exceed 4096 and get rejected. Either measure rendered length when chunking

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] Agent response is too large for Telegram

2 participants