Files

5.6 KiB

Inventory of Hermes auxiliary tasks + model routing (2026-09-04)

Все задачи, которые Hermes решает "в фоне" отдельно от main-модели через call_llm(task=...) (agent/auxiliary_client.py) и точки их вызова в коде. Использовать для решения: какую задачу направить на локальную Ollama, какую оставить на облаке.

Полная карта задач

Задача Назначение / где вызывается Требования/характер
title_generation Заголовки сессий (/title) короткий вывод, мгновенно
web_extract Пересказ/извлечение из веб-страниц (web_extract) средний вывод
vision Анализ изображений, скриншоты браузера нужна vision-модель, приватность
skills_hub Поиск/описание скиллов в хабе (skills_hub) короткий вывод
profile_describer Описание пользовательского профиля (profile_describer) не hot-path, краткий вывод
compression Сжатие длинных диалогов (context_compressor) контекст ≥ 64K, важна надёжность
approval Умное авто-одобрение команд, режим smart (approval.py) безопасность, одно слово (APPROVE/DENY/ESCALATE)
mcp Обёртка MCP-серверов (tools/mcp_tool.py) может быть сложный вывод
kanban_decomposer Декомпозиция задач каньбан в JSON (kanban_decompose.py) длинный JSON (до max 4000 токенов)
triage_specifier Спецификация/уточнение задач каньбан (kanban_specify.py) рабочие задачи, надёжность
curator Фоновый анализ/жизненный цикл скиллов (curator) фоновый, но смысловой анализ

Рекомендуемое распределение (проверено, применено в конфиге)

На локальную qwen3:8b-nothink (текст) / qwen3-vl:8b (vision): title_generation, web_extract, vision, skills_hub, profile_describer. Экономит облачные токены, картинки не уходят в облако.

Оставить на облаке (provider: auto / main):

  • compression — жёсткий минимум MINIMUM_CONTEXT_LENGTH = 64_000, локаль (< 40K) не тянет
  • approval — безопасность, не направлять на слабую локаль
  • mcp — может требовать сложного вывода
  • kanban_decomposer — длинный JSON, локаль 8b рискует битой структурой
  • triage_specifier — рабочие задачи, надёжность
  • curator — фоновый, смысловой анализ

КРИТИЧНО: session_search — НЕ auxiliary-задача

session_search НЕ имеет отдельной auxiliary-модели. Проверено резолвером:

_resolve_task_provider_model(task="session_search")  # -> provider=auto model=None

Это agent-loop инструмент (наравне с todo, memory, delegate_task), он ВСЕГДА идёт на main-модель/auto. Настройка auxiliary.session_search.provider не имеет эффекта (её блок в конфиге имеет только extra_body/max_concurrency/timeout). Не трать время на попытку переключить её на локаль — это ограничение Hermes, а не наша ошибка.

Настройка блока в config.yaml (вручную, НЕ hermes config set)

hermes config set не правит dict-блоки aux корректно — правь текстом:

  <task>:
    provider: custom
    model: qwen3:8b-nothink
    base_url: http://localhost:11434/v1
    api_key: ollama
    timeout: 60

Замена по маркеру <task>: (2 пробела + имя целиком, включая последующий отступ в 4 пробела + пустую строку до следующей задачи). Порядок полей в существующем блоке в файле: provider, model, base_url, api_key, timeout, extra_body.

Проверка E2E после смены модели

Реальный контур (не CLI, который может не подхватить ключ):

import sys; sys.path.insert(0, "/opt/hermes/.hermes/hermes-agent")
from agent.auxiliary_client import call_llm
r = call_llm(task="<task>", messages=[{"role":"user","content":"<короткий промпт>"}], max_tokens=80)
# смотри: r.model == ожидаемая модель, r.choices[0].finish_reason == "stop", content не пуст

Признак рабочей локальной модели: finish_reason: stop + осмысленный content. | r.choices[0].message.content | r.model |