RuntimeError: GroupChat select_speaker が次の話者名を解決できない問題を AutoGen で修正する

intermediate🧠 AI Tools2026-05-21| Python 3.9+、pyautogen 0.2.x / autogen-agentchat 0.4.x、任意の OS(Linux/macOS/Windows)

Error Message

RuntimeError: GroupChat select_speaker failed to resolve the next speaker's name
#autogen#マルチエージェント#groupchat#python#llm

エラーの内容

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形式の一単語エージェント名を使いましょう:PlannerCoderCritic。地味な名前はバグを起こしません。
  • マネージャーのLLM設定にtemperature=0を設定してください。決定論的な出力は幻覚によるスピーカー名の生成を減らします。
  • 本番環境で動かすものには、round_robinまたはカスタムcallableを使用してください。LLM駆動のルーティング("auto")は、深夜2時にデバッグしにくい障害点を追加します。
  • ローカルモデルで複雑なパイプラインを構築する前に、スピーカー選択を明示的にテストしてください — 7B未満のモデルのほとんどは、実際の会話長でこのタスクに失敗します。
  • requirements.txtpyautogenのバージョンを固定してください。0.2.x → 0.4.xの移行でGroupChat API全体が壊れており、同様のことが再び起こりえます。

Related Error Notes