tinyhumansai/openhuman · warning · TeamError
duplicate member name: {name}
Error message
duplicate member name: {name} What it means
Thrown by agent_teams create_team when two or more members in the same create request share the same name. The op builds a HashSet over member.name and rejects the whole request with TeamError::DuplicateMemberName before any row is written — no partial team is created. Member names must be unique within a team (they are how members address each other in message_member), while ids are generated.
Source
Thrown at src/openhuman/agent/orchestration/agent_teams/ops.rs:54
/// Create a team and its initial members.
///
/// Rejects duplicate member names ([`TeamError::DuplicateMemberName`]).
pub fn create_team(
config: &Config,
lead_agent_id: &str,
parent_thread_id: Option<&str>,
summary: Option<&str>,
members: &[NewMember],
) -> Result<TeamView> {
log::debug!(
"{LOG_PREFIX} create_team.entry lead={lead_agent_id} members={}",
members.len()
);
let mut seen: HashSet<&str> = HashSet::new();
for member in members {
if !seen.insert(member.name.as_str()) {
return Err(anyhow!(TeamError::DuplicateMemberName {
name: member.name.clone(),
}));
}
}
let team_id = format!("team-{}", Uuid::new_v4().simple());
run_ledger::upsert_agent_team(
&config.workspace_dir,
AgentTeamUpsert {
id: team_id.clone(),
parent_thread_id: parent_thread_id.map(str::to_string),
lead_agent_id: lead_agent_id.to_string(),
status: AgentTeamStatus::Active,
summary: summary.map(str::to_string),
created_at: None,
closed_at: None,
},
)?;View on GitHub (pinned to a221052e0d)
Solutions
- Deduplicate or number the member names in the create payload (researcher-1, researcher-2)
- Validate the payload against the members array before submitting
Example fix
// before
{"members":[{"name":"researcher","agent_id":"a1"},{"name":"researcher","agent_id":"a2"}]} // -> duplicate member name: researcher
// after
{"members":[{"name":"researcher-1","agent_id":"a1"},{"name":"researcher-2","agent_id":"a2"}]} Defensive patterns
Strategy: validation
Validate before calling
let names: HashSet<&str> = HashSet::new();
for m in &members { if !names.insert(m.name.as_str()) { return Err(anyhow!("duplicate member name: {}", m.name)); } }
// dedupe before agent_team_create:
let mut seen = HashSet::new();
let deduped: Vec<_> = members.into_iter().filter(|m| seen.insert(m.name.clone())).collect(); Type guard
fn unique_member_names(members: &[NewMember]) -> bool {
let mut seen = HashSet::new();
members.iter().all(|m| seen.insert(m.name.as_str()))
} Try / catch
match create_team(&config, lead, parent, summary, &members).await {
Err(e) if e.to_string().contains("duplicate member name") => {
// normalize names (append -1/-2) and re-submit — nothing was created on failure
unimplemented!()
}
other => other,
} Prevention
- Number role-style member names when spawning parallel workers (researcher-1, researcher-2)
- Validate the roster client-side before submitting — the server rejects atomically, so no cleanup is needed
When it happens
Trigger: Calling agent_team_create with a members array containing two entries whose name field matches (e.g. two 'researcher' workers); case matters as written — exact string comparison; LLM-generated rosters commonly duplicate role-style names.
Common situations: Agent composes a team template like [researcher, researcher, writer] for parallel workers; copy-paste of member blocks; names differing only by whitespace.
Related errors
- unknown team: {team_id}
- unknown member: {member_id}
- agentTeamApi: ${label} must be a positive integer
- agentTeamApi.get: teamId is required
- agentTeamApi.listMessages: teamId is required
AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16).
Data as JSON: /api/errors/4b486df8344ca55d.
Report an issue: GitHub.