microsoft/semantic-kernel · error · ValueError
Agent {handoff_agent_name} is not a member of the handoff gr
Error message
Agent {handoff_agent_name} is not a member of the handoff group. What it means
Raised as a ValueError in _validate_handoffs when the TARGET of a handoff connection is not among the orchestration's members. For each handoff source, every declared target (connection) is checked against member_names; a target not present means the agent would hand off to a non-existent agent, so construction fails.
Source
Thrown at python/semantic_kernel/agents/orchestration/handoffs.py:525
"""Get the actor type for an agent.
The type is appended with the internal topic type to ensure uniqueness in the runtime
that may be shared by multiple orchestrations.
"""
return f"{agent.name}_{internal_topic_type}"
def _validate_handoffs(self) -> None:
"""Validate the handoffs to ensure all connections are valid."""
if not self._handoffs:
raise ValueError("Handoffs cannot be empty. Please provide at least one handoff connection.")
member_names = {m.name for m in self._members}
for agent_name, connections in self._handoffs.items():
if agent_name not in member_names:
raise ValueError(f"Agent {agent_name} is not a member of the handoff group.")
for handoff_agent_name in connections:
if handoff_agent_name not in member_names:
raise ValueError(f"Agent {handoff_agent_name} is not a member of the handoff group.")
if handoff_agent_name == agent_name:
raise ValueError(f"Agent {agent_name} cannot handoff to itself.")
# endregion HandoffOrchestration
View on GitHub (pinned to c028a0c7dc)
Solutions
- Ensure every handoff target name matches exactly a member's .name.
- Use agent objects in Handoff(...) rather than name strings to avoid typos.
- Keep handoffs in sync when members are added/removed/renamed.
- Add unit tests asserting all handoff endpoints exist in members.
Example fix
# before - 'reviewer' is not a member handoffs = [Handoff(agent_a, "reviewer")] # after - target is a real member handoffs = [Handoff(agent_a, agent_c)]
Defensive patterns
Strategy: validation
Validate before calling
# Validate all handoff targets are members before constructing:
member_names = {m.name for m in members}
for h in handoffs:
tgt = h.target.name if hasattr(h.target, "name") else h.target
assert tgt in member_names, f"Handoff target '{tgt}' is not a member" Try / catch
try:
orchestration = HandoffOrchestration(members=members, handoffs=handoffs)
except ValueError as ex:
if "is not a member" in str(ex):
# reconcile handoff targets with members and retry
... Prevention
- Pass agent objects in Handoff(...) rather than name strings.
- Keep handoffs in sync when members are added/removed/renamed.
- Unit-test that all handoff targets exist in members.
When it happens
Trigger: A Handoff(source, target) is supplied where target's name does not match any member. Occurs when a target agent was removed/renamed but the handoff still points to the old name, or when a target name string is misspelled.
Common situations: Renaming/removing a target agent without updating handoffs; typos in target names; referencing a target by a stale name after refactor; building handoffs against a different members set.
Related errors
- The agent {agent.Name ?? agent.Id} cannot have a handoff to
- The following agents are not defined in the orchestration: {
- Entry agent is not defined.
- Handoffs cannot be empty. Please provide at least one handof
- Agent {agent_name} is not a member of the handoff group.
AI-assisted analysis of microsoft/semantic-kernel@c028a0c7dc (2026-08-13).
Data as JSON: /api/errors/42c602bed0a741ae.
Report an issue: GitHub.