feat(config): general to glm-5.2, add vision agent, drop plan model #99
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Контекст
После PR #98 (per-agent models + task delegation) сложилась картина: основные кодинг-модели text-only, зрение есть только у minimax-m3. Пользователь хочет:
general(кодинг) сdeepseek-v4-proнаglm-5.2— предпочтение по качеству кода.reviewerнаdeepseek-v4-pro(без изменений).visionнаminimax-m3(image+video+text) для любых задач со зрением — скриншоты, анализ UI, проверка браузера на сайтах-детекторах бот-защиты.modelуplan(primary-агент) — модель plan'а выбирается в UI под задачу, не фиксируется в конфиге.explore/scout/memory-syncerостаются наdeepseek-v4-flash(без изменений).Архитектурное решение: vision — отдельный сабагент (оправдано, т.к. зрение нужно редко; vision-модель не будет расходовать токены основных моделей). Vision сам делает скриншот через antidetect-browser MCP или читает файл через Read (сабагент НЕ наследует вложения родителя — проверено в бинарнике 1.18.18, картинку можно получить только сам прочитав файл или вызвав MCP).
Задача
.opencode/opencode.json(секцияagent):planцеликом (было{"model": "ollama-cloud/deepseek-v4-flash"}).general.model→ollama-cloud/glm-5.2(былоdeepseek-v4-pro). Остальные поляgeneral(steps: 150,permission.task,tools) — без изменений.reviewer— без изменений.explore/scout/memory-syncer— без изменений.vision:.opencode/agents/vision.md(новый файл, по паттернуreviewer.md):description: «Vision-агент для задач со зрением (скриншоты, изображения, визуальный анализ UI). Сам делает скриншот через antidetect-browser MCP или читает файл через Read. Вызывай, когда твоя модель не поддерживает изображения.»mode: subagent,temperature: 0.1,steps: 150,hidden: truepermission:edit: deny,doom_loop: deny,bash: {"*": deny, + read-only allow-список по паттерну reviewer.md: ls/cat/head/tail/date/grep/git read-only/rg/find/wc/diff/uv run/ruff/pytest/which — скопировать базовый read-only набор из reviewer.md, БЕЗ curl к Forgejo API (vision не работает с PR/issue)}AGENTS.md— добавить короткую секцию (универсальное правило, БЕЗ привязки к моделям, чтобы не устарело):Разместить в разделе после "Code Style" / перед "Config Edits" (или в другом подходящем месте — на усмотрение исполнителя, сохранить существующую структуру).
tests/test_permissions.py:test_agents_have_models: убратьplanиз списка (теперь без model); добавитьvision.test_agent_models_exact: убратьplan; изменитьgeneral→ollama-cloud/glm-5.2; добавитьvision→ollama-cloud/minimax-m3. Итог ожиданий:explore/scout/memory-syncer→deepseek-v4-flash,general→glm-5.2,reviewer→deepseek-v4-pro,vision→minimax-m3.test_general_reviewer_task_permissions: добавитьvisionв список агентов с паттерном{"*": "deny", "explore": "allow", "scout": "allow"}.test_vision_readonly_and_hidden:visionимеетtoolsс commit/create_pr/create_issue/merge_pr/post_review = false,hidden: true,permission.edit == "deny"(если проверяется через .md — то в frontmatter; если через JSON — то в opencode.json; исполнитель: проверить, где reviewer хранит edit: deny — в .md frontmatter, значит vision тоже в .md).test_agent_frontmatter.py(если он хардкодит список .md файлов — добавить vision.md).Тесты:
uv run pytest tests/ -x -q— все зелёные (ожидаем 30+ passed). Еслиcheck-permissions.pyвалидатор ругается — привести в соответствие.Контракты
provider/model-id(напримерollama-cloud/glm-5.2). Все три модели (glm-5.2,minimax-m3,deepseek-v4-pro) — встроенные в opencode 1.18.18, регистрация в секцииproviderНЕ нужна (проверено в реестре бинарника).minimax-m3: modalities input[text, image, video], attachment: true, reasoning (effort low/medium/high/max), tool_call, ctx 512000, out 131072.glm-5.2: text-only (attachment: false), reasoning (effort high/max), structured_output, ctx 976000, out 131072.permission.task— glob, семантика findLast (последний матч побеждает):"*": "deny"первым, конкретные allow после.tools(legacy) — булевы флаги встроенных тулов;true={"*": "allow"},false={"*": "deny"}. MCP-тулы (antidetect-browser, serena, context7) НЕ перечисляются вtools— они управляются черезpermission(по умолчанию все MCP включены у всех агентов; запрещать НЕ нужно, vision использует antidetect-browser).hidden: true— скрывает сабагента из @-меню, но остаётся вызываемым через task tool (подтверждено в доке opencode.ai/docs/agents).modelв frontmatter.md(unknown top-level поля форвардятся провайдеру). Модель — только вopencode.jsonсекцииagent.Инварианты
reviewer.modelостаётсяollama-cloud/deepseek-v4-pro(НЕ менять).explore/scout/memory-syncerмодели остаютсяollama-cloud/deepseek-v4-flash(НЕ менять).permission.bashdeny-лист и глобальные правила — без изменений.reviewer.md/memory-syncer.md— не трогать (только создать новыйvision.mdпо аналогии).AGENTS.md— только добавить секцию про зрение, не переписывать существующие правила.Граничные случаи
test_agent_frontmatter.pyхардкодит список .md файлов — добавитьvision.mdв ожидаемый список, иначе тест упадёт. Исполнитель: проверить тест и обновить.check-permissions.pyвалидатор проверяет frontmatter всех .md в.opencode/agents/— vision.md должен проходить (edit: deny, doom_loop: deny, bash deny-по-умолчанию). Проверить локально:python3 .opencode/scripts/check-permissions.py.planбез model: primary-агент без явной модели наследует глобальную из UI. Это документированное поведение opencode («If you don't specify a model, primary agents use the model globally configured»). Тесты не должны требовать model у plan.visionсhidden: true: в @-меню не виден, но вызывается через task.permission.taskу general/reviewer/explore/scout должны разрешатьvision(добавить"vision": "allow"после"scout": "allow"в их permission.task)."*": "deny").Влияние на связанные компоненты
permission.taskу general и reviewer — добавить"vision": "allow"(сейчас{"*": "deny", "explore": "allow", "scout": "allow"}→ станет{"*": "deny", "explore": "allow", "scout": "allow", "vision": "allow"}).permission.task(по умолчанию deny). Нужно ли им разрешать vision? Решение: НЕ добавлять (explore/scout — read-only исследователи, им зрение без надобности; если понадобится — отдельная задача). Оставить как есть.pipeline-status.py,spec-status.py,project-status.py,check-permissions.py) — НЕ читают секциюagent(проверено в прошлых исследованиях).check-permissions.pyчитает толькоpermission.bash. Поломок нет.permissions-check.yml) — проверяет изменения.opencode/opencode.json,.opencode/agents/**,.opencode/scripts/check-permissions.py. Добавлениеvision.mdи правкиopencode.jsonпопадают под проверку — валидатор должен пройти.test_permissions.py,test_agent_frontmatter.pyобновить. Другие тесты не затронуты.Вне scope
OPENAI_EMBEDDING_MODEL(RAG) — не трогать.provider— не нужна (встроенные).configure-opencode/SKILL.mdсекции 6 (документация permission.task) — опционально, не блокирующее (уже задокументирован паттерн).Критерии приемки
general.model == "ollama-cloud/glm-5.2"вopencode.jsonreviewer.model == "ollama-cloud/deepseek-v4-pro"(без изменений)explore/scout/memory-syncerмодели ==deepseek-v4-flash(без изменений)planудалена из секцииagent(primary-агент без явной модели)visionвopencode.json: modelminimax-m3, hidden true, permission.task с explore/scout allow, tools read-only.opencode/agents/vision.mdсуществует, frontmatter валиден (description, mode: subagent, temperature, steps, hidden, permission с edit: deny / doom_loop: deny / bash deny-по-умолчанию + read-only allow)permission.taskу general и reviewer содержит"vision": "allow"(после scout)AGENTS.mdсодержит универсальную секцию про зрение (без привязки к моделям)uv run pytest tests/ -x -q— все зелёныеpython3 .opencode/scripts/check-permissions.py— exit 0, "OK: No dangerous permission rules found."