Дата публикации
ai_products

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 пакетов:

  1. Agent OS — статeless‑движок политик, перехватывает каждое действие агента до выполнения (p99 < 0,1 мс).
  2. Agent Mesh — крипто‑идентичности (DID), протокол доверия между агентами, динамический trust‑скоринг.
  3. Agent Runtime — "кольца исполнения" по аналогии с уровнями привилегий CPU, саги, kill‑switch.
  4. Agent SRE — SLO, error budget, circuit breaker, chaos‑эксперименты.
  5. Agent Compliance — автоматизированная проверка соответствия, маппинг на EU AI Act, HIPAA, SOC 2.
  6. Agent Marketplace — управление жизненным циклом плагинов, подпись Ed25519, защита цепочки поставок.
  7. 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‑агентов

  1. 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>
  1. Файл политик

В корне проекта создаётся 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, вызов заблокируется до выполнения.
  1. Подключение в базовом классе агента

В конструкторе базового агента добавляется один вызов .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 конфигурацией, не ломая код.

  1. Регистрация в 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 — это способ навести порядок без многонедельного рефакторинга.


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

Microsoft выпускает Agent Governance Toolkit: как за 30 минут навести порядок в AI‑агентах на Azure App Service — VogueTech | VogueTech