Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Расширение задачи 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 (или аналогичные транспорты) для возобновления потоковой передачи маркеров, которая выживает отключение клиента и повторное подключение. |
Связанные ссылки
Полные примеры кода:
Полные примеры кода: