Agent Versioning для AI-агентів: як безпечно релізити prompt, tools і policy

Практичний agent versioning у production: version manifest, contract checks, canary rollout, rollback і відтворюваність run-ів.
На цій сторінці
  1. Ідея за 30 секунд
  2. Проблема
  3. Рішення
  4. Agent versioning ≠ rollback
  5. Компоненти versioning-контролю
  6. Як це виглядає в архітектурі
  7. Приклад
  8. У коді це виглядає так
  9. Як це виглядає під час виконання
  10. Сценарій 1: блокування через contract mismatch
  11. Сценарій 2: canary rollout
  12. Сценарій 3: rollback required
  13. Типові помилки
  14. Самоперевірка
  15. FAQ
  16. Де Agent Versioning у загальній системі
  17. Пов'язані сторінки

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

Agent versioning — це runtime-контроль, який фіксує, яку саме версію агента запускає кожен run: prompt, tools, policy і модель.

Коли це потрібно: коли агент регулярно оновлюється і в production треба безпечно релізити зміни без втрати відтворюваності.

Проблема

Без версіонування нові зміни в prompt, tools і policy змішуються в один "поточний стан". У demo це майже не видно. У production стає незрозуміло, чому один run спрацював, а інший — ні.

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

  • неможливо точно відтворити інцидент
  • складно зрозуміти, яка зміна зламала поведінку
  • rollback перетворюється на ручну й ризикову операцію

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

Аналогія: це як деплой без номера версії. Поки все добре, проблема непомітна. Коли щось ламається, неясно, до чого саме повертатись.

Рішення

Рішення — зберігати агент як версійний пакет (version manifest) і запускати run тільки з pinned version_id. Кожен реліз проходить перевірку сумісності контрактів і rollout gate перед подачею трафіку.

Version policy layer повертає технічне рішення: allow або stop з явною причиною:

  • contract_mismatch
  • gate_failed
  • rollback_required

Це окремий рівень системи, а не частина промпта чи логіки моделі.

Agent versioning ≠ rollback

Це різні ролі в системі:

  • Versioning керує змінами до і під час rollout.
  • Rollback повертає стабільну версію, коли нова вже дала регресію.

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

  • без versioning rollback складно зробити точково
  • без rollback навіть добрий versioning не рятує від production-інциденту

Приклад:

  • versioning: support-agent@2.4.0 іде на canary 5%
  • rollback: повернення на support-agent@2.3.3, якщо росте error rate

Компоненти versioning-контролю

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

КомпонентЩо контролюєКлючові механікиНавіщо
Version manifestСклад версії агентаversion_id
prompt/tools/policy hashes
Дає точне "що саме поїхало в run"
Contract checksСумісність tools і policyschema validation
tool contract check
Блокує реліз із несумісними змінами
Rollout gatingЕтапність релізуcanary stage
traffic percentage
Зменшує blast radius нової версії
Runtime pinningЯку версію виконує runpinned version_id
immutable run metadata
Дозволяє відтворити run і розслідувати інцидент
Version observabilityВидимість rollout-рішеньaudit logs
alerts на gate failures
Не керує релізом напряму, але швидко показує, чому версію заблоковано

Приклад alert:

Slack: 🛑 Agent support@2.4.0 blocked: gate_failed on canary stage (error_rate > threshold).

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

Version policy layer стоїть між runtime і запуском нової версії агента та блокує запуск до старту run. Кожне рішення (allow або stop) фіксується в audit log.

Кожен запуск run проходить через цей flow перед виконанням: runtime не стартує нову версію напряму, а передає рішення policy layer.

Коротко по flow:

  • Runtime готує запуск run
  • Policy перевіряє version_manifest, tool_contracts, rollout_stage, policy_version
  • allow -> стартує pinned agent_version
  • stop -> реліз блокується, лишається active stable version
  • обидва рішення пишуться в audit log

Приклад

Команда релізить support-agent@2.4.0 із новим refund.create tool adapter. На контракт-перевірці виявляється несумісність schema.

Результат:

  • policy повертає stop (reason=contract_mismatch)
  • canary не стартує
  • продовжує працювати support-agent@2.3.3

Versioning зупиняє ризиковий реліз до інциденту, а не після нього.

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

У спрощеній схемі вище показано основний flow. Критично: runtime має запускати run тільки з pinned version_id, а не брати "latest" під час виконання.

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

YAML
agent_release:
  stable_version: support-agent@2.3.3
  candidate_version: support-agent@2.4.0
  canary_percent: 5
  rollback_on:
    error_rate_p95: 0.05
    tool_failure_p95: 0.03
