実行時間の長いエージェント API リファレンス

このリファレンスでは 、実行時間の長い回復性のあるホスト型エージェント (回復性のあるタスク プリミティブ、回復性のある応答オプション、ストリーミング レジストリ) を構築するための AgentServer SDK サーフェスの一覧を示します。 これらの API の背後にある概念については、 実行時間の長いホステッド エージェントの回復性に関するページを参照してください。 タスク指向のチュートリアルについては、 ハウツー ガイドを参照してください。

Packages

このページの API には、少なくとも次の一般公開パッケージ バージョンが必要です。

プロトコル Python (最小バージョン) .NET (最小バージョン)
コア (タスク、ストリーミング、ストレージ) azure-ai-agentserver-core ≥ 2.0.0 Azure.AI.AgentServer.Core ≥ 1.0.0
Responses azure-ai-agentserver-responses ≥ 2.0.0 Azure.AI.AgentServer.Responses ≥ 1.0.0
呼び出し azure-ai-agentserver-invocations ≥ 1.0.0 Azure.AI.AgentServer.Invocations ≥ 1.0.0

Note

使用可能な最新バージョンを使用します。 ここに記載されているバージョンは、回復性のあるタスク、回復力のある応答、およびストリーミング レジストリ API を含む最小値です。

回復性のあるタスク

タスク プリミティブにより、作業単位がクラッシュ回復性を持つものになります。 回復性のあるタスク サブシステムは オプトインです。ホストの起動前に set_resilient_tasks_enabled(True) 呼び出して、フレームワークが TaskManager を構築し、スタートアップ回復スキャンを実行します ( 回復性のあるタスクを有効にするを参照)。

タスクを宣言する

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 つの結果が生成されます。
@multi_turn_task(*, name, title=None, timeout=None, retry=None, steerable=False) ターン間 suspended 維持される会話チェーン。 steerable=Trueを設定して、アクティブターンの背後に新しいターンをキューに入れます。

タスクを実行する

# 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 戻り値 メモ
await task.run(*, input, task_id=None, if_last_input_id=None) Output 完了まで実行され、結果が返されます。
task.start(*, input, task_id=None, if_last_input_id=None) TaskRun[Output] 待機またはキャンセルできるハンドルを返します。

TaskContext

ハンドラーは、現在の試行を説明する TaskContext を受け取ります。

Python (TaskContext[Input]) C# (TaskContext<T>) Description
input Input 呼び出し元が渡した値。 ハンドラーが実行される前に永続化されます。
task_id TaskId 永続的な作業 ID。
input_id InputId ターン単位または入力単位の ID。
entry_mode EntryMode fresh、resumed または recovered
metadata Metadata 永続的なキー値の状態が小さい (TaskMetadata)。
retry_attempt RetryAttempt 最初の試行で 0。
— RecoveryCount この試行のクラッシュ 復旧の数。
is_steered_turn IsSteeredTurn True このターンがステアリング キューから昇格された場合。
pending_input_count PendingInputCount キューに入れる新しいターンの数。
cancel Cancellation 協調キャンセル信号 (原因)。
cancel_requested CancelRequested 原因: 明示的な取り消しが要求されました。
timeout_exceeded TimeoutExceeded 原因: タスクごとのタイムアウトが発生しました。
shutdown Shutdown コンテナーがシャットダウン中です。
await ctx.exit_for_recovery() await ctx.ExitForRecoveryAsync() 未完了の作業を延期する。レコードは、後の有効期間中は進行中の状態になります。

entry_mode / EntryMode 値:

Value Meaning
fresh / Fresh この (task_id, input_id)の最初の実行。
resumed / Resumed 既存のチェーンの後続のターン。
recovered / Recovered 以前の有効期間でこの試行が実行され、完了しませんでした。永続化された入力を使用して再呼び出されます。

TaskRun

start / StartAsyncによって返されるハンドル。

