Api-Referenz für lange Zeit (Vorschau)

In dieser Referenz wird die AgentServer SDK-Oberfläche für die Erstellung langfristiger, ausfallsicherer gehosteter Agents aufgeführt: die Grundtypen für widerstandsfähige Aufgaben, die Optionen für robuste Antworten und die Streamingregistrierung. Die Konzepte hinter diesen APIs finden Sie unter Resilienz für lange ausgeführte gehostete Agents. Informationen zu aufgabenorientierten exemplarischen Vorgehensweisen finden Sie in den Anleitungen.

Note

Lange ausgeführte Agents befinden sich in der Vorschau. Die APIs auf dieser Seite stammen aus den azure-ai-agentserver Paketen und können geändert werden.

Pakete

Die APIs auf dieser Seite erfordern mindestens die folgenden Paketversionen. Die Python Pakete sind allgemein verfügbar. Die .NET Pakete befinden sich in der Vorschau – installieren Sie sie mit --prerelease.

Protocol Python (Mindestversion) .NET (Mindestversion)
Kern (Aufgaben, Streaming, Speicher) azure-ai-agentserver-core ≥ 2.0.0 Azure.AI.AgentServer.Core ≥ 1.0.0-beta.28
Antworten azure-ai-agentserver-responses ≥ 2.0.0 Azure.AI.AgentServer.Responses ≥ 1.0.0-beta.8
Aufrufe azure-ai-agentserver-invocations ≥ 1.0.0 Azure.AI.AgentServer.Invocations ≥ 1.0.0-beta.6

Note

Verwenden Sie die neueste verfügbare Version. Die aufgeführten Versionen sind die Mindestwerte, die die hier beschriebenen ausfallsicheren Aufgaben, resilienten Antworten und Streamingregistrierungs-APIs enthalten.

Robuste Aufgaben

Die Vorgangsgrundtypen machen eine Arbeitseinheit absturzsicher. Durch das Deklarieren einer Aufgabe wird die Überprüfung der Startwiederherstellung automatisch aktiviert.

Deklarieren einer Aufgabe

from datetime import timedelta
from azure.ai.agentserver.core.tasks import task, multi_turn_task, TaskContext, RetryPolicy

@task(name="summarize", timeout=timedelta(minutes=10), retry=RetryPolicy())
async def summarize(ctx: TaskContext[str]) -> str:
    ...

@multi_turn_task(name="chat", steerable=True)
async def chat(ctx: TaskContext[dict]) -> dict:
    ...
Decorator Purpose
@task(*, name, title=None, timeout=None, retry=None) 1:1-widerstandsfähige Arbeit. Eine Eingabe erzeugt ein Ergebnis.
@multi_turn_task(*, name, title=None, timeout=None, retry=None, steerable=False) Eine Unterhaltungskette, die zwischen Drehungen verbleibt suspended . Legen Sie steerable=True fest, dass eine neue Drehung hinter dem aktiven in die Warteschlange gestellt wird.

Ausführen einer Aufgabe

# One-shot: run returns the output directly.
result = await summarize.run(input="...")

# Multi-turn: same task_id resumes the chain; if_last_input_id enforces ordering.
r = await chat.run(task_id="conv-7", input={"msg": "hi"}, if_last_input_id=prev_id)

# Fire-and-track: start returns a TaskRun handle.
run = await chat.start(task_id="conv-7", input={"msg": "hi"})
Call Rückgabe Hinweise
await task.run(*, input, task_id=None, if_last_input_id=None) Output Wird zum Abschluss ausgeführt und gibt das Ergebnis zurück.
task.start(*, input, task_id=None, if_last_input_id=None) TaskRun[Output] Gibt ein Handle zurück, das Sie warten oder abbrechen können.

TaskContext

Der Handler empfängt einen TaskContext beschreibenden aktuellen Versuch.

