tg-channel-analysis/bot/services/chunker.py
2026-02-22 21:33:23 +02:00

45 lines
1.2 KiB
Python

from bot.models import ChannelMessage
MAX_TOKENS_PER_CHUNK = 25_000
CHARS_PER_TOKEN = 3
def _format_message(msg: ChannelMessage) -> str:
parts = [f"[{msg.date:%Y-%m-%d %H:%M}]"]
stats = []
if msg.views is not None:
stats.append(f"{msg.views} views")
if msg.forwards is not None:
stats.append(f"{msg.forwards} fwd")
if msg.replies is not None:
stats.append(f"{msg.replies} replies")
if stats:
parts.append(f"({', '.join(stats)})")
parts.append(f"\n{msg.text}")
return " ".join(parts)
def chunk_messages(messages: list[ChannelMessage]) -> list[str]:
"""Split messages into token-bounded chunks."""
max_chars = MAX_TOKENS_PER_CHUNK * CHARS_PER_TOKEN
chunks: list[str] = []
current_lines: list[str] = []
current_len = 0
for msg in messages:
formatted = _format_message(msg)
entry = formatted + "\n---\n"
entry_len = len(entry)
if current_len + entry_len > max_chars and current_lines:
chunks.append("".join(current_lines))
current_lines = []
current_len = 0
current_lines.append(entry)
current_len += entry_len
if current_lines:
chunks.append("".join(current_lines))
return chunks