{"record":{"id":"271e54625b301f2a","repo":"zylon-ai/private-gpt","slug":"group-id-must-be-provided-for-logical-multitenancy","errorCode":null,"errorMessage":"group_id must be provided for logical multitenancy","messagePattern":"group_id must be provided for logical multitenancy","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"private_gpt/components/vector_store/patched_qdrant_store.py","lineNumber":170,"sourceCode":"        )\n        # Init client after, to avoid to call exist collection\n        self._client = client\n        self._aclient = aclient\n\n        # Set flag os legacy\n        self._legacy_vector_format = True\n        if self.enable_hybrid:\n            self.dense_vector_name = DEFAULT_DENSE_VECTOR_NAME\n            self.sparse_vector_name = DEFAULT_SPARSE_VECTOR_NAME_OLD\n        else:\n            self.dense_vector_name = LEGACY_UNNAMED_VECTOR\n\n        # Init multi-tenancy\n        self._logical_multitenancy = logical_multitenancy\n        self._group_id = group_id\n        self._group_id_field = group_id_field or DEFAULT_GROUP_ID_FIELD\n        if self._logical_multitenancy and not self._group_id:\n            raise ValueError(\"group_id must be provided for logical multitenancy\")\n\n        # Init collection\n        self._init_collection(\n            collection_name,\n            enable_hybrid,\n            embed_dim,\n            models.Distance[distance.upper()],\n            logical_multitenancy,\n            hnsw_m,\n            hnsw_payload_m,\n            indexes,\n            on_disk,\n        )\n\n        # setup hybrid search if enabled\n        if enable_hybrid or fastembed_sparse_model is not None:\n            self._sparse_doc_fn = sparse_doc_fn or self.get_default_sparse_doc_encoder(\n                collection_name, fastembed_sparse_model=fastembed_sparse_model","sourceCodeStart":152,"sourceCodeEnd":188,"githubUrl":"https://github.com/zylon-ai/private-gpt/blob/4a030776a31a901ad80b1bf4d7faa2c1a367efbb/private_gpt/components/vector_store/patched_qdrant_store.py#L152-L188","documentation":"ValueError raised by PatchedQdrantVectorStore.__init__ when logical_multitenancy=True but no group_id was supplied. In logical multitenancy mode every write must be tagged with a group_id (stored under group_id_field, default DEFAULT_GROUP_ID_FIELD), so a missing group makes the store unusable by construction.","triggerScenarios":"Constructing PatchedQdrantVectorStore (directly or via the factory with settings.vectorstore.multitenancy == 'logical') without passing group_id; enabling logical multitenancy in config while the factory path that supplies group_id was changed or bypassed.","commonSituations":"Flipping vectorstore.multitenancy to 'logical' in settings without configuring the group id; writing a custom factory that forwards fewer constructor args; assuming group_id is optional in logical mode.","solutions":["Provide group_id whenever logical multitenancy is enabled (constructor arg or the corresponding settings field consumed by the factory)","Or set vectorstore.multitenancy back to a mode that does not require a group id","Verify group_id_field default (DEFAULT_GROUP_ID_FIELD) matches the field your payloads use"],"exampleFix":"# before\nstore = PatchedQdrantVectorStore(collection_name=\"docs\", logical_multitenancy=True)\n# after\nstore = PatchedQdrantVectorStore(\n    collection_name=\"docs\",\n    logical_multitenancy=True,\n    group_id=\"tenant-acme\",\n)","handlingStrategy":"validation","validationCode":"def validate_multitenancy(logical: bool, group_id: str | None) -> None:\n    if logical and not group_id:\n        raise ValueError(\"configure group_id before enabling logical multitenancy\")","typeGuard":null,"tryCatchPattern":"try:\n    store = PatchedQdrantVectorStore(collection_name=c, logical_multitenancy=True, group_id=gid)\nexcept ValueError as e:\n    if \"group_id must be provided\" in str(e):\n        # fix config and restart; retrying unchanged will not help\n        raise","preventionTips":["Treat logical multitenancy + group_id as one config unit; validate both at startup","Add a settings schema check that requires the group id field when multitenancy == 'logical'","Document DEFAULT_GROUP_ID_FIELD so payload writers use the same field name"],"tags":["qdrant","vector-store","multitenancy","configuration"],"backgroundTag":null,"analyzedSha":"4a030776a31a901ad80b1bf4d7faa2c1a367efbb","analyzedAt":"2026-08-15T03:51:26.951Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}