PYTHON
release_cfg = load_release_config("support-agent")
candidate = registry.get(release_cfg.candidate_version)
decision = versioning.check(candidate, runtime_context)

if decision.outcome == "stop":
    audit.log(
        run_id,
        decision=decision.outcome,
        reason=decision.reason,
        version_id=candidate.version_id,
        rollout_stage=decision.rollout_stage,
    )
    alerts.notify_if_needed(candidate.version_id, decision.reason)
    return stop(decision.reason)

selected = versioning.select(candidate, stable=release_cfg.stable_version)
run = runtime.start(
    version_id=selected.version_id,
    prompt_hash=selected.prompt_hash,
    policy_version=selected.policy_version,
)
# Decision.allow — умовний helper, щоб зберегти єдину модель outcome/reason.
allow_decision = Decision.allow(reason=None)

audit.log(
    run.id,
    decision=allow_decision.outcome,
    reason=allow_decision.reason,
    version_id=selected.version_id,
    rollout_stage=selected.rollout_stage,
)

return run

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

Сценарій 1: блокування через contract mismatch

  1. Runtime готує запуск support-agent@2.4.0.
  2. Policy перевіряє tool contracts.
  3. Рішення: stop (reason=contract_mismatch).
  4. Нова версія не запускається.
  5. Подія фіксується в audit log.

Сценарій 2: canary rollout

  1. Policy дозволяє candidate на canary_percent=5.
  2. Частина run-ів іде на 2.4.0, решта — на stable.
  3. Метрики відстежуються по version_id.
  4. Якщо пороги не порушені, stage підвищується.
  5. Версія переходить у ширший rollout.

Сценарій 3: rollback required

  1. Після rollout росте tool_failure_rate.
  2. Policy повертає stop (reason=rollback_required).
  3. Трафік повертається на stable version.
  4. Run-и з новою версією більше не стартують.
  5. Команда аналізує інцидент за version_id і audit trail.

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

  • запускати run із "latest" замість pinned version_id
  • версіонувати тільки prompt і ігнорувати tools/policy контракти
  • робити full rollout без canary gate
  • не логувати version_id і rollout_stage в audit
  • змішувати rollback і новий реліз в одному кроці без stable fallback
  • не мати явних порогів, при яких потрібен rollback

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

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

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

Прогрес: 0/8

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

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

FAQ

Q: Чому не можна просто оновлювати "поточну" версію агента?
A: Тому що без pinned version_id ти втрачаєш відтворюваність run-ів і не можеш точно локалізувати регресію.

Q: Що саме версіонувати: тільки prompt?
A: Ні. Мінімум: prompt, tool contracts, policy/config і runtime-сумісність. Інакше версія неповна.

Q: Чи обов'язковий canary для кожної зміни?
A: Для high-risk змін — так. Для low-risk можна скорочувати етапи, але з явними метриками і stop-порогами.

Q: Коли запускати rollback?
A: Коли порушені узгоджені пороги (error/tool failure/latency/cost). Це має бути policy-рішення, а не ручна імпровізація.

Q: Versioning замінює rollback?
A: Ні. Versioning запобігає хаосу в релізах, rollback залишається аварійним механізмом повернення до stable.

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

Agent versioning — це один із рівнів Agent Governance. Разом із RBAC, лімітами, бюджетами, approval і audit він формує єдину систему контрольованих змін у production.

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

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

⏱️ 6 хв читанняОновлено 27 березня 2026 р.Складність: ★★★
Реалізувати в OnceOnly
Budgets + permissions you can enforce at the boundary.
Використати в OnceOnly
# onceonly guardrails (concept)
version: 1
budgets:
  max_steps: 25
  max_tool_calls: 12
  max_seconds: 60
  max_usd: 1.00
policy:
  tool_allowlist:
    - search.read
    - http.get
writes:
  require_approval: true
  idempotency: true
controls:
  kill_switch: { enabled: true }
Інтегровано: продакшен-контрольOnceOnly
Додай guardrails до агентів з tool-calling
Зашип цей патерн з governance:
  • Бюджетами (кроки / ліміти витрат)
  • Дозволами на інструменти (allowlist / blocklist)
  • Kill switch та аварійна зупинка
  • Ідемпотентність і dedupe
  • Audit logs та трасування
Інтегрована згадка: OnceOnly — контрольний шар для продакшен агент-систем.

Автор

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

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

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


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

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

Контент базується на реальних відмовах, постмортемах та операційних інцидентах у розгорнутих AI-агентних системах.