44 lines
3.0 KiB
Markdown
44 lines
3.0 KiB
Markdown
Ты — senior Python-разработчик. Нужно написать Telegram-бота для генерации изображений через удалённый ComfyUI API.
|
||
|
||
## Стек
|
||
- Python 3.10+
|
||
- python-telegram-bot (v21+, async) [citation:3]
|
||
- SQLite (через aiosqlite или стандартный sqlite3 с осторожностью)
|
||
- requests / httpx для вызова ComfyUI API
|
||
- Docker для финальной упаковки
|
||
|
||
## Функционал (два режима)
|
||
1. **Text-to-Image**: пользователь отправляет текст → бот шлёт POST на ComfyUI `/prompt` с подставленным промптом [citation:14].
|
||
2. **Image-to-Image**: пользователь отправляет фото + текст → бот скачивает фото, загружает его в ComfyUI (через `/upload/image` или временную папку), подставляет в воркфлоу как input image, шлёт POST.
|
||
|
||
## Очередь (критично)
|
||
- Один пользователь = одна активная задача. Если он пишет ещё раз, пока висит его задача — бот отвечает «ты уже в очереди».
|
||
- Нужна глобальная очередь. Показывай:
|
||
- Если в очереди: «Перед тобой X человек».
|
||
- Если генерация идёт: «Генерация… Y%» (прогресс брать из WebSocket ComfyUI, события `progress` [citation:25][citation:35]).
|
||
|
||
## Хранение (SQLite)
|
||
Таблица `requests`:
|
||
- id (PK)
|
||
- user_id (telegram id)
|
||
- timestamp (ISO)
|
||
- prompt_text
|
||
- input_file_path (nullable)
|
||
- output_file_path (nullable)
|
||
- status (queued/running/done/failed)
|
||
- comfy_prompt_id (для отслеживания)
|
||
|
||
Файлы (входные фото и результаты) сохраняй локально в папку `./storage/{user_id}/`. В БД только пути.
|
||
|
||
## Вызов ComfyUI
|
||
- База: `http://IP_WINDOWS:PORT`
|
||
- POST `/prompt` → получаешь `prompt_id` [citation:2][citation:14].
|
||
- Опрос статуса: либо через GET `/history/{prompt_id}` (проще, но медленнее), либо через WebSocket на `/ws` (для прогресса в реальном времени) [citation:30][citation:35].
|
||
- После завершения скачай изображение через `/view?filename=...`.
|
||
|
||
## Что сделать сейчас
|
||
1. Создай структуру проекта: `bot.py`, `comfy_client.py`, `db.py`, `queue_manager.py`.
|
||
2. Напиши `comfy_client.py` с функциями submit_workflow (POST /prompt) и get_result (скачивание).
|
||
3. Напиши `db.py` с init_db() и CRUD для requests.
|
||
4. Напиши `bot.py` с хендлерами для текста и фото, но очередь пока сделай простейшей (asyncio.Queue).
|
||
5. Добавь `requirements.txt` и `Dockerfile`. |