Discussions

Ask a Question
Back to all

what im dong whong to using vedoei agent

app/bot/routers/video_agent.py

from future import annotations
import asyncio
import logging
from html import escape
from typing import Optional
from aiogram import Router, F, Bot
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import StatesGroup, State
from aiogram.types import Message, CallbackQuery
from aiogram.utils.keyboard import InlineKeyboardBuilder
from app.config import settings
from app.repositories.video_jobs import VideoJobsRepository
from app.services.heygen import HeyGenClient
router = Router()
jobs = VideoJobsRepository()
heygen = HeyGenClient(settings.heygen_api_key)
logger = logging.getLogger(name)

class VideoAgentStates(StatesGroup):
wait_prompt = State()

ВРЕМЕННО: для отладки выведем сообщение о загрузке роутера

logger.info("✅ Video Agent router loaded")

@router.message(F.text == "🤖 Video Agent")
async def video_agent_entry(message: Message, state: FSMContext):
logger.info(f"Video Agent handler triggered with text: {message.text}")
await state.set_state(VideoAgentStates.wait_prompt)
await message.answer(
"🤖 Video Agent (одним промптом)\n\n"
"Опиши, какое видео нужно создать. Например:\n"
"• «Сделай 5-секундное видео про нефрит, с аватаром и кадрами природы»\n"
"• «Расскажи о пользе медитации, 30 секунд, вертикальное»\n\n"
"Я отправлю твой запрос в Video Agent и сообщу, когда видео будет готово."
)

@router.message(VideoAgentStates.wait_prompt, F.text)
async def video_agent_prompt_received(message: Message, state: FSMContext):
prompt = message.text.strip()
if len(prompt) < 10:
await message.answer("Промпт слишком короткий. Опиши видео подробнее.")
return
await message.answer("🚀 Запускаю Video Agent... Это может занять до минуты.")
try:

Вызываем API Video Agent

video_id = await heygen.video_agent_generate(prompt)
except Exception as e:
logger.exception("Video Agent generation failed")
await message.answer(f"❌ Ошибка при запуске: {escape(str(e))}")
await state.clear()
return

Сохраняем задачу в БД

await jobs.create_job(message.from_user.id, video_id, source="video_agent")
await message.answer(
f"🤖 Видео генерируется! video_id={escape(video_id)}\n"
f"Как будет готово, я пришлю ссылку. Также можно проверить статус командой /status."
)

Запускаем фоновый опрос

asyncio.create_task(_poll_and_send_video(message.chat.id, video_id, message.bot))
await state.clear()

async def _poll_and_send_video(chat_id: int, video_id: str, bot, timeout_s: int = 900, step_s: int = 5):
deadline = asyncio.get_running_loop().time() + timeout_s
last_status: Optional[str] = None
while asyncio.get_running_loop().time() < deadline:
resp = await heygen.get_video_status(video_id)
if not resp.get("error"):
data = resp.get("data") or {}
status = (data.get("status") or data.get("state") or "").lower() or "processing"
last_status = status
if status in {"completed", "complete", "success", "done", "ready"}:
url = data.get("video_url") or data.get("url")
await jobs.set_status(video_id, "completed", video_url=url)
if url:
try:
await bot.send_video(chat_id, url, caption="✅ Видео готово!")
except Exception:
await bot.send_message(chat_id, f"✅ Видео готово!\n{url}")
else:
await bot.send_message(chat_id, f"✅ Готово, но URL не найден:\n{escape(str(data))}")
return
if status in {"failed", "error"}:
await jobs.set_status(video_id, "failed", error=str(data))
await bot.send_message(chat_id, f"❌ Генерация упала:\n{escape(str(data))}")
return
await jobs.set_status(video_id, "processing")
await asyncio.sleep(step_s)
await bot.send_message(chat_id, f"⏳ Долго генерируется (последний статус: {escape(str(last_status))}). Попробуй /status позже.")

ВРЕМЕННО: отладочный хэндлер для любых текстовых сообщений (можно удалить после проверки)

@router.message()
async def debug_all_messages(message: Message):
logger.info(f"Debug: received message with text: {message.text}")

Если хотите, можно закомментировать, чтобы не мешал работе

await message.answer(f"Debug: получено сообщение: {message.text}")

@router.message()
async def debug_all_messages(message: Message):
logger.info(f"DEBUG: Получено сообщение: '{message.text}'")
await message.answer(f"Получено сообщение: '{message.text}'\nДлина: {len(message.text)}")
what i m doing wrong?