Compare commits

8 Commits

4 changed files with 80 additions and 19 deletions

View File

@@ -18,6 +18,11 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
# Сброс docker-конфига раннера: битый auth для docker.io
# ломает даже анонимные pull базового образа.
- name: Clean docker config
run: rm -f "$HOME/.docker/config.json"
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
@@ -25,27 +30,28 @@ jobs:
uses: docker/setup-buildx-action@v3
# Логин во встроенный registry Gitea.
# GITHUB_TOKEN выдаётся автоматически; если понадобится PAT —
# создайте секрет GITEA_TOKEN и замените password на него.
- name: Login to Gitea container registry
# Пароль — существующий секрет GIT_PASSWORD (PAT для аккаунта с 2FA).
- name: Login to Gitea Container Registry
uses: docker/login-action@v3
with:
registry: git.byte-mate.ru
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
password: ${{ secrets.GIT_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
push: true
# Путь в registry обязателен в нижнем регистре
# (github.repository = Coder/photo-editor не подойдёт)
tags: |
git.byte-mate.ru/${{ github.repository }}:latest
git.byte-mate.ru/${{ github.repository }}:${{ github.ref_name }}
git.byte-mate.ru/coder/photo-editor:latest
git.byte-mate.ru/coder/photo-editor:${{ github.ref_name }}
labels: |
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
- name: Summary
run: |
echo "## Образ собран и опубликован" >> $GITHUB_STEP_SUMMARY
echo "Теги: \`git.byte-mate.ru/${{ github.repository }}:latest\`" >> $GITHUB_STEP_SUMMARY
echo "Теги: \`git.byte-mate.ru/coder/photo-editor:latest\`" >> $GITHUB_STEP_SUMMARY

1
.gitignore vendored
View File

@@ -9,6 +9,7 @@ history/
_*
*.tmp
*.log
.bench/
# ОС / редакторы
.DS_Store

View File

@@ -89,8 +89,15 @@ docker run -d --name kadr-photo-editor -p 3000:3000 ^
Требования для работы кнопки:
1. **Actions включены** на инстансе (уже включены).
2. **Зарегистрирован runner** (`act_runner`). Сейчас раннеров нет — без него
задания будут висеть в очереди. Регистрация на машине с Docker:
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
@@ -104,3 +111,36 @@ docker run -d --name kadr-photo-editor -p 3000:3000 ^
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) — но тогда
результат будет меньшего размера.

View File

@@ -219,22 +219,36 @@ function runCodexEdit(jobDir, inputName, prompt) {
const lastMessagePath = path.join(jobDir, "last_message.txt");
const outputPath = path.join(jobDir, "output.jpg");
const args = [
"exec",
"-C", jobDir,
"--skip-git-repo-check",
"--ephemeral",
"--dangerously-bypass-approvals-and-sandbox"
];
// Переопределение модели и уровня рассуждений (для тестов скорости):
// CODEX_MODEL=gpt-5.2-codex-mini CODEX_REASONING_EFFORT=low node server.js
if (process.env.CODEX_MODEL) {
args.push("-m", process.env.CODEX_MODEL);
}
if (process.env.CODEX_REASONING_EFFORT) {
args.push(
"-c",
`model_reasoning_effort=${process.env.CODEX_REASONING_EFFORT}`
);
}
args.push("-i", inputName, "-o", "last_message.txt", "-");
return new Promise((resolve, reject) => {
let child;
try {
child = spawn(
CODEX_EXE,
[
"exec",
"-C", jobDir,
"--skip-git-repo-check",
"--ephemeral",
"--dangerously-bypass-approvals-and-sandbox",
"-i", inputName,
"-o", "last_message.txt",
"-"
],
args,
{
cwd: jobDir,
env: process.env,