# MpakoImageAIbot Telegram-бот для генерации и редактирования изображений через удалённый ComfyUI API. ## Что умеет - **Text-to-image**: текст → изображение (Z-Image Turbo, 1024×1024). - **Image-to-image**: фото + подпись → редактирование (Krea2 edit). - Глобальная очередь с одной активной задачей на пользователя. - Позиция в очереди и прогресс генерации через WebSocket ComfyUI. - SQLite: запросы, статусы, seed, пути к файлам. ## Требования - Python 3.10+ (проверено на 3.13). - ComfyUI с доступом по сети, например: ```text python main.py --listen 0.0.0.0 --port 8188 ``` - Установленные кастомные ноды для текущих workflow: `Krea2ModelLoader`, `TextEncodeQwenImageEdit`, `UnetLoaderGGUF`, `CLIPLoaderGGUF`. - Модели, указанные в `workflows/txt2img.json` и `workflows/img2img.json`. ## Настройка ```powershell Copy-Item .env.example .env ``` Заполнить `.env`: - `BOT_TOKEN` — токен от `@BotFather`. - `COMFY_BASE_URL` — например `http://192.168.31.113:8188`. - Остальные параметры можно оставить по умолчанию. ## Запуск ```powershell py -3 -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -r requirements.txt python bot.py ``` Бот работает в приватных чатах. Пользователь отправляет текст или фото с подписью. ## Docker ```powershell docker compose up -d --build ``` Каталоги `./storage` и `./data` монтируются как volume. Для ComfyUI на другой машине используйте её LAN-IP, а не `localhost`. ## Workflow - `workflows/txt2img.json` — Z-Image Turbo: `EmptySD3LatentImage → KSampler → VAEDecode → SaveImage`. - `workflows/img2img.json` — Krea2 edit: `LoadImage → TextEncodeQwenImageEdit → KSamplerAdvanced → VAEDecode → SaveImage`. - `workflows/mapping.json` — ID узлов, в которые подставляются prompt, negative, seed и входное изображение. - `workflows/Krea2.json` и `workflows/ZImage.json` — исходные экспорты. Если меняются workflow, обновите `mapping.json`. При старте бот проверяет, что все узлы и поля существуют. ## Тесты ```powershell pip install -r requirements-dev.txt pytest ``` ## Ограничения текущей версии - Один воркер и одна активная задача на пользователя. - Нет `/cancel` и удаления задачи из очереди. - Нет автоочистки `storage/` и `data/`. - Прогресс в процентах зависит от WebSocket; при его недоступности используется polling без процентов. - При рестарте задача в статусе `running` помечается `failed`.