147 lines
7.6 KiB
Markdown
147 lines
7.6 KiB
Markdown
# Кадр — локальный 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`)
|
||
|
||
## Запуск
|
||
|
||
```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) |
|
||
|
||
Выводы:
|
||
|
||
- **Выбор модели почти не влияет на время** (60–82 s): узкое место — вызов
|
||
image-модели при редактировании, а не агентная модель.
|
||
- Единственный заметный выигрыш — `CODEX_REASONING_EFFORT=low` (~17%).
|
||
Кстати, у `gpt-5.6-sol` low — это значение по умолчанию; в
|
||
`~/.codex/config.toml` оно переопределено на `high`, поэтому редактирование
|
||
такое долгое.
|
||
- Для радикального ускорения нужно уменьшать разрешение исходника для шага
|
||
редактирования (медленнее при 1200×800, чем при 512×512) — но тогда
|
||
результат будет меньшего размера.
|