2525from pinecone .core .client .model .namespace_summary import NamespaceSummary
2626from pinecone import FetchResponse , QueryResponse , ScoredVector , SingleQueryResults , UpsertResponse , \
2727 DescribeIndexStatsResponse
28- from grpc ._channel import _InactiveRpcError
28+ from grpc ._channel import _InactiveRpcError , _MultiThreadedRendezvous
2929from pinecone .exceptions import PineconeProtocolError , PineconeException
3030
3131__all__ = ["GRPCIndex" , "GRPCVector" , "GRPCQueryVector" ]
@@ -207,6 +207,38 @@ def parse_stats_response(response: dict):
207207 return DescribeIndexStatsResponse (namespaces = namespace_summaries , dimension = dimension , _check_type = False )
208208
209209
210+ class PineconeGrpcFuture :
211+ def __init__ (self , delegate ):
212+ self ._delegate = delegate
213+
214+ def cancel (self ):
215+ return self ._delegate .cancel ()
216+
217+ def cancelled (self ):
218+ return self ._delegate .cancelled ()
219+
220+ def running (self ):
221+ return self ._delegate .running ()
222+
223+ def done (self ):
224+ return self ._delegate .done ()
225+
226+ def add_done_callback (self , fun ):
227+ return self ._delegate .add_done_callback (fun )
228+
229+ def result (self , timeout = None ):
230+ try :
231+ self ._delegate .result (timeout = timeout )
232+ except _MultiThreadedRendezvous as e :
233+ raise PineconeException (e ._state .debug_error_string ) from e
234+
235+ def exception (self ,timeout = None ):
236+ with _MultiThreadedRendezvous as e :
237+ raise PineconeException (e ._state .debug_error_string ) from e
238+
239+ def traceback (self ,timeout = None ):
240+ return self ._delegate .traceback (timeout = timeout )
241+
210242class GRPCIndex (GRPCIndexBase ):
211243
212244 @property
@@ -226,7 +258,8 @@ def _vector_transform(item):
226258 request = UpsertRequest (vectors = list (map (_vector_transform , vectors )), ** kwargs )
227259 timeout = kwargs .pop ('timeout' , None )
228260 if async_req :
229- return self ._wrap_grpc_call (self .stub .Upsert .future , request , timeout = timeout )
261+ future = self ._wrap_grpc_call (self .stub .Upsert .future , request , timeout = timeout )
262+ return PineconeGrpcFuture (future )
230263 else :
231264 return self ._wrap_grpc_call (self .stub .Upsert , request , timeout = timeout )
232265
@@ -235,7 +268,8 @@ def delete(self, *args, async_req=False, **kwargs):
235268 request = DeleteRequest (* args , ** kwargs )
236269 timeout = kwargs .pop ('timeout' , None )
237270 if async_req :
238- return self ._wrap_grpc_call (self .stub .Delete .future , request , timeout = timeout )
271+ future = self ._wrap_grpc_call (self .stub .Delete .future , request , timeout = timeout )
272+ return PineconeGrpcFuture (future )
239273 else :
240274 return self ._wrap_grpc_call (self .stub .Delete , request , timeout = timeout )
241275
0 commit comments