3.2 KiB
3.2 KiB
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 с доступом по сети, например:
python main.py --listen 0.0.0.0 --port 8188 - Установленные кастомные ноды для текущих workflow:
Krea2ModelLoader,TextEncodeQwenImageEdit,UnetLoaderGGUF,CLIPLoaderGGUF. - Модели, указанные в
workflows/txt2img.jsonиworkflows/img2img.json.
Настройка
Copy-Item .env.example .env
Заполнить .env:
BOT_TOKEN— токен от@BotFather.COMFY_BASE_URL— напримерhttp://192.168.31.113:8188.- Остальные параметры можно оставить по умолчанию.
Запуск
py -3 -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python bot.py
Бот работает в приватных чатах. Пользователь отправляет текст или фото с подписью.
Docker
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. При старте бот проверяет, что все узлы и поля существуют.
Тесты
pip install -r requirements-dev.txt
pytest
Ограничения текущей версии
- Один воркер и одна активная задача на пользователя.
- Нет
/cancelи удаления задачи из очереди. - Нет автоочистки
storage/иdata/. - Прогресс в процентах зависит от WebSocket; при его недоступности используется polling без процентов.
- При рестарте задача в статусе
runningпомечаетсяfailed.