Атомарная цель. Создать отдельный loopback-сервис с OpenAI-compatible /v1/chat/completions, Bearer auth и allowlist backend/model.
Что мы делаем и зачем
Codex является инженерным агентом, но не постоянным HTTP endpoint. Gateway заполняет именно этот runtime-разрыв: приложение получает стабильный локальный API, а маршрутизация на Ollama или разрешённый cloud backend остаётся в одном контролируемом сервисе.
Что должно быть готово
- Эксперимент 8.5 завершён.
- Папка C:\dev\agent-lab\local-agent-gateway отсутствует либо её состояние предварительно проверено.
- Ollama отвечает локально.
Где выполнять
Новый sibling-проект C:\dev\agent-lab\local-agent-gateway. Open-LLM-VTuber в этом эксперименте не меняется.
Scope
| Разрешено | Только действия, прямо указанные в prompt и командах этого эксперимента. |
|---|---|
| Запрещено | Секреты, изменение main/upstream, расширение scope и скрытое исправление новых ошибок. |
| Результат | Артефакты и критерии на третьей странице эксперимента. |
Откройте Codex из папки, указанной на предыдущей странице. Для независимого аудита обязательно создайте новую сессию. Скопируйте следующий prompt целиком, не вырезая ограничения.
PROMPT ДЛЯ CODEX - КОПИРОВАТЬ ЦЕЛИКОМ
Работай как инженер в режиме контролируемого агента.
Перед любым изменением покажи карту релевантной части репозитория, одну атомарную цель, файлы чтения и изменения, риски и команды проверки.
Сначала покажи план. Не меняй файлы до моего явного подтверждения.
Не используй sudo, force push, git reset --hard, git clean -fd и опасные команды удаления.
Не переключай и не изменяй main.
Не читай и не печатай .env, токены, SSH-ключи, cookies и keychain.
Не трогай файлы за пределами указанного scope.
Не скрывай ошибки и не подменяй тест словесным утверждением.
После изменения покажи краткий diff, реальный минимальный тест и git status --short.
Если нужен больший scope, остановись и запроси новый атомарный шаг.
Текущая задача: создать отдельный минимальный Python gateway в C:\dev\agent-lab\local-agent-gateway. Не меняй Open-LLM-VTuber.
Требования: FastAPI; GET /health; POST /v1/chat/completions; bind только 127.0.0.1:8642; Bearer auth для /v1; allowlist backend/model; backend ollama по умолчанию; upstream http://127.0.0.1:11434/v1; нейтральные ошибки; timeout; request_id; не логировать Authorization, полный prompt и полный response. Реальные секреты только в untracked .env, в репозитории только .env.example с placeholders.
Сначала покажи карту проекта, файлы, схему request flow, зависимости, риски и тесты. После подтверждения создай проект. После каждого изменения покажи git diff и минимальный pytest. Не добавляй OpenRouter/OpenAI вызов, пока локальный Ollama path не проверен.Команды PowerShell
Команды ниже нужны либо для ручного выполнения, либо для сверки предложения Codex. Строки после комментария «после подтверждения» не запускаются заранее.
КОМАНДЫ - КОПИРОВАТЬ ПО ПОРЯДКУ
Set-Location C:\dev\agent-lab
uv init local-agent-gateway
Set-Location .\local-agent-gateway
uv add fastapi "uvicorn[standard]" httpx pydantic-settings
uv add --dev pytest pytest-asyncio
uv run pytest -q
uv run uvicorn app.main:app --host 127.0.0.1 --port 8642Как действовать при запросе разрешения
Прочитайте команду и рабочую папку; сразу сверьте их со scope этого эксперимента.
Для одной безопасной команды выберите разовое Yes, proceed.
Если команда читает секреты, пишет за пределами scope или меняет main - нажмите Esc и объясните ограничение.
Что должно получиться
- GET /health возвращает 200 без auth и без секретов.
- POST /v1/chat/completions без Bearer возвращает 401.
- Разрешённая модель qwen3-vl:4b проходит к Ollama.
- Запрещённый backend/model отклоняется до сетевого вызова.
Типовые ошибки и действия
- Port 8642 busy: определить процесс, не менять порт молча.
- 401 при правильном клиенте: проверить заголовок без печати token.
- 502/503: проверить Ollama health и timeout.
- Секрет попал в Git: остановиться; не переписывать историю без отдельного решения.
Артефакты и доказательства
Критерий завершения
ГОТОВАЯ ЗАПИСЬ В ОТЧЁТ
Эксперимент 9: Минимальный runtime gateway | Статус: PASS / FAIL / NOT PROVEN
Доказательство: <минимальный обезличенный вывод> | Не доказано: <ограничение>
Source tree: unchanged / <известный diff> | Следующий шаг: Подключить Open-LLM-VTuber к gateway только через local conf.yaml.