Python (TaskRun[Output]) C# (TaskRun<T>) Description
task_id TaskId 作業 ID。
input_id InputId 入力 ID。
metadata Metadata 実行中のライブ メタデータ参照。
is_queued IsQueued True この入力がアクティブな操縦可能ターンの背後でキューに入れられていた場合。
await run.result() await run.GetResultAsync() 出力を待機します。
await run.cancel() await run.CancelAsync() 協調的に取り消します。
await run run.GetAwaiter() 直接待機可能。

再試行ポリシー

再試行は、クラッシュ回復ではなく、ハンドラーの障害に適用されます。 クラッシュ復旧は同じ試行を再入力し、再試行予算を消費しません。

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

遅延式: min(initial_delay * backoff_coefficient ** attempt, max_delay)。

タスクの状態と例外

TaskStatus (C#) / 状態の値: Pending、 InProgress、 Suspended、 Completed。

Python例外 C# 例外 発生日時
TaskConflictError TaskConflictException 同時に操作できない start が、実行中のタスクにヒットします。
TaskCancelled TaskCancelledException 実行が取り消されました。
TaskFailed TaskFailedException ハンドラーがターミナルで失敗しました。
TaskDeferred TaskDeferredException 復旧のために作業が延期されました。
SteeringQueueFull SteeringQueueFullException ステアリング キューは容量に入ります。
LastInputIdPreconditionFailed LastInputIdPreconditionFailedException if_last_input_id / IfLastInputId が一致しませんでした。
InputTooLarge InputTooLargeException 入力がタスク ペイロードの上限 (最大 10 MiB) を超えました。

回復性のあるタスクを有効にする

回復性のあるタスク サブシステムは オプトインです。 ホストの起動前 (通常はインポート時) にset_resilient_tasks_enabled(True)を呼び出して、AgentServerHostTaskManagerを構築し、スタートアップ回復スキャンを実行します。 これを指定しないと、get_task_manager()TaskManagerNotInitializedが発生し、.run() / .start()はタスクを実行できません。@taskまたは@multi_turn_taskを宣言しても、サブシステム自体は有効になりません。

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

回復性に優れた応答オプション

ホストを構築するときに ResponsesServerOptions に設定します。 両方のフラグの既定値は off です。

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 再起動時にハンドラーを再呼び出します。 store=true、background=true応答にのみ適用されます。
steerable_conversations SteerableConversations False 拒否するのではなく、同時ターンをキューに入れます。
default_fetch_history_count DefaultFetchHistoryCount 100 ターンごとにハイドレートされる履歴アイテムの最大数。
sse_keep_alive_interval_seconds — None SSE キープアライブ間隔。
shutdown_grace_period_seconds — 10 シャットダウン時に進行中の作業を待機する秒数。

回復対応 ResponseContext

回復性が有効な場合、応答ハンドラーの context で使用できます。

Python C# Description
context.is_recovery IsRecovery True クラッシュ後にハンドラーが再呼び出されたとき。
context.persisted_response PersistedResponse 永続的にチェックポイント処理された最後の応答スナップショット。
context.conversation_chain_metadata ConversationChainMetadata 小さなクロスターン参照と透かし。
— ConversationChainId 会話チェーンの安定した ID。
context.is_steered_turn IsSteeredTurn True このターンがステアリング キューから昇格された場合。
context.pending_input_count PendingInputCount 新しいターンはキューで待機します。
await context.exit_for_recovery() await ExitForRecoveryAsync() シャットダウン時の回復を延期します。は応答 in_progressを残します。

ストリーミング レジストリ

起動時に 1 つのバッキングを選択し、ターンごとの 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()
Configurator Replay 再起動後も存続
use_in_memory_live() × ×
use_in_memory_replay(*, cursor_fn=None, ttl_seconds=None) はい(TTL 内) ×
use_file_backed_replay(*, storage_dir=None, cursor_fn=None, ttl_seconds=None, serializer=None, deserializer=None) ○ ○

レジストリ操作: await streams.get_or_create(id)、 await streams.delete(id)。 cursor_fnを渡して、subscribe(after=...)とlast_cursor()を有効にします。

ストリーミング例外: EventStreamClosedError/EventStreamClosedException、 EventStreamNotFoundError/EventStreamNotFoundException、基本 EventStreamError/EventStreamException。