Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die erweiterung Durable Task for Microsoft Agent Framework bringt durable execution direkt in das Microsoft Agent Framework. Sie können Agents mit der Erweiterung registrieren, um sie automatisch mit persistenten Sitzungen, integrierten API-Endpunkten und verteilter Skalierung – ohne Änderungen an Ihrer Agentlogik – dauerhaft zu machen.
Die Erweiterung implementiert intern entitätsbasierte Agenten-Schleifen, wobei jede Agenten-Sitzung eine dauerhafte Entität ist, die den Konversationsstatus und die Checkpoint-Verwaltung automatisch verwaltet.
Die Erweiterung unterstützt zwei Hostingansätze:
- Azure Functions mit dem Azure Functions Integrationspaket.
- Bringen Sie Ihre eigene Berechnung mithilfe des Basispakets mit.
Agenthosting
Definieren Sie Ihren Agent mithilfe des standardmäßigen Microsoft Agent Framework-Musters, und verbessern Sie ihn dann mit der Erweiterung "Durable Task". Die Erweiterung behandelt die Sitzungspersistenz, die Endpunkterstellung und die Zustandsverwaltung automatisch.
var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME")
?? throw new InvalidOperationException("AZURE_OPENAI_DEPLOYMENT_NAME is not set.");
AIAgent agent = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
.GetChatClient(deploymentName)
.AsAIAgent(
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_NAME")
?? throw new InvalidOperationException("AZURE_OPENAI_DEPLOYMENT_NAME is not set.");
AIAgent agent = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
.GetChatClient(deploymentName)
.AsAIAgent(
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();
Multi-Agent-Orchestrierung
Sie können mehrere spezialisierte Agenten als Schritte in einer dauerhaften Orchestrierung koordinieren. Jeder Agentanruf wird überprüft, und die Orchestrierung wird automatisch wiederhergestellt, wenn ein Schritt fehlschlägt. Abgeschlossene Agent-Aufrufe werden bei der Wiederherstellung nicht erneut ausgeführt.
Das folgende Beispiel zeigt einen sequenziellen Multi-Agent-Workflow, in dem ein Recherche-Agent Informationen sammelt und ein Writer-Agent ein Dokument erzeugt.
[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 });
}
Graphbasierte Workflows
Die Erweiterung "Durable Task" unterstützt auch Microsoft Agent Framework-Workflows, die ein deklaratives, graphbasiertes Programmiermodell (WorkflowBuilder) verwenden, um mehrstufige Pipelines von Executoren und Agents zu definieren. Die Erweiterung sichert automatisch jeden Schritt im Graphen und behebt Fehler, ohne dass Änderungen an der Workflow-Definition erforderlich sind.
Sequenzieller Workflow
Im folgenden Beispiel werden drei Executoren in einen Bestellabbruchworkflow verkettet: Suchen Sie die Bestellung nach, kündigen Sie sie, und senden Sie dann eine Bestätigungs-E-Mail.
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();
Die OrderLookup, OrderCancel und SendEmail-Executoren sind Standardmäßige Microsoft Agent Framework-Executoren ohne durable-spezifischen Code. Vollständige Implementierungen finden Sie unter samples auf 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>();
Die OrderLookup, OrderCancel und SendEmail-Executoren sind Standardmäßige Microsoft Agent Framework-Executoren ohne durable-spezifischen Code. Vollständige Implementierungen finden Sie unter samples auf GitHub.
Fanout-/Fan-In-Workflow (gleichzeitig)
Sie können mehrere Ausführende oder Agents ausfächern, die parallel ausgeführt werden, und dann die Ergebnisse zusammenzufassen. Im folgenden Beispiel wird parallel eine Wissenschaftsfrage an einen Physiker und Chemiker gesendet und dann ihre Antworten aggregiert.
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();
Die ParseQuestionExecutor und AggregatorExecutor sind Standard-Microsoft Agent Framework-Executoren ohne dauerhaften Code. Vollständige Implementierungen finden Sie unter samples auf 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);
}
Die ParseQuestionExecutor und AggregatorExecutor sind Standard-Microsoft Agent Framework-Executoren ohne dauerhaften Code. Vollständige Implementierungen finden Sie unter samples auf GitHub.
Workflow für bedingtes Routing
Sie können die Ausführung basierend auf Laufzeitergebnissen an verschiedene Verzweigungen weiterleiten. Im folgenden Beispiel wird ein Spamerkennungs-Agent verwendet, um eingehende E-Mails zu klassifizieren, und leitet dann entweder an einen Spamhandler oder einen Agent des E-Mail-Assistenten weiter.
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();
Die SpamHandlerExecutor und EmailSenderExecutor sind Standard-Microsoft Agent Framework-Executoren ohne dauerhaften Code. Vollständige Implementierungen finden Sie unter samples auf 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>();
Die SpamHandlerExecutor und EmailSenderExecutor sind Standard-Microsoft Agent Framework-Executoren ohne dauerhaften Code. Vollständige Implementierungen finden Sie unter samples auf GitHub.
Human-in-the-Loop (HITL)-Workflow
Sie können die Workflowausführung an bestimmten Punkten anhalten, um auf externe Eingaben zu warten, bevor Sie fortfahren. Das Workflowmodell Microsoft Agent Framework verwendet RequestPort Knoten (in .NET) oder ctx.request_info() (in Python), um Pausenpunkte zu definieren. Im folgenden Beispiel wird ein Spesenerstattungsworkflow mit einer Managergenehmigung implementiert, gefolgt von parallelen Budget- und Compliancegenehmigungen.
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();
Das Framework generiert automatisch drei HTTP-Endpunkte für HITL-Interaktion.
-
POST /api/workflows/{name}/run: Starten des Workflows -
GET /api/workflows/{name}/status/{id}: Status überprüfen und ausstehende Freigaben -
POST /api/workflows/{name}/respond/{id}: Genehmigungsantwort senden, um fortzunehmen
Die folgenden Datensatztypen definieren die Daten, die über den Workflow fließen:
public record ApprovalRequest(string ExpenseId, decimal Amount, string EmployeeName);
public record ApprovalResponse(bool Approved, string? Comments);
Die CreateApprovalRequest, PrepareFinanceReview und ExpenseReimburse-Executoren sind Standardmäßige Microsoft Agent Framework-Executoren ohne durable-spezifischen Code. Vollständige Implementierungen finden Sie unter samples auf 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;
}
}
Die folgenden Datensatztypen definieren die Daten, die über den Workflow fließen:
public record ApprovalRequest(string ExpenseId, decimal Amount, string EmployeeName);
public record ApprovalResponse(bool Approved, string? Comments);
Die CreateApprovalRequest, PrepareFinanceReview und ExpenseReimburse-Executoren sind Standardmäßige Microsoft Agent Framework-Executoren ohne durable-spezifischen Code. Vollständige Implementierungen finden Sie unter samples auf GitHub.
Dashboard für den langlebigen Aufgabenplaner
Verwenden Sie das Dashboard "Durable Task Scheduler", um vollständige Einblicke in Ihre Durable Agents, Orchestrierungen und graphbasierten Workflows zu erhalten.
- Anzeigen des Unterhaltungsverlaufs für jede Agentsitzung
- Überprüfen von Toolaufrufen und strukturierten Ausgaben
- Ablaufverfolgung von Orchestrierungs- und Workflowausführungsabläufen
- Überwachen von Leistungsmetriken
Sowohl lokale Entwicklung (über den Emulator) als auch Produktionsbereitstellungen weisen die gleiche Dashboarderfahrung auf.
Der folgende Screenshot zeigt eine Agentsitzung mit seinen Unterhaltungsverlauf und Sitzungsdetails:
Der folgende Screenshot zeigt eine deterministische Orchestrierung mit Details zur Aktivitätsausführung:
Sitzungs-Lebensdauer (TTL)
Dauerhafte Agenten-Sitzungen verwalten automatisch den Gesprächsverlauf und Status, die sich unbegrenzt ansammeln können. Das Feature "Time-to-Live" (TTL) sorgt für eine automatische Bereinigung von Leerlaufsitzungen und verhindert so die unnötige Beanspruchung von Speicherressourcen und das Entstehen zusätzlicher Kosten.
Wenn eine Agentsitzung länger als der konfigurierte TTL-Zeitraum im Leerlauf ist, wird der Sitzungsstatus automatisch gelöscht. Jede neue Interaktion setzt den TTL-Timer zurück und erweitert die Lebensdauer der Sitzung.
Standardwerte
- Standard-TTL: 14 Tage
- Minimale TTL-Löschverzögerung: 5 Minuten
Konfiguration
TTL kann global oder pro Agent konfiguriert werden. Wenn eine Agentensitzung abläuft, wird der gesamte Sitzungszustand gelöscht, einschließlich des Konversationsverlaufs und benutzerdefinierter Zustandsdaten. Wenn eine Nachricht nach dem Löschen an dieselbe Sitzung gesendet wird, wird eine neue Sitzung mit einem neuen Unterhaltungsverlauf erstellt.
Hinweis
Die TTL-Konfiguration ist derzeit nur in .NET verfügbar.
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);
});
Bekannte Einschränkungen
Maximale Konversationsgröße.
Der Status der Agentensitzung, einschließlich des vollständigen Unterhaltungsverlaufs, unterliegt den Grenzwerten für die Statusgröße des beständigen Backends. Bei Verwendung des Durable Task Scheduler beträgt die maximale Entitätsstatusgröße 1 MB. Lange laufende Unterhaltungen mit umfangreichen Toolanrufantworten können diesen Grenzwert erreichen. Die Komprimierung des Unterhaltungsverlaufs muss z. B. manuell erfolgen, indem eine neue Agentsitzung gestartet und der vorherige Kontext zusammengefasst wird.Latenz.
Alle Agentinteraktionen werden über den Durable Task Scheduler weitergeleitet, was im Vergleich zur Ausführung im Speicher eine höhere Latenz verursacht. Dieser Kompromiss bietet Haltbarkeit und verteilte Skalierung.Streaming.
Da dauerhafte Agents auf dauerhaften Entitäten implementiert werden, ist das zugrunde liegende Kommunikationsmodell Anforderung/Antwort. Streaming wird durch Antwortrückrufe unterstützt (z. B. Push-Token an einen Redis-Stream zur Nutzung durch den Client), indem die Entität die vollständige Antwort zurückgibt, nachdem der Stream beendet wurde.TTL-Ablaufzeit.
Der TTL-Zeitgeber basiert auf der Wanduhrzeit seit der letzten Nachricht, nicht auf der kumulierten Aktivitätszeit. Sobald eine Sitzung gelöscht wurde (durch den TTL-Verfall oder manuelle Löschung), kann der Unterhaltungsverlauf nicht wiederhergestellt werden.
Verwandte Links
Vollständige Codebeispiele:
Vollständige Codebeispiele: