{"record":{"id":"5085ff8aef115403","repo":"chroma-core/chroma","slug":"tenant-name-must-be-at-least-3-characters-long","errorCode":null,"errorMessage":"Tenant name must be at least 3 characters long","messagePattern":"Tenant name must be at least 3 characters long","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"chromadb/api/segment.py","lineNumber":199,"sourceCode":"    @override\n    def delete_database(self, name: str, tenant: str = DEFAULT_TENANT) -> None:\n        self._sysdb.delete_database(name=name, tenant=tenant)\n\n    @trace_method(\"SegmentAPI.list_databases\", OpenTelemetryGranularity.OPERATION)\n    @override\n    def list_databases(\n        self,\n        limit: Optional[int] = None,\n        offset: Optional[int] = None,\n        tenant: str = DEFAULT_TENANT,\n    ) -> Sequence[t.Database]:\n        return self._sysdb.list_databases(limit=limit, offset=offset, tenant=tenant)\n\n    @trace_method(\"SegmentAPI.create_tenant\", OpenTelemetryGranularity.OPERATION)\n    @override\n    def create_tenant(self, name: str) -> None:\n        if len(name) < 3:\n            raise ValueError(\"Tenant name must be at least 3 characters long\")\n\n        self._sysdb.create_tenant(\n            name=name,\n        )\n\n    @override\n    def get_user_identity(self) -> UserIdentity:\n        return UserIdentity(\n            user_id=\"\",\n            tenant=DEFAULT_TENANT,\n            databases=[DEFAULT_DATABASE],\n        )\n\n    @trace_method(\"SegmentAPI.get_tenant\", OpenTelemetryGranularity.OPERATION)\n    @override\n    def get_tenant(self, name: str) -> t.Tenant:\n        return self._sysdb.get_tenant(name=name)\n","sourceCodeStart":181,"sourceCodeEnd":217,"githubUrl":"https://github.com/chroma-core/chroma/blob/aecdd12c8a891610db8653630b066b32ceb678b5/chromadb/api/segment.py#L181-L217","documentation":"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.","triggerScenarios":"client.create_tenant('ac') or create_tenant('x') - any tenant name with len < 3, including ''.","commonSituations":"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.","solutions":["Use a tenant name of 3+ characters: 'ac' -> 'tenant-ac'","Map short internal tenant codes to longer canonical names via a lookup table","Validate/normalize tenant names at the API boundary before they reach Chroma"],"exampleFix":"# before\nclient.create_tenant(name='a1')  # ValueError\n\n# after\nclient.create_tenant(name='tenant-a1')","handlingStrategy":"validation","validationCode":"def validate_tenant_name(name: str, minimum: int = 3) -> str:\n    name = (name or '').strip()\n    if len(name) < minimum:\n        raise ValueError(f'tenant name must be at least {minimum} characters: {name!r}')\n    return name","typeGuard":"def is_valid_tenant_name(name: str) -> bool:\n    return isinstance(name, str) and len(name.strip()) >= 3","tryCatchPattern":"try:\n    client.create_tenant(name=tenant)\nexcept ValueError as e:\n    if 'at least 3 characters' in str(e):\n        client.create_tenant(name=f'tenant-{tenant}')\n    else:\n        raise","preventionTips":["Map short tenant codes to longer canonical tenant names at your API boundary","Validate tenant names during onboarding, before any Chroma call","Never pass empty or 1-2 character identifiers into create_tenant"],"tags":["chroma","tenant-name","validation","python"],"backgroundTag":"invalid-resource-name","analyzedSha":"aecdd12c8a891610db8653630b066b32ceb678b5","analyzedAt":"2026-08-16T21:53:27.228Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}