AIエージェント
durable execution とは:AIエージェントを中断から再開する仕組み
- durable execution
- AIエージェント
- ワークフロー
- Temporal
- AWS Lambda
- Pydantic AI
- durable functions
- ツール呼び出し
- チェックポイント
- 再生
- 冪等性
- 冪等キー
- アクティビティ
- ステップ
- 副作用
- ワーカー
- Temporal Server
- イベント履歴
- 再試行
- DBOS
- Restate
目次
言語モデルを何度も呼び、途中で外部のツールを使う AI エージェントは、一回の実行に長い時間がかかることがある。その間にプロセスが落ちる、時間切れになる、配備で入れ替わると、実行は最初からやり直しになる。やり直しでは、すでに払ったトークンの料金をもう一度払い、決済のように外部の状態を変えるツールの呼び出し(副作用)をもう一度動かす。
開発者はこれまで、各呼び出しの結果を保存し、再開時に読み戻し、失敗したら再試行する処理を自分で書いてきた。この処理は書き間違えやすく、保存と実行の順序を一つ誤ると、再開後の状態が元の実行とずれる。durable execution は、この保存と再開をエンジンに任せる仕組みを指す。エンジンは実行の途中経過を記録し、中断後は記録を使って続きから進める。
本稿は、Temporal と AWS Lambda durable functions を例に取る。Python のエージェントフレームワーク Pydantic AI は同じエージェントのコードにどちらか一方を付けられ、その統合文書が両方の仕組みと制約を書いているので、同じ条件で比べられる。Pydantic AI が対応するエンジンは、ほかに DBOS、Prefect、Restate など 6 つある1。
durable execution は、落ちたエージェントの実行をどうやって続きから再開させ、利用者には何を設計させるのか。
durable execution では、エンジンがモデル呼び出しとツール呼び出しの結果を一つずつ記録し、落ちた実行をコードの先頭から再生して、記録のある呼び出しには保存した結果を返すことで、実行を続きから再開させる。 記録と再開をエンジンに任せれば、完了した呼び出しは再開時に繰り返されず、結果を保存して読み戻す処理も自分で書かずに済む。ただし、どのエンジンを使っても、利用者が設計しなければならないことが二つある。一つは、記録の直前に落ちた呼び出しがもう一度動くので、副作用を冪等に(同じ呼び出しが二度届いても結果が一度分になるように)することである。もう一つは、旧版で始まった実行を新しいコードで再生すると壊れるので、実行の形や名前を変える変更を、実行中のものと版を分けて配備することである。二つのエンジンの主な違いは、Temporal Server とワーカーを用意するか、Lambda に記録を任せて Pydantic AI の統合の制約を受け入れるかにある。
五つの呼び出しからなる実行を、途中から再開する
※ この節の数値は説明のための仮定で、測定値ではありません。
注文を受けるエージェントが、次の五つの呼び出しを順に行うとする。エンジンは、呼び出しが終わるたびにその結果を記録する。
- モデル呼び出し:注文の内容を読んで手順を決める
- ツール:在庫を照会する
- モデル呼び出し:金額を確定する
- ツール:カードに 5,000 円を課金する
- モデル呼び出し:確認のメッセージを書く
場合 A:課金が成功した直後、その記録が書かれる前にプロセスが落ちる。 再開すると、エンジンはコードを先頭から実行し直し、記録のある呼び出しでは記録した結果を返す。
| 呼び出し | 再開後に起きること |
|---|---|
| 1〜3 | 記録した結果を返す。モデルの料金も在庫の照会も再び発生しない |
| 4 課金 | 記録が無いので、もう一度動く。カードには 2 回目の 5,000 円が課金される |
| 5 | 初めて実行される |
記録は 1〜3 の払い直しを防いだが、4 の二重課金は防げない。課金のツールに注文番号を冪等キーとして渡し、決済の側が同じキーの 2 回目には 1 回目の結果を返すようにして、初めて課金は 1 回になる。
場合 B:呼び出し 3 が記録されたあと、4 の前に実行が中断し、その間に、2 と 3 の間へ「与信を確認する」ツールを足したコードが配備された。 記録を呼び出しの順序で対応づけるエンジンで、旧版で始まったこの実行を新しいコードで再生(先頭から実行し直して記録と突き合わせること)すると、新しいコードの 3 番目(与信の確認)に、旧コードの 3 番目の記録(金額を確定したモデルの応答)が対応し、実行は壊れる。実行を、始まったときの版のコードのまま最後まで再生させれば、記録と呼び出しの対応は崩れない。
エンジンは、記録のある呼び出しに保存した結果を返して実行を再生する
エンジンが解く問題は、再開後に完了済みの仕事を繰り返さないことである。そのために、モデル呼び出しとツール呼び出しを一つずつ記録の単位にする。この単位を、Lambda はステップ、Temporal はアクティビティと呼ぶ。
再開は再生(replay)で行う。再生とは、コードを先頭から実行し直し、記録のある呼び出しでは実行せず、記録した結果を返す動作である。AWS の開発者ガイドは、再生では「コードは先頭から動き、完了したチェックポイントは飛ばして保存済みの結果を使う」と説明する2。Pydantic の Lambda 向けの文書は、モデル呼び出し、関数ツール、MCP の呼び出し、動的ツールセットの解決を、それぞれステップとして記録し、再開した実行は「すでに払った仕事を繰り返す代わりに」最後に完了したステップから続くと書く3。
Temporal も再生で回復する。文書は、それを働かせる鍵を、アプリケーションを二つに分けることに置く4。同じ入力で再実行すれば同じように動く決定的な部分をワークフロー、入出力を含む任意の処理をしてよい部分をアクティビティと呼び、ワークフローのコードからは入出力を外すよう求める。Pydantic AI では、モデル呼び出し、入出力を伴うツール呼び出し、MCP サーバーとのやり取りがアクティビティになり、それらを調整するエージェントのループがワークフローに入る4。再生のたびにワークフローが同じ呼び出しを同じ順序で出すことが、記録した結果を正しい呼び出しへ返す条件になる、というのは本稿の整理である。
実行の再開を、アプリの処理からエンジンへ移す動きが広がっている
背景で述べた保存と読み戻しの処理について、AWS は、複数ステップの処理を作る開発者がこれまで取った方法として、独自の状態管理ロジックの実装と、外部のオーケストレーションサービスの組み込みの二つを挙げる5。いまは、エージェントのフレームワークが、モデル呼び出しとツール呼び出しを単位にして記録をエンジンへ任せる。
この方向には、AWS と Pydantic が動いている。AWS は 2025-12-02 に US East (Ohio) で Lambda durable functions の一般提供を始めた5。2026-09-10 には Pydantic AI との統合を発表し、チェックポイントとやり直しの処理を利用者が書かずに済むと説明した6。Pydantic は Temporal と AWS の両方と統合を共同で保守し1、durable execution を任意のエンジンにつなぐ安定したビルダーを公開した7。旧来の TemporalAgent は非推奨にして、TemporalDurability へ寄せている4。
記録をどこに置くかで、運用の負担が分かれる
Temporal では、Temporal Server が実行の進行を追跡し、状態を内部のデータベースに保存する。ワークフローとアクティビティはワーカーが動かし、実際のアプリケーションではワーカーを別のサービスとして動かすこともある4。Lambda では記録を Lambda が持ち、利用者はサーバーを管理しない6。実行は最長で 1 年続き、待機の間は計算料金がかからない2。人の承認や外部の完了を長く待つ処理では、この性質が効く。
どちらのエンジンでも、機能を付けただけでは実行は記録されない。Temporal ではワークフローの中で動かした実行だけが記録される4。Lambda では、durable_agent_handler か run_durable を通った実行だけが記録され、agent.run_sync で直接呼ぶと、警告なしに記録のない実行になる3。
どちらを選ぶかは、チームが既に持つ基盤に加え、並列のツール実行、画面への配信、記録の量の要件で決まる(後の節で扱う)。Temporal はサーバーとワーカーを用意する代わりに、画面への配信や大きなデータの扱いを設定で広げられる。Lambda は運用を AWS に任せ、統合が切り替える逐次のツール実行と、配信の経路がないことを受け入れる。
記録の直前に落ちた副作用はもう一度動くので、冪等にする
冪等とは、同じ操作を繰り返しても、結果が一度だけ行った場合と変わらない性質を指す。AWS は、Lambda と Pydantic AI の統合が、再開時に顧客へ二重に課金するような副作用を避けるのに役立つと発表で書く6。それが効くのは、記録が書かれた呼び出しまでである。ステップは実行したあとで記録されるので、Pydantic の文書は、ツールの副作用と記録の間で中断すると再開時にツールが再実行されると書く3。Temporal でも、アクティビティが途中で失敗すると先頭から再実行される4。
再試行も同じ呼び出しを繰り返す。Lambda の SDK は既定で各呼び出しを最大 6 回、Temporal はモデル呼び出しを回数の上限なく試す34。Pydantic AI やモデル提供元のクライアントの再試行と重ねると回数が掛け算になるので、どちらの文書も片方を切るよう求める34。再試行を切っても記録の直前の中断は残るので、課金のような副作用には、注文ごとの冪等キーを相手に渡し、同じキーの 2 回目を相手の側で無視させる設計が要る。これはエンジンを替えても利用者が書く。
実行の形を変える変更は、実行中のものと版を分けて配備する
Lambda は、記録を呼び出しの到達順で対応づける。ツールや MCP サーバーの追加と削除、イベントハンドラーの追加、モデルの変更でステップの数や順序が変わると、旧版で始まった実行が壊れる。エージェントやツールセットの改名も、記録の名前を変える。実行は開始時に公開されていた版に固定されるので、新しい版を公開し、旧版の実行が終わるのを待つ3。
Temporal でも、エージェントの名前やツールセットの id を変えると、実行中のワークフローが壊れる4。実行の履歴を変える更新は、実行中のワークフローを終わらせてから入れるか、ワーカーのバージョニングか新しいタスクキューで入れると文書は書く4。どちらのエンジンでも、実行中のものと互換性のない変更を入れる手順を、運用に持つことになる。
並列のツール、画面への配信、記録の量は、エンジンと統合で違う
並列のツール実行では、Pydantic AI の Lambda 統合が、ステップを到達順で識別するために、記録する実行の中ではツール呼び出しを一つずつ実行する設定に切り替える3。Lambda の SDK 自体は並列の操作を持つ8。Temporal 向けの文書は、ツールを逐次へ切り替える記述を持たず、ツールのファンアウトが N 個のアクティビティを出す場合のペイロードの注意を書く9。並列の実行時の振る舞いは、本稿では確かめていない。
画面へのトークン配信では、Lambda の durable execution は完了時に値を一つ返すので、実行中に呼び出し元へ配信する経路がない3。Temporal は Workflow Streams で実時間の配信ができるが、往復ごとに約 100ms の遅延があり、モデル呼び出しが再試行されるとイベントが重複して届く4。
記録の量には、どちらのエンジンにも実行あたりの上限がある。Temporal は一つの実行のイベント履歴を 51,200 イベントか 50 MB までとし10、データ一件の既定の上限は 2MB である。次のモデル呼び出しに渡す履歴がこの上限を超えると、実行はエラーにならず無期限に再試行される9。Lambda は、実行全体で 3,000 操作と累積 100 MB の状態を上限にし、Pydantic の文書は大きなツール結果の代わりに S3 のキーなどの参照を返すよう勧める11。
本稿は二つのエンジンを動かしておらず、本文の数値は各社の文書の記述に基づく。
出典11件
-
Pydantic AI「Durable Execution」(2026-10-07 取得). https://github.com/pydantic/pydantic-ai/blob/main/docs/durable_execution/overview.md — 対応エンジンの一覧、一つのエージェントに一つ、保存とは別の問題という位置づけ。 ↩ ↩2
-
AWS「Lambda durable functions」開発者ガイド(2026-10-07 取得). https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html — チェックポイントと再生、最長 1 年、待機中は計算料金なし。 ↩ ↩2
-
Pydantic AI「AWS Lambda Durability」(2026-10-07 取得). https://github.com/pydantic/pydantic-ai/blob/main/docs/harness/aws-lambda.md — 各呼び出しをステップに記録し先頭から再生する仕組み。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Pydantic AI「Durable Execution with Temporal」(2026-10-07 取得). https://github.com/pydantic/pydantic-ai/blob/main/docs/durable_execution/temporal.md — ワークフローとアクティビティの分離、サーバーの役割、旧ラッパーの非推奨。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11
-
AWS「Lambda durable functions」What’s New, 2025-12. https://aws.amazon.com/about-aws/whats-new/2025/12/lambda-durable-multi-step-applications-ai-workflows/ — 発表の理由と、2025-12-02 の一般提供。 ↩ ↩2
-
AWS「Lambda durable functions と Pydantic AI の統合」What’s New, 2026-09-10. https://aws.amazon.com/about-aws/whats-new/2026/09/aws-lambda-durable-pydantic-ai/ — 完了済みの呼び出しを繰り返さず、トークンの再払いと、再開時の二重課金のような副作用を避けるという説明。 ↩ ↩2 ↩3
-
Pydantic AI「Building a durable execution backend」(2026-10-07 取得). https://github.com/pydantic/pydantic-ai/blob/main/docs/durable_execution/backends.md — 任意のエンジンを一つの安定したビルダーでつなぐ設計。 ↩
-
GitHub「aws/aws-durable-execution-sdk-python」(2026-10-07 取得). https://github.com/aws/aws-durable-execution-sdk-python — Lambda durable functions の Python SDK が並列と map の操作を持つこと。 ↩
-
Pydantic AI「Temporal, Large Payloads」(2026-10-07 取得). https://github.com/pydantic/pydantic-ai/blob/main/docs/durable_execution/temporal.md#large-payloads — 2MB の既定上限と、外部ストレージ退避が公開プレビューであること。 ↩ ↩2
-
Temporal「Workflow Execution limits」(2026-10-09 取得). https://docs.temporal.io/workflow-execution/limits — 一つの実行のイベント履歴は 51,200 イベントか 50 MB が上限で、10,240 イベントか 10 MB で警告が出る。 ↩
-
Pydantic AI「AWS Lambda Durability, Constraints」(2026-10-07 取得). https://github.com/pydantic/pydantic-ai/blob/main/docs/harness/aws-lambda.md#constraints — at-least-once、6 回の再試行、逐次、版、配信、予算の制約。 ↩
この記事はAIが執筆しています。内容には誤りが含まれる可能性があります。ご注意ください。