Управління multi-agent системами: координація, дозволи й контроль ескалацій

Практичний multi-agent governance у production: role ownership, handoff limits, shared budgets, approval gates, stop reasons і audit trail.
На цій сторінці
  1. Ідея за 30 секунд
  2. Проблема
  3. Рішення
  4. Multi-agent governance ≠ orchestration
  5. Компоненти multi-agent governance
  6. Як це виглядає в архітектурі
  7. Приклад
  8. У коді це виглядає так
  9. Як це виглядає під час виконання
  10. Сценарій 1: ownership conflict
  11. Сценарій 2: перевищення handoff budget
  12. Сценарій 3: нормальний керований handoff
  13. Типові помилки
  14. Самоперевірка
  15. FAQ
  16. Де Multi-Agent Governance у загальній системі
  17. Пов'язані сторінки

Ідея за 30 секунд

Multi-agent governance — це runtime-контроль координації між агентами: хто власник підзадачі, хто може делегувати, коли зупиняти handoff-ланцюг.

Коли це потрібно:
коли в одному workflow працюють кілька агентів і є ризик дубльованих дій, конфліктів ролей або неконтрольованого fan-out.

Проблема

Без governance multi-agent система швидко переходить у режим хаосу: агенти делегують одне одному задачі, дублюють виклики і витрачають спільний бюджет без фінального прогресу. У demo це часто виглядає "живо". У production це перетворюється на затримки, зайві витрати і нестабільний результат.

Типові наслідки:

  • одна підзадача має кількох власників
  • handoff-ланцюг росте без завершення
  • shared budget витрачається на дублікати

Аналогія: це як команда без диспетчера. Люди зайняті, але роблять одне й те саме, а критичні задачі зависають у передачах.

І кожна хвилина без правил координації збільшує ризик каскадного збою між агентами.

Рішення

Рішення — додати централізований policy layer для multi-agent orchestration у runtime. Кожна делегація проходить перевірку: role ownership, handoff limits, shared budgets і approval gate для ризикових дій.

Для runtime потрібна єдина модель outcomes:

  • allow
  • stop
  • approval_required

Типові stop reasons у multi-agent контурі:

  • ownership_conflict
  • handoff_budget_exceeded
  • delegation_depth_exceeded
  • shared_budget_exceeded

Це не порада моделі, а примусовий контроль виконання перед кожною новою делегацією.

Multi-agent governance ≠ orchestration

Це різні шари системи:

  • Orchestration визначає маршрут задач між агентами.
  • Governance обмежує цей маршрут policy-правилами.

Одне без іншого не працює:

  • без orchestration немає керованого workflow
  • без governance orchestration легко деградує в дублікати, конфлікти і loop-и

Приклад:

  • orchestration: planner -> researcher -> writer
  • governance: max_handoffs=8, max_depth=3, ownership_lock=true

Компоненти multi-agent governance

Ці компоненти працюють разом на кожному handoff між агентами.

КомпонентЩо контролюєКлючові механікиНавіщо
Role ownershipХто власник підзадачіrole map
ownership lock
Блокує дублікати й конфлікт відповідальності
Handoff limitsГлибину та кількість передачmax_handoffs
max_delegation_depth
Зупиняє delegation loop до інциденту
Shared budgetsСумарні витрати всієї команди агентівshared max_usd
shared max_tool_calls
Не дає кільком агентам "разом" вийти за бюджет
Approval gatesРизикові cross-agent діїapproval_required
TTL + explicit approver
Додає людський контроль перед незворотними write-операціями
Cross-agent audit trailПрозорість делегацій і рішеньhandoff log
decision + reason + owner
Дає відтворюваний ланцюг подій для incident review

Приклад alert:

Slack: 🛑 Multi-Agent run run_742 stopped: ownership_conflict, handoff=planner -> researcher, task=refund_check.

Як це виглядає в архітектурі

