Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e066f20a52 | |||
| bf10326b9a | |||
| 378bde4940 | |||
| ae0137db84 | |||
| f74caadffa | |||
| 93f71ecd3d | |||
| f4afcf7fc1 | |||
| 887b3fa600 |
@@ -18,6 +18,11 @@ jobs:
|
|||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Сброс docker-конфига раннера: битый auth для docker.io
|
||||||
|
# ломает даже анонимные pull базового образа.
|
||||||
|
- name: Clean docker config
|
||||||
|
run: rm -f "$HOME/.docker/config.json"
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v3
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
@@ -25,27 +30,28 @@ jobs:
|
|||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
# Логин во встроенный registry Gitea.
|
# Логин во встроенный registry Gitea.
|
||||||
# GITHUB_TOKEN выдаётся автоматически; если понадобится PAT —
|
# Пароль — существующий секрет GIT_PASSWORD (PAT для аккаунта с 2FA).
|
||||||
# создайте секрет GITEA_TOKEN и замените password на него.
|
- name: Login to Gitea Container Registry
|
||||||
- name: Login to Gitea container registry
|
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: git.byte-mate.ru
|
registry: git.byte-mate.ru
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GIT_PASSWORD }}
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
|
# Путь в registry обязателен в нижнем регистре
|
||||||
|
# (github.repository = Coder/photo-editor не подойдёт)
|
||||||
tags: |
|
tags: |
|
||||||
git.byte-mate.ru/${{ github.repository }}:latest
|
git.byte-mate.ru/coder/photo-editor:latest
|
||||||
git.byte-mate.ru/${{ github.repository }}:${{ github.ref_name }}
|
git.byte-mate.ru/coder/photo-editor:${{ github.ref_name }}
|
||||||
labels: |
|
labels: |
|
||||||
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
|
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
|
||||||
|
|
||||||
- name: Summary
|
- name: Summary
|
||||||
run: |
|
run: |
|
||||||
echo "## Образ собран и опубликован" >> $GITHUB_STEP_SUMMARY
|
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
1
.gitignore
vendored
@@ -9,6 +9,7 @@ history/
|
|||||||
_*
|
_*
|
||||||
*.tmp
|
*.tmp
|
||||||
*.log
|
*.log
|
||||||
|
.bench/
|
||||||
|
|
||||||
# ОС / редакторы
|
# ОС / редакторы
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|||||||
44
README.md
44
README.md
@@ -89,8 +89,15 @@ docker run -d --name kadr-photo-editor -p 3000:3000 ^
|
|||||||
Требования для работы кнопки:
|
Требования для работы кнопки:
|
||||||
|
|
||||||
1. **Actions включены** на инстансе (уже включены).
|
1. **Actions включены** на инстансе (уже включены).
|
||||||
2. **Зарегистрирован runner** (`act_runner`). Сейчас раннеров нет — без него
|
2. **Зарегистрирован runner** (`act_runner`) — уже работает
|
||||||
задания будут висеть в очереди. Регистрация на машине с Docker:
|
(«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
|
```bash
|
||||||
# токен регистрации: Администрирование → Actions → Runners → Create new runner
|
# токен регистрации: Администрирование → Actions → Runners → Create new runner
|
||||||
@@ -104,3 +111,36 @@ docker run -d --name kadr-photo-editor -p 3000:3000 ^
|
|||||||
|
|
||||||
3. После регистрации нажмите «Run workflow» — образ соберётся Buildx'ом и
|
3. После регистрации нажмите «Run workflow» — образ соберётся Buildx'ом и
|
||||||
уедет в registry.
|
уедет в 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) — но тогда
|
||||||
|
результат будет меньшего размера.
|
||||||
|
|||||||
34
server.js
34
server.js
@@ -219,22 +219,36 @@ function runCodexEdit(jobDir, inputName, prompt) {
|
|||||||
const lastMessagePath = path.join(jobDir, "last_message.txt");
|
const lastMessagePath = path.join(jobDir, "last_message.txt");
|
||||||
const outputPath = path.join(jobDir, "output.jpg");
|
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) => {
|
return new Promise((resolve, reject) => {
|
||||||
let child;
|
let child;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
child = spawn(
|
child = spawn(
|
||||||
CODEX_EXE,
|
CODEX_EXE,
|
||||||
[
|
args,
|
||||||
"exec",
|
|
||||||
"-C", jobDir,
|
|
||||||
"--skip-git-repo-check",
|
|
||||||
"--ephemeral",
|
|
||||||
"--dangerously-bypass-approvals-and-sandbox",
|
|
||||||
"-i", inputName,
|
|
||||||
"-o", "last_message.txt",
|
|
||||||
"-"
|
|
||||||
],
|
|
||||||
{
|
{
|
||||||
cwd: jobDir,
|
cwd: jobDir,
|
||||||
env: process.env,
|
env: process.env,
|
||||||
|
|||||||
Reference in New Issue
Block a user