Azure Functions での Python 用エージェント バインディング

Python関数アプリのエージェントバインディングは、既存の関数にエージェント的振る舞いを追加できます。 関数が実行されると、拡張はMarkdown命令から Agent を構築し、型付きパラメータとしてハンドラーに注入します。 あなたのコードは、決定論的なアプリケーションロジックとともに、いつどのようにエージェントを呼び出すかを決定します。

Important

Python関数アプリのエージェントバインディングは現在プレビュー中です。 機能、パッケージ名、設定は一般公開前に変更されることがあります。

エージェントバインディングをAzure FunctionsのホストスキルやModel Context Protocol(MCP)ツールなど他のAI関連機能と比較するには、Azure FunctionsのAI統合オプションをご覧ください。

エージェントバインディングとは、拡張所有の入力バインディングであり、Python関数に対して完全に構築されたAgentオブジェクトを提供します。 拡張子はエージェント命令を .agent.md ファイルからの生のテキストとして読み取ります。 アプリケーションコードはクライアントおよびプロバイダー固有のツール設定を保持し、機能アプリプロジェクトはファイルベースのエージェントスキルやリモートMCPサーバーを発見できます。

エージェントバインディングアーキテクチャは、プロバイダー固有の拡張パッケージを通じて異なるSDKのエージェントオブジェクトをサポートします。 Microsoft Agent Frameworkは、現在のプレビューでサポートされている唯一のエージェントSDKです。 使うには azurefunctions-agents-extensions-agent-framework パッケージをインストールしてください。

エージェントバインディングの使用時期

Azure関数がワークフローの一部でエージェント的推論を必要としているが、アプリケーションがトリガー、検証、分岐、エラー処理、応答の制御を保持しなければならない場合、エージェントバインディングを活用してください。 一般的なシナリオは次のとおりです。

  • HTTPリクエストを評価してください。 決定性コードで注文を検証し、エージェントに履行リスクを評価させ、その結果を使ってHTTP応答を構築します。
  • イベントを豊かにしたり分類したりする。 キューメッセージ、イベントグリッドイベント、その他のトリガーペイロードを受け取り、関数が結果を書き込む前にエージェントを使ってデータを分類、要約、または充実させます。
  • 持続的なワークフローに理性を加えましょう。 リプレイセーフcontext.call_agent()APIを通じてDurable Functionsオーケストレーターからエージェントを呼び出し、その後のオーケストレーションステップで結果を活用します。

関数の決定論的コードがコーディネーターのままである場合、エージェントバインディングは適しています。 エージェントは有界推論タスクを実行し、ハンドラーまたはオーケストレーションに制御を返します。

なぜエージェント結合を使うのですか?

多くの本番作業フローは、決定論的でなければならないステップとモデル推論の恩恵を受けるステップを組み合わせています。 エージェントバインディングは、これらのハイブリッドワークフローに以下の利点を提供します:

  • 既存の機能にエージェント的振る舞いを加える。 HTTP-、タイマー、キュー、イベントグリッド、Service Bus-などのトリガー関数のエージェント推論を活用してください。
  • コード内でエージェント呼び出しを安全に制御。 エージェントを呼び出すタイミングを決め、その応答を点検し、出力関数を決定します。 この拡張機能は、成功、失敗、またはキャンセル後に、呼び出しに関連付けられたリソースを閉じます。
  • エージェント設定コードを削減しましょう。 各呼び出しごとに構築・配線するのではなく、型付きのハンドラパラメータとして設定された Agent を受け取ること。
  • 命令は実行時の設定から分離します。 自然言語命令を.agent.mdファイルに保存し、クライアントやプロバイダー固有のツールをPythonで明示的に設定します。
  • 共有エージェントの機能を活用しましょう。 この拡張機能は、アプリケーションルートからファイルベースのエージェントスキルやHTTPベースのMCPサーバーを発見し、各エージェントバインディングに提供します。
  • 耐久性のあるオーケストレーションからエージェントに連絡する。 拡張機能は、オーケストレーションのリプレイの決定性が保たれるように、エージェントの処理を非表示のアクティビティで実行します。
  • 慣れ親しんだツールでローカルでデバッグしましょう。 他のPython関数アプリと同じように、ローカルで実行・デバッグしてください。 ブレークポイントを設定し、決定論的関数ロジックとエージェントを呼び出すコードの両方をステップで進めることができます。

薬剤結合の仕組み

AgentFunctionApp azure.functions.FunctionAppを拡張しているので、FunctionAppと同じ機能を持っています。 markdown_agentデコレーターは関数にエージェント入力を追加します。

