auto-sync: 2026-06-05 18:50:01
This commit is contained in:
99
tasks/orchestrator/DEV_TASK_ORCH41_AGENT_MODELS.md
Normal file
99
tasks/orchestrator/DEV_TASK_ORCH41_AGENT_MODELS.md
Normal file
@@ -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_<AGENT>`), дефолт — единый базовый, напр. `claude-opus-4-8`:
|
||||
```python
|
||||
# Per-agent LLM model (ORCH-41). Empty -> agent_model_default. Resolution order:
|
||||
# project-override > ORCH_AGENT_MODEL_<AGENT> > 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_<agent>` (глобальный 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 <clone> -e PYTHONPATH=<clone> 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','<orch_proj_id>'))"
|
||||
```
|
||||
|
||||
## 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, пример конфига).
|
||||
Reference in New Issue
Block a user