microsoft/semantic-kernel · error · VectorStoreOperationException

Failed to delete item(s).

Error message

Failed to delete item(s).

What it means

CosmosNoSqlCollection._inner_delete deletes items concurrently with asyncio.gather(..., return_exceptions=True), then collects any exceptions. If one or more deletes failed, it raises VectorStoreOperationException with the gathered exceptions attached. Partial failure is possible: some items may have been deleted.

Source

Thrown at python/semantic_kernel/connectors/azure_cosmos_db.py:772

        query = (
            f"SELECT {self._build_select_clause(include_vectors)} FROM c WHERE "  # nosec: B608
            f"c.id IN ({', '.join([f'@id{i}' for i in range(len(keys))])})"  # nosec: B608
        )  # nosec: B608
        parameters: list[dict[str, Any]] = [{"name": f"@id{i}", "value": _get_key(key)} for i, key in enumerate(keys)]

        container_proxy = await self._get_container_proxy(self.collection_name, **kwargs)
        return [item async for item in container_proxy.query_items(query=query, parameters=parameters)]

    @override
    async def _inner_delete(self, keys: Sequence[TNoSQLKey], **kwargs: Any) -> None:  # type: ignore
        container_proxy = await self._get_container_proxy(self.collection_name, **kwargs)
        results = await asyncio.gather(
            *[container_proxy.delete_item(item=_get_key(key), partition_key=_get_partition_key(key)) for key in keys],
            return_exceptions=True,
        )
        exceptions = [result for result in results if isinstance(result, Exception)]
        if exceptions:
            raise VectorStoreOperationException("Failed to delete item(s).", exceptions)

    @override
    async def _inner_search(
        self,
        search_type: SearchType,
        options: VectorSearchOptions,
        values: Any | None = None,
        vector: Sequence[float | int] | None = None,
        **kwargs: Any,
    ) -> KernelSearchResults[VectorSearchResult[TModel]]:
        params = [{"name": "@top", "value": options.top}]
        vector_field = self.definition.try_get_vector_field(options.vector_property_name)
        if not vector_field:
            raise VectorStoreModelException(
                f"Vector field '{options.vector_property_name}' not found in the data model definition."
            )
        if not vector:
            vector = await self._generate_vector_from_values(values, options)

View on GitHub (pinned to c028a0c7dc)

Solutions

  1. Inspect the 'exceptions' list attached to the error to see which keys failed and why.
  2. For 'not found' errors, decide whether to treat as success (idempotent delete) or report upstream.
  3. Retry the failed keys with exponential backoff for transient (429/network) errors.
  4. Verify _get_partition_key produces the correct partition key for each record.
Defensive patterns

Strategy: try-catch

Try / catch

try:
    await collection.delete(keys=keys)
except VectorStoreOperationException as e:
    excs = e.args[1] if len(e.args) > 1 else []
    # classify per-key failures; retry transient ones; treat 'not found' as success if idempotent

Prevention

When it happens

Trigger: Raised in _inner_delete when at least one of the per-key delete_item calls raised. Causes: key not found (CosmosResourceNotFoundError), partition key mismatch, throttling (429), auth failure, network error.

Common situations: Deleting keys that don't exist. Wrong partition key derivation (_get_partition_key). Throttling under concurrent deletes. Transient network errors. Auth token expiry mid-batch.

Related errors


AI-assisted analysis of microsoft/semantic-kernel@c028a0c7dc (2026-08-13). Data as JSON: /api/errors/c8fa991ee6dd2621. Report an issue: GitHub.