Расширение устойчивых задач для Microsoft Agent Framework

Расширение задачи Durable Task для платформы Microsoft Agent Framework внедряет устойчивое выполнение непосредственно в Microsoft Agent Framework. Вы можете зарегистрировать агенты с расширением, чтобы сделать их автоматически устойчивыми с помощью постоянных сеансов, встроенных конечных точек API и распределенного масштабирования без изменений в логике агента.

Когда следует использовать устойчивые агенты

Выберите расширение для работы с устойчивыми задачами, когда это необходимо:

  • Состояние сохраняемой беседы — сеансы агента выживают сбои, перезапуски и масштабирование событий без потери контекста.
  • Оркестрация многоагентных систем — координация специализированных агентов в детерминированных рабочих процессах с автоматическим созданием контрольных точек и восстановлением после сбоев.
  • Длительные рабочие процессы — поддержка утверждений с вовлечением человека или запланированных ожиданий, которые могут длиться часы, дни или недели, не потребляя вычислительные ресурсы.
  • Масштабируемый, бессерверный хостинг — масштабируйтесь до тысяч одновременных сеансов агентов (или до нуля) в плане гибкого потребления Функции Azure.

Если вам не требуется устойчивое состояние или координация с несколькими агентами, возможно, достаточно стандартного агента Microsoft Agent Framework без расширения.

Tip

Пошаговое руководство по настройке, предварительным требованиям и развертыванию см. в статье tutorial on Microsoft Learn.

Architecture

Расширение внутренне реализует циклы агента на основе сущностей, где каждый сеанс агента является устойчивой сущностью, которая автоматически управляет состоянием беседы и контрольными точками.

Расширение поддерживает два подхода к размещению:

  • Функции Azure с помощью пакета интеграции Функции Azure.
  • Используйте собственные вычислительные ресурсы с помощью базового пакета.

Размещение агента

Определите своего агента, используя стандартный шаблон проектирования Microsoft Agent Framework, а затем расширьте его с помощью расширения Durable Task. Расширение автоматически обрабатывает сохраняемость сеансов, создание конечной точки и управление состояниями.

var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
    ?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT")
    ?? "gpt-4o-mini";

// Create an AI agent using the Microsoft Agent Framework pattern
AIAgent agent = new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
    .AsAIAgent(
        model: deploymentName,
        instructions: "You are a professional content writer who creates engaging, "
                    + "well-structured documents for any given topic.",
        name: "DocumentPublisher");

// One line to make the agent durable with serverless hosting
using IHost app = FunctionsApplication
    .CreateBuilder(args)
    .ConfigureFunctionsWebApplication()
    .ConfigureDurableAgents(options => options.AddAIAgent(agent))
    .Build();
app.Run();
var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
    ?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT")
    ?? "gpt-4o-mini";

// Create an AI agent using the Microsoft Agent Framework pattern
AIAgent agent = new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
    .AsAIAgent(
        model: deploymentName,
        instructions: "You are a professional content writer who creates engaging, "
                    + "well-structured documents for any given topic.",
        name: "DocumentPublisher");

// Host the agent with Durable Task Scheduler
string connectionString = "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None";

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.ConfigureDurableAgents(
            options => options.AddAIAgent(agent),
            workerBuilder: builder => builder.UseDurableTaskScheduler(connectionString),
            clientBuilder: builder => builder.UseDurableTaskScheduler(connectionString));
    })
    .Build();

await host.StartAsync();

Замечание

Примеры C# используют AIProjectClient из пакета Azure.AI.Projects, который является рекомендованным шаблоном для новых проектов. Примеры Python используют FoundryChatClient из agent_framework.azure. Оба клиента поддерживают .AsAIAgent() / .as_agent() расширение, которое интегрируется с расширением устойчивых задач. См. образцы на GitHub для последних ссылок на пакеты.

Мультиагентная оркестрация с устойчивым контрольным точкам

Вы можете координировать несколько специализированных агентов в рамках устойчивой оркестрации. Каждый вызов агента контролируется контрольной точкой, и оркестрация восстанавливается автоматически, если какой-либо шаг завершается ошибкой. Завершенные вызовы агента не выполняются повторно при восстановлении.

