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.
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