diff --git a/pinecone/db_control/models/list_response.py b/pinecone/db_control/models/list_response.py index c3ba57d41..8ae7d82d7 100644 --- a/pinecone/db_control/models/list_response.py +++ b/pinecone/db_control/models/list_response.py @@ -1,5 +1,7 @@ from typing import NamedTuple, Optional, List +from pinecone.core.openapi.db_data.model.usage import Usage + class Pagination(NamedTuple): next: str @@ -9,3 +11,4 @@ class ListResponse(NamedTuple): namespace: str vectors: List pagination: Optional[Pagination] + usage: Usage diff --git a/pinecone/grpc/index_grpc.py b/pinecone/grpc/index_grpc.py index 83fce126c..fb8a1755e 100644 --- a/pinecone/grpc/index_grpc.py +++ b/pinecone/grpc/index_grpc.py @@ -11,6 +11,7 @@ from .utils import ( dict_to_proto_struct, parse_fetch_response, + parse_list_response, parse_query_response, parse_stats_response, parse_upsert_response, @@ -29,7 +30,7 @@ NamespaceDescription, ListNamespacesResponse, ) -from pinecone.db_control.models.list_response import ListResponse as SimpleListResponse, Pagination +from pinecone.db_control.models.list_response import ListResponse as SimpleListResponse from pinecone.core.grpc.protos.db_data_2025_04_pb2 import ( Vector as GRPCVector, QueryVector as GRPCQueryVector, @@ -566,8 +567,9 @@ def list_paginated( limit: Optional[int] = None, pagination_token: Optional[str] = None, namespace: Optional[str] = None, + async_req: bool = False, **kwargs, - ) -> SimpleListResponse: + ) -> Union[SimpleListResponse, PineconeGrpcFuture]: """ The list_paginated operation finds vectors based on an id prefix within a single namespace. It returns matching ids in a paginated form, with a pagination token to fetch the next page of results. @@ -606,16 +608,15 @@ def list_paginated( ) request = ListRequest(**args_dict, **kwargs) timeout = kwargs.pop("timeout", None) - response = self.runner.run(self.stub.List, request, timeout=timeout) - if response.pagination and response.pagination.next != "": - pagination = Pagination(next=response.pagination.next) + if async_req: + future = self.runner.run(self.stub.List.future, request, timeout=timeout) + return PineconeGrpcFuture( + future, timeout=timeout, result_transformer=parse_list_response + ) else: - pagination = None - - return SimpleListResponse( - namespace=response.namespace, vectors=response.vectors, pagination=pagination - ) + response = self.runner.run(self.stub.List, request, timeout=timeout) + return parse_list_response(response) def list(self, **kwargs): """ diff --git a/pinecone/grpc/utils.py b/pinecone/grpc/utils.py index 1be98f5b5..9eff85e9f 100644 --- a/pinecone/grpc/utils.py +++ b/pinecone/grpc/utils.py @@ -17,6 +17,8 @@ ListNamespacesResponse, Pagination, ) +from pinecone.core.grpc.protos.db_data_2025_04_pb2 import ListResponse as GRPCListResponse +from pinecone.db_control.models.list_response import ListResponse, Pagination as SimplePagination from pinecone.db_data.dataclasses import FetchResponse from google.protobuf.struct_pb2 import Struct @@ -163,3 +165,16 @@ def parse_list_namespaces_response(response: Message) -> ListNamespacesResponse: pagination=pagination, _check_type=False, ) + +def parse_list_response(response: GRPCListResponse) -> ListResponse: + if response.pagination and response.pagination.next != "": + pagination = SimplePagination(next=response.pagination.next) + else: + pagination = None + + return ListResponse( + namespace=response.namespace, + vectors=list(response.vectors), + pagination=pagination, + usage=parse_usage(response.usage), + )