Загрузка данных


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())