Ниже сохранён подробный Codex-практикум V2: 15 экспериментов, отдельные prompts, команды, ошибки и критерии. Используйте его после Части I. Hermes можно подставить как инженерного агента, сохраняя тот же controlled-agent contract; в экспериментах 9-12 отдельно выбирайте Hermes API Server или минимальный gateway, а не оба одновременно.
macOS. Исходные лабораторные команды преимущественно даны для PowerShell. Перед выполнением на macOS используйте таблицу эквивалентов ниже и native zsh-команды из Части I. Не вставляйте PowerShell variables `$env:` и here-strings `@'...'@` в zsh.
| Задача | Windows PowerShell | macOS zsh |
|---|---|---|
| Перейти в каталог | Set-Location PATH | cd PATH |
| Создать каталог | New-Item -ItemType Directory | mkdir -p |
| Скопировать файл | Copy-Item | cp |
| Проверить файл | Test-Path | test -f |
| Найти listener | Get-NetTCPConnection | lsof -nP -iTCP:PORT -sTCP:LISTEN |
| HTTP GET | Invoke-RestMethod | curl -fsS |
| Environment | $env:NAME='value' | export NAME='value' |
| Активировать venv | .\.venv\Scripts\Activate.ps1 | source .venv/bin/activate |
| Остановить foreground | Ctrl+C | Ctrl+C |
| Многострочный Python | @' ... '@ | uv run python - | uv run python - <<'PY' ... PY |
Как пользоваться этой версией
Эта редакция намеренно подробнее сокращённого практикума. Она рассчитана на последовательное выполнение: теория объясняет смысл шага, готовый prompt задаёт Codex безопасный scope, PowerShell-блок даёт точные команды, а раздел проверки помогает не принять красивый ответ модели за доказательство.
Главное правило
Не импровизируйте со scope. Если Codex обнаружил проблему, которой нет в текущей атомарной цели, зафиксируйте её и остановитесь. Не разрешайте агенту одновременно диагностировать, менять конфигурацию, патчить source и публиковать изменения.
Обозначения
| Обычный PowerShell | Команда выполняется пользователем вне сессии Codex. Используется для интерактивного входа, UAC, foreground-сервисов и ручных проверок. |
|---|---|
| Codex CLI | Готовый prompt вставляется в новую или текущую сессию Codex из указанной рабочей папки. |
| После подтверждения | Не выполняйте следующие команды до того, как Codex покажет план и вы явно ответите «одобряю». |
| PASS | Есть реальный вывод, файл, test result или наблюдение, прямо доказывающее критерий. |
| NOT PROVEN | Утверждение возможно верно, но доказательства нет. Это не PASS. |
Можно ли продолжить после эксперимента 8
Да. Не начинайте заново автоматически. Выполните эксперимент 8.5, сопоставьте старые результаты с критериями и повторите только проверки без доказательств. Если раньше ради pyttsx3 менялся source, функциональный результат можно сохранить, но критерий source tree unchanged остаётся невыполненным до отдельного решения.
Роли компонентов
В оригинальной архитектуре Hermes совмещал инженерную роль и runtime gateway. В этой редакции обязанности разделены. Такое разделение важно: Codex не становится HTTP-сервисом только потому, что умеет писать и запускать код.
| Codex | Анализирует репозиторий, предлагает план, меняет согласованные файлы, запускает тесты и работает с Git. Не является постоянным endpoint для VTuber. |
|---|---|
| Local gateway | Постоянно слушает 127.0.0.1:8642, принимает OpenAI-compatible запросы, проверяет Bearer token и маршрутизирует только разрешённые backend/model. |
| Ollama | Локально обслуживает qwen3-vl:4b через 127.0.0.1:11434/v1. Это основной offline backend. |
| OpenRouter/OpenAI | Опциональные cloud backends. В базовых voice/vision экспериментах выключены и не получают аудио. |
| Open-LLM-VTuber | Клиентская/runtime-система с WebSocket, Live2D, LLM, ASR и TTS. Подключается к gateway через local conf.yaml. |
Поток данных
Codex -> читает/меняет/тестирует -> Git workspace
Browser microphone -> sherpa_onnx_asr -> text
text + screenshot -> Open-LLM-VTuber -> Local Gateway :8642
Local Gateway -> Ollama :11434/v1 -> qwen3-vl:4b
model response -> pyttsx3_tts -> Windows speakersПриватность. ASR и TTS остаются локальными. Gateway не должен логировать полный prompt, response, Authorization и речь пользователя.
Рабочая структура и окна
Рекомендуемая структура
C:\dev\agent-lab\
|-- Open-LLM-VTuber\ # upstream exercise repository
|-- local-agent-gateway\ # отдельный gateway project
|-- evidence\ # только обезличенные доказательства
|-- praktikum_codex_gateway_ru_v2.docx
`-- praktikum_codex_gateway_ru_v2.pdfКакие окна будут использоваться
PowerShell A: ollama serve. Окно остаётся открытым, пока работает локальная модель.
PowerShell B: gateway на 127.0.0.1:8642. Появляется с эксперимента 9.
PowerShell C: uv run run_server.py --verbose в Open-LLM-VTuber.
Codex CLI: отдельная сессия для анализа и согласованных изменений.
Browser: локальная страница VTuber, screenshot и microphone smoke tests.
Как понять, где вы находитесь
Get-Location
git branch --show-current
git status --shortПеред копированием команды. Сверьте путь в prompt с текущим Get-Location. Большинство ошибочных результатов в первых экспериментах возникало из-за запуска rg из C:\dev\agent-lab вместо корня Open-LLM-VTuber.
PowerShell: команды, которые часто путают
Bash heredoc не работает в PowerShell
Конструкция python - <<'PY' предназначена для Bash. В Windows PowerShell используйте here-string, затем передайте его в stdin Python.
@'
print("Проверка PowerShell here-string")
'@ | uv run python -Остановка foreground-сервера
Нажмите Ctrl+C в том же окне, где запущен сервер. Закрытие окна допустимо как аварийный вариант, но в доказательстве лучше показать штатную остановку и отсутствие listening port.
Просмотрщик Codex
Если вывод открылся на полном экране и внизу написано q to quit, нажмите q. Это закрывает просмотрщик результата, а не удаляет задачу и не останавливает систему.
Красная строка Failed to paste image
Она означает, что CLI получил команду вставки изображения, но в буфере не было поддерживаемого image format. К sandbox и выполнению текстовой команды это не относится.
Никогда не публикуйте
- реальное значение Token из gh auth status;
- полный conf.yaml с ключами;
- пути C:\Users\<имя>\...;
- исходное аудио или transcript личной речи;
- скриншоты с чатами, cookies, email и ключами.
Универсальный controlled-agent контракт
Этот блок уже встроен в prompts изменяющих экспериментов. Если вы формулируете дополнительный атомарный шаг самостоятельно, начинайте с него.
Скопировать целиком
Работай как инженер в режиме контролируемого агента.
Перед любым изменением покажи карту релевантной части репозитория, одну атомарную цель, файлы чтения и изменения, риски и команды проверки.
Сначала покажи план. Не меняй файлы до моего явного подтверждения.
Не используй sudo, force push, git reset --hard, git clean -fd и опасные команды удаления.
Не переключай и не изменяй main.
Не читай и не печатай .env, токены, SSH-ключи, cookies и keychain.
Не трогай файлы за пределами указанного scope.
Не скрывай ошибки и не подменяй тест словесным утверждением.
После изменения покажи краткий diff, реальный минимальный тест и git status --short.
Если нужен больший scope, остановись и запроси новый атомарный шаг.Как отвечать на запрос разрешения
- Yes, proceed - разрешение только текущей команды. Это безопасный выбор по умолчанию после проверки команды.
- Yes, and don't ask again - постоянное правило для префикса. Выбирайте только для узкого и понятного read-only префикса.
- No / Esc - команда отменяется. Используйте, если scope шире задания, команда читает секреты или меняет неизвестные файлы.
Важно. Разрешение выйти за sandbox не делает опасную команду безопасной. Сначала проверяют точный target и причину escalation.
Стандарт доказательств
Практикум считается завершённым не тогда, когда агент написал «готово», а когда каждый критерий связан с фактом. Доказательство должно быть минимальным: достаточно нужных строк лога, а не полного дампа с персональными данными.
| Команда | Точный текст команды, рабочая папка и exit code. |
|---|---|
| Результат | Минимальные строки, доказывающие ожидаемое состояние. |
| Ручное наблюдение | Допустимо для слышимого TTS и отсутствия feedback loop; явно помечается как ручное. |
| Git | git diff для изменяющего шага и git status --short после него. |
| Ограничение | Что тест не проверил. Например, health 200 не доказывает генерацию модели. |
Шаблон записи результата
Эксперимент: <номер и название>
Дата/версия: <дата, commit или версия>
Команда: <точная команда>
Exit code: <0 или фактический код>
Доказательство: <минимальный обезличенный вывод>
Статус: PASS / FAIL / NOT PROVEN
Что доказано: <одно предложение>
Что не доказано: <одно предложение>
Git status --short: <пусто или фактические строки>
Следующий шаг: <только один>