Blog Post

Microsoft Developer Community Blog
4 MIN READ

Durable Task Extension for Microsoft Agent Framework で、堅牢なエージェントを構築する

Madoka Chiyoda's avatar
Nov 19, 2025

あなたの AI エージェントが、すべて自動で、クラッシュから復旧し、数千のインスタンスで分散実行され、人間の入力 (承認) を何週間も待ち続けることができ、しかもアイドル状態ではコストゼロで動くようになることを想像してみてください

(これは 2025/11/13 に出された製品チームの記事『Bulletproof agents with the durable task extension for Microsoft Agent Framework』を日本語に翻訳したものです。)

 

本日 (2025/11/13)、Durable Task Extension for Microsoft Agent Framework のパブリックプレビューを発表できることを大変うれしく思います。

この拡張機能は、Azure Durable Functions の 実績ある 耐久性のある実行 (durable execution) (クラッシュや再起動に耐える) と分散実行 (複数インスタンスで動作する) 機能を、Microsoft Agent Framework に直接組み込むことで、本番環境対応の、堅牢でスケーラブルな AI エージェントの構築方法を一新します。

これにより、セッション管理、障害復旧、スケーリングを自動的に処理する、ステートフルで堅牢な AI エージェントを Azure にデプロイでき、開発者はエージェントのロジックに完全に集中できるようになります。

 

たとえば、複数日にわたる会話でコンテキストを維持するカスタマーサービスエージェント、人間による承認 (human-in-the-loop approval workflow) を含むコンテンツパイプライン、または専門的な AI モデルを連携させる完全自動化されたマルチエージェントシステムを構築する場合でも、この Durable Task Extension for Microsoft Agent Framework は、サーバーレスのシンプルさで本番レベルの信頼性、スケーラビリティ、そして調整機能を提供します。

 

Durable Task Extension の主な機能:

  • サーバーレスホスティング (Serverless Hosting):Azure Functions 上にエージェントをデプロイし、数千のインスタンスからゼロまで自動スケーリングを実現しながら、サーバーレスアーキテクチャの利点を維持したまま完全な制御を保持します。
  • 自動セッション管理 (Automatic Session Management):エージェントは、プロセスのクラッシュや再起動、インスタンス間の分散実行に耐える、完全な会話コンテキストを保持した永続的なセッションを維持します。
  • 決定的なマルチエージェントオーケストレーション (Deterministic Multi-Agent Orchestrations): コードで制御された、予測可能かつ再現性のある実行パターンで、特化した (specialized) durable agents を組み合わせて動作させる。
    (訳註1:「決定的な (deterministic)」とは、同じ入力に対しては常に同じ結果を返すもので、その動作が予測可能なものを指します)
    (訳註2:「durable agent」とは、このフレームワークのエージェントをそう呼んでおり、普通のエージェントと違ってDurable な性質を持っているエージェントのことを指します)
  • サーバーレスによるコスト削減を伴う Human-in-the-Loop (Human-in-the-Loop with Serverless Cost Savings): 人間の入力を待つ間、コンピュートリソースを消費せず、コストも発生しません。
  • Durable Task Scheduler による組み込みの可観測性 (Built-in Observability with Durable Task Scheduler):Durable Task Scheduler の UI ダッシュボードを通じて、エージェントの操作やオーケストレーションを深く可視化できます。

Durable Agent を作成して実行してみる

公式ドキュメント

https://aka.ms/create-and-run-durable-agent