Python (TaskContext[Input]) C# (TaskContext<T>) Description
input Input Der Wert, den der Aufrufer übergeben hat. Beibehalten, bevor der Handler ausgeführt wird.
task_id TaskId Die dauerhafte Arbeitsidentität.
input_id InputId Die Pro-Turn-/Eingabeidentität.
entry_mode EntryMode fresh, resumed oder recovered.
metadata Metadata Kleiner dauerhafter Schlüsselwertzustand (TaskMetadata).
retry_attempt RetryAttempt 0 beim ersten Versuch.
RecoveryCount Anzahl der Absturzwennungen für diesen Versuch.
is_steered_turn IsSteeredTurn True wenn diese Drehung von der Lenkwarteschlange heraufgestuft wurde.
pending_input_count PendingInputCount Wie viele neuere Kurven in die Warteschlange gestellt werden.
cancel Cancellation Kooperatives Abbruchsignal (beliebige Ursache).
cancel_requested CancelRequested Ursache: Ein expliziter Abbruch wurde angefordert.
timeout_exceeded TimeoutExceeded Ursache: Das Timeout pro Aufgabe wurde ausgelöst.
shutdown Shutdown Der Container wird heruntergefahren.
await ctx.exit_for_recovery() await ctx.ExitForRecoveryAsync() Nicht abgeschlossene Arbeit zurückstellen; lässt den Datensatz für eine spätere Lebensdauer in Bearbeitung.

entry_mode / EntryMode werte:

Wert Dies bedeutet
fresh / Fresh Erste Ausführung für dieses (task_id, input_id).
resumed / Resumed Eine nachfolgende Wende einer vorhandenen Kette.
recovered / Recovered Ein vorheriger Lebenszyklus hat diesen Versuch ausgeführt und nicht abgeschlossen. wird mit der beibehaltenen Eingabe erneut aufgerufen.

TaskRun

Der von start / StartAsync.

Python (TaskRun[Output]) C# (TaskRun<T>) Description
task_id TaskId Die Arbeitsidentität.
input_id InputId Die Eingabeidentität.
metadata Metadata Livemetadatenverweis während des Fluges.
is_queued IsQueued True wenn diese Eingabe hinter einer aktiven lenkbaren Drehung in die Warteschlange gestellt wurde.
await run.result() await run.GetResultAsync() Warten Sie auf die Ausgabe.
await run.cancel() await run.CancelAsync() Kooperativ kündigen.
await run run.GetAwaiter() Direkt abwartbar.

Richtlinie für Wiederholungsversuche

Wiederholungen gelten für Handlerfehler, nicht für die Absturzwiederherstellung. Die Absturzwiederherstellung gibt denselben Versuch erneut ein und verbraucht kein Wiederholungsbudget.

from azure.ai.agentserver.core.tasks import RetryPolicy

RetryPolicy(
    initial_delay=timedelta(seconds=1),   # base delay
    backoff_coefficient=2.0,              # multiplier per attempt (>= 1.0)
    max_delay=timedelta(seconds=60),      # cap
    max_attempts=3,                       # total tries, including the first
)
RetryPolicy.no_retry()                    # single attempt

Verzögerungsformel: min(initial_delay * backoff_coefficient ** attempt, max_delay).

Vorgangsstatus und Ausnahmen