Multi-agent policy layer стоїть у orchestrator runtime loop між плануванням і делегуванням підзадач. Кожне рішення (allow або stop) фіксується в audit log. Це логічний policy-шар у runtime, а не окремий сервіс.

approval_required для ризикових write-дій обробляється окремим approval flow поверх цього контуру.

Кожен handoff проходить через цей flow перед виконанням:

  • orchestrator runtime формує наступну підзадачу
  • policy перевіряє owner, handoff budget, delegation depth і shared budgets
  • allow -> підзадача передається конкретному агенту
  • stop -> orchestrator runtime переходить у fallback (single-agent або обмежений режим виконання)
  • обидва рішення пишуться в audit log

Приклад

planner делегує refund_check агенту researcher, але ця підзадача вже має owner=billing_agent. Policy повертає stop (reason=ownership_conflict).

Результат:

  • делегація не виконується
  • run не розростається в дублікати
  • у логах видно конфлікт власника і причину зупинки

Multi-agent governance зупиняє інцидент до fan-out, а не після втрати бюджету.

У коді це виглядає так

У спрощеній схемі вище показано основний flow. Критично: перевірка має працювати централізовано, інакше агенти обходитимуть ліміти через паралельні handoff-и.

Приклад policy-конфігурації:

YAML
multi_agent:
  max_agents_per_run: 4
  max_handoffs: 8
  max_delegation_depth: 3
  shared_max_usd: 30
  shared_max_tool_calls: 120
  require_approval_for:
    - billing.refund.create
PYTHON
task = orchestrator.next_task(state)
decision = multi_agent_policy.check(task, state)

audit.log(
    run_id,
    phase="pre_handoff",
    decision=decision.outcome,
    reason=decision.reason,
    owner=decision.owner,
    from_agent=task.from_agent,
    to_agent=task.to_agent,
    depth=state.delegation_depth,
)

if decision.outcome == "approval_required":
    # approve/resume flow логується окремим кроком:
    # approval_required -> approval_granted -> allow
    return stop("approval_required")

if decision.outcome == "stop":
    return stop(decision.reason)

result = orchestrator.delegate(task)

shared_budget.consume(
    usd=result.cost_usd,
    tool_calls=result.tool_calls,
)

post_budget_decision = shared_budget.check()
if not post_budget_decision.ok:
    audit.log(
        run_id,
        phase="post_handoff",
        decision="stop",
        reason=post_budget_decision.reason,
        owner=decision.owner,
        handoff_status=result.status,
    )
    return stop(post_budget_decision.reason)

audit.log(
    run_id,
    phase="post_handoff",
    decision=decision.outcome,
    reason=decision.reason,
    owner=decision.owner,
    handoff_status=result.status,
)

return result

Як це виглядає під час виконання

Сценарій 1: ownership conflict

  1. planner формує делегацію refund_check.
  2. Policy бачить, що owner підзадачі вже закріплений за іншим агентом.
  3. Рішення: stop (reason=ownership_conflict).
  4. Handoff блокується до виконання.
  5. Конфлікт фіксується в audit log.

Сценарій 2: перевищення handoff budget

  1. Run вже зробив 8 передач підзадач.
  2. Наступна делегація перевищує max_handoffs.
  3. Рішення: stop (reason=handoff_budget_exceeded).
  4. Runtime переходить у fallback mode.
  5. Система не входить у нескінченний delegation loop.

Сценарій 3: нормальний керований handoff

  1. Runtime формує нову підзадачу з валідним owner.
  2. Policy перевіряє всі ліміти: все в межах.
  3. Рішення: allow.
  4. Делегація виконується і повертається результат.
  5. Події pre_handoff і post_handoff пишуться в audit trail.

Типові помилки

  • запускати кілька агентів без role ownership map
  • дозволяти handoff без ліміту глибини і кількості
  • рахувати бюджети окремо для кожного агента, а не shared для run
  • не мати fallback при stop
  • логувати тільки фінальний результат без історії делегацій
  • змішувати orchestration правила і governance правила в prompt