Используйте context.GetAgent() (C#) или app.get_agent() (Python) для восстановления зарегистрированных агентов в рамках оркестрации. Возвращенная DurableAIAgent оболочка гарантирует, что вызовы отслеживаются и сохраняются контрольные точки фреймворком.

В следующем примере показан последовательный рабочий процесс с несколькими агентами, в котором агент исследования собирает сведения, а агент записи создает документ.

[Function(nameof(DocumentPublishingOrchestration))]
public async Task<string> DocumentPublishingOrchestration(
    [OrchestrationTrigger] TaskOrchestrationContext context)
{
    var docRequest = context.GetInput<DocumentRequest>();

    DurableAIAgent researchAgent = context.GetAgent("ResearchAgent");
    DurableAIAgent writerAgent = context.GetAgent("DocumentPublisherAgent");

    // Step 1: Research the topic
    AgentResponse<ResearchResult> researchResult = await researchAgent
        .RunAsync<ResearchResult>(
            $"Research the following topic: {docRequest.Topic}");

    // Step 2: Write the document using the research findings
    AgentResponse<DocumentResponse> document = await writerAgent
        .RunAsync<DocumentResponse>(
            $"""Create a document about {docRequest.Topic}.
            Research findings: {researchResult.Result.Findings}""");

    // Step 3: Publish
    return await context.CallActivityAsync<string>(
        nameof(PublishDocument),
        new { docRequest.Topic, document.Result.Text });
}
static async Task<string> DocumentPublishingOrchestration(
    TaskOrchestrationContext context, DocumentRequest docRequest)
{
    DurableAIAgent researchAgent = context.GetAgent("ResearchAgent");
    DurableAIAgent writerAgent = context.GetAgent("DocumentPublisherAgent");

    // Step 1: Research the topic
    AgentResponse<ResearchResult> researchResult = await researchAgent
        .RunAsync<ResearchResult>(
            $"Research the following topic: {docRequest.Topic}");

    // Step 2: Write the document using the research findings
    AgentResponse<DocumentResponse> document = await writerAgent
        .RunAsync<DocumentResponse>(
            $"""Create a document about {docRequest.Topic}.
            Research findings: {researchResult.Result.Findings}""");

    // Step 3: Publish
    return await context.CallActivityAsync<string>(
        nameof(PublishDocument),
        new { docRequest.Topic, document.Result.Text });
}

Рабочие процессы на основе графов с платформой агента Microsoft

Расширение устойчивых задач также поддерживает рабочие процессы Microsoft Agent Framework, которые используют декларативную модель программирования на основе графов (WorkflowBuilder) для определения многоэтапных конвейеров исполнителей и агентов. Расширение автоматически выполняет чекпойнты каждого шага в графе и восстанавливается после сбоев без изменений в описании рабочего процесса.

Рабочие процессы дополняют оркестрации: используйте оркестрации для координации императивных агентов с условной логикой, а рабочие процессы — для фиксированных топологий графов с маршрутизацией сообщений, проверенной по типу.

Последовательный рабочий процесс

В следующем примере три исполнителя объединяются в рабочий процесс отмены заказа: поиск заказа, отмена его, а затем отправка сообщения электронной почты подтверждения.

OrderLookup orderLookup = new();
OrderCancel orderCancel = new();
SendEmail sendEmail = new();

Workflow cancelOrder = new WorkflowBuilder(orderLookup)
    .WithName("CancelOrder")
    .WithDescription("Cancel an order and notify the customer")
    .AddEdge(orderLookup, orderCancel)
    .AddEdge(orderCancel, sendEmail)
    .Build();

using IHost app = FunctionsApplication
    .CreateBuilder(args)
    .ConfigureFunctionsWebApplication()
    .ConfigureDurableWorkflows(workflows => workflows.AddWorkflows(cancelOrder))
    .Build();
app.Run();

Исполнители OrderLookup, OrderCancel и SendEmail являются стандартными исполнителями Microsoft Agent Framework без кода, связанного с Durable. Полные реализации см. в разделе samples on GitHub.

string dtsConnectionString = Environment.GetEnvironmentVariable("DURABLE_TASK_SCHEDULER_CONNECTION_STRING")
    ?? "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None";

OrderLookup orderLookup = new();
OrderCancel orderCancel = new();
SendEmail sendEmail = new();

Workflow cancelOrder = new WorkflowBuilder(orderLookup)
    .WithName("CancelOrder")
    .WithDescription("Cancel an order and notify the customer")
    .AddEdge(orderLookup, orderCancel)
    .AddEdge(orderCancel, sendEmail)
    .Build();

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.ConfigureDurableWorkflows(
            workflowOptions => workflowOptions.AddWorkflow(cancelOrder),
            workerBuilder: builder => builder.UseDurableTaskScheduler(dtsConnectionString),
            clientBuilder: builder => builder.UseDurableTaskScheduler(dtsConnectionString));
    })
    .Build();