TaskStatus (C#) / Statuswerte: Pending, InProgress, Suspended, Completed.

Ausnahme Python C#-Ausnahme Wird ausgelöst, wenn
TaskConflictError TaskConflictException Gleichzeitiges nicht lenkbares start Treffen eines In-Flight-Vorgangs.
TaskCancelled TaskCancelledException Die Ausführung wurde abgebrochen.
TaskFailed TaskFailedException Der Handler konnte nicht terminalisch ausgeführt werden.
TaskDeferred TaskDeferredException Die Arbeit wurde für die Wiederherstellung zurückgestellt.
SteeringQueueFull SteeringQueueFullException Die Lenkwarteschleife ist in der Kapazität.
LastInputIdPreconditionFailed LastInputIdPreconditionFailedException if_last_input_id / IfLastInputId nicht übereinstimmen.
InputTooLarge InputTooLargeException Die Eingabe hat den Grenzwert für die Vorgangsnutzlast überschritten (~10 MiB).

Wiederherstellung erzwingen

Durch das Deklarieren einer Aufgabe wird der Wiederherstellungsscan automatisch aktiviert. Erzwingen sie, wenn Aufgaben nach dem Hoststart lazily registriert werden.

from azure.ai.agentserver.core.tasks import set_resilient_tasks_enabled
set_resilient_tasks_enabled(True)   # call at import time, before host startup

Optionen für robuste Antworten

Wird beim Erstellen des Hosts aktiviert ResponsesServerOptions . Beide Flags sind standardmäßig deaktiviert.

from azure.ai.agentserver.responses import ResponsesAgentServerHost, ResponsesServerOptions

app = ResponsesAgentServerHost(
    options=ResponsesServerOptions(
        resilient_background=True,       # re-invoke stored background responses after a crash
        steerable_conversations=True,    # queue a new turn instead of 409 conversation_locked
        default_fetch_history_count=100,
        sse_keep_alive_interval_seconds=None,
        shutdown_grace_period_seconds=10,
    ),
)
Python C# Vorgabe Description
resilient_background ResilientBackground False Rufen Sie den Handler beim Neustart erneut auf. Gilt nur für store=trueAntworten. background=true
steerable_conversations SteerableConversations False Führen Sie eine gleichzeitige Warteschlange aus, anstatt sie abzulehnen.
default_fetch_history_count DefaultFetchHistoryCount 100 Max. Verlaufselemente pro Drehung hydratisiert.
sse_keep_alive_interval_seconds None SSE-Keep-Alive-Intervall.
shutdown_grace_period_seconds 10 Sekunden, bis die In-Flight-Arbeit beim Herunterfahren wartet.

Wiederherstellungsfähig ResponseContext

Verfügbar für die Resilienz des Antworthandlers context , wenn Resilienz aktiviert ist.

Python C# Description
context.is_recovery IsRecovery True wenn der Handler nach einem Absturz erneut aufgerufen wurde.
context.persisted_response PersistedResponse Die letzte dauerhaft überprüfte Antwortmomentaufnahme.
context.conversation_chain_metadata ConversationChainMetadata Kleine Querverweise und Wasserzeichen.
ConversationChainId Stabile Identität der Unterhaltungskette.
context.is_steered_turn IsSteeredTurn True wenn diese Drehung von der Lenkwarteschlange heraufgestuft wurde.
context.pending_input_count PendingInputCount Neuer wird in der Warteschleife gewartet.
await context.exit_for_recovery() await ExitForRecoveryAsync() Zurückstellung für die Wiederherstellung beim Herunterfahren; verlässt die Antwort in_progress.

Streamingregistrierung

Wählen Sie eine Sicherung beim Start aus, und suchen Sie dann die Datenströme nach einer einzelnen Turn-ID.

from azure.ai.agentserver.core.streaming import streams

streams.use_in_memory_live()                                        # no replay, no restart survival
streams.use_in_memory_replay(cursor_fn=lambda e: e["n"], ttl_seconds=600)
streams.use_file_backed_replay(storage_dir=Path("/streams"),
                               cursor_fn=lambda e: e["n"])

stream = await streams.get_or_create(invocation_id)
await stream.emit({"n": 0, "delta": "..."})
async for event in stream.subscribe(after=last_cursor):
    ...
await stream.close()
Konfigurator Wiedergabe Überleben des Neustarts
use_in_memory_live() No No
use_in_memory_replay(*, cursor_fn=None, ttl_seconds=None) Ja, innerhalb von TTL No
use_file_backed_replay(*, storage_dir=None, cursor_fn=None, ttl_seconds=None, serializer=None, deserializer=None) Ja Ja

Registrierungsvorgänge: await streams.get_or_create(id), await streams.delete(id). Übergeben cursor_fn , um das Feature zu aktivieren subscribe(after=...) und last_cursor().

Streaming-Ausnahmen: EventStreamClosedError/EventStreamClosedException,EventStreamNotFoundException/EventStreamNotFoundError , und die Basis .EventStreamError/EventStreamException