Microsoft Agent Frameworkを使用してワークフローを作成してみる

普段のお仕事に役立つ普遍的なプログラミングTIPSや、業界で注目度が高い最新情報をお届けする「編集部ピックアップ」。
今回はMicrosoft Agent Frameworkを使用してワークフローを作成する方法についてお届けします。

Microsoft Agent Frameworkとは?

Microsoft Agent Frameworkは、2025年10月1日にプレビュー公開されたAIエージェントとマルチエージェント用のワークフローを構築するためのオープンソース開発キットで、 .NETおよびPythonに対応しています。

Microsoft Agent Frameworkでは、AIアプリケーションに求められる以下の2つの機能を実装できるようになっています。

  • AIエージェント
    LLMを使用してユーザーからの入力を処理し、ツールと MCP サーバーを呼び出してアクションを実行し応答を生成するエージェントを作成
  • ワークフロー
    複数のエージェントと関数を接続して複雑なマルチステップのタスクを実行するワークフローを作成

今まではSemantic Kernel(AIエージェントの開発用フレームワーク)とAutoGen(複数のAIエージェントを連携してタスクを処理するためのオーケストレーションの開発用フレームワーク)が提供されていましたが、Microsoft Agent Frameworkはこの2つを統合したフレームワークという位置付けになっています。

本記事では、Microsoft Agent Frameworkを使用して .NETアプリケーションにワークフローを実装する方法について紹介します。

ワークフローを作成する

Microsoft Agent Frameworkでは、タスクを順番に処理したり並列に処理するなどユースケースに合わせていくつかのワークフローのパターン(オーケストレーション)をサポートしていますが、本記事では各ステップでタスクを処理して次のステップに渡すシンプルなワークフロー(シーケンシャルなワークフロー)を実装してみます。

アプリケーションの作成

Visual Studioでコンソールアプリケーションを作成します。

アプリケーションの作成

NuGetパッケージマネージャーから以下のパッケージをインストールします。

  • Microsoft.Agents.AI.Workflows
アプリケーションの作成

Program.csに以下のコードを追加して、テキストを大文字に変換するエグゼキューター(Executor、ワークフロー内の個々の処理単位)のクラスUppercaseExecutorを追加します。

class UppercaseExecutor() : Executor<string, string>("UppercaseExecutor")
{
    public override ValueTask<string> HandleAsync(string message, IWorkflowContext context, CancellationToken cancellationToken = default)
    {
        string result = message.ToUpperInvariant();
        return ValueTask.FromResult(result);
    }
}

このクラスではExecutor<TInput,TOutput>クラスを継承していて、単一のメッセージハンドラー関数を使用して受信メッセージを処理するシンプルなエグゼキューターを実装しています。

次のステップとして、受け取ったテキストを反転するエグゼキューターのクラスReverseTextExecutorを追加します。

class ReverseTextExecutor() : Executor<string, string>("ReverseTextExecutor")
{
    public override ValueTask<string> HandleAsync(string message, IWorkflowContext context, CancellationToken cancellationToken = default)
    {
        return ValueTask.FromResult(string.Concat(message.Reverse()));
    }
}

次にWorkflowBuilderクラスを使用してワークフローを作成します。uppercaseを引数に設定して開始するエグゼキューターを指定します。

UppercaseExecutor uppercase = new();
ReverseTextExecutor reverse = new();

WorkflowBuilder builder = new(uppercase);
builder.AddEdge(uppercase, reverse).WithOutputFrom(reverse);
var workflow = builder.Build();

さらにAddEdgeメソッドを使用して、uppercaseエグゼキューターが処理を完了したらその出力を reverseエグゼキューターの入力として渡すように、エッジ(Edge、ワークフロー内のエグゼキューター間でメッセージがどのように流れるかを定義)を設定します。さらに、WithOutputFromメソッドでワークフローの出力をどのエッジの出力にするかを設定します。最後にBuildメソッドでワークフローをビルドします。

最後にワークフローを実行して結果を返すコードを追加します。ワークフローの実行は RunAsyncメソッドを使用します。メソッドの引数には、ビルドしたワークフローとワークフローに渡すテキストを設定します。

await using Run run = await InProcessExecution.RunAsync(workflow, "Hello, World!");
foreach (WorkflowEvent evt in run.NewEvents)
{
    switch (evt)
    {
        case ExecutorCompletedEvent executorComplete:
            Console.WriteLine($"{executorComplete.ExecutorId}: {executorComplete.Data}");
            break;
    }
}

ワークフローを実行して発生するイベントのコレクションをforeachで処理しています。エグゼキューターが完了した際に発生するExecutorCompletedEventイベントをキャッチして、結果をコンソールに出力します。

実行してみる

作成したワークフローを実行すると、次のような出力が表示されます。

アプリケーションの作成

ワークフローに渡したテキスト「Hello, World!」は、最初にUppercaseExecutorで大文字(「HELLO, WORLD!」)に変換され、次にReverseTextExecutorで反転 (「!DLROW,OLLEH」)する処理が行われたことが確認できます。

ワークフローをストリーミングモードで実行する

ワークフローをストリーミングモードで実行して、リアルタイムで各イベントを把握することも可能になっています。以下のように、先ほどのRunAsyncメソッドの代わりにStreamAsyncメソッドを使用します。また、WatchStreamAsyncメソッドでワークフローの実行中に発生するイベントを非同期ストリームで受け取ります。

await using StreamingRun run = await InProcessExecution.StreamAsync(workflow, "Hello, World!");
await foreach (WorkflowEvent evt in run.WatchStreamAsync())
{
    if (evt is ExecutorCompletedEvent executorCompleted)
    {
        Console.WriteLine($"{executorCompleted.ExecutorId}: {executorCompleted.Data}");
    }
}

RunAsyncメソッドでは、結果を表示する前にワークフロー全体が完了するまで待機しますが、StreamAsyncメソッドを使用したストリーミングモードでは、各エグゼキューターが処理を完了するとイベントがリアルタイムで出力されます。今回は該当しませんが、長時間実行されるワークフローを監視したり、ユーザーにフィードバックを提供したりするのに役立つ機能となっています。

さいごに

今回はMicrosoft Agent Frameworkを使用してワークフローを作成する方法を確認してみました。今回試してみたシンプルなワークフロー(シーケンシャルなワークフロー)は、非常にシンプルなコードで実装することが可能になっている印象を受けました。まだ紹介していない条件分岐するエッジの使い方や、AIエージェントを含めたエグゼキューターの実装など、ワークフローのその他の機能についても、今後のブログ記事で紹介していきたいと思います。

\  この記事をシェアする  /