Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo riferimento elenca la superficie agentServer SDK per la creazione di agenti ospitati resilienti e a esecuzione prolungata: primitive di attività resilienti, opzioni di risposte resilienti e registro di streaming. Per i concetti alla base di queste API, vedere Resilienza per gli agenti ospitati a esecuzione prolungata. Per le procedure dettagliate orientate alle attività, vedere le guide pratiche.
Note
Gli agenti a esecuzione prolungata sono in anteprima. Le API in questa pagina provengono dai azure-ai-agentserver pacchetti e sono soggette a modifiche.
Packages
Le API in questa pagina richiedono almeno le versioni del pacchetto seguenti. I pacchetti Python sono disponibili a livello generale; i pacchetti .NET sono in anteprima, installarli con --prerelease.
| Protocol | Python (versione minima) | .NET (versione minima) |
|---|---|---|
| Core (attività, streaming, archiviazione) |
azure-ai-agentserver-core ≥ 2.0.0 |
Azure.AI.AgentServer.Core ≥ 1.0.0-beta.28 |
| Responses |
azure-ai-agentserver-responses ≥ 2.0.0 |
Azure.AI.AgentServer.Responses ≥ 1.0.0-beta.8 |
| Invocazioni |
azure-ai-agentserver-invocations ≥ 1.0.0 |
Azure.AI.AgentServer.Invocations ≥ 1.0.0-beta.6 |
Note
Usare la versione più recente disponibile. Le versioni elencate sono i minimi che includono l'attività resiliente, le risposte resilienti e le API del Registro di sistema di streaming descritte qui.
Attività resilienti
Le primitive delle attività rendono resiliente un'unità di lavoro che si arresta in modo anomalo. La dichiarazione di un'attività abilita automaticamente l'analisi di ripristino di avvio.
Dichiarare un'attività
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) |
Lavoro resiliente a colpo singolo. Un input produce un risultato. |
@multi_turn_task(*, name, title=None, timeout=None, retry=None, steerable=False) |
Catena di conversazioni che rimane suspended tra turni. Impostare steerable=True per accodare un nuovo turno dietro quello attivo. |
Eseguire un'attività
# 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 | Restituzioni | Notes |
|---|---|---|
await task.run(*, input, task_id=None, if_last_input_id=None) |
Output |
Esegue fino al completamento e restituisce il risultato. |
task.start(*, input, task_id=None, if_last_input_id=None) |
TaskRun[Output] |
Restituisce un handle che è possibile attendere o annullare. |
TaskContext
Il gestore riceve un oggetto TaskContext che descrive il tentativo corrente.
Python (TaskContext[Input]) |
C# (TaskContext<T>) |
Description |
|---|---|---|
input |
Input |
Valore passato dal chiamante. Persistente prima dell'esecuzione del gestore. |
task_id |
TaskId |
Identità di lavoro durevole. |
input_id |
InputId |
Identità per turno/input. |
entry_mode |
EntryMode |
fresh, resumed o recovered. |
metadata |
Metadata |
Piccolo stato chiave-valore durevole (TaskMetadata). |
retry_attempt |
RetryAttempt |
0 al primo tentativo. |
| — | RecoveryCount |
Numero di ripristini di arresto anomalo per questo tentativo. |
is_steered_turn |
IsSteeredTurn |
True se questo turno è stato alzato di livello dalla coda di sterzata. |
pending_input_count |
PendingInputCount |
Numero di turni più recenti in coda. |
cancel |
Cancellation |
Segnale di annullamento cooperativo (qualsiasi causa). |
cancel_requested |
CancelRequested |
Causa: è stato richiesto un annullamento esplicito. |
timeout_exceeded |
TimeoutExceeded |
Causa: timeout per attività attivato. |
shutdown |
Shutdown |
Il contenitore viene arrestato. |
await ctx.exit_for_recovery() |
await ctx.ExitForRecoveryAsync() |
Rinviare il lavoro incompiuto; lascia il record in corso per una durata successiva. |
entry_mode
/
EntryMode valori:
| Value | Meaning |
|---|---|
fresh / Fresh |
Prima esecuzione per questo (task_id, input_id)oggetto . |
resumed / Resumed |
Turno successivo di una catena esistente. |
recovered / Recovered |
Una durata precedente ha eseguito questo tentativo e non è finito; richiamato nuovamente con l'input persistente. |
TaskRun
Handle restituito da start / StartAsync.
Python (TaskRun[Output]) |
C# (TaskRun<T>) |
Description |
|---|---|---|
task_id |
TaskId |
Identità di lavoro. |
input_id |
InputId |
Identità di input. |
metadata |
Metadata |
Riferimento ai metadati in tempo reale durante la fase di anteprima. |
is_queued |
IsQueued |
True se l'input è stato accodato dietro un turno di gestione attivo. |
await run.result() |
await run.GetResultAsync() |
Attendere l'output. |
await run.cancel() |
await run.CancelAsync() |
Annullare in modo cooperativo. |
await run |
run.GetAwaiter() |
Awaitable direttamente. |
Politica di ripetizione dei tentativi
I tentativi si applicano agli errori del gestore, non al ripristino di arresto anomalo del sistema. Il ripristino di arresto anomalo entra nuovamente nello stesso tentativo e non utilizza il budget di ripetizione dei tentativi.
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
Formula ritardata: min(initial_delay * backoff_coefficient ** attempt, max_delay).
Stato dell'attività ed eccezioni
TaskStatus (C#) / valori di stato: Pending, InProgress, Suspended, Completed.
| Python eccezione | Eccezione C# | Generato quando |
|---|---|---|
TaskConflictError |
TaskConflictException |
Un'attività simultanea non gestibile start ha raggiunto un'attività in anteprima. |
TaskCancelled |
TaskCancelledException |
L'esecuzione è stata annullata. |
TaskFailed |
TaskFailedException |
Il gestore non è riuscito terminalemente. |
TaskDeferred |
TaskDeferredException |
Il lavoro è stato posticipato per il ripristino. |
SteeringQueueFull |
SteeringQueueFullException |
La coda di sterzata è alla capacità. |
LastInputIdPreconditionFailed |
LastInputIdPreconditionFailedException |
if_last_input_id
/
IfLastInputId non corrispondeva. |
InputTooLarge |
InputTooLargeException |
L'input ha superato il limite del payload dell'attività (~10 MiB). |
Forzare il ripristino
La dichiarazione automatica di un'attività abilita l'analisi di ripristino. Forzare l'abilitazione quando le attività vengono registrate in modo differire dopo l'avvio dell'host.
from azure.ai.agentserver.core.tasks import set_resilient_tasks_enabled
set_resilient_tasks_enabled(True) # call at import time, before host startup
Opzioni di risposte resilienti
Impostare su ResponsesServerOptions quando si costruisce l'host. Entrambi i flag sono disattivati per impostazione predefinita.
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# | Default | Description |
|---|---|---|---|
resilient_background |
ResilientBackground |
False |
Richiamare nuovamente il gestore al riavvio. Si applica solo a store=true, background=true risposte. |
steerable_conversations |
SteerableConversations |
False |
Accoda un turno simultaneo invece di rifiutarlo. |
default_fetch_history_count |
DefaultFetchHistoryCount |
100 |
Numero massimo di elementi della cronologia idratati a turno. |
sse_keep_alive_interval_seconds |
— | None |
Intervallo keep-alive SSE. |
shutdown_grace_period_seconds |
— | 10 |
Secondi di attesa per il lavoro in corso di arresto. |
Riconoscimento del ripristino ResponseContext
Disponibile nel gestore della context risposta quando è abilitata la resilienza.
| Python | C# | Description |
|---|---|---|
context.is_recovery |
IsRecovery |
True quando il gestore è stato richiamato di nuovo dopo un arresto anomalo. |
context.persisted_response |
PersistedResponse |
Ultimo snapshot della risposta con checkpoint permanente. |
context.conversation_chain_metadata |
ConversationChainMetadata |
Piccoli riferimenti a turni incrociati e filigrane. |
| — | ConversationChainId |
Identità stabile della catena di conversazioni. |
context.is_steered_turn |
IsSteeredTurn |
True se questo turno è stato alzato di livello dalla coda di sterzata. |
context.pending_input_count |
PendingInputCount |
I turni più recenti sono in attesa nella coda. |
await context.exit_for_recovery() |
await ExitForRecoveryAsync() |
Rinvia per il ripristino all'arresto; lascia la risposta in_progress. |
Registro di streaming
Selezionare un backup all'avvio, quindi cercare i flussi in base a un ID per turno.
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()
| Configurator | Riproduci di nuovo | Sopravvive al riavvio |
|---|---|---|
use_in_memory_live() |
No | No |
use_in_memory_replay(*, cursor_fn=None, ttl_seconds=None) |
Sì, entro TTL | No |
use_file_backed_replay(*, storage_dir=None, cursor_fn=None, ttl_seconds=None, serializer=None, deserializer=None) |
Sì | Sì |
Operazioni del Registro di sistema: await streams.get_or_create(id), await streams.delete(id). Passare cursor_fn per abilitare subscribe(after=...) e last_cursor().
Eccezioni di streaming: EventStreamClosedError/EventStreamClosedException,EventStreamNotFoundException/EventStreamNotFoundError e la base .EventStreamError/EventStreamException