Files
wiki/tasks/orchestrator/DEV_TASK_ORCH41_AGENT_MODELS.md
2026-06-05 18:50:01 +03:00

6.6 KiB
Raw Blame History

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.pyclass 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.pyAGENT_CONFIGS (dict по агентам) + сборка model_flag (строки ~88,99,207-208):
    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:

# 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 каждого проекта, опционально). Пример записи реестра:

{"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.

Команды проверки (ОБЯЗАТЕЛЬНО до отчёта)

# из клона ветки в окружении прод-образа орка:
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, пример конфига).