import asyncio
import random
from aiogram import Bot, Dispatcher, Router, F
from aiogram.types import Message
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
router = Router()
# Симуляция генератора текста (замените на поток от вашей LLM — OpenAI, Claude, vLLM)
async def fake_llm_stream():
words = [
"Привет!", "Я", "генерирую", "ответ", "в", "реальном", "времени",
"с", "помощью", "новых", "возможностей", "Telegram", "API",
"и", "фреймворка", "aiogram.", "Это", "очень", "удобно!"
]
current_text = ""
for word in words:
await asyncio.sleep(0.3) # Имитируем задержку сети/генерации модели
current_text += " " + word
yield current_text
@router.message(F.text)
async def handle_streaming_text(message: Message, bot: Bot):
# Генерация уникального ID для сессии стриминга
# ID должен быть ненулевым и уникальным для каждого отдельного стрима
draft_id = random.randint(1, 1000000)
# Шаг 1: Показываем статус "Thinking..." пользователю
await bot.send_message_draft(
chat_id=message.chat.id,
draft_id=draft_id,
text=None # Отправка None автоматически вешает плашку «Загрузка/Думает»
)
final_text = ""
# Шаг 2: Получаем куски текста из стрима и обновляем черновик
async for partial_text in fake_llm_stream():
final_text = partial_text
try:
await bot.send_message_draft(
chat_id=message.chat.id,
draft_id=draft_id,
text=final_text
)
except Exception as e:
# Игнорируем возможные сетевые микро-сбои во время стрима
pass
# Шаг 3: Обязательно фиксируем финальный результат постоянным сообщением
await message.answer(text=final_text)
async def main():
# Замените на ваш токен бота
bot = Bot(token="ВАШ_ТОКЕН_БОТА", default=DefaultBotProperties(parse_mode=ParseMode.HTML))
dp = Dispatcher()
dp.include_router(router)
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())