fix(opencode): выбор модели — только глобальный конфиг opencode; агент передаётся в сессию
Some checks failed
CI / test (push) Failing after 1m16s
CI / build-and-package (amd64, linux) (push) Failing after 1m4s
CI / build-and-package (amd64, windows) (push) Successful in 29s

- CreateSession(ctx, agent) шлёт {agent} в POST /api/session, модель не выбираем
- удалён internal/opencode/config.go (ReadModelRef/JSONC-стрип) и его тесты
- runner.go больше не читает конфиг opencode и не хардпинит модель
- тесты и README обновлены
This commit is contained in:
ki.sagidullin
2026-08-23 17:22:36 +05:00
parent 0ad53e338d
commit 4c0dc80aa8
8 changed files with 46 additions and 332 deletions

View File

@@ -138,18 +138,13 @@ update:
Что делает обёртка (`internal/opencode`):
- **Хардпин модели.** При создании сессии в конфиге opencode ищется top-level
`"model"` (`internal/opencode/config.go`) и передаётся в `POST /api/session`
как `{"model":{providerID,id}}`. Это убирает зависимость от fallback-логики
opencode (которая молча выбирает «дефолтную» запись, если модель не задана).
- **Весь код резолва модели устойчив к этому классу проблем (класс O5 WARN):**
- если конфиг не читается / в нём нет `model` — в логи пишется warning;
- фактическая модель ответа (из финального assistant-сообщения) сравнивается
с ожидаемой; расхождение логируется как warning;
- конфиг, написанный по **старой v1-схеме** (`provider.X.npm` / `options`),
молча игнорируется v2 — обёртка этого не «чинит» сама, но предупреждает.
Правильный v2-вид провайдера — `api: { type:"aisdk", package, url }` и
`request.headers` вместо `options.headers`.
- **Модель — только глобальный конфиг opencode.** ratatoskr модель не выбирает
и про неё не знает: opencode сам берёт модель по умолчанию из своего
глобального конфига (`~/.config/opencode/opencode.jsonc`). Наш код конфиг
opencode не читает.
- **Свой агент.** При создании сессии в `POST /api/session` передаётся имя
встроенного агента ratatoskr (analyst/dev/reviewer/chat/postmortem), который
распаковывается в каталог `OPENCODE_CONFIG_DIR` (см. `internal/agents`).
- **Поллинг вердикта.** Промпт отправляется неблокирующе (`POST .../prompt`
durable admit), вердикт собирается из новых assistant-сообщений
(`GET .../message`); завершение ответа — сессия ушла из активных дренажей