7.6 KiB
Кадр — локальный AI-фоторедактор
Веб-приложение редактирует фотографии по текстовому промпту (через локальный Codex CLI) и увеличивает разрешение через домашний сервер ComfyUI.
Поддерживаются фотографии JPEG, PNG, WebP и HEIC/HEIF. Файлы HEIC/HEIF
преобразуются на сервере в JPEG с помощью heic-convert до передачи в ComfyUI
или Codex.
Как это работает
- История версий: каждая загрузка и каждый результат (редактирование или
апскейл) сохраняется в папке
history/как отдельная версия. Можно вернуться к любой версии кликом по ней в ленте «История версий» и продолжить правки именно с неё — например, отредактировать фото, а затем увеличить разрешение уже отредактированного варианта. История переживает перезапуск сервера и обновление страницы; хранится последние 50 версий. - Редактирование: сервер передаёт выбранную версию и промпт агенту Codex
CLI (
codex exec). Агент редактирует изображение и сохраняет результат. Обработка обычно занимает 1–3 минуты. - Увеличение разрешения: 4× upscale через ComfyUI моделью
RealESRGAN_x4plus.safetensors— применяется к выбранной (в том числе отредактированной) версии.
Требования
- Node.js 20 или новее
- Локальный Codex CLI (
codex) с выполненным входом в аккаунт OpenAI - Доступ к ComfyUI:
http://192.168.31.240:8188 - Checkpoint:
sdxl_turbo.safetensors - Upscale-модель:
RealESRGAN_x4plus.safetensors - Установленные зависимости проекта, включая
heic-convert(ставится командойnpm install)
Запуск
npm install
npm start
Docker
Образ собирается на базе node:22-bookworm-slim (Debian, glibc) — Codex CLI
распространяется как бинарник под glibc и не работает на Alpine/musl.
# сборка и запуск
docker compose up -d --build
# или вручную:
docker build -t kadr-photo-editor .
docker run -d --name kadr-photo-editor -p 3000:3000 ^
-v "$env:USERPROFILE\.codex:/root/.codex" ^
-v "${PWD}\history:/app/history" ^
-e COMFY_URL=http://192.168.31.240:8188 ^
kadr-photo-editor
Что важно знать:
- Авторизация Codex: контейнер монтирует
~/.codexхоста в/root/.codex(auth + config + навыки). Альтернатива — переменная окруженияOPENAI_API_KEY. - История версий: каталог
history/смонтирован томом, версии переживают пересоздание контейнера. - ComfyUI: задаётся через
COMFY_URL(по умолчаниюhttp://192.168.31.240:8188); из контейнера адрес доступен как исходящий адрес локальной сети. - Порт: по умолчанию 3000, меняется через
PORT.
Сборка образа в Gitea (Actions)
Репозиторий: https://git.byte-mate.ru/Coder/photo-editor (ветка main).
Workflow лежит в .gitea/workflows/build.yml и запускается вручную:
вкладка Actions → Run workflow → выбрать ветку → нажать кнопку.
После успешного прогона образ публикуется во встроенный registry Gitea:
docker pull git.byte-mate.ru/coder/photo-editor:latest
docker run -d --name kadr-photo-editor -p 3000:3000 ^
-v "$env:USERPROFILE\.codex:/root/.codex" ^
-v "${PWD}\history:/app/history" ^
-e COMFY_URL=http://192.168.31.240:8188 ^
git.byte-mate.ru/coder/photo-editor:latest
Требования для работы кнопки:
- Actions включены на инстансе (уже включены).
- Зарегистрирован runner (
act_runner) — уже работает («Runner-10C-32Gb»). - Секрет
GIT_PASSWORDв репозитории (Settings → Actions → Secrets): Personal Access Token с правами на пакеты. ИменаGITEA_TOKEN/GITHUB_TOKENзарезервированы Gitea и не создаются. - Образ публикуется в
git.byte-mate.ru/coder/photo-editor(тегиlatestи имя ветки; путь в registry обязательно в нижнем регистре).
Если runner ещё не зарегистрирован:
# токен регистрации: Администрирование → Actions → Runners → Create new runner
docker run -d --name gitea-runner --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v gitea-runner:/data \
-e GITEA_INSTANCE_URL=https://git.byte-mate.ru \
-e GITEA_RUNNER_REGISTRATION_TOKEN=<token> \
gitea/act_runner:latest
- После регистрации нажмите «Run workflow» — образ соберётся Buildx'ом и уедет в registry.
Тест скорости моделей Codex (ветка testing)
Сервер умеет переопределять модель и уровень рассуждений через переменные
окружения (без правки ~/.codex/config.toml):
$env:CODEX_MODEL = "gpt-5.6-luna"; $env:CODEX_REASONING_EFFORT = "low"
npm start
Проверено на ветке testing: одинаковое фото 512×512 и один промпт,
замер полного цикла редактирования:
| Конфигурация | Время | Токены |
|---|---|---|
gpt-5.6-sol + effort high (как сейчас) |
73.9 s | 15 286 |
gpt-5.6-sol + effort low |
61.7 s | 29 760 |
gpt-5.6-luna (default medium) |
68.6 s | 52 005 |
gpt-5.4-mini (default medium) |
82.1 s | 19 437 |
gpt-5.2-codex, gpt-5.2-codex-mini |
— | недоступны для ChatGPT-аккаунта (API 400) |
Выводы:
- Выбор модели почти не влияет на время (60–82 s): узкое место — вызов image-модели при редактировании, а не агентная модель.
- Единственный заметный выигрыш —
CODEX_REASONING_EFFORT=low(~17%). Кстати, уgpt-5.6-sollow — это значение по умолчанию; в~/.codex/config.tomlоно переопределено наhigh, поэтому редактирование такое долгое. - Для радикального ускорения нужно уменьшать разрешение исходника для шага редактирования (медленнее при 1200×800, чем при 512×512) — но тогда результат будет меньшего размера.