各薬剤結合に対して、拡張は以下の操作を行います。

  1. 関数アプリのrootまたはそのagents/ディレクトリから要求された.agent.mdファイルを解決します。
  2. 完全なファイルを生のUTF-8命令として読み込みます。
  3. 指示を設定済みクライアントファクトリー、明示的に設定されたプロバイダーツール、発見されたエージェントスキルおよびMCPサーバーと組み合わせます。
  4. 新しい Agent を作成し、呼び出しに属するリソースを開きます。
  5. ハンドラーパラメータに Agent を注入します。
  6. 実行終了時に呼び出し所有リソースを閉じます。

この拡張はプロバイダーの発見やコンパイルされたバインディング定義をキャッシュできます。 関数呼び出し間で、実行中の呼び出しリソースをキャッシュしたり再利用したりすることはありません。

エージェント結合の定義

以下の例では、現在サポートされているMicrosoft Agent Frameworkプロバイダーを使って、HTTPトリガー関数にAgentを追加します。 関数はコードでタスクを構築し、エージェントを呼び出し、エージェントの応答を返します。

import azure.functions as func
from agent_framework import Agent
from azurefunctions.agents.extensions.agent_framework import AgentFunctionApp


app = AgentFunctionApp(client_factory=create_chat_client)


@app.function_name(name="ProcessOrder")
@app.route(route="orders/{orderId}", methods=["POST"])
@app.markdown_agent(
    arg_name="order_agent",
    agent_name="order-fulfillment",
)
async def process_order(
    req: func.HttpRequest,
    order_agent: Agent,
) -> func.HttpResponse:
    task = (
        "Validate the order and return fulfillment guidance for "
        f"{req.route_params['orderId']}."
    )
    response = await order_agent.run(task)
    return func.HttpResponse(response.text)

arg_name値は注入されたハンドラーパラメータと一致しなければなりません。 複数のエージェントを同じ関数に注入するには、デコレーター markdown_agent スタックし、各エージェントバインディングごとに固有の arg_name とハンドラーパラメータを使用します。 agent_name値は命令ファイルの識別を示します。 この例では、order-fulfillment は次の場所のいずれか 1 つに厳密に解決される必要があります。

<app_root>/order-fulfillment.agent.md
<app_root>/agents/order-fulfillment.agent.md

両方のファイルが存在する場合、定義が曖昧でアプリの起動が失敗します。 エージェント名には絶対パス、パスセパレーター、トラバーサルコンポーネントを含めることはできません。 アプリケーションのルート外で解決されるファイルは許可されていません。

エージェントクライアントとツールの設定

AgentFunctionAppを構築する際には、ゼロ引数のclient_factoryを設定してください。 工場はプロバイダーパッケージでサポートされた新しいクライアントを返品します。 また、MicrosoftエージェントフレームワークのツールオブジェクトやPython呼び出し可能なものを、アプリレベルでtoolsパラメータを通して渡すことも可能です。 バインディングは、異なる動作を必要とする場合、アプリレベルのクライアントファクトリーやツールを上書きすることができます。

例えば、以下のHTTPトリガー関数は、 lookup_inventory を order_agentのみがツールとして利用できるようにするエージェントバインディングを使用しています。

def lookup_inventory(product_id: str) -> str:
    """Return the available inventory for a product."""
    return f"Inventory is available for {product_id}."


@app.markdown_agent(
    arg_name="order_agent",
    agent_name="order-fulfillment",
    tools=[lookup_inventory],
)
async def process_order(
    req: func.HttpRequest,
    order_agent: Agent,
) -> func.HttpResponse:
    response = await order_agent.run(req.get_body().decode())
    return func.HttpResponse(response.text)

エージェントクライアントやツールを設定する際には以下の点を念頭に置いてください:

  • ベースエージェントの拡張はプロバイダーニュートラルです。 プロバイダーパッケージは特定のエージェントSDKを統合し、サポートされるクライアントおよびエージェントタイプを定義します。
  • 現在サポートされているMicrosoft Agent Frameworkのプロバイダパッケージは、アプリケーションのモデルプロバイダーを選択したり設定したりしません。 クライアントファクトリーは、どのサポートされるMicrosoft Agent Frameworkチャットクライアントとエージェントが使用するモデルを決定します。
  • この拡張機能は、設定されたプロバイダーにエージェント命令として .agent.md ファイル全体を渡します。 モデル設定やツール、YAMLのフロントマター、その他のランタイム設定をファイルから解析することはありません。

共有エージェントスキルとMCPサーバー

この拡張機能は、アプリケーションルートから共有エージェントの能力を自動的に検出します:

能力 場所 Behavior
エージェントのスキル skills/<skill-name>/SKILL.md または Skills/<skill-name>/SKILL.md プロバイダーパッケージはファイルベースのエージェントスキルを読み込み、検証します。
リモート MCP サーバー mcp.json この拡張機能は、対応するHTTPまたはストリーミング可能なHTTPサーバーとオプションのツール許容リストを設定します。
プロバイダーツール アプリケーションまたはバインディング構成 Microsoft Agent FrameworkのツールオブジェクトやPythonの呼び出し可能オブジェクトは、発見されるのではなく明示的に提供されます。

