Many messaging channels (Feishu, Telegram, etc.) have a per-message character limit (~4000 chars for Feishu). When a response exceeds this limit, it either gets truncated or silently fails, leaving the user with no feedback.
Before sending any message, check its length and split if necessary.
python
def send_long_message(text, channel="{active_channel}"):
"""
Send a message, splitting it into multiple chunks if it exceeds the length limit.
Args:
text: The message text to send
channel: Target channel (feishu/telegram/discord/whatsapp/signal/imessage/openclaw-weixin)
Returns:
Number of chunks sent
"""
MAX_LEN = 3600 # Feishu limit with margin
CHUNK_HEADER = "[{i}/{total}]\n"
if len(text) <= MAX_LEN:
message(action="send", channel=channel, message=text)
return 1
chunks = split_text(text, MAX_LEN)
total = len(chunks)
for i, chunk in enumerate(chunks, 1):
header = f"[{i}/{total}]\n" if total > 1 else ""
message(action="send", channel=channel, message=header + chunk)
return total
def split_text(text, max_len):
"""
Split text into chunks of at most max_len characters.
Attempts to split at sentence boundaries or line breaks for readability.
"""
import re
# Try to split at sentence-ending punctuation first
sentence_split = re.split(r'(?<=[。!?.!?])\s+', text)
chunks = []
current = ""
for sentence in sentence_split:
if len(current) + len(sentence) + 1 <= max_len:
current += (" " + sentence if current else sentence)
else:
if current:
chunks.append(current)
# If single sentence exceeds limit, split by words/characters
if len(sentence) > max_len:
for i in range(0, len(sentence), max_len - 100):
chunks.append(sentence[i:i + max_len - 100])
current = ""
else:
current = sentence
if current:
chunks.append(current)
return chunks
ChannelMax chars (approx)NotesFeishu4000Hard limitTelegram4096Discord2000Embed limit 6000WhatsApp65000But relayed messages get truncatedSignal700Very lowiMessage~4000Via macOS relay
MAX_LEN = 3600 as a safe default (leaves room for header)[{i}/{total}] are only added when total > 1