Реклама. ИП Ахунов Александр Раисович, ИНН 665911236854
Оркестрация tool-calling AI-агента: SOP, лимиты и audit trail

Оркестрация tool-calling AI-агента: SOP, лимиты и audit trail

Оркестрация tool-calling в бизнес-агенте — это не «модель сама вызовет API», а жёсткий SOP: planner решает что делать, executor вызывает только whitelist, а каждый шаг пишет audit trail с лимитами и причиной остановки.

Я вывожу tool-calling в прод только когда вижу три артефакта: карту инструментов с правами, лимиты на сессию и полный журнал «запрос → tool → результат → решение». Без этого агент либо молчит на полезных шагах, либо жжёт бюджет и CRM в цикле.


Planner / Executor: две роли вместо одного «умного» цикла

Смешивать «подумай и сразу дерни API» в одном промпте — путь к непредсказуемым side-effect. Я разделяю поток на две роли с разными правами.

РольВходВыходПрава на tool
PlannerЦель, контекст CRM, политикаПлан шагов + stop-условияТолько read/search
ExecutorОдин шаг плана + схема argsРезультат tool + raw/normalizedWhitelist write/action
GuardПлан или результатallow / deny / escalateНет внешних вызовов
AuditorСобытия сессииЗапись в лог, score рискаAppend-only

Минимальный SOP на один тикет

  1. Intake: тип задачи, обязательные поля, channel.
  2. Planner: 1–5 шагов, без «и ещё что-нибудь полезное».
  3. Guard на план: запреты policy (деньги, юр., удаление).
  4. Executor по одному шагу; после каждого — проверка схемы ответа.
  5. Stop: цель достигнута / нехватка данных / лимит / escalate.
  6. Handoff-пакет или закрытие с кратким summary для человека.

Один «агент в while True» без явного stop я в бою не держу: стоимость и риск растут быстрее качества.


Whitelist инструментов и контракт аргументов

Tool-calling ломается чаще на кривых args и «лишних» правах, чем на «глупой» модели. Я фиксирую контракт на каждый инструмент.

Поле контрактаЗачемПример
nameСтабильный id в логахcrm.update_deal_stage
descriptionКогда вызывать (и когда нет)Только после подтверждённого intent
input_schemaJSON Schema / pydanticdeal_id uuid, stage enum
side_effectnone / write / money / externalwrite
auth_scopeМинимальные праваdeals:write:own
timeout_msЗащита от висяков8000
retry_policyidempotent onlymax 2, backoff
on_denyЧто сказать пользователю«Нужен менеджер»

Чеклист перед подключением нового tool

  1. Есть ли идемпотентный ключ (чтобы retry не создал дубль)?
  2. Можно ли выполнить действие без tool (тогда tool не нужен)?
  3. Записан ли пример bad args и ответ API на ошибку?
  4. Есть ли маскирование PII в логах запроса/ответа?
  5. Кто владелец tool в команде (on-call при 5xx)?
  6. Есть ли feature-flag на отключение без релиза агента?

Пока на эти вопросы нет ответов, tool остаётся в staging с синтетическими тикетами.


Лимиты сессии: токены, шаги, деньги, время

Без лимитов tool-calling превращается в неконтролируемый счёт. Я ставлю жёсткие потолки на сессию и на инструмент.

ЛимитТипичное значение на стартеЧто делать при hit
max_tool_calls6–10 на тикетescalate + summary
max_planner_revisions2handoff «не смог спланировать»
max_wall_time90–180 секpartial result + human
max_cost_tokensбюджет на intent-классdegrade: только read-tools
max_write_tools1–3 write за сессиюдальнейшие write → human
circuit_breakerN ошибок API подрядpause tool на 5–15 мин

Правила, которые снижают «зацикливание»

  • После двух одинаковых ошибок tool — не повторять с теми же args.
  • Write-tool только после явного плана с обоснованием.
  • Любой tool с side_effect=money — только через human confirm (отдельный шаг UI/сообщения).
  • Параллельные tool-call — только для read; write строго последовательно.

Лимиты я храню рядом с политикой, а не «в голове у промпта»: промпт можно обойти формулировкой, код лимита — нет.


Audit trail: что писать, чтобы разбирать инциденты за минуты

Когда клиент говорит «бот сам поменял сделку», спор решает журнал. Я пишу события в одном формате.

СобытиеОбязательные поля
session_startsession_id, channel, user/hash, intent
plan_createdsteps[], policy_version
tool_calltool, args_redacted, attempt
tool_resultok/error, latency_ms, result_hash
decisioncontinue / stop / escalate, reason
handoffpackage_id, assignee_queue
session_endoutcome, cost_tokens, tool_count

Как читать audit при разборе

  1. Найти session_id по времени и channel.
  2. Сверить policy_version и whitelist — не уехал ли конфиг.
  3. Посмотреть первый deny/error — часто корень там, а не в последнем шаге.
  4. Сравнить args write-tool с тем, что в CRM сейчас (дрейф данных).
  5. Если модели «передумали» mid-flight — усилить guard на план, не «сменить модель».

Без audit trail я не спорю с бизнесом о «вине ИИ»: нет следа — нет улучшения, только мнения.


Часто задаваемые вопросы

Нужен ли отдельный planner, если модель «умеет» tool-calling из коробки?
Для демо — нет. Для боя с CRM и деньгами — да: отдельный план и guard на write снижают сюрпризы сильнее, чем смена провайдера.

Что важнее: больше tools или жёстче контракты?
Жёстче контракты. Десять размытых tools хуже трёх с схемой, timeout и idempotency key.

Как понять, что лимиты слишком жёсткие?
Смотрю долю session_end по причине max_tool_calls при успешном partial progress. Если >15% и handoff «дожимает» в 1 шаг — поднимаю лимит точечно на этот intent.

Можно ли логировать полные ответы API?
Только в secure store с TTL и redaction. В обычные чаты/тикеты — hash, статус и бизнес-поля без секретов.


Читайте также


Готов разобрать ваш tool-calling контур и собрать SOP с лимитами под ваш CRM: https://raisovich.ru

Зачем разделять planner и executor в tool-calling агенте?

Чтобы план с read-правами не смешивался с write-вызовами: executor идёт по whitelist по одному шагу, а guard режет money/legal side-effect до факта.

Что обязательно писать в audit trail tool-calling сессии?

События «запрос → tool → args/result (с redaction) → решение/stop» с session_id, policy_version и причиной остановки — иначе инцидент в CRM не разобрать за минуты.

Какие лимиты ставить на tool-calling в первой боевой версии?

Типичный старт: 6–10 tool calls на тикет, 1–3 write за сессию, wall time 90–180 с и circuit breaker на серии ошибок API — лимиты в коде, не только в промпте.

Р
Команда экспертов по AI-автоматизации бизнеса, созданию сайтов и продвижению нейросетями. Помогаем бизнесу расти с помощью современных технологий.

Часто задаваемые вопросы

Зачем разделять planner и executor в tool-calling агенте?

Чтобы план с read-правами не смешивался с write-вызовами: executor идёт по whitelist по одному шагу, а guard режет money/legal side-effect до факта.

Что обязательно писать в audit trail tool-calling сессии?

События «запрос → tool → args/result (с redaction) → решение/stop» с session_id, policy_version и причиной остановки — иначе инцидент в CRM не разобрать за минуты.