chroma-core/chroma · error · ValueError

Tenant name must be at least 3 characters long

Error message

Tenant name must be at least 3 characters long

What it means

SegmentAPI.create_tenant (chromadb/api/segment.py:194) requires tenant names of at least 3 characters. The check runs before the sysdb write, so a short name fails fast with ValueError and no tenant is created.

Source

Thrown at chromadb/api/segment.py:199

    @override
    def delete_database(self, name: str, tenant: str = DEFAULT_TENANT) -> None:
        self._sysdb.delete_database(name=name, tenant=tenant)

    @trace_method("SegmentAPI.list_databases", OpenTelemetryGranularity.OPERATION)
    @override
    def list_databases(
        self,
        limit: Optional[int] = None,
        offset: Optional[int] = None,
        tenant: str = DEFAULT_TENANT,
    ) -> Sequence[t.Database]:
        return self._sysdb.list_databases(limit=limit, offset=offset, tenant=tenant)

    @trace_method("SegmentAPI.create_tenant", OpenTelemetryGranularity.OPERATION)
    @override
    def create_tenant(self, name: str) -> None:
        if len(name) < 3:
            raise ValueError("Tenant name must be at least 3 characters long")

        self._sysdb.create_tenant(
            name=name,
        )

    @override
    def get_user_identity(self) -> UserIdentity:
        return UserIdentity(
            user_id="",
            tenant=DEFAULT_TENANT,
            databases=[DEFAULT_DATABASE],
        )

    @trace_method("SegmentAPI.get_tenant", OpenTelemetryGranularity.OPERATION)
    @override
    def get_tenant(self, name: str) -> t.Tenant:
        return self._sysdb.get_tenant(name=name)

View on GitHub (pinned to aecdd12c8a)

Solutions

  1. Use a tenant name of 3+ characters: 'ac' -> 'tenant-ac'
  2. Map short internal tenant codes to longer canonical names via a lookup table
  3. Validate/normalize tenant names at the API boundary before they reach Chroma

Example fix

# before
client.create_tenant(name='a1')  # ValueError

# after
client.create_tenant(name='tenant-a1')
Defensive patterns

Strategy: validation

Validate before calling

def validate_tenant_name(name: str, minimum: int = 3) -> str:
    name = (name or '').strip()
    if len(name) < minimum:
        raise ValueError(f'tenant name must be at least {minimum} characters: {name!r}')
    return name

Type guard

def is_valid_tenant_name(name: str) -> bool:
    return isinstance(name, str) and len(name.strip()) >= 3

Try / catch

try:
    client.create_tenant(name=tenant)
except ValueError as e:
    if 'at least 3 characters' in str(e):
        client.create_tenant(name=f'tenant-{tenant}')
    else:
        raise

Prevention

When it happens

Trigger: client.create_tenant('ac') or create_tenant('x') - any tenant name with len < 3, including ''.

Common situations: Multi-tenant apps deriving tenant ids from short codes ('a1', 'us'); onboarding flows accepting arbitrary user input as tenant name; provisioning scripts with abbreviated tenant slugs.

Related errors


AI-assisted analysis of chroma-core/chroma@aecdd12c8a (2026-08-16). Data as JSON: /api/errors/5085ff8aef115403. Report an issue: GitHub.