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

  1. Deduplicate or number the member names in the create payload (researcher-1, researcher-2)
  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

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


AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16). Data as JSON: /api/errors/4b486df8344ca55d. Report an issue: GitHub.