feat: add support for alter schema drop vector index#1991
Conversation
There was a problem hiding this comment.
Orca Security Scan Summary
| Status | Check | Issues by priority | |
|---|---|---|---|
| Infrastructure as Code | View in Orca | ||
| SAST | View in Orca | ||
| Secrets | View in Orca | ||
| Vulnerabilities | View in Orca |
There was a problem hiding this comment.
Pull request overview
Adds client support for dropping a named vector’s index via the schema REST endpoint, mirroring the existing “delete property index” capability in the collections config API.
Changes:
- Added
delete_vector_index(vector_name)to the collection config executor, issuingDELETE /v1/schema/{className}/vectors/{vectorIndexName}/index. - Added sync and async type stubs for
delete_vector_index(...).
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.
| File | Description |
|---|---|
| weaviate/collections/config/executor.py | Implements the new delete-vector-index operation via the config executor. |
| weaviate/collections/config/sync.pyi | Exposes the new method in the sync config type stub. |
| weaviate/collections/config/async_.pyi | Exposes the new method in the async config type stub. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| Raises: | ||
| weaviate.exceptions.WeaviateConnectionError: If the network connection to Weaviate fails. | ||
| weaviate.exceptions.UnexpectedStatusCodeError: If Weaviate reports a non-OK status. | ||
| weaviate.exceptions.WeaviateInvalidInputError: If the vector does not exist. |
| def resp(res: Response) -> bool: | ||
| return res.status_code == 200 | ||
|
|
| return executor.execute( | ||
| response_callback=resp, | ||
| method=self._connection.delete, | ||
| path=path, | ||
| error_msg="Vector may not exist", | ||
| status_codes=_ExpectedStatusCodes(ok_in=[200], error="vector exists"), | ||
| ) |
| def delete_vector_index( | ||
| self, | ||
| vector_name: str, | ||
| ) -> executor.Result[bool]: | ||
| """Delete a vector index from the collection in Weaviate. | ||
|
|
||
| This is a destructive operation. The index will | ||
| need to be regenerated if you wish to use it again. | ||
|
|
||
| Args: | ||
| vector_name: The name of the vector whose index to delete. | ||
|
|
||
| Raises: | ||
| weaviate.exceptions.WeaviateConnectionError: If the network connection to Weaviate fails. | ||
| weaviate.exceptions.UnexpectedStatusCodeError: If Weaviate reports a non-OK status. | ||
| weaviate.exceptions.WeaviateInvalidInputError: If the vector does not exist. | ||
| """ | ||
| _validate_input( | ||
| [_ValidateArgument(expected=[str], name="vector_name", value=vector_name)] | ||
| ) | ||
|
|
||
| path = ( | ||
| f"/schema/{_capitalize_first_letter(self._name)}" | ||
| + f"/vectors/{vector_name}" | ||
| + "/index" | ||
| ) | ||
|
|
||
| def resp(res: Response) -> bool: | ||
| return res.status_code == 200 | ||
|
|
||
| return executor.execute( | ||
| response_callback=resp, | ||
| method=self._connection.delete, | ||
| path=path, | ||
| error_msg="Vector may not exist", | ||
| status_codes=_ExpectedStatusCodes(ok_in=[200], error="vector exists"), | ||
| ) |
d728dd9 to
7e5cd7f
Compare
There was a problem hiding this comment.
Orca Security Scan Summary
| Status | Check | Issues by priority | |
|---|---|---|---|
| Secrets | View in Orca |
3657487 to
736a7cd
Compare
| vector_index_config = __get_vector_index_config(named_vector) | ||
| assert vector_index_config is not None | ||
| # A vector whose index was dropped with `collection.config.delete_vector_index` is | ||
| # returned as `vectorIndexType: "none"` without any `vectorIndexConfig`. | ||
| assert ( | ||
| vector_index_config is not None |
| NONE: The index of this vector has been dropped, see ``collection.config.delete_vector_index``. | ||
| The vector data is still stored, but it cannot be searched. This value is reported by the | ||
| server only, it cannot be used to configure a vector. | ||
| """ |
7e5cd7f to
4e2a580
Compare
736a7cd to
be6c8dc
Compare
Follow-up to the `delete_vector_index` support, addressing review findings. After a successful drop, Weaviate keeps the vector in the schema as `vectorIndexType: "none"` with no `vectorIndexConfig`. The client asserted that every named vector has an index config, so `collection.config.get()` and `client.collections.list_all()` raised `AssertionError` for every collection in the cluster once any vector index had been dropped. `_NamedVectorConfig. vector_index_config` is now optional, `VectorIndexType` gained a server-reported `NONE` member and `to_dict()` round-trips it. `collection.config.update()` on a dropped vector raised a bare `KeyError: 'vectorIndexConfig'` from the schema merge. Both the current and the deprecated merge paths now go through one helper that raises a `WeaviateInvalidInputError` explaining that a dropped index cannot be re-created. The docstring claimed the index could be regenerated and that a missing vector raises `WeaviateInvalidInputError`. Neither is true: Weaviate rejects re-creating a dropped index, and an unknown vector name comes back as a 422. It now also documents that the endpoint is experimental and needs `ENABLE_EXPERIMENTAL_ALTER_SCHEMA_DROP_VECTOR_INDEX_ENDPOINT=true`, that only named vectors can be dropped, and that the drop is applied asynchronously. The error message no longer blames a missing vector for what is usually a disabled endpoint. Tests: unit coverage for parsing, exporting and updating a dropped vector, mock coverage for the request path and the disabled-endpoint response, and integration coverage gated at 1.39.0. The CI compose file enables the experimental endpoint; that flag can be dropped once 1.39.0 is GA. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4e2a580 to
2dbfaed
Compare
|
thought: Do you think this PR could do with fewer tests? The new endpoint is very simple and it seems to me like one "happy path" test will catch most things. Other tests verify Weaviate's behavior more than client's logic, and some may add up to 30s of pipeline time. |
Summary
delete_vector_index(vector_name)method to collection config, allowing users to drop a named vector's index viaDELETE /v1/schema/{className}/vectors/{vectorIndexName}/indexdelete_property_indexmethodCloses #1990