From 09cf14978b219da1495fc9e1a97c2c6104c5e650 Mon Sep 17 00:00:00 2001 From: Stream Date: Fri, 5 Jun 2026 18:50:01 +0300 Subject: [PATCH] auto-sync: 2026-06-05 18:50:01 --- .../DEV_TASK_ORCH41_AGENT_MODELS.md | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 tasks/orchestrator/DEV_TASK_ORCH41_AGENT_MODELS.md diff --git a/tasks/orchestrator/DEV_TASK_ORCH41_AGENT_MODELS.md b/tasks/orchestrator/DEV_TASK_ORCH41_AGENT_MODELS.md new file mode 100644 index 0000000..ea6c532 --- /dev/null +++ b/tasks/orchestrator/DEV_TASK_ORCH41_AGENT_MODELS.md @@ -0,0 +1,99 @@ +# DEV TASK — ORCH-41: Конфигурируемые модели LLM per-agent + per-project + +## Контекст / корень +Сейчас модель агентов зашита в коде `src/agents/launcher.py` (`AGENT_CONFIGS`): +- architect, reviewer → `"model": "opus"` +- analyst, developer, tester, deployer → модели НЕТ (CLI берёт дефолт) +- Алиас `opus` в CLI 2.1.142 резолвится в **opus-4-7** (подтверждено логами runs/102,103). + +Слава хочет: **модель выбирается в настройках, под каждого агента, с возможностью задать per-project.** +Это первый шаг к мультипровайдерности (ORCH-13). НЕ хардкодить версию — вынести в конфиг. + +## Репозиторий / ветка +- Репо: `orchestrator`, база `main` (HEAD `8da571d`) +- Ветка: `feat/ORCH-41-agent-models`, PR в main, НЕ мержить. +- Сервер: `sshpass -p 'motoZ@yaz2010' ssh slin@82.22.50.71`, контейнер `orchestrator`. + +## Архитектура (изучено лично — используй эти точки) +- `src/config.py` — `class Settings(BaseSettings)` (pydantic-settings, env-driven, префикс `ORCH_`). + Паттерн уже есть: `plane_bot_analyst..deployer`. Делай модели по аналогии. +- `src/projects.py` — `@dataclass(frozen=True) class ProjectConfig` (поля: plane_project_id, repo, + work_item_prefix), парсится из `settings.projects_json`. Сюда добавляем per-project модели. +- `src/agents/launcher.py` — `AGENT_CONFIGS` (dict по агентам) + сборка `model_flag` (строки ~88,99,207-208): + ```python + model = config.get("model", "") + model_flag = f"--model {model} " if model else "" + ``` + +## Что сделать + +### 1. Глобальные дефолты модели per-agent — в Settings (src/config.py) +Добавить поля (env `ORCH_AGENT_MODEL_`), дефолт — единый базовый, напр. `claude-opus-4-8`: +```python +# Per-agent LLM model (ORCH-41). Empty -> agent_model_default. Resolution order: +# project-override > ORCH_AGENT_MODEL_ > agent_model_default > CLI default. +agent_model_default: str = "claude-opus-4-8" +agent_model_analyst: str = "" +agent_model_architect: str = "" +agent_model_developer: str = "" +agent_model_reviewer: str = "" +agent_model_tester: str = "" +agent_model_deployer: str = "" +``` + +### 2. Per-project override — в ProjectConfig (src/projects.py) +Добавить опциональное поле `agent_models: dict[str, str]` (агент→модель), парсить из +`projects_json` (ключ `agent_models` в JSON каждого проекта, опционально). Пример записи реестра: +```json +{"plane_project_id":"...","repo":"orchestrator","work_item_prefix":"ORCH", + "agent_models":{"developer":"claude-opus-4-8","reviewer":"claude-sonnet-4-6"}} +``` +Поле опционально → старые записи без `agent_models` работают (default = {}). +ВНИМАНИЕ: dataclass `frozen=True` + mutable default → используй `field(default_factory=dict)`. + +### 3. Резолвинг модели — helper (где удобнее: launcher или projects) +Функция `resolve_agent_model(agent: str, project_id: str) -> str` с приоритетом: +1. `ProjectConfig.agent_models[agent]` (per-project override) — если есть +2. `settings.agent_model_` (глобальный per-agent env) — если непусто +3. `settings.agent_model_default` +4. (если всё пусто) — без флага, CLI-дефолт +Вернуть строку модели (или "" → без `--model`). + +### 4. Применить в launcher.py +- Убрать хардкод `"model": "opus"` из AGENT_CONFIGS (architect, reviewer) — модель теперь резолвится. +- При сборке команды: `model = resolve_agent_model(agent, project_id)` вместо `config.get("model","")`. +- `project_id` уже доступен в потоке запуска (передаётся в launch — проверь сигнатуру, протяни если надо). + +### 5. Тесты (tests/) +- `test_resolve_agent_model.py`: все 4 уровня приоритета (project > env > default > пусто), + отсутствие проекта, неизвестный агент, frozen-dataclass с agent_models. +- Проверить, что `--model` корректно подставляется/опускается в собранной команде. + +### 6. Документация +- Обновить `docs/` (конфиг-референс орка): новые env `ORCH_AGENT_MODEL_*`, поле `agent_models` в projects_json. +- CHANGELOG.md. + +## Команды проверки (ОБЯЗАТЕЛЬНО до отчёта) +```bash +# из клона ветки в окружении прод-образа орка: +docker exec -w -e PYTHONPATH= orchestrator python3 -m pytest tests/ -q -p no:cacheprovider +# Ожидаемо: 0 failed (>=402 passed + новые) +# Проверь резолвинг руками: +python3 -c "from src.agents.launcher import resolve_agent_model; print(resolve_agent_model('developer',''))" +``` + +## Off-limits / грабли +- НЕ менять логику гейтов, webhook, HMAC, очередь. +- НЕ хардкодить версию модели в коде (вся суть задачи — конфигурируемость). +- frozen dataclass + dict → `field(default_factory=dict)`, иначе TypeError. +- Тесты НЕ в docker-образе → гонять из клона репо. +- После push: `git log origin/main..origin/feat/ORCH-41-agent-models` показывает коммит ДО отчёта. +- Не регистрировать раннеров, не nohup. +- ⚠️ Бюджет (ORCH-38): дефолт 4-8 может быть дороже 4-7. НЕ менять дефолт на проде сам — только + в коде как default; реальное переключение прода/env делаю я после ОК Славы. + +## Результат +PR `feat/ORCH-41-agent-models` → main. Модель агентов конфигурируема: глобально (env per-agent), +с per-project override в projects_json. 0 failed. Отчёт: +`tasks/orchestrator/reports/dev-2026-06-05-orch41-agent-models.md` + краткое резюме мне +(что добавил, вывод pytest, ссылка на PR, пример конфига).