共有エージェント機能を使用する際には以下の点を念頭に置いてください:

  • 関数アプリのすべてのエージェントバインディングは、発見されたすべてのエージェントスキルとMCPサーバーを受け取ります。
  • ファイルベースのエージェントスキルとは、エージェントがロードできる能力のことです。 これらはAzure Functionsでホストされたスキルではなく、別の実行モデルを使っています。
  • 現在のエージェント拡張プレビューでは、アプリや個別のバインディングのサブセット選択はサポートされていません。
  • エージェントスキルやMCPツールは特権操作を実行できます。 アプリ内のすべてのエージェントが使用できる機能のみを配置し、エージェントごとに異なる機能境界が必要な場合は別々の機能アプリを使いましょう。

MCPの設定は、URL、ヘッダー、認証スコープ、クライアントIDの環境変数を参照できます。 参照は、拡張機能がサーバーに接続する前に、呼び出しごとに解決されます。 秘密をソース管理の mcp.json ファイルに直接保存しないでください。

ローカルプロセスおよび標準入出力(stdio)MCPサーバーはサポートされていません。 MCPのサポートは任意の依存関係であり、インストールされていない通常のパッケージインポートは安全に保たれます。

Durable Functions でエージェント バインディングを使用する

エージェントバインディングは、オプションのDurable Functions統合を通じて、ハイブリッドで長期実行のワークフローをサポートします。 同期ジェネレーターオーケストレーターは context.call_agent() を呼び出し、次のタスクを生成します。

from typing import Any

from azurefunctions.agents.extensions.agent_framework import AgentFunctionApp


app = AgentFunctionApp(client_factory=create_chat_client)


@app.orchestration_trigger(context_name="context")
def order_orchestrator(context: Any):
    assessment = yield context.call_agent(
        "order-fulfillment",
        {"order": context.get_input()},
    )
    return assessment

call_agent() エージェント定義を解決し、モデル、ファイルシステム、認証情報、ツール、ネットワーク操作をすべて実行する隠れた活動をスケジュールします。 オーケストレーターは決定的でJSONシリアライズ可能なschema-v1リクエストのみを作成します。 その結果、オーケストレーションリプレイは非決定性エージェント操作を繰り返しません。

永続エージェント呼び出しでは、AgentFunctionApp で構成されたプロバイダーと共有機能を使用します。 入力と出力はJSONでシリアライズ可能でなければなりません。

Durable Functionsのサポートは任意です。 それを使わないアプリケーションはDurable Functionsをインストールしたりインポートしたりする必要はありません。 orchestration_triggerとcontext.call_agent()を使うには、サポートされたプロバイダーパッケージとそのDurable依存関係を追加インストールしてください。

プロジェクトファイル

エージェント対応アプリケーションとは、エージェント拡張依存関係と1つ以上の命令ファイルを持つ標準的なPython v2関数アプリのことです。

ファイルまたはフォルダー Purpose
function_app.py AgentFunctionApp、標準関数トリガー、エージェントバインディング、クライアントファクトリー、明示的に設定されたプロバイダーツールを定義します。
host.json Azure Functions ホストを構成します。
requirements.txt サポートされたエージェントプロバイダーパッケージとSDK専用クライアントパッケージが含まれています。 現在のプレビューでは azurefunctions-agents-extensions-agent-frameworkをご利用ください。 オプションの追加機能により、Durable FunctionsおよびMCP対応が可能になります。
*.agent.md または agents/*.agent.md エージェント用の生のUTF-8命令を含みます。 各参照名は、必ず1つのファイルのみに対応していなければなりません。
skills/ または Skills/ (任意)すべてのエージェントバインディングで共有されるファイルベースのエージェントスキルが含まれています。
mcp.json (任意)すべてのエージェントバインディングが共有するリモートHTTPベースのMCPサーバーを定義します。

標準的なPythonプロジェクト構成については、Azure Functions Python開発者ガイドをご覧ください。

検証と診断

この拡張機能は、バインディングのコンパイル前またはコンパイル中にエージェント定義を検証するため、設定上の問題がある場合は、対処可能なエラーを出して失敗します。 バリデーションの対象は以下の通りです:

  • .agent.mdファイルの欠落や曖昧さ。
  • 無効なハンドラ署名、または不一致の注入パラメータを含む。
  • サポートされていないプロバイダーの選択肢や能力。
  • 無効なスキルディレクトリと不具合のMCP設定。
  • サポートされていないMCPトランスポートと環境値の欠如。
  • 無効なDurableペイロードやJSONで直列化できない値。

利用可能な場合、この拡張機能はAzure関数名、呼び出しID、耐久インスタンスIDをプロバイダー境界に保持し、相関や診断をサポートします。