Files
photo-editor/README.md

7.6 KiB
Raw Permalink Blame History

Кадр — локальный AI-фоторедактор

Веб-приложение редактирует фотографии по текстовому промпту (через локальный Codex CLI) и увеличивает разрешение через домашний сервер ComfyUI.

Поддерживаются фотографии JPEG, PNG, WebP и HEIC/HEIF. Файлы HEIC/HEIF преобразуются на сервере в JPEG с помощью heic-convert до передачи в ComfyUI или Codex.

Как это работает

  • История версий: каждая загрузка и каждый результат (редактирование или апскейл) сохраняется в папке history/ как отдельная версия. Можно вернуться к любой версии кликом по ней в ленте «История версий» и продолжить правки именно с неё — например, отредактировать фото, а затем увеличить разрешение уже отредактированного варианта. История переживает перезапуск сервера и обновление страницы; хранится последние 50 версий.
  • Редактирование: сервер передаёт выбранную версию и промпт агенту Codex CLI (codex exec). Агент редактирует изображение и сохраняет результат. Обработка обычно занимает 13 минуты.
  • Увеличение разрешения: 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 и запускается вручную: вкладка ActionsRun 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

Требования для работы кнопки:

  1. Actions включены на инстансе (уже включены).
  2. Зарегистрирован runner (act_runner) — уже работает («Runner-10C-32Gb»).
  3. Секрет GIT_PASSWORD в репозитории (Settings → Actions → Secrets): Personal Access Token с правами на пакеты. Имена GITEA_TOKEN / GITHUB_TOKEN зарезервированы Gitea и не создаются.
  4. Образ публикуется в 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
  1. После регистрации нажмите «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)

Выводы:

  • Выбор модели почти не влияет на время (6082 s): узкое место — вызов image-модели при редактировании, а не агентная модель.
  • Единственный заметный выигрыш — CODEX_REASONING_EFFORT=low (~17%). Кстати, у gpt-5.6-sol low — это значение по умолчанию; в ~/.codex/config.toml оно переопределено на high, поэтому редактирование такое долгое.
  • Для радикального ускорения нужно уменьшать разрешение исходника для шага редактирования (медленнее при 1200×800, чем при 512×512) — но тогда результат будет меньшего размера.