Informazioni di riferimento sulle API dell'agente a esecuzione prolungata (anteprima)

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)

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