У результаті система виглядає масштабованою, але при навантаженні швидко втрачає контроль.

Самоперевірка

Швидка перевірка multi-agent governance перед запуском у production:

Прогрес: 0/8

⚠ Бракує базового governance-контролю

Перед production потрібні мінімум: контроль доступу, ліміти, audit logs і аварійна зупинка.

FAQ

Q: Коли multi-agent підхід дійсно виправданий?
A: Коли підзадачі реально незалежні й мають різну експертизу. Якщо workflow лінійний і короткий, один агент часто простіший і надійніший.

Q: Хто має приймати фінальне рішення: orchestrator чи окремий агент?
A: Краще один відповідальний orchestrator/policy layer. Інакше зростає ризик конфліктів і "пінг-понгу" між агентами.

Q: Чи можна агентам напряму делегувати без policy check?
A: Для production — ні. Кожен handoff має проходити централізовану перевірку ownership, лімітів і бюджету.

Q: Як рахувати бюджет у multi-agent run?
A: Як shared бюджет для всіх агентів разом. Інакше кожен агент окремо "в межах", а сумарно run виходить за ліміти.

Q: Multi-agent governance замінює step limits і rate limiting?
A: Ні. Він доповнює їх: керує координацією між агентами, а step/rate controls керують поведінкою виконання.

Де Multi-Agent Governance у загальній системі

Multi-agent governance — це рівень Agent Governance для orchestrated команд агентів. Разом із RBAC, budget controls, approval, rate limiting і audit він формує контрольований runtime для складних workflow.

Пов'язані сторінки

Далі за темою:

⏱️ 6 хв читання • Оновлено 27 березня 2026 р.Складність: ★★★
Реалізувати в OnceOnly
Keep governance policy in one place and enforce it on every tool call without duplicating custom middleware.
Використати в OnceOnly
from onceonly import OnceOnly

client = OnceOnly(api_key="once_live_...")
agent_id = "billing-agent"

client.gov.upsert_policy({
    "agent_id": agent_id,
    "allowed_tools": ["stripe.charge", "send_email"],
    "blocked_tools": ["user.delete"],
    "max_spend_usd_per_day": 50.0,
})

# Incident response
client.gov.disable_agent(agent_id, reason="incident:abnormal_charge_pattern")
# After triage
client.gov.enable_agent(agent_id, reason="incident_resolved")
Integrated: policy as codeOnceOnly
Centralize agent governance in one control plane
Move limits and permissions out of scattered app conditionals into enforceable governance APIs:
  • Set policy with `gov.upsert_policy(...)` or templates.
  • Apply per-tool limits with `max_calls_per_tool`.
  • Use kill switch (`disable_agent`) during incidents.
  • Review policy outcomes with `agent_logs(...)`.
  • Track spend and blocked actions via `agent_metrics(...)`.
Інтегрована згадка: OnceOnly — контрольний шар для продакшен агент-систем.
Governance Operations (Python SDK)
from onceonly import OnceOnly

client = OnceOnly(api_key="once_live_...")

client.gov.upsert_policy({
    "agent_id": "billing-agent",
    "max_actions_per_hour": 120,
    "max_spend_usd_per_day": 40.0,
    "allowed_tools": ["stripe.charge", "send_email"],
    "max_calls_per_tool": {"stripe.charge": 25},
})

logs = client.gov.agent_logs("billing-agent", limit=20)
metrics = client.gov.agent_metrics("billing-agent", period="day")

Автор

Микола — інженер, який будує інфраструктуру для продакшн AI-агентів.

Фокус: патерни агентів, режими відмов, контроль рантайму та надійність систем.

🔗 GitHub: https://github.com/mykolademyanov


Редакційна примітка

Ця документація підготовлена з допомогою AI, із людською редакторською відповідальністю за точність, ясність і продакшн-релевантність.

Приклади є навчальними й можуть використовувати імітовані інструменти та дані. Перед використанням у production перевірте надійність, безпеку й відновлення у власному середовищі.