- Дата публикации
Microsoft выпускает Agent Governance Toolkit: как за 30 минут навести порядок в AI‑агентах на Azure App Service
Что нового
Microsoft выкатил открытый (MIT) Agent Governance Toolkit — набор библиотек для управления и защиты автономных AI‑агентов на рантайме. Он закрывает все 10 рисков из OWASP Top 10 for Agentic Applications и делает это с детерминированной проверкой политик с задержкой менее 0,1 мс на 99‑м перцентиле.
Ключевые факты:
- Поддерживаемые языки: Python, TypeScript, Rust, Go, .NET.
- Работает с разными фреймворками: Microsoft Agent Framework (MAF), LangChain, CrewAI, Google ADK и др.
- Основной сценарий в примере — ASP.NET Core‑приложение на Azure App Service с шестью агентами (координатор + пять специализированных).
- Для интеграции в существующий сервис автору потребовалось около 30 минут:
- 1 NuGet‑пакет;
- 1 YAML‑файл с политиками;
- несколько строк кода в базовом классе агента;
- регистрация ядра governance в DI.
- Toolkit закрывает все 10 категорий рисков OWASP для агентных систем: goal hijacking, tool misuse, identity abuse, memory poisoning, rogue agents и др.
- Подготовка к регуляторным требованиям: EU AI Act (обязательства по high‑risk AI с августа 2026) и Colorado AI Act (с июня 2026).
Набор разбит на 7 пакетов:
- Agent OS — статeless‑движок политик, перехватывает каждое действие агента до выполнения (p99 < 0,1 мс).
- Agent Mesh — крипто‑идентичности (DID), протокол доверия между агентами, динамический trust‑скоринг.
- Agent Runtime — "кольца исполнения" по аналогии с уровнями привилегий CPU, саги, kill‑switch.
- Agent SRE — SLO, error budget, circuit breaker, chaos‑эксперименты.
- Agent Compliance — автоматизированная проверка соответствия, маппинг на EU AI Act, HIPAA, SOC 2.
- Agent Marketplace — управление жизненным циклом плагинов, подпись Ed25519, защита цепочки поставок.
- Agent Lightning — управление обучением с подкреплением с жёсткими политиками на раннерах.
В примере на Azure App Service используются три пакета: Agent OS, Agent Compliance, Agent SRE.
Как это работает
Общая идея
Agent Governance Toolkit встраивается в пайплайн агента и перехватывает каждую попытку вызвать инструмент, функцию или внешний API. Перед тем как агент выполнит действие, GovernanceKernel проверяет его по набору политик. Решение — allow, deny, throttle и т.д. — принимается детерминированно и укладывается в доли миллисекунды.
Это не отдельный прокси‑сервис, а библиотека, которая живёт внутри вашего приложения и использует уже настроенную телеметрию (OpenTelemetry + Application Insights).
Структура пакетов (под капотом)
-
Agent OS — ядро:
- хранит политики (YAML, OPA Rego, Cedar);
- собирает контекст (имя агента, имя инструмента, параметры, метаданные);
- прогоняет запрос через движок правил по приоритетам;
- пишет решение в лог и метрики.
-
Agent Compliance:
- связывает ваши политики с регуляторными требованиями (EU AI Act, HIPAA, SOC 2);
- автоматически формирует audit trail по каждому решению;
- позволяет показывать аудиторам не только логи, но и формализованные правила.
-
Agent SRE:
- считает SLO (например, p99‑латентность конкретного агента за 5 минут);
- ведёт error budget;
- включает circuit breakers при серии ошибок;
- может менять поведение агентов (снижать автономность, требовать человеческое подтверждение).
Интеграция в ASP.NET Core‑агентов
- NuGet‑пакет
В проект TravelPlanner.Shared.csproj добавляют пакет Microsoft.AgentGovernance:
<ItemGroup>
<!-- Existing packages -->
<PackageReference Include="Azure.Monitor.OpenTelemetry.AspNetCore" Version="1.3.0">
<PackageReference Include="Microsoft.Agents.AI" Version="1.0.0">
<!-- NEW: Agent Governance Toolkit (single package, all features included) -->
<PackageReference Include="Microsoft.AgentGovernance" Version="3.0.2">
</PackageReference></PackageReference></PackageReference></ItemGroup>
- Файл политик
В корне проекта создаётся governance-policies.yaml. Это единая точка, где описаны правила для всех агентов:
apiVersion: governance.toolkit/v1
name: travel-planner-governance
description: Policy enforcement for the multi-agent travel planner on App Service
scope: global
defaultAction: deny
rules:
- name: allow-currency-conversion
condition: "tool == 'ConvertCurrency'"
action: allow
priority: 10
description: Allow Currency Converter agent to call Frankfurter exchange rate API
- name: allow-weather-forecast
condition: "tool == 'GetWeatherForecast'"
action: allow
priority: 10
description: Allow Weather Advisor agent to call NWS forecast API
- name: allow-weather-alerts
condition: "tool == 'GetWeatherAlerts'"
action: allow
priority: 10
description: Allow Weather Advisor agent to check NWS weather alerts
Ключевые моменты:
defaultAction: deny— всё запрещено по умолчанию, кроме явно разрешённого.- Разрешены только три инструмента:
ConvertCurrency,GetWeatherForecast,GetWeatherAlerts. - Если агент попытается вызвать что‑то вроде
DeleteDatabase, вызов заблокируется до выполнения.
- Подключение в базовом классе агента
В конструкторе базового агента добавляется один вызов .UseGovernance(...). До:
Agent = new ChatClientAgent(
chatClient, instructions: Instructions,
name: AgentName, description: Description)
.AsBuilder()
.UseOpenTelemetry(sourceName: AgentName)
.Build();
После:
var kernel = serviceProvider.GetService<GovernanceKernel>();
if (kernel is not null)
builder.UseGovernance(kernel, AgentName);
Agent = builder.Build();
Полный обновлённый класс BaseAgent:
using AgentGovernance;
using Microsoft.Extensions.DependencyInjection;
public abstract class BaseAgent : IAgent
{
protected readonly ILogger Logger;
protected readonly AgentOptions Options;
protected readonly AIAgent Agent;
// Constructor for simple agents without tools
protected BaseAgent(
ILogger logger,
IOptions<AgentOptions> options,
IChatClient chatClient,
IServiceProvider serviceProvider)
{
Logger = logger;
Options = options.Value;
var builder = new ChatClientAgent(
chatClient, instructions: Instructions,
name: AgentName, description: Description)
.AsBuilder()
.UseOpenTelemetry(sourceName: AgentName);
var kernel = serviceProvider.GetService<GovernanceKernel>();
if (kernel is not null)
builder.UseGovernance(kernel, AgentName);
Agent = builder.Build();
}
// Constructor for agents with tools
protected BaseAgent(
ILogger logger,
IOptions<AgentOptions> options,
IChatClient chatClient,
ChatOptions chatOptions,
IServiceProvider serviceProvider)
{
Logger = logger;
Options = options.Value;
var builder = new ChatClientAgent(
chatClient, instructions: Instructions,
name: AgentName, description: Description,
tools: chatOptions.Tools?.ToList())
.AsBuilder()
.UseOpenTelemetry(sourceName: AgentName);
var kernel = serviceProvider.GetService<GovernanceKernel>();
if (kernel is not null)
builder.UseGovernance(kernel, AgentName);
Agent = builder.Build();
}
// ... rest unchanged
}
Если GovernanceKernel не зарегистрирован, агенты работают как раньше. Это даёт возможность включать и отключать governance конфигурацией, не ломая код.
- Регистрация в DI (Program.cs)
using AgentGovernance;
// ... existing builder setup ...
// Configure OpenTelemetry with Azure Monitor (existing — from Blog 2)
builder.Services.AddOpenTelemetry().UseAzureMonitor();
// NEW: Configure Agent Governance Toolkit
// Load policy from YAML, register as singleton. Agents resolve via IServiceProvider.
var policyPath = Path.Combine(builder.Environment.ContentRootPath, "governance-policies.yaml");
if (File.Exists(policyPath))
{
try
{
var yaml = File.ReadAllText(policyPath);
var kernel = new GovernanceKernel(new GovernanceOptions
{
EnableAudit = true,
EnableMetrics = true
});
kernel.LoadPolicyFromYaml(yaml);
builder.Services.AddSingleton(kernel);
Console.WriteLine($"[Governance] Loaded policies from {policyPath}");
}
catch (Exception ex)
{
Console.WriteLine($"[Governance] Failed to load: {ex.Message}. Running without governance.");
}
}
На этом уровне всё. Никакой отдельной инфраструктуры, прокси или sidecar‑контейнеров.
Язык политик
Базовый язык — YAML‑правила с простыми условиями и приоритетами.
- Allowlist/denylist по инструментам:
defaultAction: deny
rules:
- name: allow-currency-conversion
condition: "tool == 'ConvertCurrency'"
action: allow
priority: 10
- name: allow-weather-forecast
condition: "tool == 'GetWeatherForecast'"
action: allow
priority: 10
- Условия:
# Конкретный инструмент
condition: "tool == 'ConvertCurrency'"
# Несколько инструментов
condition: "tool == 'GetWeatherForecast' or tool == 'GetWeatherAlerts'"
# Привязка к агенту
condition: "agent == 'CurrencyConverterAgent' and tool == 'ConvertCurrency'"
- Приоритеты и конфликты:
rules:
- name: allow-all-weather-tools
condition: "tool == 'GetWeatherForecast' or tool == 'GetWeatherAlerts'"
action: allow
priority: 10
- name: block-during-maintenance
condition: "tool == 'GetWeatherForecast'"
action: deny
priority: 100
description: Temporarily block NWS calls during API maintenance
Чем выше priority, тем выше вес правила. Можно разрешить класс действий и поверх него временно заблокировать часть.
- Продвинутые сценарии: OPA Rego и Cedar.
Для сложных условий можно подключить Rego:
# policies/advanced.rego — Example: time-based access control
package travel_planner.governance
default allow_tool_call = false
allow_tool_call {
input.agent == "CurrencyConverterAgent"
input.tool == "get_exchange_rate"
time.weekday(time.now_ns()) != "Sunday" # Markets closed
}
Комбинация: простые вещи — в YAML, нетривиальная логика — в Rego/Cedar.
Интеграция с App Insights и OpenTelemetry
Каждое решение governance попадает в трассы OpenTelemetry и в Application Insights. В Agents View видны события:
Policy: api-allowlist → ALLOWED— агент вызвал разрешённый API.Policy: token-budget → ALLOWED— запрос уложился в лимит токенов.Policy: rate-limit → THROTTLED— превышен лимит запросов, вызов отложен.
Для анализа используются KQL‑запросы.
Пример: все нарушения политик за 24 часа:
// Find all governance policy violations in the last 24 hours
traces
| where timestamp > ago(24h)
| where customDimensions["governance.decision"] != "ALLOWED"
| extend
agentName = tostring(customDimensions["agent.name"]),
policyName = tostring(customDimensions["governance.policy"]),
decision = tostring(customDimensions["governance.decision"]),
violationReason = tostring(customDimensions["governance.reason"]),
targetUrl = tostring(customDimensions["tool.target_url"])
| project timestamp, agentName, policyName, decision, violationReason, targetUrl
| order by timestamp desc
И токен‑бюджет по агентам:
// Token budget consumption by agent over the last hour
customMetrics
| where timestamp > ago(1h)
| where name == "governance.tokens.consumed"
| extend agentName = tostring(customDimensions["agent.name"])
| summarize
totalTokens = sum(value),
avgTokensPerRequest = avg(value),
maxTokensPerRequest = max(value)
by agentName, bin(timestamp, 5m)
| order by totalTokens desc
SRE для агентов
Agent SRE добавляет в YAML SLO, circuit breakers и error budgets.
Пример SLO по латентности:
slos:
- name: weather-agent-latency
agent: "WeatherAdvisorAgent"
metric: latency-p99
target: 5000ms
window: 5m
Пример circuit breaker для всех агентов:
circuit-breakers:
- agent: "*"
failure-threshold: 5
recovery-timeout: 30s
half-open-max-calls: 2
Логика:
- 5 подряд неудачных вызовов — цепь "открывается";
- следующие запросы получают быстрый отказ, а не ждут таймаутов;
- через 30 секунд режим half‑open, 2 тестовых вызова;
- если они успешны — цепь закрывается, если нет — снова open.
Error budget можно связать с уровнем автономности: при исчерпании бюджетa toolkit снижает рискованные действия или вводит обязательное подтверждение человеком.
Архитектура на App Service
Высокоуровневая схема после включения governance:
┌─────────────────────────────────────────────────────────────────┐
│ Azure App Service │
│ ┌──────────────┐ ┌─────────────────────────────────────┐ │
│ │ Frontend │───▶│ ASP.NET Core API │ │
│ │ (Static) │ │ │ │
│ └──────────────┘ │ ┌─────────────────────────────┐ │ │
│ │ │ Coordinator Agent │ │ │
│ │ │ ┌───────┐ ┌────────────┐ │ │ │
│ │ │ │ OTel │─▶│ Governance │ │ │ │
│ │ │ └───────┘ │ Engine │ │ │ │
│ │ │ │ ┌────────┐ │ │ │ │
│ │ │ │ │Policies│ │ │ │ │
│ │ │ │ └────────┘ │ │ │ │
│ │ │ └─────┬──────┘ │ │ │
│ │ └───────────────────┼─────────┘ │ │
│ │ ┌───────────────────┼──────────┐ │ │
│ │ │ Specialist Agents │ │ │ │
│ │ │ (Currency, Weather, etc.) │ │ │
│ │ │ Each with OTel + Governance │ │ │
│ │ └──
App Service закрывает инфраструктурный уровень: Managed Identity, VNet, Private Endpoints, Easy Auth, deployment slots, Always‑on и WebJobs.
Что это значит для вас
Когда это нужно
Если вы запускаете в проде многокомпонентные агентные системы, которые:
- ходят во внешние API;
- обрабатывают пользовательские данные (включая PII);
- принимают автономные решения (планы, бронирования, транзакции);
— вам уже сейчас нужен контроль над тем, что именно агенты могут делать.
Риски без governance:
- Несанкционированные API‑вызовы — агент случайно или под влиянием prompt injection обращается к нежелательному сервису, сливает данные или тратит деньги.
- Утечка чувствительных данных — PII уходит в сторонние сервисы без согласия.
- Раздувание токен‑бюджета — рекурсивные цепочки агентов сжигают бюджет OpenAI‑подписок за минуты.
- Cascading failures — ошибка одного агента ломает весь workflow.
Agent Governance Toolkit даёт несколько практических рычагов:
- Жёсткий allowlist инструментов и API.
- Централизованные лимиты по токенам и запросам.
- SLO‑контракты на производительность и надёжность агентов.
- Audit trail, который можно показать безопасности и юридическому отделу.
Типовые сценарии
Подходит для:
- Корпоративных ассистентов с доступом к внутренним системам (CRM, ERP, базы клиентов).
- Автономных планировщиков (логистика, travel, закупки), которые принимают решения и вызывают сторонние API.
- Финтех‑агентов (скоринг, рекомендации, отчётность), где регуляторика и аудит критичны.
- SaaS‑платформ, которые дают клиентам собственных агентов и должны изолировать их друг от друга.
Менее полезен, если:
- у вас один простой чат‑бот без инструментов и внешних API;
- агенты работают только в тестовом окружении и не трогают реальные данные.
Региональные ограничения
Toolkit — это библиотека, а не облачный сервис. Сам код доступен в открытом репозитории.
Но пример из статьи опирается на Azure App Service, Azure OpenAI, Cosmos DB, Service Bus и Application Insights. Доступность этих сервисов и Azure в целом из России ограничена политикой Microsoft. Для продакшн‑сценариев в РФ потребуется либо зарубежная инфраструктура, либо аналогичный стек в другом облаке (но тогда интеграцию придётся адаптировать).
Место на рынке
Прямых цифр сравнения с другими системами управления агентами в материале нет. Но по набору функций можно провести параллели.
С чем это можно сравнить по духу:
- LangChain Guardrails / policy‑layers — добавляют валидацию и фильтрацию действий, но чаще работают на уровне prompt/response, а не полного OWASP‑набора рисков.
- Open Policy Agent (OPA) — мощная система политик для микросервисов; Agent Governance Toolkit использует Rego, но добавляет именно агентно‑специфические контексты и интеграцию с AI‑фреймворками.
- Простые allowlist‑фильтры в коде — многие команды сейчас вручную проверяют имена инструментов и URL. Toolkit даёт централизованный и проверяемый механизм, плюс audit и интеграцию с SRE‑паттернами.
Ключевое отличие Agent Governance Toolkit — он заточен под автономных агентов, а не просто HTTP‑сервисы. В ядре есть понятия "agent", "tool", "token budget", SLO для конкретных агентов, error budget, circuit breaker на уровне логики агента.
По стоимости:
- Сам toolkit — open source под MIT‑лицензией.
- Стоимость складывается из Azure‑ресурсов: App Service, Application Insights, Azure OpenAI и прочие компоненты. Конкретных цен в материале нет.
Как запустить
Ниже — последовательность шагов, если у вас уже есть многoагентное ASP.NET Core‑приложение на Azure App Service (как travel‑планнер из примера).
1. Установить NuGet‑пакет
В общий проект с агентами (TravelPlanner.Shared.csproj) добавить:
<ItemGroup>
<!-- Existing packages -->
<PackageReference Include="Azure.Monitor.OpenTelemetry.AspNetCore" Version="1.3.0">
<PackageReference Include="Microsoft.Agents.AI" Version="1.0.0">
<!-- NEW: Agent Governance Toolkit (single package, all features included) -->
<PackageReference Include="Microsoft.AgentGovernance" Version="3.0.2">
</PackageReference></PackageReference></PackageReference></ItemGroup>
2. Создать файл политик
В корне проекта положить governance-policies.yaml:
apiVersion: governance.toolkit/v1
name: travel-planner-governance
description: Policy enforcement for the multi-agent travel planner on App Service
scope: global
defaultAction: deny
rules:
- name: allow-currency-conversion
condition: "tool == 'ConvertCurrency'"
action: allow
priority: 10
description: Allow Currency Converter agent to call Frankfurter exchange rate API
- name: allow-weather-forecast
condition: "tool == 'GetWeatherForecast'"
action: allow
priority: 10
description: Allow Weather Advisor agent to call NWS forecast API
- name: allow-weather-alerts
condition: "tool == 'GetWeatherAlerts'"
action: allow
priority: 10
description: Allow Weather Advisor agent to check NWS weather alerts
Позже сюда можно добавить SLO, circuit breakers, лимиты токенов и сложные правила.
3. Обновить базовый класс агентов
Добавить GovernanceKernel через IServiceProvider и вызвать .UseGovernance:
using AgentGovernance;
using Microsoft.Extensions.DependencyInjection;
public abstract class BaseAgent : IAgent
{
protected readonly ILogger Logger;
protected readonly AgentOptions Options;
protected readonly AIAgent Agent;
// Constructor for simple agents without tools
protected BaseAgent(
ILogger logger,
IOptions<AgentOptions> options,
IChatClient chatClient,
IServiceProvider serviceProvider)
{
Logger = logger;
Options = options.Value;
var builder = new ChatClientAgent(
chatClient, instructions: Instructions,
name: AgentName, description: Description)
.AsBuilder()
.UseOpenTelemetry(sourceName: AgentName);
var kernel = serviceProvider.GetService<GovernanceKernel>();
if (kernel is not null)
builder.UseGovernance(kernel, AgentName);
Agent = builder.Build();
}
// Constructor for agents with tools
protected BaseAgent(
ILogger logger,
IOptions<AgentOptions> options,
IChatClient chatClient,
ChatOptions chatOptions,
IServiceProvider serviceProvider)
{
Logger = logger;
Options = options.Value;
var builder = new ChatClientAgent(
chatClient, instructions: Instructions,
name: AgentName, description: Description,
tools: chatOptions.Tools?.ToList())
.AsBuilder()
.UseOpenTelemetry(sourceName: AgentName);
var kernel = serviceProvider.GetService<GovernanceKernel>();
if (kernel is not null)
builder.UseGovernance(kernel, AgentName);
Agent = builder.Build();
}
// ... rest unchanged
}
4. Зарегистрировать GovernanceKernel в Program.cs
using AgentGovernance;
// ... existing builder setup ...
// Configure OpenTelemetry with Azure Monitor (existing — from Blog 2)
builder.Services.AddOpenTelemetry().UseAzureMonitor();
// NEW: Configure Agent Governance Toolkit
// Load policy from YAML, register as singleton. Agents resolve via IServiceProvider.
var policyPath = Path.Combine(builder.Environment.ContentRootPath, "governance-policies.yaml");
if (File.Exists(policyPath))
{
try
{
var yaml = File.ReadAllText(policyPath);
var kernel = new GovernanceKernel(new GovernanceOptions
{
EnableAudit = true,
EnableMetrics = true
});
kernel.LoadPolicyFromYaml(yaml);
builder.Services.AddSingleton(kernel);
Console.WriteLine($"[Governance] Loaded policies from {policyPath}");
}
catch (Exception ex)
{
Console.WriteLine($"[Governance] Failed to load: {ex.Message}. Running without governance.");
}
}
После деплоя в Azure App Service вы получаете:
- управляемые политики для всех агентов;
- audit trail в Application Insights;
- возможность менять правила через YAML и deployment slots без простоя.
Если вы уже запустили multi‑agent систему на Azure и дошли до вопроса «как не дать агентам натворить лишнего», Agent Governance Toolkit — это способ навести порядок без многонедельного рефакторинга.