エラーの内容
RuntimeError: GroupChat select_speaker failed to resolve the next speaker's name
AutoGenのGroupChatManagerが次のエージェントを特定できない場合、会話の途中でクラッシュします。LLMは登録済みエージェント名のいずれかを返すはずでしたが、認識できない値、または何も返しませんでした。
原因
このエラーを引き起こす原因はいくつかあり、それぞれ異なる対処が必要です:
- LLMがどのエージェントにも一致しない名前を返した — モデルが名前を幻覚で生成したか、
"Coder"という単純な文字列の代わりに"Agent: Coder"のような書式を付加した。 - エージェント名にスペースや特殊文字が含まれている —
"Code Writer"や"agent-1"のような名前は、AutoGenがLLM出力を解析する際に使用するファジーマッチングを混乱させる。 - スピーカー選択中にトークン上限に達した — 選択プロンプトが途中で切り捨てられ、モデルが空または不完全なレスポンスを返した。
- GroupChatManagerに非力なモデルを使用している — GPT-3.5やほとんどのローカルLLMは、このタスクに驚くほど頻繁に失敗する。GPT-4クラスのモデルであれば安定して処理できる。
- カスタム
speaker_selection_methodで例外が発生した — callableを渡してそれがエラーになった場合、AutoGenがこのRuntimeErrorでラップする。
修正1:シンプルな一単語のエージェント名を使う
この修正だけで、ほとんどのケースでエラーが解消されます。エージェント名を単純な英数字の文字列に変更してください。スペースなし、ハイフンなし、できればアンダースコアも避けてください。
import autogen
coder = autogen.AssistantAgent(
name="Coder", # Good: simple, single word
llm_config=llm_config,
)
reviewer = autogen.AssistantAgent(
name="Reviewer", # Good
llm_config=llm_config,
)
# Bad examples:
# name="Code Writer" → spaces break matching
# name="code-reviewer" → hyphens trip up the LLM
# name="agent_1" → underscores sometimes misread as spaces
修正2:GroupChatManagerにより強力なモデルを使う
スピーカー選択は独立したLLM呼び出しであり、マネージャーはエージェントが使用するモデルを使いません。マネージャーのモデルが非力な場合は、GPT-4oまたは同等のモデルを指定した専用の設定を用意してください。temperature=0の設定も効果的です。決定論的な出力により、幻覚による名前の生成が減ります。
manager_llm_config = {
"config_list": [{"model": "gpt-4o", "api_key": "..."}],
"temperature": 0,
}
group_chat = autogen.GroupChat(
agents=[user_proxy, coder, reviewer],
messages=[],
max_round=12,
)
manager = autogen.GroupChatManager(
groupchat=group_chat,
llm_config=manager_llm_config, # separate, stronger config
)
修正3:決定論的な選択でLLMを完全に回避する
動的なルーティングが不要な場合は、それに対してコストをかける必要はありません。"round_robin"またはカスタムcallableを使えば、スピーカー選択の呼び出しは一切発生しません。
# Option A: round_robin — エージェントが順番に交代する
group_chat = autogen.GroupChat(
agents=[user_proxy, coder, reviewer],
messages=[],
max_round=10,
speaker_selection_method="round_robin",
)
# Option B: カスタムcallable — 完全な制御
def my_speaker_selector(last_speaker, groupchat):
agents = groupchat.agents
last_idx = agents.index(last_speaker)
return agents[(last_idx + 1) % len(agents)]
group_chat = autogen.GroupChat(
agents=[user_proxy, coder, reviewer],
messages=[],
max_round=10,
speaker_selection_method=my_speaker_selector,
)
修正4:max_retries_for_selecting_speakerを増やす
AutoGen 0.2.xには、このエラー専用のリトライパラメータが含まれています。デフォルトは2回ですが、モデルが時々失敗する場合には不十分なことが多いです。5に増やすだけで、他の変更なしにほとんどの一時的な失敗から回復できます。
group_chat = autogen.GroupChat(
agents=[user_proxy, coder, reviewer],
messages=[],
max_round=10,
max_retries_for_selecting_speaker=5, # default is 2
speaker_selection_method="auto",
)
修正5:ローカルLLMのコンテキストウィンドウオーバーフローに対処する
OllamaやLM Studioを使用していますか?スピーカー選択プロンプトには会話履歴全体が含まれます。8〜10ラウンド目になると、その履歴が4Kまたは8Kのコンテキストウィンドウを超える可能性があります。モデルは切り捨てられた入力を受け取り、無意味な出力、または何も返しません。
2つの調整が有効です:スピーカーのレスポンスに対するmax_tokensを制限し(必要なのは一単語だけです)、max_roundを減らして履歴を短く保ちます。
llm_config = {
"config_list": [{
"model": "llama3",
"base_url": "http://localhost:11434/v1",
"api_key": "ollama",
}],
"max_tokens": 512, # speaker response is just a name
"temperature": 0,
}
group_chat = autogen.GroupChat(
agents=[user_proxy, coder, reviewer],
messages=[],
max_round=6, # fewer rounds = shorter context history
)
修正6:autogen-agentchat 0.4.xに移行済みの場合
0.4.xパッケージはGroupChat APIを一から書き直しました。古いGroupChatManagerのパターンはもう存在しません。決定論的な順序付けにはRoundRobinGroupChatを、LLMベースのルーティングが必要な場合はSelectorGroupChatを使用してください。
from autogen_agentchat.teams import RoundRobinGroupChat, SelectorGroupChat
from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletionClient
model_client = OpenAIChatCompletionClient(model="gpt-4o")
coder = AssistantAgent(name="Coder", model_client=model_client)
reviewer = AssistantAgent(name="Reviewer", model_client=model_client)
# Deterministic rotation
team = RoundRobinGroupChat([coder, reviewer], max_turns=10)
# LLM-based selection — use a capable model here
team = SelectorGroupChat(
[coder, reviewer],
model_client=model_client,
)
動作確認
簡単なタスクで最小構成の2エージェントチャットを実行してください。正常に完了すれば、修正が成功しています。
import autogen
llm_config = {"config_list": [{"model": "gpt-4o", "api_key": "YOUR_KEY"}], "temperature": 0}
user = autogen.UserProxyAgent(name="User", human_input_mode="NEVER", max_consecutive_auto_reply=1)
coder = autogen.AssistantAgent(name="Coder", llm_config=llm_config)
gc = autogen.GroupChat(agents=[user, coder], messages=[], max_round=3)
mgr = autogen.GroupChatManager(groupchat=gc, llm_config=llm_config)
user.initiate_chat(mgr, message="Write a hello world in Python")
# Should complete without RuntimeError
実行後のログを確認してください。select_speakerの警告は問題ありません — リトライが成功したことを意味します。実際のエラーが出ている場合は、まだ問題が解消されていません。
予防策
- CamelCase形式の一単語エージェント名を使いましょう:
Planner、Coder、Critic。地味な名前はバグを起こしません。 - マネージャーのLLM設定に
temperature=0を設定してください。決定論的な出力は幻覚によるスピーカー名の生成を減らします。 - 本番環境で動かすものには、
round_robinまたはカスタムcallableを使用してください。LLM駆動のルーティング("auto")は、深夜2時にデバッグしにくい障害点を追加します。 - ローカルモデルで複雑なパイプラインを構築する前に、スピーカー選択を明示的にテストしてください — 7B未満のモデルのほとんどは、実際の会話長でこのタスクに失敗します。
requirements.txtにpyautogenのバージョンを固定してください。0.2.x → 0.4.xの移行でGroupChat API全体が壊れており、同様のことが再び起こりえます。