コードサンプル (Python/C#)

# Python

endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
deployment_name = os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME", "gpt-4o-mini")

# 標準的な Microsoft Agent Framework パターンに従って AI エージェントを作成します
agent = AzureOpenAIChatClient(
    endpoint=endpoint,
    deployment_name=deployment_name,
    credential=AzureCliCredential()
).create_agent(
    instructions="""あなたは、どんなテーマに対しても読みやすく構造化された、
魅力的なドキュメントを作成するプロフェッショナルなコンテンツライターです。

テーマが与えられたら、次の手順で進めてください。
1. Web 検索ツールを使ってテーマをリサーチする
2. ドキュメントのアウトラインを生成する
3. 適切な書式で説得力のあるドキュメントを書く
4. 関連する例と出典(引用)を含める""",
    name="DocumentPublisher",
    tools=[
        AIFunctionFactory.Create(search_web),
        AIFunctionFactory.Create(generate_outline)
    ]
)

# Durable なセッション管理でエージェントをホストするように Function アプリを構成します
app = AgentFunctionApp(agents=[agent])

app.run()

 

// C#

var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT") ?? "gpt-4o-mini";

// 標準的な Microsoft Agent Framework パターンに従って AI エージェントを作成します
AIAgent agent = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
    .GetChatClient(deploymentName)
    .CreateAIAgent(
        instructions: """
        あなたは、どんなテーマに対しても読みやすく構造化された、
        魅力的なドキュメントを作成するプロフェッショナルなコンテンツライターです。
        テーマが与えられたら、次の手順で進めてください。
        1.Web 検索ツールを使ってテーマをリサーチする
        2.ドキュメントのアウトラインを生成する
        3.適切な書式で説得力のあるドキュメントを書く
        4.関連する例と出典(引用)を含める
        """,
        name: "DocumentPublisher",
        tools: [
            AIFunctionFactory.Create(SearchWeb),
            AIFunctionFactory.Create(GenerateOutline)
        ]);

// Durable なスレッド管理でエージェントをホストするように Functions アプリを構成します
// これにより、HTTP エンドポイントが自動で作成され、状態の永続化が管理されます
using IHost app = FunctionsApplication
    .CreateBuilder(args)
    .ConfigureFunctionsWebApplication()
    .ConfigureDurableAgents(options =>
        options.AddAIAgent(agent)
    )
    .Build();

app.Run();

 

なぜ Durable Task Extension が必要なのか

AI エージェントが、単純なチャットボットから、複雑で長時間実行されるタスクを処理する高度なシステムへと進化するにつれて、新たな課題が浮上します。

  • 会話が数日から数週間にわたるため、プロセスの再起動やクラッシュ、障害を超えて状態を保持する必要があります。
  • ツール呼び出しが通常のタイムアウトを超える時間を要する場合があり、自動チェックポイントと復旧が必要です。
  • 大量のワークロードに対応するため、数千のエージェント会話を同時に処理できるよう、分散インスタンス間での弾力的なスケーリングが求められます。
  • 複数の専門エージェントを、信頼性の高いビジネスプロセスのために、予測可能で再現可能な実行パターンで調整する必要があります。
  • エージェントは、処理を進める前に人間の承認を待つ必要がある場合があり、その間は理想的にはリソースを消費しない (課金されない) ことが望まれます。

Durable Extension は、Azure Durable Functions の機能を Microsoft Agent Framework に拡張することで、これらの課題に対応します。これにより、障害に耐え、弾力的にスケールし、耐久性と分散実行によって予測可能に動作する AI エージェントを構築できます。

4 つの柱 : 4D

この拡張機能は、4 つの基本的な価値の柱、通称「4D」に基づいて構築されています。

  • Durability (耐久性)
    • すべてのエージェントの状態変更(メッセージ、ツール呼び出し、意思決定)は、自動的に耐久性のあるチェックポイントとして保存されます。エージェントは、インフラ更新やクラッシュから復旧し、長時間の待機中にメモリからアンロードされてもコンテキストを失わずに再開できます。これは、長時間実行される処理や外部イベントを待機するエージェントに不可欠です。

  • Distributed (分散型の)
    • エージェントの実行はすべてのインスタンスで利用可能であり、弾力的なスケーリングと自動フェイルオーバーを実現します。正常なノードは、障害が発生したインスタンスの作業をシームレスに引き継ぎ、継続的な運用を保証します。この分散実行モデルにより、数千のステートフルエージェントがスケールアップし、並列で動作できます。

  • Deterministic (決定性)
    • エージェントのオーケストレーションは、通常のコードとして記述された命令型ロジックを使用して予測可能に実行されます。実行パスを定義することで、自動テスト、検証可能なガードレール、ステークホルダーが信頼できるビジネスクリティカルなワークフローを実現します。必要に応じて明示的な制御フローを提供し、エージェント主導のワークフローを補完します。

  • Debuggability (デバッグしやすさ)
    • IDE、デバッガー、ブレークポイント、スタックトレース、単体テストなどの馴染みのある開発ツールやプログラミング言語を使用して開発・デバッグできます。エージェントとそのオーケストレーションはコードとして表現されるため、テスト、デバッグ、保守が容易です。

 

実際の機能の動作

サーバーレス ホスティング (Serverless hosting)

エージェントを Azure Functions (近日中に他の Azure サービスにも拡張予定)にデプロイし、使用していないときはゼロまで、使用時は数千インスタンスまで自動スケーリングします。消費したコンピューティング リソースに対してのみ料金を支払います。このコードファーストのデプロイ手法により、サーバーレス アーキテクチャの利点を維持しながら、コンピュート環境 (compute environment) を完全に制御できます。

# Python

endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
deployment_name = os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME", "gpt-4o-mini")

# 標準的な Microsoft Agent Framework パターンに従って AI エージェントを作成します
agent = AzureOpenAIChatClient(
    endpoint=endpoint,
    deployment_name=deployment_name,
    credential=AzureCliCredential()
).create_agent(
    instructions="""あなたは、どんなテーマに対しても読みやすく構造化された、
魅力的なドキュメントを作成するプロフェッショナルなコンテンツライターです。

テーマが与えられたら、次の手順で進めてください。
1. Web 検索ツールを使ってテーマをリサーチする
2. ドキュメントのアウトラインを生成する
3. 適切な書式で説得力のあるドキュメントを書く
4. 関連する例と出典(引用)を含める""",
    name="DocumentPublisher",
    tools=[
        AIFunctionFactory.Create(search_web),
        AIFunctionFactory.Create(generate_outline)
    ]
)

# Durable なセッション管理でエージェントをホストするように Function アプリを構成します
app = AgentFunctionApp(agents=[agent])

app.run()

 

Automatic session management(自動セッション管理)

エージェントのセッションは、Function アプリで構成した耐久性のあるストレージに自動的にチェックポイントされ、複数インスタンス間での耐久性と分散実行を可能にします。中断やプロセス障害の後でも、どのインスタンスからでもエージェントの実行を再開でき、継続的な運用が保証されます。

内部的には、エージェントは Durable Entities として実装されています。これらは、実行間で状態を保持するステートフルなオブジェクトです。このアーキテクチャにより、各エージェントセッションは、会話履歴とコンテキストを保持した信頼性の高い長寿命のエンティティとして機能します。

シナリオ例:

複数日から数週間にわたる複雑なサポート案件を処理するカスタマーサービスエージェント。エージェントが再デプロイされたり、別のインスタンスに移動した場合でも、会話履歴、コンテキスト、進捗は保持されます。

# 最初の対話 - ドキュメント作成用の新しいスレッドを開始
curl -X POST https://your-function-app.azurewebsites.net/api/agents/DocumentPublisher/threads \
  -H "Content-Type: application/json" \
  -d '{"message": "Azure Functions の利点についてのドキュメントを作成してください"}'

# レスポンスにはスレッド ID と初期のドキュメントのアウトライン/下書きが含まれます
# {"threadId": "doc789", "response": "Azure Functions の利点に関する網羅的なドキュメントを作成します。最新情報を検索します… [ドキュメント下書き] # Azure Functions の利点\n\n## はじめに\nAzure Functions は、インフラ管理なしでイベント駆動のコードを実行できるサーバーレスのコンピュートサービスです…\n\n## コスト効率\n- 実行時間に対してのみ支払う\n- アイドル状態のリソースには料金がかからない\n- 自動スケーリングにより過剰プロビジョニングを削減…\n\n## 開発者の生産性\n- 複数言語のサポート(C#, Python, JavaScript, Java)\n- 統合開発ツールと CI/CD …\n\n## スケーラビリティ\n- 需要に基づく自動スケーリング\n- 何百万ものリクエストをシームレスに処理…\n\n参考文献: [Azure ドキュメント、サーバーレス計算に関する研究]"}

# 2 回目の対話 - 同じスレッドでドキュメントを改善
curl -X POST https://your-function-app.azurewebsites.net/api/agents/DocumentPublisher/threads/doc789 \
  -H "Content-Type: application/json" \
  -d '{"message": "他の Azure サービスとの統合に関するセクションを追加してもらえますか?"}'

# エージェントは Azure Functions ドキュメントのコンテキストを保持し、要求されたセクションを追加します
# {"threadId": "doc789", "response": "Azure Functions ドキュメントに、包括的な統合セクションを追加しました:\n\n## Azure サービスとの統合\n\n### Azure Storage\nBlob Storage、Queue Storage、Table Storage へのトリガーとバインディングにより、イベント駆動アーキテクチャをシームレスに実現…\n\n### Azure Event Grid と Event Hubs\nリアルタイムのイベントストリームを処理し、スケール可能な Pub/Sub パターンを実装…\n\n### Azure Cosmos DB\nドキュメントデータベース操作向けの組み込みバインディングと、変更フィードの自動処理…\n\n### Azure Service Bus\nエンタープライズメッセージング機能による信頼性の高いメッセージ処理…\n\n### Azure AI Services\nOpenAI、Cognitive Services、AI Search を容易に統合してインテリジェントなアプリケーションを実現…\n\nこのセクションはスケーラビリティのセクションの後に追加されています。ユースケースやデプロイのベストプラクティスも追加しましょうか?"}

(訳者注:11/20 現在、上記のエンドポイント URL やリクエスト、レスポンスの形式は変更されています。この記事ではオリジナル記事の時のままの記載にしていますが、今後も (現在まだ preview 版で) 変わる可能性があるため、最新の情報は公式ドキュメントを参照してください:https://aka.ms/create-and-run-durable-agent )

Deterministic multi-agent orchestrations(決定的なマルチエージェントオーケストレーション)

命令型コードを使用して、複数の専門的な durable agents を調整します。この場合、制御フローは開発者が定義します。これは、エージェントが次のステップを決定するエージェント主導のワークフローとは異なります。
決定的オーケストレーションは、自動チェックポイントと復旧を備えた予測可能で再現可能な実行パターンを提供します。

 

シナリオ例:
メール処理システムで、まずスパム検出エージェントを使用し、その分類に基づいて条件付きで異なる専門エージェントにルーティングします。オーケストレーションは、どのステップで障害が発生しても自動的に復旧し、完了済みのエージェント呼び出しは再実行されません。

 

# Python

app.orchestration_trigger(context_name="context")
def document_publishing_orchestration(context: DurableOrchestrationContext):
    """複数の専門エージェントを協調させる決定的オーケストレーション。"""
    doc_request = context.get_input()

    # オーケストレーションのコンテキストから専門エージェントを取得
    research_agent = context.get_agent("ResearchAgent")
    writer_agent = context.get_agent("DocumentPublisherAgent")

    # ステップ 1:Web 検索でトピックを調査する
    research_result = yield research_agent.run(
        messages=f"次のトピックを調査し、主要な情報を収集してください:{doc_request.topic}",
        response_schema=ResearchResult
    )

    # ステップ 2:調査結果に基づいてアウトラインを生成する
    outline = yield context.call_activity("generate_outline", {
        "topic": doc_request.topic,
        "research_data": research_result.findings
    })

    # ステップ 3:調査結果とアウトラインに基づいてドキュメントを作成する
    document = yield writer_agent.run(
        messages=f"""以下のトピックについて、網羅的なドキュメントを作成してください:{doc_request.topic}

調査結果: {research_result.findings}
アウトライン: {outline}

適切な書式で、構造化され読みやすく、魅力的なドキュメントにしてください。必要に応じて出典(引用)も含めてください。""",
        response_schema=DocumentResponse
    )

    # ステップ 4:生成したドキュメントを保存して公開する
    return yield context.call_activity("publish_document", {
        "title": doc_request.topic,
        "content": document.text,
        "citations": document.citations
    })

 

Human-in-the-loop(人間を介在させる仕組み)

オーケストレーションやエージェントは、人間の入力、承認、レビューを待つ間、コンピュートリソースを消費せずに一時停止できます。アプリケーションがクラッシュや再起動したとしても、耐久性のある実行 (durable execution) により、数日から数週間にもわたる人間の応答をオーケストレーションが待機することが可能です。サーバーレスホスティングと組み合わせることで、待機期間中はすべてのコンピュートリソースが停止し、人間が入力を提供するまでコンピュートコストが完全に排除されます。

シナリオ例:
コンテンツ公開エージェントが下書きを生成し、人間のレビュー担当者に送信して、承認を数日間待機するケース。この間、レビュー期間中はコンピュートリソースを実行(または課金)しません。人間の応答が届くと、オーケストレーションは会話コンテキストと実行状態を完全に保持したまま自動的に再開します。

# Python

app.orchestration_trigger(context_name="context")
def content_approval_workflow(context: DurableOrchestrationContext):
    """人間を介在させるワークフロー(待機中はコストゼロ)"""
    topic = context.get_input()

    # ステップ 1:エージェントを使ってコンテンツを生成
    content_agent = context.get_agent("ContentGenerationAgent")
    draft_content = yield content_agent.run(f"{topic} についての記事を書いてください")

    # ステップ 2:人間によるレビューを依頼
    yield context.call_activity("notify_reviewer", draft_content)

    # ステップ 3:承認を待機(待機中はコンピュートリソースを消費しない)
    approval_event = context.wait_for_external_event("ApprovalDecision")
    timeout_task = context.create_timer(context.current_utc_datetime + timedelta(hours=24))
    
    winner = yield context.task_any([approval_event, timeout_task])
    
    if winner == approval_event:
        timeout_task.cancel()
        approved = approval_event.result
        
        if approved:
            result = yield context.call_activity("publish_content", draft_content)
            return result
        else:
            return "コンテンツは却下されました"
    else:
        # タイムアウト時:レビューをエスカレーション
        result = yield context.call_activity("escalate_for_review", draft_content)
        return result

 

Built-in agent observability(エージェントの組み込み可観測性)

Function App を Durable Task Scheduler を耐久バックエンドとして構成します(エージェントとオーケストレーションの状態を永続化する仕組み)。Durable Task Scheduler は、durable agents に推奨されるバックエンドであり、最高のスループット性能、完全に管理されたインフラ、そして UI ダッシュボードによる組み込みの可観測性を提供します。

 

Durable Task Scheduler ダッシュボードは、エージェントの操作を深く可視化します:

  • 会話履歴 (Conversation history): 各エージェントセッションの完全な会話スレッドを表示し、すべてのメッセージ、ツール呼び出し、任意時点のコンテキストを確認可能
  • マルチエージェントの可視化 (Multi-agent visualization): 複数の専門エージェントを呼び出す際の実行フローを、エージェント間のハンドオフ、並列実行、条件分岐を含む視覚的な表現で表示
  • パフォーマンス指標 (Performance metrics): エージェントの応答時間、トークン使用量、オーケストレーションの実行時間を監視
  • 実行履歴 (Execution history): デバッグ用に完全なリプレイ機能を備えた詳細な実行ログにアクセス可能

Demo Video

Language support

The Durable Task Extension は以下の言語をサポートしています:

  • C# (.NET 8.0+) with Azure Functions
  • Python (3.10+) with Azure Functions

Support for additional computes coming soon.

今日から始めてみましょう

Click here to create and run a durable agent

Learn more

原文

Bulletproof agents with the durable task extension for Microsoft Agent Framework | Microsoft Community Hub

 

Updated Nov 20, 2025
Version 2.0
No CommentsBe the first to comment