このリファレンスでは 、実行時間の長い回復性のあるホスト型エージェント (回復性のあるタスク プリミティブ、回復性のある応答オプション、ストリーミング レジストリ) を構築するための 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。