await host.StartAsync();

IWorkflowClient workflowClient = host.Services.GetRequiredService<IWorkflowClient>();
IAwaitableWorkflowRun run = (IAwaitableWorkflowRun)await workflowClient.RunAsync(cancelOrder, "ORD-12345");
string? result = await run.WaitForCompletionAsync<string>();

Исполнители OrderLookup, OrderCancel и SendEmail являются стандартными исполнителями Microsoft Agent Framework без кода, связанного с Durable. Полные реализации см. в разделе samples on GitHub.

Рабочий процесс расширения и сужения (параллельный)

Вы можете распределять задачи на нескольких исполнителей или агентов, которые работают параллельно, а затем собрать результаты вместе. Следующий пример отправляет научный вопрос физику и химику параллельно, а затем агрегирует их ответы.

ChatClient chatClient = new AzureOpenAIClient(
    new Uri(endpoint), new DefaultAzureCredential()).GetChatClient(deploymentName);

AIAgent physicist = chatClient.AsAIAgent(
    "You are a physics expert. Be concise (2-3 sentences).", "Physicist");
AIAgent chemist = chatClient.AsAIAgent(
    "You are a chemistry expert. Be concise (2-3 sentences).", "Chemist");

ParseQuestionExecutor parseQuestion = new();
AggregatorExecutor aggregator = new();

Workflow workflow = new WorkflowBuilder(parseQuestion)
    .WithName("ExpertReview")
    .AddFanOutEdge(parseQuestion, [physicist, chemist])
    .AddFanInBarrierEdge([physicist, chemist], aggregator)
    .Build();

using IHost app = FunctionsApplication
    .CreateBuilder(args)
    .ConfigureFunctionsWebApplication()
    .ConfigureDurableWorkflows(workflows => workflows.AddWorkflows(workflow))
    .Build();
app.Run();

ParseQuestionExecutor и AggregatorExecutor являются стандартными исполнителями Microsoft Agent Framework без устойчивого кода. Полные реализации см. в разделе samples on GitHub.

string dtsConnectionString = Environment.GetEnvironmentVariable("DURABLE_TASK_SCHEDULER_CONNECTION_STRING")
    ?? "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None";

ChatClient chatClient = new AzureOpenAIClient(
    new Uri(endpoint), new DefaultAzureCredential()).GetChatClient(deploymentName);

ParseQuestionExecutor parseQuestion = new();
AIAgent physicist = chatClient.AsAIAgent(
    "You are a physics expert. Be concise (2-3 sentences).", "Physicist");
AIAgent chemist = chatClient.AsAIAgent(
    "You are a chemistry expert. Be concise (2-3 sentences).", "Chemist");
AggregatorExecutor aggregator = new();

Workflow workflow = new WorkflowBuilder(parseQuestion)
    .WithName("ExpertReview")
    .AddFanOutEdge(parseQuestion, [physicist, chemist])
    .AddFanInBarrierEdge([physicist, chemist], aggregator)
    .Build();

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.ConfigureDurableOptions(
            options => options.Workflows.AddWorkflow(workflow),
            workerBuilder: builder => builder.UseDurableTaskScheduler(dtsConnectionString),
            clientBuilder: builder => builder.UseDurableTaskScheduler(dtsConnectionString));
    })
    .Build();

await host.StartAsync();

IWorkflowClient workflowClient = host.Services.GetRequiredService<IWorkflowClient>();
IWorkflowRun run = await workflowClient.RunAsync(workflow, "Why is the sky blue?");

if (run is IAwaitableWorkflowRun awaitableRun)
{
    string? result = await awaitableRun.WaitForCompletionAsync<string>();
    Console.WriteLine(result);
}

ParseQuestionExecutor и AggregatorExecutor являются стандартными исполнителями Microsoft Agent Framework без устойчивого кода. Полные реализации см. в разделе samples on GitHub.

Рабочий процесс условной маршрутизации

Выполнение можно направлять в разные ветви на основе результатов выполнения процесса. В следующем примере агент обнаружения нежелательной почты используется для классификации электронной почты, после чего она направляется либо в агент-обработчик спама, либо к агенту-ассистенту по электронной почте.

AIAgent spamDetector = chatClient.AsAIAgent(
    "You are a spam detection assistant. Return JSON with is_spam (bool) and reason (string).",
    "SpamDetectionAgent");
AIAgent emailAssistant = chatClient.AsAIAgent(
    "You are an email assistant. Draft a professional response.",
    "EmailAssistantAgent");

SpamHandlerExecutor spamHandler = new();
EmailSenderExecutor emailSender = new();

Workflow workflow = new WorkflowBuilder(spamDetector)
    .WithName("EmailClassification")
    .AddSwitchCaseEdgeGroup(spamDetector, [
        new Case(condition: IsSpamDetected, target: spamHandler),
        new Default(target: emailAssistant),
    ])
    .AddEdge(emailAssistant, emailSender)
    .Build();

using IHost app = FunctionsApplication
    .CreateBuilder(args)
    .ConfigureFunctionsWebApplication()
    .ConfigureDurableWorkflows(workflows => workflows.AddWorkflows(workflow))
    .Build();
app.Run();

SpamHandlerExecutor и EmailSenderExecutor являются стандартными исполнителями Microsoft Agent Framework без устойчивого кода. Полные реализации см. в разделе samples on GitHub.

string dtsConnectionString = Environment.GetEnvironmentVariable("DURABLE_TASK_SCHEDULER_CONNECTION_STRING")
    ?? "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None";

ChatClient chatClient = new AzureOpenAIClient(
    new Uri(endpoint), new DefaultAzureCredential()).GetChatClient(deploymentName);

AIAgent spamDetector = chatClient.AsAIAgent(
    "You are a spam detection assistant. Return JSON with is_spam (bool) and reason (string).",
    "SpamDetectionAgent");
AIAgent emailAssistant = chatClient.AsAIAgent(
    "You are an email assistant. Draft a professional response.",
    "EmailAssistantAgent");

SpamHandlerExecutor spamHandler = new();
EmailSenderExecutor emailSender = new();

Workflow workflow = new WorkflowBuilder(spamDetector)
    .WithName("EmailClassification")
    .AddSwitchCaseEdgeGroup(spamDetector, [
        new Case(condition: IsSpamDetected, target: spamHandler),
        new Default(target: emailAssistant),
    ])
    .AddEdge(emailAssistant, emailSender)
    .Build();

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.ConfigureDurableWorkflows(
            workflowOptions => workflowOptions.AddWorkflow(workflow),
            workerBuilder: builder => builder.UseDurableTaskScheduler(dtsConnectionString),
            clientBuilder: builder => builder.UseDurableTaskScheduler(dtsConnectionString));
    })
    .Build();

await host.StartAsync();

IWorkflowClient workflowClient = host.Services.GetRequiredService<IWorkflowClient>();
IAwaitableWorkflowRun run = (IAwaitableWorkflowRun)await workflowClient.RunAsync(workflow, "Check this email for spam");
string? result = await run.WaitForCompletionAsync<string>();

SpamHandlerExecutor и EmailSenderExecutor являются стандартными исполнителями Microsoft Agent Framework без устойчивого кода. Полные реализации см. в разделе samples on GitHub.

Рабочий процесс "Человек в контуре" (HITL)

Вы можете приостановить выполнение рабочего процесса в указанных точках, чтобы ждать внешних входных данных перед продолжением. Модель рабочего процесса агента Microsoft Agent Framework использует узлы RequestPort (в .NET) или ctx.request_info() (в Python) для определения точек приостановки. В следующем примере реализуется рабочий процесс возмещения расходов с утверждением руководителя, за которым следует параллельное утверждение бюджета и соответствия требованиям.

CreateApprovalRequest createRequest = new();
RequestPort<ApprovalRequest, ApprovalResponse> managerApproval =
    RequestPort.Create<ApprovalRequest, ApprovalResponse>("ManagerApproval");
PrepareFinanceReview prepareFinanceReview = new();
RequestPort<ApprovalRequest, ApprovalResponse> budgetApproval =
    RequestPort.Create<ApprovalRequest, ApprovalResponse>("BudgetApproval");
RequestPort<ApprovalRequest, ApprovalResponse> complianceApproval =
    RequestPort.Create<ApprovalRequest, ApprovalResponse>("ComplianceApproval");
ExpenseReimburse reimburse = new();

Workflow expenseApproval = new WorkflowBuilder(createRequest)
    .WithName("ExpenseReimbursement")
    .WithDescription("Expense reimbursement with manager and parallel finance approvals")
    .AddEdge(createRequest, managerApproval)
    .AddEdge(managerApproval, prepareFinanceReview)
    .AddFanOutEdge(prepareFinanceReview, [budgetApproval, complianceApproval])
    .AddFanInBarrierEdge([budgetApproval, complianceApproval], reimburse)
    .Build();

using IHost app = FunctionsApplication
    .CreateBuilder(args)
    .ConfigureFunctionsWebApplication()
    .ConfigureDurableWorkflows(workflows =>
        workflows.AddWorkflow(expenseApproval, exposeStatusEndpoint: true))
    .Build();
app.Run();

Платформа автоматически создает три конечные точки HTTP для взаимодействия HITL.

  • POST /api/workflows/{name}/run : запуск рабочего процесса
  • GET /api/workflows/{name}/status/{id} : проверка состояния и ожидаемых одобрений
  • POST /api/workflows/{name}/respond/{id} : отправка ответа на утверждение для продолжения работы

Следующие типы записей определяют данные, поступающие через рабочий процесс:

public record ApprovalRequest(string ExpenseId, decimal Amount, string EmployeeName);
public record ApprovalResponse(bool Approved, string? Comments);

Исполнители CreateApprovalRequest, PrepareFinanceReview и ExpenseReimburse являются стандартными исполнителями Microsoft Agent Framework без кода, связанного с Durable. Полные реализации см. в разделе samples on GitHub.

string dtsConnectionString = Environment.GetEnvironmentVariable("DURABLE_TASK_SCHEDULER_CONNECTION_STRING")
    ?? "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None";

CreateApprovalRequest createRequest = new();
RequestPort<ApprovalRequest, ApprovalResponse> managerApproval =
    RequestPort.Create<ApprovalRequest, ApprovalResponse>("ManagerApproval");
PrepareFinanceReview prepareFinanceReview = new();
RequestPort<ApprovalRequest, ApprovalResponse> budgetApproval =
    RequestPort.Create<ApprovalRequest, ApprovalResponse>("BudgetApproval");
RequestPort<ApprovalRequest, ApprovalResponse> complianceApproval =
    RequestPort.Create<ApprovalRequest, ApprovalResponse>("ComplianceApproval");
ExpenseReimburse reimburse = new();

Workflow expenseApproval = new WorkflowBuilder(createRequest)
    .WithName("ExpenseReimbursement")
    .AddEdge(createRequest, managerApproval)
    .AddEdge(managerApproval, prepareFinanceReview)
    .AddFanOutEdge(prepareFinanceReview, [budgetApproval, complianceApproval])
    .AddFanInBarrierEdge([budgetApproval, complianceApproval], reimburse)
    .Build();

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.ConfigureDurableWorkflows(
            options => options.AddWorkflow(expenseApproval),
            workerBuilder: builder => builder.UseDurableTaskScheduler(dtsConnectionString),
            clientBuilder: builder => builder.UseDurableTaskScheduler(dtsConnectionString));
    })
    .Build();

await host.StartAsync();

IWorkflowClient workflowClient = host.Services.GetRequiredService<IWorkflowClient>();
IStreamingWorkflowRun run = await workflowClient.StreamAsync(expenseApproval, "EXP-2025-001");

await foreach (WorkflowEvent evt in run.WatchStreamAsync())
{
    switch (evt)
    {
        case DurableWorkflowWaitingForInputEvent requestEvent:
            Console.WriteLine($"Workflow paused at: {requestEvent.RequestPort.Id}");
            ApprovalResponse approval = new(Approved: true, Comments: "Approved.");
            await run.SendResponseAsync(requestEvent, approval);
            break;

        case DurableWorkflowCompletedEvent completedEvent:
            Console.WriteLine($"Workflow completed: {completedEvent.Result}");
            break;
    }
}

Следующие типы записей определяют данные, поступающие через рабочий процесс:

public record ApprovalRequest(string ExpenseId, decimal Amount, string EmployeeName);
public record ApprovalResponse(bool Approved, string? Comments);

Исполнители CreateApprovalRequest, PrepareFinanceReview и ExpenseReimburse являются стандартными исполнителями Microsoft Agent Framework без кода, связанного с Durable. Полные реализации см. в разделе samples on GitHub.

Панель мониторинга планировщика устойчивых задач

