Getting Unable to parse hex string to integer error at delete_many function

Description

Deleting objects based on property of string type with verbose set to True return WeaviateDeleteManyError

tenant.data.delete_many(
    where=Filter.by_property(name="document_id").equal("Document_12345"),
dry_run=False, verbose=True)

Throws
WeaviateDeleteManyError: Query call with protocol GRPC delete failed with message batch delete reply: failed to parse hex string to integer.

Server Setup Information

  • Weaviate Server Version: 1.32.8
  • Deployment Method: Kubenetes
  • Multi Node? Number of Running Nodes: 6
  • Client Language and Version: v4.5.7
  • Multitenancy?: Yes

Any additional Information

We face the error only when verbose=True, as per our finding, the issue is at batchDeleteReplyFromObjects which try to convert object uuid to hexadecimal to send in the grpc response.

Hi!

As per our release page, you should be using at least python client version 4.16.x.

Also, try to always be on 1.32.latest on the server (or preferably 1.latest.latest), as we backport the most important fixes.

Do you see any logs on server or the request never even gets there? If the request gets to server, are they deleted before the error on client?

Assuming this is a client error, can you paste the entire traceback?

Thanks for reporting!

Nope @DudaNogueira , this is from server side not from client. This not happen to all batch_delete calls some cases only.

Traceback (most recent call last):
  File "/home/xxx/xxx/lib/python3.9/site-packages/weaviate/collections/batch/grpc_batch_delete.py", line 33, in batch_delete
    res, _ = self._connection.grpc_stub.BatchDelete.with_call(
  File "/home/xxx/xxx/lib/python3.9/site-packages/grpc/_channel.py", line 1193, in with_call
    return _end_unary_response_blocking(state, call, True, None)
  File "/home/xxx/xxx/lib/python3.9/site-packages/grpc/_channel.py", line 1005, in _end_unary_response_blocking
    raise _InactiveRpcError(state)  # pytype: disable=not-instantiable
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
	status = StatusCode.UNKNOWN
	details = "batch delete reply: failed to parse hex string to integer"
	debug_error_string = "UNKNOWN:Error received from peer  {grpc_message:"batch delete reply: failed to parse hex string to integer", grpc_status:2, created_time:"2025-12-17T07:00:38.049720466+00:00"}"
>

I myself added logging in server side using the below code in weaviate/adapters/handlers/grpc/v1/batch_delete.go

if verbose {
			uuidStr := obj.UUID.String()
			uuidHex := strings.ReplaceAll(uuidStr, "-", "")

			hexInteger, success := new(big.Int).SetString(uuidHex, 16)
			if !success {
				errMsg := fmt.Sprintf("UUID %q (cleaned=%q len=%d)", uuidStr, uuidHex, len(uuidHex))
				parseErrors = append(parseErrors, errMsg)
				fmt.Printf("batchDeleteReplyFromObjects: failed to parse %s\n", errMsg)
				// Create object with empty UUID for this failed parse
				hexInteger = new(big.Int)
			}
<! Remaining Code ---- >

	// Throw error at the end if there were any parsing errors
	if len(parseErrors) > 0 {
		return reply, fmt.Errorf("batch delete completed with %d UUID parse errors: %v", len(parseErrors), parseErrors)
	}

and get the below error response.

debug_error_string = "UNKNOWN:Error received from peer  {created_time:"2025-12-24T07:16:15.566023889+00:00", grpc_status:2, grpc_message:"batch delete reply: batch delete completed with 12 UUID parse errors: [UUID \"\" (cleaned=\"\" len=0) UUID \"\" (cleaned=\"\" len=0) UUID \"\" (cleaned=\"\" len=0) UUID \"\" (cleaned=\"\" len=0) UUID \"\" (cleaned=\"\" len=0) UUID \"\" (cleaned=\"\" len=0) UUID \"\" (cleaned=\"\" len=0) UUID \"\" (cleaned=\"\" len=0) UUID \"\" (cleaned=\"\" len=0) UUID \"\" (cleaned=\"\" len=0) UUID \"\" (cleaned=\"\" len=0) UUID \"\" (cleaned=\"\" len=0)]"}"