MiniAgent

MiniAgent — встроенный кодинг-агент: полностью самостоятельная «обвязка», вшитая прямо в Pastukhov Agent (библиотека на C#, минималистичный агент в духе Pi, переписанный с нуля). Ей не нужна внешняя программа и ей нечего устанавливать — Pastukhov Agent и MiniAgent представляют собой единое целое и полностью самодостаточны «из коробки».

MiniAgent — часть системы обвязок Pastukhov Agent и выбирается переменной AGENT_BACKEND=mini. Общий обзор обвязок — на странице Обвязки.


Почему это важно для бизнеса

Обычные обвязки — это сторонние программы, которые скачиваются и устанавливаются через менеджер пакетов. MiniAgent устроена иначе: она живёт внутри самого Pastukhov Agent, поэтому:

  • Независимость от сторонних разработчиков. Работа агента не зависит от чужих проектов и их обновлений — движок всегда под рукой у сервера.
  • Безопасность поставки. Никакой установки пакетов из сторонних источников — исчезает сам риск получения скомпрометированного установочного пакета.
  • Самодостаточность «из коробки». MiniAgent уже внутри продукта: нечего скачивать, устанавливать и обновлять отдельно.
  • Всё на вашем сервере. Агент работает там же, где и Pastukhov Agent: данные не покидают вашу инфраструктуру.

Возможности

Это полноценный агент со всем, что нужно для реальной работы:

  • Инструменты read, write, edit, bash, parallel_bash, grep, find, ls, glob, load_skill, todo_write, agent и фоновые задачи agent_start, agent_check, agent_stop — чтение, правка и создание файлов, запуск команд, поиск, загрузка навыков и запуск подагентов;
  • Постоянные сессии — диалог сохраняется в формате JSONL и возобновляется после перезапуска;
  • Переключение модели и уровня размышлений на лету — прямо посреди диалога, ничего не теряя;
  • Один уровень размышлений на все чаты — если весь сервер должен работать на одном уровне, его задают одной настройкой профиля; настройка главнее суффикса модели и сохранённого уровня (подробнее ниже);
  • Автоматическое сжатие контекста — длинные разговоры не «забывают» начало;
  • Повторы при временных сбоях провайдера и защита от потери ответа — пауза между попытками и их число настраиваются, а каждый повтор виден в чате отдельной строкой (подробнее ниже);
  • Подсчёт токенов и стоимости — в чате и в аналитике;
  • Контекст проекта — сам читает CLAUDE.md/AGENTS.md (приоритет у CLAUDE.md) и сам находит навыки .claude/skills;
  • Интерактивные формы и кнопки (agent.form/agent.button) — прямо в системном промпте, без отдельных дополнений;
  • Чтение картинок — инструмент read прикладывает файл-изображение к запросу (подробности в примечании ниже);
  • Экономное чтение файлов — сколько строк инструмент read отдаёт за одно обращение, настраивается; большой файл агент дочитывает по частям и не забивает контекст целиком (подробнее ниже);
  • Загрузка страниц и поиск в интернете — агент сам открывает нужные адреса и ищет в интернете: вызовы fetch и search идут по настраиваемому списку сервисов, а если один сервис не ответил, ход передаётся следующему (подробнее ниже);
  • Внешние инструменты и правила — MiniAgent сам подключает MCP-серверы из mcp.yml и применяет хуки из hooks.yml: в мини-чатах они работают так же, как у командных агентов;
  • Подагенты — инструмент agent запускает вложенный сеанс с собственным контекстом, видимый дочерним чатом: несколько вызовов в одном ответе работают одновременно, а рядом есть фоновые задачи, чей итог приходит в текущий ход сам (подробнее ниже).

Примечание: отправка изображений в чат пока не подключена — приложенные к сообщению картинки игнорируются с предупреждением в журнале. При этом агент сам читает картинки с диска инструментом read: на моделях, которым разрешён ввод изображений, файл прикладывается к запросу (jpg, png, gif, webp, bmp до 5 МБ), а на текстовых моделях возвращается понятная ошибка. Файл больше предела отклоняется с подсказкой уменьшить его командой.


Подключение

MiniAgent выбирается переменной AGENT_BACKEND=mini. Проще всего создать модель из готового шаблона провайдера, где обвязка MiniAgent уже есть: Anthropic, DeepSeek, z.ai, BigModel, OpenRouter, xAI, MiniMax, Moonshot, OpenAI, OpenCode Go/Zen. Шаблон сам подставит обвязку и параметры подключения:

  • MINI_BASE_URL — адрес провайдера;
  • MINI_API — формат протокола: anthropic-messages или openai-completions;
  • MINI_AUTH — тип авторизации: api-key или bearer;
  • MINI_API_KEY — ключ доступа.

Модель задаётся в формате «провайдер/модель:мышление», например MODEL=anthropic/claude-sonnet-5:medium. Суффикс :thinking задаёт уровень размышлений: off, minimal, low, medium, high, xhigh, max. Модель, которой нет в шаблоне, соберётся автоматически по параметрам выше; при наличии файла ~/.mini/models.json (формат, совместимый с Pi) приоритет у него. Если модель не задана вовсе, используется deepseek/deepseek-v4-flash. Провайдера по умолчанию можно указать переменной MINI_PROVIDER — она используется, когда в имени модели нет префикса «провайдер/».


Данные

Данные MiniAgent хранятся в папке ~/.mini (переопределяется переменной MINI_AGENT_DIR):

  • models.json — конфигурация моделей;
  • agent-sessions — сессии в формате JSONL;
  • skills — дополнительные навыки;
  • CLAUDE.md — глобальный контекст.

Профили MiniAgent

Профиль — именованный набор настроек встроенного агента: какие контекстные файлы загружать, какими инструментами разрешено пользоваться, как долго может выполняться один вызов, какой токеновый потолок стоит у запросов и сколько подагентов разрешено запускать разом. Профили позволяют держать несколько режимов работы одного проекта: «безопасный» без bash для чувствительных репозиториев, «черновой» с большим таймаутом для тяжёлых задач, «только чтение» для ревью — и переключаться между ними просто сменой модели.

Профили живут в файле miniagent.yml в папке бренда проекта (.xedant/ или .pastukhov/). Корневая карта profiles: — ключом служит имя профиля, значением — его настройки:

# miniagent.yml
profiles:
  safe:                       # безопасный режим: без bash, короткий таймаут
    disabledTools:
      - bash
    toolCallTimeout: 60
    loadAgentsMd: false

  readonly:                   # только чтение: разрешены лишь поисковые инструменты
    enabledTools:
      - read
      - grep
      - find
      - glob
      - ls

Модель выбирает профиль суффиксом mini:имя в переменной AGENT_BACKEND конфигурации модели на странице Модели — например, AGENT_BACKEND=mini:safe. Имя профиля приводится к нижнему регистру и ищется без учёта регистра; легаси-псевдоним mini-agent:safe тоже работает. Обычное AGENT_BACKEND=mini без суффикса, пустой суффикс или несуществующее имя дают встроенные настройки по умолчанию — об отсутствующем профиле записывается предупреждение в журнал. Суффикс с двоеточием понимает только обвязка MiniAgent, остальные обвязки принимают AGENT_BACKEND целиком.


Настройки профиля

Каждое поле профиля необязательно: пропущенное поле, пустой профиль {} или отсутствующий файл означают встроенные значения по умолчанию.

ПолеТипДефолтЧто делает
loadClaudeMdbooltrueзагружает CLAUDE.md в контекст
loadAgentsMdbooltrueзагружает AGENTS.md в контекст
enabledToolsсписок имённет (включены все 11)белый список инструментов; пустой список — ошибка; несовместим с disabledTools
disabledToolsсписок имённет (все включены)денy-лист инструментов; несовместим с enabledTools
toolCallTimeoutint, сек300потолок одного вызова инструмента
maxOutputTokensint384000потолок выходных токенов запроса; по умолчанию — потолок из описания модели (384000); перекрывает maxTokens модели
thinkingBudgetint65536бюджет размышлений для всех уровней мышления, кроме off; применяется на серверах anthropic
thinkingLevelстрокауровень из имени модели, иначе mediumуровень размышлений для всех сеансов профиля: off, minimal, low, medium, high, xhigh, max; главнее суффикса имени модели и уровня, сохранённого в сеансе
parallelBashThreadsint5сколько команд одного вызова parallel_bash исполняется одновременно
readMaxLinesint500сколько строк один вызов read возвращает до усечения; второе ограничение — 50 КБ на ответ
maxParallelAgentsint4сколько подагентов одного чата работают одновременно; остальные ждут очереди
systemPromptстрокавстроенныйзаменяет встроенный базовый системный промпт; пустой — тоже встроенный
sessionHeaderстроканет (X-Agent-Session, на opencode — X-Opencode-Session)имя HTTP-заголовка, в котором каждый запрос к провайдеру несёт идентификатор сессии; запись headers в models.json с тем же именем имеет приоритет

Уровень размышлений. Поле thinkingLevel задаёт один уровень для всех сеансов профиля — удобно, когда весь сервер должен работать одинаково: например, размышления выключены ради скорости и экономии или, наоборот, включены на полную для сложных задач. Настройка главнее и суффикса :thinking в имени модели, и уровня, сохранённого в сеансе. Уровень влияет не только на качество ответа, но и на счёт: чем он выше, тем дольше модель размышляет и тем больше токенов расходует. Отдельно стоит знать про серверы семейства DeepSeek: раньше они всегда работали со своим уровнем по умолчанию — размышления включены, усилие максимальное, — и выбранный в чате уровень до них не доходил. Теперь уровень доходит: размышления можно выключить или понизить.

Сколько строк читает агент. Поле readMaxLines ограничивает, сколько строк инструмент read отдаёт за одно обращение — по умолчанию 500. Второе ограничение — 50 КБ на ответ: файл из нескольких огромных строк усечётся по объёму. Когда файл длиннее, агент получает подсказку, с какого места продолжить, и дочитывает его следующими обращениями: большой файл он видит целиком, но контекст не заполняется им за один раз. Меньше строк за раз — экономнее разговор, но больше обращений к файлу.

Профиль управляет ровно 11 встроенными инструментами: read, bash, parallel_bash, edit, write, grep, find, glob, ls, load_skill, todo_write. Инструменты agent, agent_start, agent_check и agent_stop стоят особняком: они добавляются каждому основному чату всегда, и списки профиля их не фильтруют — ни включить, ни отключить их через профиль нельзя. Так же ведут себя fetch и search: это дополнительные инструменты, они появляются сами, когда есть хотя бы один включённый сервис — у fetch в fetch.yml, у search в search.yml, — и ни в одном из двух списков профиля не значатся. Оба списка enabledTools и disabledTools в одном профиле — ошибка (одновременно и в yml, и в переменных окружения): разрешать и запрещать один и тот же инструмент бессмысленно. Пустой enabledTools отклоняется — он оставил бы профиль вообще без инструментов, а пустой disabledTools даёт только предупреждение.

Приоритет каждой настройки — три источника по старшинству: переменная, заданная у модели (на странице Модели), главнее переменной окружения процесса сервера, а та главнее профиля; сам профиль главнее встроенного значения по умолчанию. Пустое значение переменной передаёт ход следующему источнику, а не сбрасывает настройку в ноль. Так можно задать общий уровень для всего сервера и при этом переопределить его для одной модели, не заводя отдельный профиль.

Заголовок сессии. Каждый запрос к провайдеру несёт идентификатор сессии в HTTP-заголовке — принимающий провайдер может различать чаты MiniAgent: группировать трафик, ограничивать частоту запросов или вести временное хранилище по сессии, не разбирая переписку. По умолчанию заголовок называется X-Agent-Session, на провайдерах opencode (имя провайдера начинается с opencode или адрес на opencode.ai) — X-Opencode-Session. Имя меняется полем sessionHeader профиля или переменной MINI_PROFILE_SESSION_HEADER; явная запись headers в models.json с тем же именем главнее автоматической отправки. У ключа sessionHeader нет редактора в диалоге настроек — его вписывают вручную в miniagent.yml или задают переменной, диалог передаёт вручную заданное значение без изменений. Запрос, отправленный до появления идентификатора сессии, заголовка не несёт.


Переменные окружения

Любую настройку профиля можно переопределить на уровне процесса переменной MINI_PROFILE_* — она применяется поверх выбранного профиля (или значений по умолчанию, если профиль не задан):

ПеременнаяПереопределяет
MINI_PROFILE_LOAD_CLAUDE_MDloadClaudeMd
MINI_PROFILE_LOAD_AGENTS_MDloadAgentsMd
MINI_PROFILE_ENABLED_TOOLSenabledTools (имена через запятую)
MINI_PROFILE_DISABLED_TOOLSdisabledTools (имена через запятую)
MINI_PROFILE_TOOL_CALL_TIMEOUTtoolCallTimeout
MINI_PROFILE_MAX_OUTPUT_TOKENSmaxOutputTokens
MINI_PROFILE_THINKING_BUDGETthinkingBudget
MINI_PROFILE_THINKING_LEVELthinkingLevel
MINI_PROFILE_PARALLEL_BASH_THREADSparallelBashThreads
MINI_PROFILE_READ_MAX_LINESreadMaxLines
MINI_PROFILE_MAX_PARALLEL_AGENTSmaxParallelAgents
MINI_PROFILE_SYSTEM_PROMPTsystemPrompt
MINI_PROFILE_SESSION_HEADERsessionHeader

Пустое значение переменной считается не заданным — настройка берётся из профиля или значения по умолчанию, так что «очистить» переопределение можно пустой строкой. Обе list-переменные одновременно (MINI_PROFILE_ENABLED_TOOLS и MINI_PROFILE_DISABLED_TOOLS) — жёсткая ошибка, как и неразбираемое значение (не true/false, не положительное число): сессия не создастся, а в ошибке будет названа сама переменная.

Пример — таймаут вызова 120 секунд и запрет bash для всех чатов: задайте переменные MINI_PROFILE_TOOL_CALL_TIMEOUT=120 и MINI_PROFILE_DISABLED_TOOLS=bash.

MiniAgent, как и остальные обвязки, уважает сетевые переменные HTTP_PROXY, HTTPS_PROXY и NO_PROXY: если сервер выходит в интернет через прокси, запросы к провайдеру пойдут через него, а адреса из NO_PROXY — напрямую. Подробнее — на странице Модели.


Инструмент parallel_bash

parallel_bash — инструмент MiniAgent для запуска нескольких независимых команд одним вызовом. Модель сама решает, какие команды не зависят друг от друга (этот контракт независимости зафиксирован в описании инструмента), и объединяет их в один вызов:

parallel bash:
  - git status --short
  - ls pages/ | wc -l
  - df -h /project

Команды исполняются конкурентно: parallelBashThreads (по умолчанию 5) ограничивает, сколько команд выполняется одновременно, остальные ждут в очереди. Вызов завершается после ответа всех команд, а результат возвращает упорядоченные секции [i] command — по одной на команду, в порядке ввода, что позволяет агенту сопоставить каждый вывод со своей командой. Тривиальная разница с bash: bash исполняет одну команду, parallel_bash — пакет; оба работают на общем ядре ShellCommand, и поведение bash не изменилось.


Загрузка страниц и поиск в интернете

Агент работает не только с файлами на сервере: он умеет сам открывать страницы в интернете и искать нужное. Это два отдельных инструмента — fetch для загрузки страницы по адресу и search для поиска. Владельцу бизнеса это экономит главное — время: не нужно вручную копировать в чат документацию, статьи и выдачу поиска. Достаточно попросить, и агент принесёт содержимое страницы или список найденного со ссылками, а дальше уже работает с ним как с обычным текстом.

Загрузка страницы

fetch скачивает страницу по адресу и отдаёт её модели как читаемый текст: разметка страницы переводится в простой текст с лёгким оформлением, а содержимое, которое уже приходит текстом, таблицей данных или разметкой для программ, возвращается как есть. Если важна сама вёрстка, модель может попросить исходное содержимое без перевода. Слишком большая страница в разговор не влезает: агент получает её в виде файла и читает нужные куски обычным чтением. В компактном виде вызов виден короткой строкой «Загружаю …» с адресом, в обычном — карточкой вызова с тем же адресом и раскрываемым результатом.

Поиск в интернете

search выполняет запрос и приносит нумерованный список найденного: заголовок, адрес, короткий фрагмент и дата, когда поисковик её отдаёт. Если поисковик сам ответил на вопрос, этот ответ приходит строкой над списком. Модель решает, сколько результатов просить (по умолчанию десять) и на каком языке искать. В компактном виде вызов виден строкой «Ищу …» с текстом запроса; результаты раскрываются там же, в карточке вызова.

Несколько сервисов и запасной вариант

За загрузку и поиск отвечают не сами агент и не одна программа, а список сервисов — его вы настраиваете сами. Так сделано потому, что сайты бывают очень разными: обычную страницу достаточно запросить напрямую, другую — только через прокси, третья собирается скриптами и открывается лишь настоящим браузером. У каждого сервиса есть приоритет: сначала пробуется сервис с меньшим числом, и, если он не ответил или ответил ошибкой, ход передаётся следующему. Поэтому один сломанный ключ или недоступный прокси не останавливают работу — её доводит следующий сервис в списке. Исключение одно: когда страница уже получена, её перевод в текст не переигрывается другими сервисами — повторная загрузка того же адреса дала бы ту же ошибку.

Файлы fetch.yml и search.yml

Загрузка страниц и поиск настраиваются в двух разных файлах папки бренда проекта (.xedant/ или .pastukhov/): загрузка — в fetch.yml, поиск — в отдельном search.yml. Устроены они одинаково, и в каждом свой раздел services: со списком сервисов. У записи пять полей: name (имя, по которому сервис узнают в сообщениях), type (тип сервиса), enabled (выключатель), priority (приоритет) и settings (настройки типа — адреса, ключи, пределы времени):

Вот так выглядит сервис загрузки в fetch.yml:

# fetch.yml — только загрузка страниц
services:
  - name: Direct HTTP       # имя, по которому сервис узнают в сообщениях
    type: Direct            # тип сервиса
    enabled: true           # выключенный сервис в переборе не участвует
    priority: 100           # меньшее число пробуется первым
    settings:
      TimeoutSec: "30"      # сколько секунд ждать ответа

А так — сервис поиска в search.yml. Раздел и поля те же, отличаются только типы и их настройки:

# search.yml — только поиск в интернете
services:
  - name: Serper (main)
    type: Serper
    enabled: true
    priority: 100
    settings:
      ApiKey: $SERPER_API_KEY   # ключ берётся из переменной, а не хранится в файле

Ключи и пароли в файлах не хранят: в настройках пишут $ИМЯ, ${ИМЯ} или ${ИМЯ:-значение-по-умолчанию}, и подстановка идёт сначала по переменным чата (то есть модели), затем по окружению сервера. Если переменная не задана и значения по умолчанию нет, текст остаётся как есть, а в журнал идёт предупреждение. Проверка идёт при сохранении и при сборке — у каждого файла своя: неизвестный ключ — предупреждение, а отсутствие обязательной настройки, неположительное число, значение вне допустимых или неполный адрес отклоняют сервис с указанием причины; повтор имени внутри своего файла и неположительный приоритет — ошибки файла.

fetch.yml с одним включённым сервисом загрузки создаётся сам при первом запуске, поэтому загрузка работает сразу, без настройки; если файл повреждён, он читается как тот же сервис по умолчанию с одним предупреждением в журнале. search.yml заранее не создаётся: он появляется, когда вы сохраните первый сервис поиска. Готового сервиса поиска нет — и это осознанно: десяти из одиннадцати типов нужен ключ доступа, прежде чем они смогут хоть что-то, а инструмент, сломанный «из коробки», хуже отсутствующего.

Типы сервисов загрузки

ТипЧто делает
Direct — «Прямой»обычный запрос страницы с этого сервера; подпись браузера, дополнительные заголовки и предел времени настраиваются
Proxied — «Через прокси»тот же запрос, но через прокси сервиса — адрес, имя пользователя и пароль
BrowserEmulation — «Эмуляция браузера»настоящий браузер на сервере отрисовывает страницу (при первом использовании браузер скачивается); выбор браузера и пауза на отрисовку
Nodriver — «Nodriver»браузер, который труднее распознать: страница открывается через отдельное окружение Python, которое создаётся само
RemoteBrowser — «Удалённый браузер»отрисовку делает внешний браузерный сервис по адресу и протоколу
ScriptFetch — «Сценарий загрузки»своя команда оболочки загружает адрес и печатает результат в оговорённом виде — когда нужен способ, которого нет среди готовых

Типы сервисов поиска

ТипЧто опрашивает
Serperрезультаты Google через сервис serper.dev — нужен ключ доступа
Keenableрезультаты поиска через сервис Keenable — нужен ключ доступа
SearXNGсвой или публичный экземпляр SearXNG — нужен его адрес
DuckDuckGoразбор выдачи DuckDuckGo без ключа; способ хрупкий — возможны ограничения частоты обращений
Braveрезультаты через Brave Search — нужен ключ доступа
Tavilyрезультаты плюс готовый ответ поисковика — нужен ключ доступа
JsonSeoпоисковик на выбор (Яндекс, Google, Bing) — нужен ключ доступа
Tinyfishрезультаты поиска через Tinyfish — нужен ключ доступа
Exaрезультаты с подсвеченными фрагментами — нужен ключ доступа
Anysiteживой разбор выдачи поисковика: медленнее остальных и тарифицируется по кредитам — нужен ключ доступа
ScriptSearch — «Сценарий поиска»своя команда оболочки выполняет запрос и печатает результаты в оговорённом виде

Страницы «Fetch-сервисы» и «Search-сервисы»

Править список руками в файле не обязательно: в диалоге MiniAgent рядом с профилями есть вкладки «Fetch-сервисы» и «Search-сервисы». Первая страница пишет fetch.yml, вторая — search.yml: это два независимых файла и два независимых сохранения, каждое под свою последнюю прочитанную контрольную сумму. Всё остальное у них одинаково:

  • Список сервисов — в порядке приоритета, с добавлением, правкой, дублированием и удалением; рядом переключатель включения, поле приоритета («Меньшее значение пробуется первым») и подсказка, что для нового сервиса приоритет ставится на единицу больше текущего максимума — то есть он пробуется последним;
  • Форма по типу сервиса — выберите тип, и поля появятся сами: имя подставится из типа, обязательные поля помечены, ключи и пароли скрыты и показываются по кнопке, для каждого поля видно значение по умолчанию;
  • «Проверить» — прогоняет один сервис: загрузка проверяется на простой странице, поиск — небольшим запросом. Видны успех, задержка, пояснение и образец ответа. Проверка исполняет сохранённый файл, поэтому сначала сохраните правки — диалог об этом предупреждает;
  • Копирование и вставка — определение сервиса можно скопировать в буфер обмена и вставить обратно или в другой проект: так одинаковые настройки переносятся между серверами без ручного ввода;
  • Защита от ошибок и конфликтов — сохранение каждой страницы проверяет только её собственный список по тем же правилам, что и файл (неизвестный тип, отсутствующая обязательная настройка, повтор имени, неположительный приоритет), и отклоняется с указанием сервиса и поля; если файл успели изменить снаружи (например, в текстовой вкладке настроек проекта), страница предложит перезагрузить именно его вместо молчаливой перезаписи. У каждого файла своё событие обновления, поэтому правка одного не сбрасывает другой. Сохранение запускает проверочную сборку файла.

Если сервисов нет и когда правки вступают в силу

Выключите все сервисы загрузки — и инструмента fetch для новых чатов просто не существует: в запросе к модели не будет ни описания инструмента, ни упоминания в указании. С поиском так же: пока нет файла search.yml или все его записи выключены, инструмента поиска в чате нет. А вот отсутствие fetch.yml загрузку не выключает: сервер создаёт его при запуске со встроенным сервисом Direct. Настройки читаются один раз, при создании чата, поэтому правки каталога действуют на новые чаты, а начатый разговор дорабатывает с прежним списком.


Подагенты

Инструмент agent позволяет модели запустить отдельного подагента — вложенный сеанс со своим контекстом и своим журналом. Это тот же приём, что «подзадачи» у командных агентов: большая задача разбивается на части, и каждая часть работает в чистом контексте, не засоряя основную беседу.

  • Вызов несёт описание задачи и подробное указание — как у инструмента подзадач командного агента;
  • вложенный запуск виден отдельным дочерним чатом, привязанным к родительскому: его сообщения, расход и стоимость появляются в реальном времени, а в родительском чате растёт сводка по подагентам;
  • итоговый ответ подагента (усечённый до общих пределов вывода) возвращается родителю как результат инструмента;
  • подагент работает без навыка чата, без MCP-серверов, без хуков и без самого инструмента agent — запустить своего подагента он не может;
  • остановка родительского чата доходит и до вложенного запуска, а в дочернем чате остаётся всё, что тот успел сделать.

Несколько подагентов сразу

Если в одном ответе модели вызовов agent несколько, они стартуют одновременно: карточки всех вызовов появляются сразу, а результаты возвращаются в порядке вызовов. Сколько подагентов одного чата работает разом, задаёт настройка профиля maxParallelAgents (по умолчанию 4): лишние вызовы встают в очередь и начинают работу, как только освободится место. Предел один на весь чат — очередь у обычных и у фоновых задач общая.

Фоновые задачи

Для долгой работы есть три отдельных инструмента. agent_start ставит задачу в очередь и сразу отдаёт её номер. agent_check сообщает состояние задачи, а после завершения — её итоговый ответ или текст ошибки. agent_stop останавливает работающую задачу или отменяет ту, что ещё ждёт своей очереди.

  • Итог приходит сам. Опрашивать ничего не нужно: завершившаяся задача сама приносит результат в текущий ход, и он виден на строке вызова agent_start — как раскрываемый результат у обычного вызова. Пока у чата есть незавершённые фоновые задачи, ход не закрывается;
  • Короткая подпись вместо номера. В чате фоновые вызовы показаны понятной строкой — «Запускаю агента …», «Проверяю агента …», «Останавливаю агента …» — с названием задачи, которое придумала модель;
  • Результат не теряется. Итог задачи хранится на сервере: к нему можно вернуться по тому же номеру — и в другом ходе, и после перезапуска приложения. Задачи, оборванные остановкой сервера, при следующем запуске закрываются с пометкой об остановке;
  • Остановка чата снимает всё. Если остановить родительский чат, все его фоновые задачи завершаются: работающие останавливаются, ждущие отменяются. В дочернем чате остаётся всё, что успел сделать подагент, и пометка об остановке; у отменённой ждущей задачи дочернего чата нет вовсе.

MCP-серверы

MiniAgent сам подключает MCP-серверы, включённые в файле mcp.yml, — командная строка Claude Code для этого не нужна. Поддерживаются те же три способа подключения: локальные процессы (stdio), удалённые серверы по http и устаревающий sse.

Серверы подключаются не при запуске, а при первом сообщении чата. Выключенные записи пропускаются. Если сервер не поднялся или не ответил, чат продолжает работать, а в журнал идёт предупреждение с именем сервера: один неисправный сервер не тянет за собой остальные и не мешает разговору. В командах, аргументах, переменных окружения, адресах и заголовках раскрываются $ИМЯ, ${ИМЯ} и ${ИМЯ:-значение-по-умолчанию} — сначала по переменным чата, затем по окружению; незаданная переменная остаётся как есть с предупреждением. При остановке чата подключения закрываются, а локальные процессы серверов гасятся, поэтому остановка не ждёт их выхода.

Как завести серверы и что лежит в mcp.yml — на странице MCP-серверы.


Хуки

Правила из hooks.yml действуют и в мини-чатах: запрет инструмента, проверка перед его вызовом, действия по событиям разговора. Один и тот же каталог передаётся и командным агентам, и MiniAgent, поэтому правила не нужно заводить дважды.

Список событий, запрещающие правила и предел времени на выполнение — на странице Хуки.


Диалог профилей в настройках

Диалог открывается с карточки «MiniAgent» группы Configuration в центре настроек (шестерёнка в шапке) — подробнее о хабе на странице Настройки. Диалог редактирует тот же miniagent.yml, что и текстовый YAML-редактор, но как форму:

  • Список профилей — создание, переименование и удаление. Имя подчиняется маске ^[a-z0-9][a-z0-9_-]*$: строчная буква или цифра, дальше строчные буквы, цифры, дефисы и подчёркивания — оно же становится суффиксом mini:имя;
  • Редактор профиля — переключатели loadClaudeMd/loadAgentsMd, переключатели инструментов с итогом «N of M tools enabled» (меняют disabledTools), числовые поля с подсказками значений по умолчанию и редактор системного промпта с предпросмотром встроенного. Среди числовых полей есть «Параллельных агентов» — сколько подагентов одного чата запускать одновременно (по умолчанию 4, подсказка «Субагенты одного чата, запущенные одновременно; лишние ждут очереди»); ноль и отрицательное число сохранить нельзя. Кнопка Reset to default очищает текст промпта — встроенный берётся заново при каждом обновлении приложения, а не копируется;
  • Сводка встроенных значений по умолчанию — показана рядом со списком;
  • Защита от конфликтов — каждое сохранение проходит проверку контрольной суммы (md5): если файл успел измениться (правка в другом клиенте, текстовом редакторе или вкладке Project Settings), сервер отвечает 409 с предложением перезагрузить диалог — правки не затираются молча;
  • Та же валидация, что у YAML — и сохранение из формы, и правка текстом проходят одни и те же правила (имена профилей, взаимоисключение списков, диапазоны чисел) и дают одинаковые ошибки; валидатор работает как псевдо-сборка.

Настройки фиксируются при создании сессии: живой чат работает с тем профилем, с которым был создан, а правки применяются к новым сессиям — переключение профиля или модели пересоздаёт сессию. Ещё одна тонкость: если в профиле отключён инструмент load_skill, из системного промпта пропадает строка «Start by loading the skill» — требовать загрузку навыка инструментом, которого нет, бессмысленно. А сам загруженный навык приходит целиком, каким бы большим он ни был: общий предел вывода на него не действует — в этом и смысл вызова.


Настройки повтора

Поставщик ИИ иногда отвечает не сразу: сервис перегружен, обращений слишком много, соединение оборвалось. Вместо того чтобы сразу закончить ход ошибкой, MiniAgent повторяет запрос — и часто ответ приходит уже на повторе. Сколько ждать между попытками и сколько попыток делать, вы задаёте сами: для этого в центре настроек есть карточка «Повторить» в группе «Конфигурация» (шестерёнка в шапке). Подробнее о хабе — на странице Настройки.

Карточка открывает диалог «Настройки повтора» с двумя полями:

  • Интервал повтора — сколько секунд ждать перед повтором неудачного запроса, по умолчанию 60 секунд;
  • Максимальное число попыток — сколько всего раз запрос отправляется (первый запрос плюс повторы), прежде чем ошибка завершит ход, по умолчанию 10. Допустимо только целое число больше нуля;

Пауза всегда одна и та же — с каждой попыткой она не растёт. Пустое поле означает «вернуть значение по умолчанию». Внизу диалога видно, где лежит файл настроек.

Повторяются только временные сбои: перегруженный сервис, ограничение частоты обращений, ответы 400, 429 и 5xx, обрывы соединения. А вот случаи, которые от повтора не изменятся, — исчерпанные лимиты и кредиты аккаунта — чат показывает сразу, не дожидаясь остальных попыток (при значениях по умолчанию это сэкономило бы до девяти минут ожидания).

Каждый повтор виден в чате отдельной строкой с жёлтой (предупреждающей) подсветкой. В строке названы модель, номер попытки из общего числа, причина сбоя и сколько ждать до следующего запроса. Это не ошибка: обычно ответ приходит уже на повторе, поэтому строка и оформлена как предупреждение — метку «ошибка» она чату не ставит. А вот когда попытки исчерпаны, в чате появляется настоящее сообщение об ошибке и чат помечается меткой «ошибка». Если прервать ответ во время паузы, повтор не состоится.

Оплачиваются все попытки, а не только удачная: поставщик обрабатывает и неудачные запросы. Поэтому расход неудачных попыток прибавляется к расходу хода — цифры в чате и в аналитике показывают реальный счёт, а не только тот запрос, который в итоге ответил.

Значения хранятся в файле retry.yml в папке бренда проекта (.xedant/ или .pastukhov/):

retryIntervalSeconds: 60
maxAttempts: 10

Тот же файл можно править текстом во вкладке настроек проекта и любым редактором — изменение подхватывается по ходу работы. Если файл повреждён, диалог покажет значения по умолчанию и пояснит, что сохранение заменит испорченный файл. Если файл правили в другом окне или текстом, диалог предупредит: «retry.yml изменён вне этого диалога. Ваши правки не сохранены.» — с кнопкой «Перезагрузить». Настройки применяются к новым сессиям: активный чат дорабатывает с той политикой, с которой был создан, а битый файл чаты не ломает — работают значения по умолчанию. Файл проверяется и при сборке: неизвестные ключи и число меньше единицы будут найдены, как у остальных файлов настроек.


Практический пример

Профиль «safe» — bash выключен, таймаут вызова 60 секунд. Создайте его в диалоге: Настройки → Configuration → MiniAgent → «Добавить профиль», имя safe, выключите переключатель bash и поставьте toolCallTimeout: 60, сохраните. Эквивалентный файл:

profiles:
  safe:
    disabledTools:
      - bash
    toolCallTimeout: 60

Теперь назначьте его модели: в мастере моделей на странице Модели задайте переменную AGENT_BACKEND=mini:safe (в yml — строка в списке variables:). Чаты на этой модели будут работать без запуска shell-команд и ограничат каждый вызов инструмента 60 секундами — всё остальное останется встроенным.


  • MCP-серверы — внешние инструменты и источники данных, которые MiniAgent подключает сам;
  • Хуки — правила запрета и выполнения, общие для командных агентов и мини-чатов;
  • Настройки — карточка MiniAgent и хаб настроек;
  • Папка .pastukhov — файл fetch.yml и остальные файлы настроек проекта;
  • Модели — переменная AGENT_BACKEND, выбор профиля моделью и признак ввода изображений;
  • Навыки — навыки в чате и инструмент load_skill.