Используйте панель мониторинга планировщика устойчивых задач для полной видимости устойчивых агентов, оркестрации и рабочих процессов на основе графов:

  • Просмотр истории бесед для каждой сессии агента
  • Проверка вызовов инструмента и структурированных выходных данных
  • Трассировка потоков оркестрации и выполнения рабочих процессов
  • Мониторинг метрик производительности

Локальные разработки (с помощью эмулятора) и производственные развертывания используют одинаковые возможности панели мониторинга.

На следующем снимке экрана показан сеанс агента с журналом бесед и сведениями о сеансе:

Снимок экрана панели управления планировщиком долговечных задач, показывающей историю бесед агентов и детали сеансов.

На следующем снимке экрана показана детерминированная оркестровка с подробными сведениями о выполнении действия.

Снимок экрана: панель мониторинга планировщика устойчивых задач с детерминированным агентским представлением оркестрации.

Время жизни сеанса (TTL) для долговечных агентов

Сеансы с устойчивыми агентами автоматически сохраняют историю беседы и состояние, которые могут накапливаться бесконечно. Функция времени ожидания (TTL) обеспечивает автоматическую очистку бездействующих сеансов, предотвращая потребление ресурсов хранилища и увеличение затрат.

Если сеанс агента неактивен дольше, чем настроенный срок жизни, состояние сеанса автоматически удаляется. Каждое новое взаимодействие сбрасывает таймер TTL, продлевая время существования сеанса.

Значения по умолчанию

  • TTL по умолчанию: 14 дней
  • Минимальная задержка удаления TTL: 5 минут

Конфигурация

TTL можно настроить глобально или для каждого агента. После истечения срока действия сеанса агента удаляется все его состояние, включая журнал беседы и любые пользовательские данные состояния. Если сообщение отправляется в тот же сеанс после удаления, создается новый сеанс с новым журналом бесед.

Замечание

Конфигурация TTL в настоящее время доступна только в .NET.

services.ConfigureDurableAgents(
    options =>
    {
        // Set global default TTL to 7 days
        options.DefaultTimeToLive = TimeSpan.FromDays(7);

        // Agent with custom TTL of 1 day
        options.AddAIAgent(shortLivedAgent, timeToLive: TimeSpan.FromDays(1));

        // Agent with custom TTL of 90 days
        options.AddAIAgent(longLivedAgent, timeToLive: TimeSpan.FromDays(90));

        // Agent using global default (7 days)
        options.AddAIAgent(defaultAgent);

        // Agent with no TTL (never expires)
        options.AddAIAgent(permanentAgent, timeToLive: null);
    });

Известные ограничения

  • Максимальный размер беседы.
    Состояние сеанса агента, включая полный журнал бесед, зависит от ограничений размера состояния устойчивой серверной части. При использовании планировщика устойчивых задач максимальный размер состояния сущности составляет 1 МБ. Длительные беседы с объемными ответами на вызовы инструментов могут достичь этого предела. Сжатие журнала бесед необходимо выполнить мануально, например, запустив новый сеанс с агентом и подведя итоги предыдущего контекста.

  • Задержки.
    Все взаимодействия агента обрабатываются через Durable Task Scheduler, что добавляет задержку по сравнению с выполнением агента в памяти. Этот компромисс обеспечивает устойчивость и распределенное масштабирование.

  • Стриминг.
    Поскольку устойчивые агенты реализуются на основе устойчивых сущностей, базовая модель коммуникации — запрос или ответ. Потоковая передача (стриминг) поддерживается с помощью ответных вызовов (например, отправка токенов в поток Redis для потребления клиентом), при этом сущность возвращает полный ответ целиком после завершения стрима.

  • Срок действия TTL.
    Таймер TTL основан на времени по системным часам с момента последнего сообщения, а не суммарного времени активности. После удаления сеанса (с помощью срока действия TTL или удаления вручную) его журнал бесед не может быть восстановлен.

Дополнительные возможности

Следующие расширенные шаблоны доступны в samples на GitHub но подробно не рассматриваются в этой статье:

Рисунок Описание
Долговременные инструменты Агенты могут из вызовов инструментов запускать долговременные оркестрации, что позволяет инструментам работать в течение длительных периодов с отслеживанием хода выполнения.
Агент как средство MCP Предоставьте устойчивых агентов как инструменты Model Context Protocol (MCP), чтобы другие агенты или клиенты могли вызывать их через стандартный интерфейс.
Надежная потоковая передача Используйте Потоки Redis (или аналогичные транспорты) для возобновления потоковой передачи маркеров, которая выживает отключение клиента и повторное подключение.

Дальнейшие действия