- Python
AutoGenとは・使い方|v0.2との違いとLLM呼び出し回数の実測
結論
AutoGenは、複数のAIエージェントに会話させて仕事を分担させる、Microsoft製のPythonの枠組み(オープンソース)です。2026年10月29日時点では保守モードで、新しく始める場合は公式が Microsoft Agent Framework を案内しています。
この記事でわかること
- v0.4以降(AgentChat 0.7.5)の使い方:エージェント・ツール・グループ会話・終了条件
- 自作のモックLLMで動かしたログの原文と、LLM呼び出し回数の実測
- v0.2との違い、Agent Framework・LangGraph・CrewAIとの選び分け
AutoGenでは、役割を持たせたエージェント(AssistantAgent)を作り、1体で動かすか、複数をチーム(RoundRobinGroupChat など)にして順番に話させます。チームは「終了条件」を満たすまで会話を続けます。
flowchart TD
T[タスクを渡す] --> W[writer が下書き]
W --> R[reviewer が確認]
R --> C{終了条件?}
C -->|APPROVE と書いた| E[TaskResult を返す]
C -->|まだ| W
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| AutoGenとは | 複数のAIエージェントに会話させて仕事を分けるMicrosoftのPythonの枠組み | AutoGenとは |
| Microsoft AutoGenの今の扱い | 保守モード。新規は Microsoft Agent Framework が案内されている | 保守モードとAgent Framework |
| AutoGenのインストール | pip install -U "autogen-agentchat" "autogen-ext[openai]"(Python 3.10以上) |
インストール |
| AutoGenの使い方(最小) | モデルクライアント→AssistantAgent→await agent.run(task=...) |
AssistantAgentを動かす |
| ツール(関数)を使わせる | tools=[関数]。結果を文章にするなら reflect_on_tool_use=True |
ツール呼び出し |
| 複数のエージェントで会話 | RoundRobinGroupChat か SelectorGroupChat + 終了条件 | グループ会話 |
| v0.2のコードが動かない | v0.4でAPIが作り直された。initiate_chat は run に変わった |
v0.2とv0.4以降の違い |
| 費用はどれくらい | ライブラリは無料。LLMの呼び出し回数と送る文字数が会話の長さで増える | 呼び出し回数と費用の実測 |
確認環境:Ubuntu 24.04.5 LTS・Python 3.12.3 の仮想環境(作業用の venv)に autogen-agentchat 0.7.5・autogen-core 0.7.5・autogen-ext 0.7.5(openai 3.41.0)を入れて実行しました。外部のLLMには接続せず、127.0.0.1 で動く OpenAI 互換の自作モック(Python 標準の http.server で作り、役割ごとに決まった文を返し、届いたリクエストを記録する)に向けています。実行前に、クライアントの接続先が http://127.0.0.1:18142/v1/ であることを出力で確かめました。v0.2 は別の venv に pyautogen 0.2.35、Microsoft Agent Framework は agent-framework-core 1.23.0・agent-framework-openai 1.17.0 を入れて、同じモックで動かしています。そのため、ログの応答文はモックが返した決まった文で、本物のLLMの賢さや速さは測っていません。保守モードの扱い・移行ガイド・版と公開日・AutoGen Studio は、GitHub の README、公式ドキュメント、Microsoft Learn、PyPI で確かめました。図は mermaid で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「AutoGenとは・使い方|v0.2との違いとLLM呼び出し回数の実測」
AutoGenとは(Microsoftのマルチエージェントの枠組み)
この節では、AutoGenが何をする道具で、どんな部品でできているかが分かります。
AutoGenは、LLMを使うエージェントを複数作り、会話させながらタスクを進めるためのPythonのライブラリです。Microsoft Research から2023年に公開され、MIT ライセンスのオープンソースとして GitHub(microsoft/autogen)で開発されてきました。1体のエージェントにツール(関数)を使わせることも、下書き役とレビュー役のように役割を分けて会話させることもできます。
「エージェント」とは、LLMに役割(システムメッセージ)と道具(ツール)を与え、受け取ったメッセージに応じて返事をしたり関数を呼んだりする単位です。エージェントそのものの考え方は、関連記事「AIエージェントとは|仕組みとワークフローとの違い・作り方入門」で扱っています。
1AgentChat
すぐ使える高水準の API。AssistantAgent、チーム(RoundRobinGroupChat・SelectorGroupChat など)、終了条件がここにある。
2Core
メッセージのやり取りとイベント駆動のランタイム。分散実行や独自の仕組みを作るときの土台。
3Extensions
OpenAI・Azure OpenAI などのモデルクライアントや、コード実行などの拡張。
4Studio と Bench
AutoGen Studio はコードを書かずに試す画面、AutoGen Bench は性能を測る道具。
README の説明では、Core はメッセージパッシングとイベント駆動のエージェント、AgentChat は2者間チャットやグループチャットなど一般的なパターンを扱う「簡潔で方針が明確な」API、Extensions は LLM クライアントやコード実行などの拡張です。入門では AgentChat だけを使えば足ります。
AutoGenは保守モード:Microsoft Agent Frameworkとの関係(2026年10月29日時点)
この節では、AutoGenの今の扱いと、後から出た Microsoft Agent Framework との関係が分かります。
2026年10月29日時点で、microsoft/autogen の README は冒頭で「AutoGen is now in maintenance mode. It will not receive new features or enhancements」と書いています。続けて「New users should start with Microsoft Agent Framework.」とあり、既存の利用者には AutoGen から Agent Framework への移行ガイドが案内されています。README にあるのは「maintenance mode(保守モード)」で、新機能は入らないという意味です。
Microsoft Learn の移行ガイドは、Agent Framework を「AutoGen で切り開いた考え方を大きく発展させたもの」で、「Microsoft の AutoGen と Semantic Kernel の中核チームが開発し、今後の AI アプリ構築の新しい基盤として設計された」と説明しています(ページの最終更新 2026年10月23日)。
PyPI の公開履歴では、v0.4 系の最初の 0.4.0 が2025年1月9日(意図しない GPL の依存を含んでいたため取り下げられ、0.4.2 への更新が案内されている)、0.5.0 が2025年4月3日、0.6.0 が2025年6月5日、0.7.0 が2025年7月28日、0.7.5 が2025年9月30日です。Agent Framework の 1.0.0 は2026年4月2日に公開されています。
このため、これから書く新しいシステムは Agent Framework を第一候補にし、AutoGen は「既存の AutoGen のコードを読む・保守する」「チームやマルチエージェントの考え方を手元で学ぶ」用途で使う、という分け方が公式の案内に沿います。具体的な選び方は後の判断表にまとめました。
AutoGenのインストール(pip・venv)と名前が似たパッケージ
この節では、AutoGenを入れるコマンドと、入れ間違えやすいパッケージ名の違いが分かります。
公式の README が示すインストールは次の1行です。Python 3.10 以上が要ります。手元では作業用のフォルダーに venv を作り、その中に入れました。
python3.12 -m venv venv
./venv/bin/pip install -U "autogen-agentchat" "autogen-ext[openai]"
./venv/bin/pip list | grep -i -E 'autogen|openai'
autogen-agentchat 0.7.5
autogen-core 0.7.5
autogen-ext 0.7.5
openai 3.41.0
入った後の venv は、pip のキャッシュを含めて約94MB でした。autogen-ext[openai] の [openai] は、OpenAI 互換の API を呼ぶクライアントを一緒に入れる指定です。
PyPI には名前の似たパッケージが複数あり、どれを入れたかで書き方がまったく違います。
| パッケージ名 | 中身(PyPI の説明・2026年10月29日時点) | 書き方 |
|---|---|---|
| autogen-agentchat | Microsoft の AutoGen v0.4 以降。最新 0.7.5 | from autogen_agentchat... |
| pyautogen | 最新 0.10.0 は autogen-agentchat を入れるための中継パッケージ。v0.2 を使うなら pyautogen~=0.2.0 に固定と案内 | 0.2 系なら from autogen import ... |
| autogen(ハイフンなし) | v0.2 から続く別系統。説明に「AG2 is the current, actively developed version.」とある | from autogen import ... |
| agent-framework | Microsoft Agent Framework。最新 1.23.0 | from agent_framework import Agent |
ネットの記事で pip install pyautogen と from autogen import AssistantAgent の組み合わせを見かけたら、それは v0.2 の書き方です。v0.4 以降の環境で同じ import を書くと、手元では次のエラーになりました。
ModuleNotFoundError: No module named 'autogen'
AutoGenの使い方①:AssistantAgentを動かす(モックLLMに向ける)
この節では、エージェントを1体作って動かす最小のコードと、外部のLLMに繋がずに試す方法が分かります。
AutoGen v0.4 以降は、まず「モデルクライアント」を作り、それをエージェントに渡します。本物の OpenAI を使うなら model="gpt-4o" などの名前と API キーを渡しますが、今回は OpenAI 互換の自作モックに向けるため、base_url と model_info を指定しました。
モックを 127.0.0.1 で起動する
/v1/chat/completions を受けて、システムメッセージの役割に応じた決まった文か、ツール呼び出し(tool_calls)を返す小さなサーバー。届いた回数と送られた文字数を記録する。
接続先を確かめる
コードに assert BASE.startswith("http://127.0.0.1:") を入れ、起動時にクライアントの接続先を表示した。プロキシ環境では NO_PROXY=127.0.0.1 も設定する。
モデルクライアントを作る
OpenAI の一覧に無いモデル名を使うときは model_info(関数呼び出しに対応するか等)が必須。
エージェントを作って run する
名前・クライアント・システムメッセージを渡し、await agent.run(task=...)。戻り値は TaskResult。
import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletionClient
BASE = "http://127.0.0.1:18142/v1"
assert BASE.startswith("http://127.0.0.1:"), "接続先がモックではない"
def make_client():
return OpenAIChatCompletionClient(
model="mock-model",
base_url=BASE,
api_key="dummy",
model_info={"vision": False, "function_calling": True, "json_output": False,
"family": "unknown", "structured_output": False},
)
async def main():
client = make_client()
print("接続先:", client._client.base_url)
a = AssistantAgent("assistant", model_client=client, system_message="在庫係として答える。")
r = await a.run(task="ノートPCの在庫は?")
for m in r.messages:
print(type(m).__name__, "|", m.source, "|", m.content)
await client.close()
asyncio.run(main())
接続先: http://127.0.0.1:18142/v1/
TextMessage | user | ノートPCの在庫は?
TextMessage | assistant | ツールが無いので在庫を答えられません。
r.messages には、渡したタスク(source が user)とエージェントの返事が順に入ります。ツールを渡していないので、モックは「答えられません」と返しました。本物の LLM でも、ツールが無ければ在庫のような手元のデータは知りようがありません。
実際に AutoGen がモックに送った HTTP の本文は次のとおりです(モックで記録したもの)。システムメッセージとタスクが、OpenAI の Chat Completions と同じ形で送られています。
{"model": "mock-model", "stream": false,
"messages": [{"content": "在庫係として答える。", "role": "system"},
{"role": "user", "name": "user", "content": "ノートPCの在庫は?"}]}
同じ形の API を持つものなら、base_url を変えるだけで向け先を変えられます。手元のPCでLLMを動かす Ollama も OpenAI 互換の API を持っており、詳しくは関連記事「Ollamaの使い方|ローカルLLMのコマンド一覧とAPIの呼び方」で扱っています。
AutoGenの使い方②:ツール呼び出し(関数を使わせる)
この節では、エージェントに Python の関数を使わせる方法と、ログに出るイベントの読み方が分かります。
関数を tools=[...] に渡すだけで、AutoGen が型ヒントと docstring から JSON スキーマを作り、LLM に渡します。LLM が「この関数をこの引数で呼んで」と返すと、AutoGen が関数を実行し、結果を会話に戻します。
from autogen_agentchat.ui import Console
async def get_stock(item: str) -> str:
"""商品の在庫数を返す。"""
table = {"ノートPC": 12, "モニター": 3}
return f"{item}: {table.get(item, 0)}台"
b = AssistantAgent("stock", model_client=client, tools=[get_stock],
system_message="在庫係として答える。")
await Console(b.run_stream(task="ノートPCの在庫は?"))
---------- TextMessage (user) ----------
ノートPCの在庫は?
---------- ToolCallRequestEvent (stock) ----------
[FunctionCall(id='call_1', arguments='{"item": "ノートPC"}', name='get_stock')]
---------- ToolCallExecutionEvent (stock) ----------
[FunctionExecutionResult(content='ノートPC: 12台', name='get_stock', call_id='call_1', is_error=False)]
---------- ToolCallSummaryMessage (stock) ----------
ノートPC: 12台
ToolCallRequestEvent が「LLM が関数を呼べと言った」、ToolCallExecutionEvent が「AutoGen が関数を実行した結果」、ToolCallSummaryMessage が「エージェントの最終的な返事」です。AutoGen が LLM に送ったツールの定義は次のとおりで、docstring が description に、型ヒントが type になっています。
"tools": [{"type": "function", "function": {
"name": "get_stock", "description": "商品の在庫数を返す。",
"parameters": {"type": "object",
"properties": {"item": {"description": "item", "title": "Item", "type": "string"}},
"required": ["item"], "additionalProperties": false},
"strict": false}}]
既定(reflect_on_tool_use=False)では、関数の戻り値がそのまま返事になり、LLM の呼び出しは1回です。結果を LLM に文章としてまとめさせたいときは reflect_on_tool_use=True にします。その場合の実行結果がこちらです。
TextMessage | user | ノートPCの在庫は?
ToolCallRequestEvent | stock2 | [FunctionCall(id='call_2', arguments='{"item": "ノートPC"}', name='get_stock')]
ToolCallExecutionEvent | stock2 | [FunctionExecutionResult(content='ノートPC: 12台', name='get_stock', call_id='call_2', is_error=False)]
TextMessage | stock2 | ノートPCの在庫は12台です。TERMINATE
usage: [None, RequestUsage(prompt_tokens=52, completion_tokens=1), None, RequestUsage(prompt_tokens=170, completion_tokens=13)]
モックの記録では、2回目の呼び出しはメッセージが4件(システム・タスク・ツール呼び出し・ツール結果)に増え、送った文字数は1回目の104文字から340文字になりました。2回目のリクエストには tools が付いておらず、「まとめるだけ」の呼び出しになっています。トークン数はモックが文字数から決めた値なので、本物の値ではありません。
reflect_on_tool_use=False(既定)
LLM 呼び出し1回
返事は関数の戻り値そのもの(ToolCallSummaryMessage)
形式は tool_call_summary_format で変えられる
reflect_on_tool_use=True
LLM 呼び出し2回
返事は LLM が書いた文章(TextMessage)
人に読ませる返事が要るときに使う
AgentChat 0.7.5 の AssistantAgent には max_tool_iterations(既定1)もあり、ツール呼び出しを何回まで続けるかを決めます。Function Calling そのものの仕組みは、関連記事「Function Calling(tool use)の仕組みとPython実装」で扱っています。
AutoGenの使い方③:グループ会話(RoundRobinGroupChat)と終了条件
この節では、2体のエージェントを順番に話させるチームの作り方と、会話を止める終了条件が分かります。
RoundRobinGroupChat は、参加者を決まった順に1回ずつ話させるチームです。下書き役(writer)とレビュー役(reviewer)を作り、レビュー役が「APPROVE」と書いたら止める、という形にしました。
from autogen_agentchat.conditions import TextMentionTermination, MaxMessageTermination
from autogen_agentchat.teams import RoundRobinGroupChat
writer = AssistantAgent("writer", model_client=client,
system_message="下書き役。説明文の下書きを書き、指摘があれば直す。")
reviewer = AssistantAgent("reviewer", model_client=client,
system_message="レビュー役。下書きを確かめ、良ければ APPROVE と書く。")
stop = TextMentionTermination("APPROVE") | MaxMessageTermination(10)
team = RoundRobinGroupChat([writer, reviewer], termination_condition=stop)
result = await Console(team.run_stream(task="AutoGenの説明文を1文で書く。"))
print("stop_reason:", result.stop_reason)
---------- TextMessage (user) ----------
AutoGenの説明文を1文で書く。
---------- TextMessage (writer) ----------
下書き: AutoGenはすごいツールです。
---------- TextMessage (reviewer) ----------
レビュー: 修正点: 「すごい」では何か分かりません。何をする道具かを1文で。
---------- TextMessage (writer) ----------
下書き: AutoGenは、複数のAIエージェントに会話させて仕事を分担させるMicrosoftのPythonの枠組みです。(修正版)
---------- TextMessage (reviewer) ----------
レビュー: 問題ありません。APPROVE
stop_reason: Text 'APPROVE' mentioned
メッセージ数: 5 LLM呼び出し: 4
終了条件は |(どちらかを満たしたら止める)と &(両方満たしたら止める)で組み合わせられます。「APPROVE が出なかったときの上限」を必ず一緒に付けます。MaxMessageTermination(3) だけにすると、次のように3件目で止まりました。
stop_reason: Maximum number of messages 3 reached, current message count: 3
メッセージ数: 3 LLM呼び出し: 2
AgentChat 0.7.5 に入っている終了条件は次のとおりです(ソースの conditions で確かめた一覧)。
| 終了条件 | 止まるとき | 使いどころ |
|---|---|---|
| TextMentionTermination | 指定の文字列が出た | 「APPROVE」「TERMINATE」で合格を表す |
| MaxMessageTermination | メッセージ数が上限に達した | 無限に続くのを防ぐ上限 |
| TokenUsageTermination | トークン使用量が上限を超えた | 費用の上限 |
| TimeoutTermination | 指定の秒数が過ぎた | 応答時間の上限 |
| HandoffTermination | 指定の相手への引き継ぎが起きた | 人に渡す(Swarm など) |
| SourceMatchTermination | 指定のエージェントが話した | 最後の担当が話したら終わる |
| ExternalTermination | 外から set() された | 画面の停止ボタン |
| FunctionCallTermination | 指定の関数が実行された | 「完了」関数で終わる |
この表のほか、StopMessageTermination・TextMessageTermination・FunctionalTermination もあります。TokenUsageTermination(max_total_token=1000) を、いつまでも合格を出さないレビュー役と組み合わせた結果は次のとおりで、7件目で止まりました。
stop_reason: Token usage limit reached, total token count: 1029, prompt token count: 919, completion token count: 110.
messages: 7 合計トークン(モックの申告): 1029
上限ちょうどではなく、超えた時点で止まる点に注意します。また、チームを作るときに max_turns を渡すと、終了条件が無くても指定の回数で止まります。
stop_reason: Maximum number of turns 3 reached. / messages: 4
2回目 stop_reason: Maximum number of turns 3 reached. / 2回目の最初の話者: reviewer
reset後 最初の話者: writer
チームは run の後も会話の状態を覚えていて、もう一度 run すると続きから始まります。3ターン目で writer が話して止まったので、2回目は reviewer から始まりました。最初からやり直すときは await team.reset() を呼びます。
SelectorGroupChat:LLMに次の話し手を選ばせる
この節では、話す順番を LLM に決めさせるチームの動きと、その分の呼び出しが増える様子が分かります。
SelectorGroupChat は、毎ターン「次に誰が話すか」を LLM に選ばせるチームです。同じ writer と reviewer で動かし、モックに届いた最初のリクエストを記録すると、AutoGen が組み立てた選択用のプロンプトは次のとおりでした。
user :: You are in a role play game. The following roles are available:
writer: An agent that provides assistance with ability to use tools.
reviewer: An agent that provides assistance with ability to use tools..
Read the following conversation. Then select the next role from ['writer', 'reviewer'] to play. Only return the role.
user: AutoGenの説明文を1文で書く。
Read the above conversation. Then select the next role from ['writer', 'reviewer'] to play. Only return the role.
description を指定しないと、どのエージェントも同じ既定の説明(An agent that provides assistance with ability to use tools.)になり、LLM は名前だけで選ぶことになります。SelectorGroupChat を使うときは、各エージェントに description="下書きを書く担当" のように役割を書きます。
既定の allow_repeated_speaker=False では、直前に話した人は候補から外れます。2人のチームだと候補が1人になるため、手元では最初の1回だけ選択の呼び出しが起き、LLM 呼び出しは合計5回(選択1回+発言4回)でした。allow_repeated_speaker=True にすると毎ターン選択の呼び出しが入り、呼び出しは発言の2倍になりました(次の節の表)。
話す順番が決まっているなら RoundRobinGroupChat、順番を状況で変えたいなら SelectorGroupChat、決まった分岐や並列を図で書きたいなら GraphFlow、と分けると呼び出しの無駄が減ります。チームの型の考え方は、関連記事「AIエージェントの設計パターン一覧|5つの型の違いと選び方」で扱っています。
AutoGenのLLM呼び出し回数と費用の実測
この節では、会話を長くしたときに LLM の呼び出し回数と送る文字数がどれだけ増えるかが、実測の数字で分かります。
AutoGen 自体は無料ですが、エージェントが1回話すたびに LLM の API を1回呼びます。しかも毎回それまでの会話をまとめて送るので、送る量は会話の長さに対して2乗に近い形で増えます。いつまでも合格を出さないレビュー役を作り、MaxMessageTermination の上限を変えて、モックに届いた回数と文字数を数えました(文字数は送られた messages を JSON にした長さ)。
| チーム・上限 | メッセージ数 | LLM呼び出し | 送った文字数の合計 | 1回の最大 |
|---|---|---|---|---|
| RoundRobin・3 | 3 | 2 | 293 | 186 |
| RoundRobin・5 | 5 | 4 | 891 | 360 |
| RoundRobin・9 | 9 | 8 | 3,137 | 708 |
| RoundRobin・17 | 17 | 16 | 11,829 | 1,404 |
| Selector・3 | 3 | 4 | 1,379 | 561 |
| Selector・5 | 5 | 8 | 3,248 | 676 |
| Selector・9 | 9 | 16 | 8,726 | 906 |
| Selector・17 | 17 | 32 | 26,642 | 1,404 |
RoundRobin では、メッセージ数が約6倍(3→17)になったとき、送った文字数の合計は約40倍(293→11,829)になりました。実際の料金は「入力トークン×単価+出力トークン×単価」なので、入力側が会話の長さとともに膨らむ点が費用に効きます。SelectorGroupChat で毎回選ばせると、呼び出しは発言の2倍、文字数は RoundRobin の約2.3倍(17件で 26,642 対 11,829)でした。
- 1終了条件に必ず上限を付けるMaxMessageTermination か TokenUsageTermination を | でつなぐ
- 2順番が決まっているなら RoundRobinSelector は選ぶための呼び出しが増える
- 3ツール結果をそのまま返してよいなら reflect しないreflect_on_tool_use=True は呼び出しが1回増える
- 4開発中はモックか安いモデルで流れを確かめる会話の流れの不具合は、高いモデルで見つけても同じ
- 5同じ質問を繰り返すならキャッシュするv0.4 以降は既定で無効。ChatCompletionCache で包む
モックが 429(呼び出し回数の上限)を返すようにすると、AutoGen のクライアント(中で openai SDK を使う)は既定で2回再試行し、モックには合計3回届いてから openai.RateLimitError になりました(約0.5秒・0.8秒の間隔)。429 の扱いは関連記事「LLM APIの429・529エラー対処|リトライ実装とエラー一覧」で扱っています。
AutoGen v0.2とv0.4以降の違い(同じ処理を両方で動かした)
この節では、v0.2 と v0.4 以降で何が変わったかと、同じツール呼び出しを両方で動かした結果が分かります。
v0.4 は、非同期・イベント駆動の仕組みに作り直された版で、v0.2 のコードはそのままでは動きません。公式の移行ガイド(Migration Guide for v0.2 to v0.4)が示す主な対応は次のとおりです。
| 項目 | v0.2 | v0.4 以降 |
|---|---|---|
| 入れるもの | pyautogen~=0.2.0 等 | autogen-agentchat・autogen-ext |
| モデルの設定 | llm_config・config_list | model_client(OpenAIChatCompletionClient など) |
| 実行 | initiate_chat(同期) | await run()・run_stream()。結果は TaskResult |
| グループ会話 | GroupChat + GroupChatManager | Team(RoundRobinGroupChat・SelectorGroupChat) |
| 終了 | is_termination_msg・max_consecutive_auto_reply | 終了条件(TextMentionTermination など) |
| UserProxyAgent | 人の入力・コード実行・関数実行を兼ねる | 人の入力だけ。コード実行は CodeExecutorAgent |
| キャッシュ | cache_seed で既定で有効 | 既定で無効。ChatCompletionCache で包む |
v0.2 を別の venv に入れ(pyautogen 0.2.35)、同じ在庫のツール呼び出しを同じモックに向けて動かしました。v0.2 では、LLM が使う関数(caller)と、関数を実行する側(executor)を別々に登録します。
from autogen import AssistantAgent, UserProxyAgent, register_function
llm_config = {"config_list": [{"model": "mock-model", "base_url": BASE, "api_key": "dummy"}],
"cache_seed": None}
assistant = AssistantAgent("stock", system_message="在庫係として答える。", llm_config=llm_config)
user = UserProxyAgent("user", human_input_mode="NEVER", max_consecutive_auto_reply=3,
code_execution_config=False,
is_termination_msg=lambda m: "TERMINATE" in (m.get("content") or ""))
def get_stock(item: str) -> str:
"""商品の在庫数を返す。"""
return f"{item}: 12台"
register_function(get_stock, caller=assistant, executor=user, description="商品の在庫数を返す。")
res = user.initiate_chat(assistant, message="ノートPCの在庫は?")
user (to stock):
ノートPCの在庫は?
--------------------------------------------------------------------------------
[autogen.oai.client: (時刻は省略)] {329} WARNING - Model mock-model is not found. The cost will be 0. In your config_list, add field {"price" : [prompt_price_per_1k, completion_token_price_per_1k]} for customized pricing.
stock (to user):
***** Suggested tool call (call_1): get_stock *****
Arguments:
{"item": "ノートPC"}
***************************************************
--------------------------------------------------------------------------------
>>>>>>>> EXECUTING FUNCTION get_stock...
user (to stock):
***** Response from calling tool (call_1) *****
ノートPC: 12台
***********************************************
--------------------------------------------------------------------------------
stock (to user):
ノートPCの在庫は12台です。TERMINATE
--------------------------------------------------------------------------------
summary: ノートPCの在庫は12台です。
LLM呼び出し: 2
v0.2 は「user と stock が交互に話す2者の会話」として動き、ツールの結果を受けて LLM がもう一度まとめるため呼び出しは2回でした。v0.4 以降の既定(reflect しない)は1回なので、同じ「在庫を聞く」でも、移行すると呼び出し回数と返事の形が変わることがあります。v0.2 は料金表に無いモデル名だと「The cost will be 0」という警告を出し、費用を自動で数える機能を持っていました(移行ガイドの執筆時点では、v0.4 側の Model Client Cost は今後提供予定とされています)。
v0.2 の記事のコードをそのまま写す
pip install pyautogen の後に from autogen import AssistantAgent と initiate_chat を書くpip list で確かめ、v0.4 以降なら autogen_agentchat の書き方に合わせるpyautogen の最新は autogen-agentchat を入れる中継パッケージで、v0.2 の import は通らない
会話の止め方
LLM が合格の言葉を書かなければ、上限が無いチームは止まらない
Jupyter で動かす
asyncio.run(main()) を呼ぶawait main() と直接書くJupyter はすでにイベントループが動いている。asyncio.run は二重に呼べない
Microsoft Agent Frameworkへの移行(同じツール呼び出しを動かした)
この節では、AutoGen のコードが Agent Framework でどう書けるかと、同じモックで動かした結果が分かります。
Microsoft Learn の移行ガイド「AutoGen to Microsoft Agent Framework Migration Guide」(最終更新 2026年10月23日)が示す主な対応は次のとおりです。
| AutoGen | Agent Framework(Python) | ガイドの説明 |
|---|---|---|
| AssistantAgent | Agent | Agent は既定で複数ターン。ツールを呼び続けて最終回答を返す |
| FunctionTool | @tool | スキーマを自動で推定する |
| RoundRobinGroupChat | SequentialBuilder | 参加者を順に通るワークフロー |
| MagenticOneGroupChat | MagenticBuilder | Magentic 型の調整役 |
| GraphFlow | Workflow・WorkflowBuilder | 辺に沿ってメッセージを流す |
| run_stream | run(..., stream=True) | chunk.text で読める |
agent-framework-core 1.23.0 と agent-framework-openai 1.17.0 を別の venv に入れ、同じモックに向けて動かしました。
from agent_framework import Agent, tool
from agent_framework.openai import OpenAIChatCompletionClient
@tool
def get_stock(item: str) -> str:
"""商品の在庫数を返す。"""
return f"{item}: 12台"
client = OpenAIChatCompletionClient(model="mock-model", base_url=BASE, api_key="dummy")
agent = Agent(name="stock", client=client, instructions="在庫係として答える。", tools=[get_stock])
result = await agent.run("ノートPCの在庫は?")
text: ノートPCの在庫は12台です。TERMINATE
assistant | ['function_call']
tool | ['function_result']
assistant | ['text']
LLM呼び出し: 2
ガイドの説明どおり、Agent Framework の Agent はツールの結果を受けて LLM がもう一度答えるため、呼び出しは2回でした(AutoGen の reflect_on_tool_use=True に近い動き)。2回目のリクエストにも tools が付いていて、必要なら続けて関数を呼べる形です。モデル名が OpenAI の一覧に無くても、model_info の指定は要りませんでした。
なお、Agent Framework 本体(agent-framework-core)だけでは OpenAI のクライアントは使えず、agent-framework-openai を足す必要がありました。グループ会話(SequentialBuilder など)は agent-framework-orchestrations という別のパッケージにあります。
AutoGen Studioとは(コードを書かずに試す画面)
この節では、AutoGen Studio が何で、どう起動し、どこまで使ってよいかが分かります。
AutoGen Studio は、AgentChat のエージェントやチームを画面上で組み立てて試せる、ブラウザで使う道具です。PyPI の説明では、次の2行で入れて起動し、表示された URL をブラウザで開きます。
pip install -U autogenstudio
autogenstudio ui --port 8081
2026年10月29日時点の PyPI の最新版は 0.4.2.2(2025年5月27日公開)です。PyPI のページには「AutoGen Studio is under active development and is currently not meant to be a production-ready app.」「Expect breaking changes in upcoming releases.」と書かれており、本番のアプリとして使うものではなく、試作と確認のための道具という位置づけです。この記事では Studio は動かしておらず、PyPI と README の記述の範囲で書いています。
AutoGen Studio が向く
エージェントの組み合わせを画面で試す
非エンジニアに流れを見せる
作った構成を JSON で書き出す
コード(AgentChat)が向く
テスト・バージョン管理をする
自社のシステムに組み込む
終了条件や費用の上限を細かく決める
AutoGen・Agent Framework・LangGraph・CrewAIの判断表
この節では、マルチエージェントを作るときに、どれを選ぶかの目安が分かります。
どれもエージェントを組み合わせる道具ですが、組み立て方の考え方が違います。LangGraph は LangChain の開発元が作る、状態とノード・辺(グラフ)で流れを書く道具、CrewAI は役割・目標・タスクを書いてチームを組む道具です。LangChain 側の基本は、関連記事「LangChain入門|PythonでLLMアプリを作る基本とコピペ集」で扱っています。
| こうしたい | 選ぶもの | 理由 |
|---|---|---|
| Microsoft の技術でこれから新しく作る | Agent Framework | 公式が新規の利用者に案内している。Python と .NET |
| 既存の AutoGen v0.4 以降のコードを保守する | AutoGen(0.7.5)のまま | 動いているなら急がず、移行ガイドで計画する |
| 既存の v0.2 のコードを保守する | 版を固定して保守し、移行先を決める | v0.4 へも Agent Framework へも書き直しになる |
| 会話の流れ(チーム)の考え方を学ぶ | AutoGen AgentChat | チームと終了条件が少ないコードで試せる |
| 分岐・やり直し・途中保存を細かく制御したい | LangGraph か Agent Framework の Workflow | 流れをグラフで明示して書ける |
| 役割とタスクを書いて素早く試作したい | CrewAI | 役割・目標・タスクの書き方で組める |
| エージェント1体+ツール数個で足りる | 各社の SDK を直接 | 枠組みを入れるほどの複雑さが無い |
エージェントを複数にすると、呼び出し回数と送る文字数が増え、どこで間違えたかも追いにくくなります。上の実測のとおり、まず1体+ツールで足りないかを確かめてから、チームにするのが費用の面でも安全です。
- 1LLM を1回呼ぶSDK を直接。プロンプトだけで済むか
- 21体+ツールAssistantAgent に tools。呼び出し1〜2回
- 3決まった順のチームRoundRobinGroupChat + 上限付きの終了条件
- 4LLM が順番を選ぶチームSelectorGroupChat。description を書く
- 5分岐・並列を明示した流れGraphFlow、または Agent Framework の Workflow
AutoGenのよくあるエラーとつまずき(原文つき)
この節では、AutoGen を動かしたときに出たエラーの原文と、その直し方が分かります。
次の表のエラーは、すべて手元で起こして原文を写したものです。
| 出たエラー(原文) | 起きた操作 | 直し方 |
|---|---|---|
| ValueError: model_info is required when model name is not a valid OpenAI model | 一覧に無いモデル名(互換 API・ローカル LLM)を model_info なしで指定 | model_info={"function_calling": True, ...} を渡す |
| ValueError: The model does not support function calling. | model_info で function_calling を False にしたまま tools を渡した | 関数呼び出しに対応するモデルを使い、model_info を正しく書く |
| openai.APIConnectionError: Connection error. | base_url のポートで何も待ち受けていない | URL・ポート・/v1 の有無、プロキシ(NO_PROXY)を確かめる |
| openai.RateLimitError: Error code: 429 | API が429を返した(再試行2回の後) | 待って再試行する。呼び出し回数を減らす |
| ValueError: The participant names must be unique. | 同じ名前のエージェントを2体チームに入れた | 名前を変える |
| ValueError: The agent name must be a valid Python identifier. | 名前に空白を入れた(「下書き 役」) | 英数字と _ の名前にする |
| RuntimeError: asyncio.run() cannot be called from a running event loop | イベントループの中で asyncio.run を呼んだ(Jupyter と同じ状況) | Jupyter では await main() |
| ModuleNotFoundError: No module named 'autogen' | v0.4 以降の環境で v0.2 の import を書いた | autogen_agentchat から import する |
エラーにならないつまずきもあります。手元で見たものは次の3つです。
1終わらない・止まらない
合格の言葉が出ないと、上限の無いチームは会話を続ける。上限の付いた終了条件か max_turns を必ず付ける。
22回目の run が途中から始まる
チームは状態を覚えている。最初からなら await team.reset()。
3Selector が変な順に選ぶ
description が既定の文のままだと、名前でしか区別できない。役割を description に書く。
また、v0.2 の記事にある「UserProxyAgent が LLM の書いたコードを手元で実行する」構成は、LLM が書いたものをそのまま実行するため、実行する場所を隔離することが前提です。v0.4 以降では CodeExecutorAgent とコード実行の拡張(Docker を使うものなど)に分かれています。本記事ではコード実行は扱っていません。
よくある質問(AutoGen)
この節では、AutoGen についてよく調べられる疑問への短い答えが分かります。
Q. AutoGenとは何ですか? A. 複数のAIエージェントに会話させて仕事を分担させる、Microsoft製のPythonの枠組みです。エージェント1体にツールを使わせることも、複数をチームにして順番に話させることもできます。
Q. AutoGenは無料ですか? A. ライブラリは MIT ライセンスで無料です。費用がかかるのは、エージェントが呼ぶ LLM の API(OpenAI・Azure OpenAI など)です。会話が長いほど呼び出し回数と送る量が増えます。
Q. AutoGenはもう使われていないのですか? A. 2026年10月29日時点で README は保守モードと書いており、新機能は入りません。既存のコードは動きますが、新しく始めるなら公式は Microsoft Agent Framework を案内しています。
Q. AutoGenのインストール方法は?
A. Python 3.10 以上の環境で pip install -U "autogen-agentchat" "autogen-ext[openai]" です。venv などの仮想環境に入れると、他のプロジェクトと混ざりません。
Q. Microsoft AutoGen と AG2 は同じものですか? A. 別の系統です。AG2 は v0.2 系から分かれて開発が続いているもので、PyPI の autogen(ハイフンなし)の説明には「AG2 is the current, actively developed version.」とあります。Microsoft の v0.4 以降は autogen-agentchat です。
Q. v0.2 のコードを v0.4 で動かせますか?
A. そのままでは動きません。initiate_chat は run、llm_config は model_client、GroupChatManager は Team に変わりました。公式の移行ガイドに対応表があります。
Q. OpenAI 以外のモデルやローカル LLM でも使えますか?
A. OpenAI 互換の API を持つものなら、base_url と model_info を指定して使えます。この記事では 127.0.0.1 の自作モックをこの方法で使いました。Azure OpenAI などは Extensions に専用のクライアントがあります。
Q. 会話が終わらないときはどうしますか?
A. 終了条件に MaxMessageTermination か TokenUsageTermination を | でつなぎます。チーム作成時の max_turns でも止められます。
Q. 日本語で使えますか? A. システムメッセージやタスクは日本語で書けます。この記事の例もすべて日本語で動かしました。ただしエージェントの名前は Python の識別子として正しい必要があり、空白は使えません。
Q. AutoGen Studio は本番で使えますか? A. PyPI に「currently not meant to be a production-ready app」とあり、試作と確認のための道具という位置づけです。
Q. LangGraph や CrewAI とどう選べばよいですか? A. 流れを細かく制御したいなら LangGraph、役割とタスクで素早く試作したいなら CrewAI、Microsoft の技術で新しく作るなら Agent Framework が目安です。この記事の判断表にまとめています。
まとめ
この節では、この記事の要点が5つに分かります。
- AutoGenは、複数のAIエージェントに会話させて仕事を分けるMicrosoftのPythonの枠組み。2026年10月29日時点で保守モードで、新規には Microsoft Agent Framework が案内されている。
- v0.4 以降は
pip install -U "autogen-agentchat" "autogen-ext[openai]"。モデルクライアント→AssistantAgent→await run()が基本形。 - ツールは関数を
tools=[...]に渡すだけ。既定は呼び出し1回、reflect_on_tool_use=Trueで2回になった。 - チームは RoundRobinGroupChat か SelectorGroupChat。上限付きの終了条件を必ず付ける。会話が約6倍で送る文字数は約40倍、Selector は呼び出しが2倍になった。
- v0.2 とは API が別物。同じ処理でも呼び出し回数が変わることがあるので、移行時はモックで回数を数えて確かめると安全。
参考・出典
この節では、この記事で確かめた公式の情報源が分かります(確認日 2026年10月29日)。
- microsoft/autogen(GitHub、README):https://github.com/microsoft/autogen
- AutoGen ドキュメント「Migration Guide for v0.2 to v0.4」:https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/migration-guide.html
- Microsoft Learn「AutoGen to Microsoft Agent Framework Migration Guide」:https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-autogen/
- PyPI「autogen-agentchat」:https://pypi.org/project/autogen-agentchat/
- PyPI「agent-framework」:https://pypi.org/project/agent-framework/
- PyPI「autogenstudio」:https://pypi.org/project/autogenstudio/
- PyPI「pyautogen」:https://pypi.org/project/pyautogen/
- PyPI「autogen」:https://pypi.org/project/autogen/
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「AutoGenとは・使い方|v0.2との違いとLLM呼び出し回数の実測」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。