From 35c6b9e08a8872d75e8d917c5c416bf55cbcb9b7 Mon Sep 17 00:00:00 2001 From: Maxwell Calkin <101308415+MaxwellCalkin@users.noreply.github.com> Date: Sun, 8 Mar 2026 08:11:19 -0400 Subject: [PATCH] fix: guard setattr on primitive return types in API client response handling When the delete endpoint returns a response that deserializes to a primitive type (e.g. str), the code tried to call setattr() on it to attach _response_info, which raises AttributeError since primitive types do not support arbitrary attribute assignment. Add a hasattr(__dict__) check before setattr to only attach response info on objects that support dynamic attributes (OpenAPI models). Primitive return types silently skip the response info attachment. Fixes pinecone-io#564 --- pinecone/openapi_support/api_client.py | 4 +++- pinecone/openapi_support/asyncio_api_client.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pinecone/openapi_support/api_client.py b/pinecone/openapi_support/api_client.py index afd6b96c..c716a248 100644 --- a/pinecone/openapi_support/api_client.py +++ b/pinecone/openapi_support/api_client.py @@ -212,9 +212,11 @@ def __call_api( response_info = extract_response_info(headers) if isinstance(return_data, dict): return_data["_response_info"] = response_info - else: + elif hasattr(return_data, "__dict__"): # Dynamic attribute assignment on OpenAPI models setattr(return_data, "_response_info", response_info) + # Primitive types (str, int, float, bool) do not support + # attribute assignment, so response_info is silently skipped. if _return_http_data_only: return return_data diff --git a/pinecone/openapi_support/asyncio_api_client.py b/pinecone/openapi_support/asyncio_api_client.py index 58a3a869..fa03e770 100644 --- a/pinecone/openapi_support/asyncio_api_client.py +++ b/pinecone/openapi_support/asyncio_api_client.py @@ -177,9 +177,11 @@ async def __call_api( response_info = extract_response_info(headers) if isinstance(return_data, dict): return_data["_response_info"] = response_info - else: + elif hasattr(return_data, "__dict__"): # Dynamic attribute assignment on OpenAPI models setattr(return_data, "_response_info", response_info) + # Primitive types (str, int, float, bool) do not support + # attribute assignment, so response_info is silently skipped. if _return_http_data_only: return return_data