0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Microsoft Agent Frameworkをローカルモデル(LM Studio)で動かしてみた ― C#とPython、両方触ってみた

0
Posted at

はじめに

C# で出来ること一覧 2026年版(.NET 10) で紹介されていたテーマのうち、.NET Framework移行編に続いて、今回は「Microsoft Agent Framework」を試してみます。

Microsoft Agent Frameworkは、Semantic KernelとAutoGenを統合する形で2026年4月3日に1.0 GAを迎えた、Microsoft製のAIエージェント構築SDKです。C#/.NETとPythonの両方に対応していて、しかもAPIがかなり揃えられているらしいので、「C#メインで触ってみて、Pythonにも同じノリで手を伸ばしてみる」という進め方で検証しました。

クラウドのAPI keyを用意するのが面倒だったので、今回は普段使っているLM Studio(ローカルLLM)をOpenAI互換サーバーとして使い、Agent Frameworkから繋いでいます。API keyもクラウド契約も不要で、コードはOpenAIを使う場合と同じ、という構成です。

準備:LM Studioをローカルサーバーとして起動

LM Studioでモデルをロードした状態で、「Local Server」タブから「Start Server」を押すだけです。デフォルトでhttp://localhost:1234にOpenAI互換のエンドポイントが立ちます。

C#編:file-based appsでサクッと試す

.NET 10のfile-based apps(dotnet run app.cs)を使うと、プロジェクトを作らずに1ファイルで試せます。

#:package Microsoft.Agents.AI@*-*
#:package Microsoft.Extensions.AI.OpenAI@*-*
#:package OpenAI@2.*

using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
using OpenAI;
using System.ClientModel;

var openAiClient = new OpenAIClient(
    new ApiKeyCredential("not-needed"),
    new OpenAIClientOptions { Endpoint = new Uri("http://localhost:1234/v1") });

AIAgent agent = openAiClient
    .GetChatClient("bonsai-8b") // LM Studioでロード中のモデル名に置き換えてください
    .AsIChatClient()
    .AsAIAgent(instructions: "あなたは親切な日本語アシスタントです。", name: "LocalAgent");

var response = await agent.RunAsync("こんにちは、自己紹介して!");
Console.WriteLine(response.Text);
dotnet run agent-test.cs

これはすんなり動きました。ロード中だったモデル(Bonsai、PrismML製の1-bit量子化モデル)が、そのまま日本語で自己紹介してくれました。

Function callingも試す

普通のC#メソッドに[Description]を付けてAIFunctionFactory.Create()に渡すだけで、agentの「道具」として使えます。

[Description("指定した都市の今日の天気を返す")]
static string GetWeather([Description("都市名")] string city)
{
    return $"{city}の今日の天気は「晴れ、最高気温28度」です。";
}
AIAgent agent = openAiClient
    .GetChatClient("bonsai-8b") // LM Studioでロード中のモデル名に置き換えてください
    .AsIChatClient()
    .AsAIAgent(
        instructions: "あなたは親切な日本語アシスタントです。必要に応じてツールを使ってください。",
        name: "LocalAgent",
        tools: [AIFunctionFactory.Create(GetWeather)]);

「東京の天気を教えて」と聞くと、ちゃんと関数を呼び出した上で回答してくれました(ローカルモデルが気温以外の情報を"それっぽく"盛って答えてくる場面もありましたが、これはご愛嬌です)。

Python編:予想以上に手こずった

「あ、Pythonもいけるのね」くらいの軽い気持ちで始めたのですが、ここから意外と長い道のりになりました。

つまずき①:pip install agent-framework --preが終わらない

error: resolution-too-deep
× Dependency resolution exceeded maximum depth

agent-frameworkを素で入れると、Azure・AWS・Redis・Bedrock…とほぼ全プラットフォーム対応の拡張([all]相当)込みでインストールされてしまい、依存解決が終わらなくなります。今回はOpenAI互換で使えれば十分なので、必要な拡張だけに絞りました。

pip install "agent-framework-core[openai]==1.13.0"
pip install agent-framework-openai==1.12.0

これで数秒で解決しました。

つまずき②〜④:APIがとにかく変わり続けている

ここからOpenAIChatClientの引数名で何度も足止めを食いました。

TypeError: OpenAIChatClient.__init__() got an unexpected keyword argument 'model_id'
TypeError: OpenAIChatClient.__init__() got an unexpected keyword argument 'ai_model_id'

model_idでもai_model_idでもなく、正解はmodelでした。実際にインストールされているクラスをhelp()で直接確認して、ようやく確定しました。

python -c "from agent_framework.openai import OpenAIChatClient; help(OpenAIChatClient.__init__)"

さらにclient.create_agent(...)というメソッド自体が存在せず(AttributeError)、from agent_framework import ChatAgentも存在しない(ChatAgentAgentにリネーム済み)という状態でした。

最終的に動いたコードがこちらです。

import asyncio
from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient

async def main():
    client = OpenAIChatClient(
        base_url="http://localhost:1234/v1",
        api_key="not-needed",
        model="bonsai-8b",  # LM Studioでロード中のモデル名に置き換えてください
    )
    agent = Agent(
        client=client,
        name="LocalAgent",
        instructions="あなたは親切な日本語アシスタントです。",
    )
    result = await agent.run("こんにちは、自己紹介して!")
    print(result.text)

asyncio.run(main())

なぜこんなに変わるのか

調べてみたところ、Agent FrameworkのPython版は2026年に入ってからだけでも、ChatAgentAgentChatMessageMessageAIFunctionFunctionTool、モデル指定のmodel_idmodelへの統一など、数十件規模の破壊的変更が続けざまに入っています(Python 2026 Significant Changes Guideにまとまっています)。1.0 GAは迎えたものの、実態としてはまだかなり活発に動いているプロジェクトのようです。ネット上のサンプルコードを見つけても、書かれた時期によって全然API名が違う、ということが普通に起こります。

わかったこと

  • Microsoft Agent Frameworkは、C#とPythonでほぼ同じ設計(クライアントを作ってinstructionsを渡してagent化する)になっており、片方を覚えればもう片方もすぐ書ける
  • ローカルLLM(LM StudioのOpenAI互換サーバー)とAgent Frameworkの組み合わせは、API keyもクラウド契約も不要で気軽に試せる
  • C#側は今回すんなり動いた一方、Python側はパッケージのextra指定とAPIの頻繁な変更に振り回された
  • Pythonでサンプルコードを写経して動かない場合、まず疑うべきは「そのサンプルが書かれた時点のバージョンと、手元にインストールされているバージョンのズレ」。help()で実際のシグネチャを直接確認するのが一番早い

次回予告

GitHub Copilotアップグレード(VS Code拡張機能版)を試す予定です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?