Files
photo-editor/README.md

147 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Кадр — локальный 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`)
## Запуск
```powershell
npm install
npm start
```
## Docker
Образ собирается на базе `node:22-bookworm-slim` (Debian, glibc) — Codex CLI
распространяется как бинарник под glibc и не работает на Alpine/musl.
```powershell
# сборка и запуск
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:
```powershell
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 ещё не зарегистрирован:
```bash
# токен регистрации: Администрирование → 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
```
3. После регистрации нажмите «Run workflow» — образ соберётся Buildx'ом и
уедет в registry.
## Тест скорости моделей Codex (ветка testing)
Сервер умеет переопределять модель и уровень рассуждений через переменные
окружения (без правки `~/.codex/config.toml`):
```powershell
$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) — но тогда
результат будет меньшего размера.