pinecone 5.4.2__tar.gz → 6.0.0.dev2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/PKG-INFO +3 -3
  2. pinecone-6.0.0.dev2/pinecone/__version__ +1 -0
  3. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/control/pinecone.py +9 -15
  4. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/shared/api_client.py +6 -67
  5. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/shared/configuration.py +0 -20
  6. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/data/index.py +25 -101
  7. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/data/query_results_aggregator.py +40 -34
  8. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/exceptions/__init__.py +3 -0
  9. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/grpc/__init__.py +1 -4
  10. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/grpc/base.py +11 -35
  11. pinecone-6.0.0.dev2/pinecone/grpc/future.py +34 -0
  12. pinecone-6.0.0.dev2/pinecone/grpc/grpc_runner.py +153 -0
  13. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/grpc/index_grpc.py +46 -114
  14. pinecone-6.0.0.dev2/pinecone/grpc/index_grpc_asyncio.py +638 -0
  15. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/grpc/pinecone.py +12 -3
  16. pinecone-6.0.0.dev2/pinecone/grpc/query_results.py +14 -0
  17. pinecone-6.0.0.dev2/pinecone/grpc/sparse_vector.py +6 -0
  18. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/grpc/utils.py +36 -10
  19. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/__init__.py +0 -2
  20. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pyproject.toml +11 -9
  21. pinecone-5.4.2/pinecone/__version__ +0 -1
  22. pinecone-5.4.2/pinecone/grpc/future.py +0 -86
  23. pinecone-5.4.2/pinecone/grpc/grpc_runner.py +0 -97
  24. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/LICENSE.txt +0 -0
  25. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/README.md +0 -0
  26. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/__init__.py +0 -0
  27. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/config/__init__.py +0 -0
  28. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/config/config.py +0 -0
  29. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/config/openapi.py +0 -0
  30. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/config/pinecone_config.py +0 -0
  31. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/control/__init__.py +0 -0
  32. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/control/index_host_store.py +0 -0
  33. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/control/langchain_import_warnings.py +0 -0
  34. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/control/repr_overrides.py +0 -0
  35. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/__init__.py +0 -0
  36. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/grpc/protos/vector_service_pb2.py +0 -0
  37. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/grpc/protos/vector_service_pb2.pyi +0 -0
  38. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/grpc/protos/vector_service_pb2_grpc.py +0 -0
  39. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/__init__.py +0 -0
  40. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/api/__init__.py +0 -0
  41. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/api/inference_api.py +0 -0
  42. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/api/manage_indexes_api.py +0 -0
  43. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/apis/__init__.py +0 -0
  44. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/__init__.py +0 -0
  45. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/collection_list.py +0 -0
  46. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/collection_model.py +0 -0
  47. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/configure_index_request.py +0 -0
  48. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/configure_index_request_spec.py +0 -0
  49. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/configure_index_request_spec_pod.py +0 -0
  50. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/create_collection_request.py +0 -0
  51. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/create_index_request.py +0 -0
  52. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/deletion_protection.py +0 -0
  53. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/embed_request.py +0 -0
  54. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/embed_request_inputs.py +0 -0
  55. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/embed_request_parameters.py +0 -0
  56. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/embedding.py +0 -0
  57. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/embeddings_list.py +0 -0
  58. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/embeddings_list_usage.py +0 -0
  59. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/error_response.py +0 -0
  60. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/error_response_error.py +0 -0
  61. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/index_list.py +0 -0
  62. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/index_model.py +0 -0
  63. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/index_model_spec.py +0 -0
  64. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/index_model_status.py +0 -0
  65. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/index_spec.py +0 -0
  66. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/pod_spec.py +0 -0
  67. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/pod_spec_metadata_config.py +0 -0
  68. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/model/serverless_spec.py +0 -0
  69. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/control/models/__init__.py +0 -0
  70. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/__init__.py +0 -0
  71. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/api/__init__.py +0 -0
  72. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/api/data_plane_api.py +0 -0
  73. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/apis/__init__.py +0 -0
  74. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/__init__.py +0 -0
  75. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/delete_request.py +0 -0
  76. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/describe_index_stats_request.py +0 -0
  77. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/describe_index_stats_response.py +0 -0
  78. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/fetch_response.py +0 -0
  79. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/list_item.py +0 -0
  80. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/list_response.py +0 -0
  81. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/namespace_summary.py +0 -0
  82. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/pagination.py +0 -0
  83. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/protobuf_any.py +0 -0
  84. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/protobuf_null_value.py +0 -0
  85. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/query_request.py +0 -0
  86. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/query_response.py +0 -0
  87. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/query_vector.py +0 -0
  88. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/rpc_status.py +0 -0
  89. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/scored_vector.py +0 -0
  90. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/single_query_results.py +0 -0
  91. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/sparse_values.py +0 -0
  92. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/update_request.py +0 -0
  93. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/upsert_request.py +0 -0
  94. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/upsert_response.py +0 -0
  95. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/usage.py +0 -0
  96. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/model/vector.py +0 -0
  97. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/data/models/__init__.py +0 -0
  98. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/shared/__init__.py +0 -0
  99. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/shared/exceptions.py +0 -0
  100. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/shared/model_utils.py +0 -0
  101. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core/openapi/shared/rest.py +0 -0
  102. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/__init__.py +0 -0
  103. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/api/__init__.py +0 -0
  104. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/api/manage_indexes_api.py +0 -0
  105. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/apis/__init__.py +0 -0
  106. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/__init__.py +0 -0
  107. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/collection_list.py +0 -0
  108. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/collection_model.py +0 -0
  109. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/configure_index_request.py +0 -0
  110. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/configure_index_request_spec.py +0 -0
  111. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/configure_index_request_spec_pod.py +0 -0
  112. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/create_collection_request.py +0 -0
  113. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/create_index_request.py +0 -0
  114. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/deletion_protection.py +0 -0
  115. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/error_response.py +0 -0
  116. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/error_response_error.py +0 -0
  117. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/index_list.py +0 -0
  118. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/index_model.py +0 -0
  119. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/index_model_spec.py +0 -0
  120. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/index_model_status.py +0 -0
  121. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/index_spec.py +0 -0
  122. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/pod_spec.py +0 -0
  123. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/pod_spec_metadata_config.py +0 -0
  124. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/model/serverless_spec.py +0 -0
  125. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_control/models/__init__.py +0 -0
  126. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/__init__.py +0 -0
  127. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/api/__init__.py +0 -0
  128. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/api/bulk_operations_api.py +0 -0
  129. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/api/vector_operations_api.py +0 -0
  130. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/apis/__init__.py +0 -0
  131. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/__init__.py +0 -0
  132. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/delete_request.py +0 -0
  133. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/describe_index_stats_request.py +0 -0
  134. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/describe_index_stats_response.py +0 -0
  135. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/fetch_response.py +0 -0
  136. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/import_error_mode.py +0 -0
  137. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/import_list_response.py +0 -0
  138. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/import_model.py +0 -0
  139. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/list_item.py +0 -0
  140. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/list_response.py +0 -0
  141. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/namespace_summary.py +0 -0
  142. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/pagination.py +0 -0
  143. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/protobuf_any.py +0 -0
  144. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/protobuf_null_value.py +0 -0
  145. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/query_request.py +0 -0
  146. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/query_response.py +0 -0
  147. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/query_vector.py +0 -0
  148. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/rpc_status.py +0 -0
  149. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/scored_vector.py +0 -0
  150. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/single_query_results.py +0 -0
  151. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/sparse_values.py +0 -0
  152. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/start_import_request.py +0 -0
  153. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/start_import_response.py +0 -0
  154. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/update_request.py +0 -0
  155. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/upsert_request.py +0 -0
  156. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/upsert_response.py +0 -0
  157. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/usage.py +0 -0
  158. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/model/vector.py +0 -0
  159. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/db_data/models/__init__.py +0 -0
  160. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/shared/__init__.py +0 -0
  161. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/shared/api_client.py +0 -0
  162. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/shared/configuration.py +0 -0
  163. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/shared/exceptions.py +0 -0
  164. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/shared/model_utils.py +0 -0
  165. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/core_ea/openapi/shared/rest.py +0 -0
  166. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/data/__init__.py +0 -0
  167. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/data/errors.py +0 -0
  168. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/data/features/__init__.py +0 -0
  169. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/data/features/bulk_import.py +0 -0
  170. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/data/sparse_vector_factory.py +0 -0
  171. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/data/vector_factory.py +0 -0
  172. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/deprecation_warnings.py +0 -0
  173. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/exceptions/exceptions.py +0 -0
  174. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/grpc/channel_factory.py +0 -0
  175. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/grpc/config.py +0 -0
  176. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/grpc/retry.py +0 -0
  177. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/grpc/sparse_values_factory.py +0 -0
  178. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/grpc/vector_factory_grpc.py +0 -0
  179. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/models/__init__.py +0 -0
  180. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/models/collection_description.py +0 -0
  181. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/models/collection_list.py +0 -0
  182. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/models/index_description.py +0 -0
  183. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/models/index_list.py +0 -0
  184. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/models/index_model.py +0 -0
  185. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/models/list_response.py +0 -0
  186. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/models/pod_spec.py +0 -0
  187. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/models/serverless_spec.py +0 -0
  188. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/check_kwargs.py +0 -0
  189. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/constants.py +0 -0
  190. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/convert_to_list.py +0 -0
  191. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/deprecation_notice.py +0 -0
  192. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/docslinks.py +0 -0
  193. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/error_handling.py +0 -0
  194. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/fix_tuple_length.py +0 -0
  195. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/normalize_host.py +0 -0
  196. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/parse_args.py +0 -0
  197. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/repr_overrides.py +0 -0
  198. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/setup_openapi_client.py +0 -0
  199. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/user_agent.py +0 -0
  200. {pinecone-5.4.2 → pinecone-6.0.0.dev2}/pinecone/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pinecone
3
- Version: 5.4.2
3
+ Version: 6.0.0.dev2
4
4
  Summary: Pinecone client and SDK
5
5
  Home-page: https://www.pinecone.io
6
6
  License: Apache-2.0
@@ -33,9 +33,9 @@ Requires-Dist: googleapis-common-protos (>=1.53.0) ; extra == "grpc"
33
33
  Requires-Dist: grpcio (>=1.44.0) ; (python_version >= "3.8" and python_version < "3.11") and (extra == "grpc")
34
34
  Requires-Dist: grpcio (>=1.59.0) ; (python_version >= "3.11" and python_version < "4.0") and (extra == "grpc")
35
35
  Requires-Dist: lz4 (>=3.1.3) ; extra == "grpc"
36
- Requires-Dist: pinecone-plugin-inference (>=2.0.0,<4.0.0)
36
+ Requires-Dist: pinecone-plugin-inference (>=2.0.0,<3.0.0)
37
37
  Requires-Dist: pinecone-plugin-interface (>=0.0.7,<0.0.8)
38
- Requires-Dist: protobuf (>=4.25,<5.0) ; extra == "grpc"
38
+ Requires-Dist: protobuf (>=5.28,<6.0) ; extra == "grpc"
39
39
  Requires-Dist: protoc-gen-openapiv2 (>=0.0.1,<0.0.2) ; extra == "grpc"
40
40
  Requires-Dist: python-dateutil (>=2.5.3)
41
41
  Requires-Dist: tqdm (>=4.64.1)
@@ -0,0 +1 @@
1
+ 6.0.0.dev2
@@ -1,6 +1,6 @@
1
1
  import time
2
2
  import logging
3
- from typing import Optional, Dict, Any, Union, List, Tuple, Literal
3
+ from typing import Optional, Dict, Any, Union, Literal
4
4
 
5
5
  from .index_host_store import IndexHostStore
6
6
 
@@ -10,7 +10,12 @@ from pinecone.core.openapi.control.api.manage_indexes_api import ManageIndexesAp
10
10
  from pinecone.core.openapi.shared.api_client import ApiClient
11
11
 
12
12
 
13
- from pinecone.utils import normalize_host, setup_openapi_client, build_plugin_setup_client
13
+ from pinecone.utils import (
14
+ normalize_host,
15
+ setup_openapi_client,
16
+ build_plugin_setup_client,
17
+ parse_non_empty_args,
18
+ )
14
19
  from pinecone.core.openapi.control.models import (
15
20
  CreateCollectionRequest,
16
21
  CreateIndexRequest,
@@ -317,9 +322,6 @@ class Pinecone:
317
322
 
318
323
  api_instance = self.index_api
319
324
 
320
- def _parse_non_empty_args(args: List[Tuple[str, Any]]) -> Dict[str, Any]:
321
- return {arg_name: val for arg_name, val in args if val is not None}
322
-
323
325
  if deletion_protection in ["enabled", "disabled"]:
324
326
  dp = DeletionProtection(deletion_protection)
325
327
  else:
@@ -329,7 +331,7 @@ class Pinecone:
329
331
  if "serverless" in spec:
330
332
  index_spec = IndexSpec(serverless=ServerlessSpecModel(**spec["serverless"]))
331
333
  elif "pod" in spec:
332
- args_dict = _parse_non_empty_args(
334
+ args_dict = parse_non_empty_args(
333
335
  [
334
336
  ("environment", spec["pod"].get("environment")),
335
337
  ("metadata_config", spec["pod"].get("metadata_config")),
@@ -351,7 +353,7 @@ class Pinecone:
351
353
  serverless=ServerlessSpecModel(cloud=spec.cloud, region=spec.region)
352
354
  )
353
355
  elif isinstance(spec, PodSpec):
354
- args_dict = _parse_non_empty_args(
356
+ args_dict = parse_non_empty_args(
355
357
  [
356
358
  ("replicas", spec.replicas),
357
359
  ("shards", spec.shards),
@@ -765,14 +767,6 @@ class Pinecone:
765
767
  # Now you're ready to perform data operations
766
768
  index.query(vector=[...], top_k=10)
767
769
  ```
768
-
769
- Arguments:
770
- name: The name of the index to target. If you specify the name of the index, the client will
771
- fetch the host url from the Pinecone control plane.
772
- host: The host url of the index to target. If you specify the host url, the client will use
773
- the host url directly without making any additional calls to the control plane.
774
- pool_threads: The number of threads to use when making parallel requests by calling index methods with optional kwarg async_req=True, or using methods that make use of parallelism automatically such as query_namespaces(). Default: 1
775
- connection_pool_maxsize: The maximum number of connections to keep in the connection pool. Default: 5 * multiprocessing.cpu_count()
776
770
  """
777
771
  if name == "" and host == "":
778
772
  raise ValueError("Either name or host must be specified")
@@ -2,31 +2,12 @@ import json
2
2
  import atexit
3
3
  import mimetypes
4
4
  from multiprocessing.pool import ThreadPool
5
- from concurrent.futures import ThreadPoolExecutor
6
5
  import io
7
6
  import os
8
7
  import re
9
8
  import typing
10
9
  from urllib.parse import quote
11
10
  from urllib3.fields import RequestField
12
- import time
13
- import random
14
-
15
- def retry_api_call(
16
- func, args=(), kwargs={}, retries=3, backoff=1, jitter=0.5
17
- ):
18
- attempts = 0
19
- while attempts < retries:
20
- try:
21
- return func(*args, **kwargs) # Attempt to call __call_api
22
- except Exception as e:
23
- attempts += 1
24
- if attempts >= retries:
25
- print(f"API call failed after {attempts} attempts: {e}")
26
- raise # Re-raise exception if retries are exhausted
27
- sleep_time = backoff * (2 ** (attempts - 1)) + random.uniform(0, jitter)
28
- # print(f"Retrying ({attempts}/{retries}) in {sleep_time:.2f} seconds after error: {e}")
29
- time.sleep(sleep_time)
30
11
 
31
12
 
32
13
  from pinecone.core.openapi.shared import rest
@@ -71,7 +52,6 @@ class ApiClient(object):
71
52
  """
72
53
 
73
54
  _pool = None
74
- _threadpool_executor = None
75
55
 
76
56
  def __init__(self, configuration=None, header_name=None, header_value=None, cookie=None, pool_threads=1):
77
57
  if configuration is None:
@@ -94,9 +74,6 @@ class ApiClient(object):
94
74
  self.close()
95
75
 
96
76
  def close(self):
97
- if self._threadpool_executor:
98
- self._threadpool_executor.shutdown()
99
- self._threadpool_executor = None
100
77
  if self._pool:
101
78
  self._pool.close()
102
79
  self._pool.join()
@@ -114,12 +91,6 @@ class ApiClient(object):
114
91
  self._pool = ThreadPool(self.pool_threads)
115
92
  return self._pool
116
93
 
117
- @property
118
- def threadpool_executor(self):
119
- if self._threadpool_executor is None:
120
- self._threadpool_executor = ThreadPoolExecutor(max_workers=self.pool_threads)
121
- return self._threadpool_executor
122
-
123
94
  @property
124
95
  def user_agent(self):
125
96
  """User agent for this API client"""
@@ -345,7 +316,6 @@ class ApiClient(object):
345
316
  response_type: typing.Optional[typing.Tuple[typing.Any]] = None,
346
317
  auth_settings: typing.Optional[typing.List[str]] = None,
347
318
  async_req: typing.Optional[bool] = None,
348
- async_threadpool_executor: typing.Optional[bool] = None,
349
319
  _return_http_data_only: typing.Optional[bool] = None,
350
320
  collection_formats: typing.Optional[typing.Dict[str, str]] = None,
351
321
  _preload_content: bool = True,
@@ -406,9 +376,8 @@ class ApiClient(object):
406
376
  If parameter async_req is False or missing,
407
377
  then the method will return the response directly.
408
378
  """
409
- if async_threadpool_executor:
410
- return self.threadpool_executor.submit(
411
- self.__call_api,
379
+ if not async_req:
380
+ return self.__call_api(
412
381
  resource_path,
413
382
  method,
414
383
  path_params,
@@ -427,8 +396,9 @@ class ApiClient(object):
427
396
  _check_type,
428
397
  )
429
398
 
430
- if not async_req:
431
- return self.__call_api(
399
+ return self.pool.apply_async(
400
+ self.__call_api,
401
+ (
432
402
  resource_path,
433
403
  method,
434
404
  path_params,
@@ -445,35 +415,7 @@ class ApiClient(object):
445
415
  _request_timeout,
446
416
  _host,
447
417
  _check_type,
448
- )
449
-
450
- return self.pool.apply_async(
451
- retry_api_call,
452
- args=(
453
- self.__call_api, # Pass the API call function as the first argument
454
- (
455
- resource_path,
456
- method,
457
- path_params,
458
- query_params,
459
- header_params,
460
- body,
461
- post_params,
462
- files,
463
- response_type,
464
- auth_settings,
465
- _return_http_data_only,
466
- collection_formats,
467
- _preload_content,
468
- _request_timeout,
469
- _host,
470
- _check_type,
471
- ),
472
- {}, # empty kwargs dictionary
473
- 3, # retries
474
- 1, # backoff time
475
- 0.5 # jitter
476
- )
418
+ ),
477
419
  )
478
420
 
479
421
  def request(
@@ -723,7 +665,6 @@ class Endpoint(object):
723
665
  self.params_map["all"].extend(
724
666
  [
725
667
  "async_req",
726
- "async_threadpool_executor",
727
668
  "_host_index",
728
669
  "_preload_content",
729
670
  "_request_timeout",
@@ -738,7 +679,6 @@ class Endpoint(object):
738
679
  self.openapi_types = root_map["openapi_types"]
739
680
  extra_types = {
740
681
  "async_req": (bool,),
741
- "async_threadpool_executor": (bool, ),
742
682
  "_host_index": (none_type, int),
743
683
  "_preload_content": (bool,),
744
684
  "_request_timeout": (none_type, float, (float,), [float], int, (int,), [int]),
@@ -888,7 +828,6 @@ class Endpoint(object):
888
828
  response_type=self.settings["response_type"],
889
829
  auth_settings=self.settings["auth"],
890
830
  async_req=kwargs["async_req"],
891
- async_threadpool_executor=kwargs.get("async_threadpool_executor", None),
892
831
  _check_type=kwargs["_check_return_type"],
893
832
  _return_http_data_only=kwargs["_return_http_data_only"],
894
833
  _preload_content=kwargs["_preload_content"],
@@ -469,23 +469,3 @@ class Configuration(object):
469
469
  """Fix base path."""
470
470
  self._base_path = value
471
471
  self.server_index = None
472
-
473
- def __repr__(self):
474
- attrs = [
475
- f"host={self.host}",
476
- f"api_key=***",
477
- f"api_key_prefix={self.api_key_prefix}",
478
- f"access_token={self.access_token}",
479
- f"connection_pool_maxsize={self.connection_pool_maxsize}",
480
- f"username={self.username}",
481
- f"password={self.password}",
482
- f"discard_unknown_keys={self.discard_unknown_keys}",
483
- f"disabled_client_side_validations={self.disabled_client_side_validations}",
484
- f"server_index={self.server_index}",
485
- f"server_variables={self.server_variables}",
486
- f"server_operation_index={self.server_operation_index}",
487
- f"server_operation_variables={self.server_operation_variables}",
488
- f"ssl_ca_cert={self.ssl_ca_cert}",
489
-
490
- ]
491
- return f"Configuration({', '.join(attrs)})"
@@ -1,12 +1,11 @@
1
1
  from tqdm.autonotebook import tqdm
2
2
 
3
- import logging
4
- import json
5
- from typing import Union, List, Optional, Dict, Any, Literal
3
+ from typing import Union, List, Optional, Dict, Any
6
4
 
7
5
  from pinecone.config import ConfigBuilder
8
6
 
9
7
  from pinecone.core.openapi.shared import API_VERSION
8
+ from pinecone.core.openapi.data.models import SparseValues
10
9
  from pinecone.core.openapi.data import ApiClient
11
10
  from pinecone.core.openapi.data.models import (
12
11
  FetchResponse,
@@ -23,25 +22,13 @@ from pinecone.core.openapi.data.models import (
23
22
  UpdateRequest,
24
23
  DescribeIndexStatsRequest,
25
24
  ListResponse,
26
- SparseValues,
27
- )
28
- from pinecone.core.openapi.data.api.data_plane_api import DataPlaneApi
29
- from ..utils import (
30
- setup_openapi_client,
31
- parse_non_empty_args,
32
- build_plugin_setup_client,
33
- validate_and_convert_errors,
34
25
  )
35
26
  from .features.bulk_import import ImportFeatureMixin
27
+ from pinecone.core.openapi.data.api.data_plane_api import DataPlaneApi
28
+ from ..utils import setup_openapi_client, parse_non_empty_args
36
29
  from .vector_factory import VectorFactory
37
30
  from .query_results_aggregator import QueryResultsAggregator, QueryNamespacesResults
38
-
39
31
  from multiprocessing.pool import ApplyResult
40
- from concurrent.futures import as_completed
41
-
42
- from pinecone_plugin_interface import load_and_install as install_plugins
43
-
44
- logger = logging.getLogger(__name__)
45
32
 
46
33
  __all__ = [
47
34
  "Index",
@@ -62,6 +49,8 @@ __all__ = [
62
49
  "SparseValues",
63
50
  ]
64
51
 
52
+ from ..utils.error_handling import validate_and_convert_errors
53
+
65
54
  _OPENAPI_ENDPOINT_PARAMS = (
66
55
  "_return_http_data_only",
67
56
  "_preload_content",
@@ -70,7 +59,6 @@ _OPENAPI_ENDPOINT_PARAMS = (
70
59
  "_check_return_type",
71
60
  "_host_index",
72
61
  "async_req",
73
- "async_threadpool_executor",
74
62
  )
75
63
 
76
64
 
@@ -103,41 +91,20 @@ class Index(ImportFeatureMixin):
103
91
  **kwargs,
104
92
  )
105
93
 
106
- self.config = ConfigBuilder.build(
94
+ self._config = ConfigBuilder.build(
107
95
  api_key=api_key, host=host, additional_headers=additional_headers, **kwargs
108
96
  )
109
- self._openapi_config = ConfigBuilder.build_openapi_config(self.config, openapi_config)
110
- self._pool_threads = pool_threads
111
-
112
- if kwargs.get("connection_pool_maxsize", None):
113
- self._openapi_config.connection_pool_maxsize = kwargs.get("connection_pool_maxsize")
97
+ openapi_config = ConfigBuilder.build_openapi_config(self._config, openapi_config)
114
98
 
115
99
  self._vector_api = setup_openapi_client(
116
100
  api_client_klass=ApiClient,
117
101
  api_klass=DataPlaneApi,
118
- config=self.config,
119
- openapi_config=self._openapi_config,
120
- pool_threads=self._pool_threads,
102
+ config=self._config,
103
+ openapi_config=openapi_config,
104
+ pool_threads=pool_threads,
121
105
  api_version=API_VERSION,
122
106
  )
123
107
 
124
- self._load_plugins()
125
-
126
- def _load_plugins(self):
127
- """@private"""
128
- try:
129
- # I don't expect this to ever throw, but wrapping this in a
130
- # try block just in case to make sure a bad plugin doesn't
131
- # halt client initialization.
132
- openapi_client_builder = build_plugin_setup_client(
133
- config=self.config,
134
- openapi_config=self._openapi_config,
135
- pool_threads=self._pool_threads,
136
- )
137
- install_plugins(self, openapi_client_builder)
138
- except Exception as e:
139
- logger.error(f"Error loading plugins in Index: {e}")
140
-
141
108
  def __enter__(self):
142
109
  return self
143
110
 
@@ -451,7 +418,7 @@ class Index(ImportFeatureMixin):
451
418
  **kwargs,
452
419
  )
453
420
 
454
- if kwargs.get("async_req", False) or kwargs.get("async_threadpool_executor", False):
421
+ if kwargs.get("async_req", False):
455
422
  return response
456
423
  else:
457
424
  return parse_query_response(response)
@@ -495,7 +462,6 @@ class Index(ImportFeatureMixin):
495
462
  ("sparse_vector", sparse_vector),
496
463
  ]
497
464
  )
498
-
499
465
  response = self._vector_api.query(
500
466
  QueryRequest(
501
467
  **args_dict,
@@ -506,12 +472,10 @@ class Index(ImportFeatureMixin):
506
472
  )
507
473
  return response
508
474
 
509
- @validate_and_convert_errors
510
475
  def query_namespaces(
511
476
  self,
512
477
  vector: List[float],
513
478
  namespaces: List[str],
514
- metric: Literal["cosine", "euclidean", "dotproduct"],
515
479
  top_k: Optional[int] = None,
516
480
  filter: Optional[Dict[str, Union[str, float, int, bool, List, dict]]] = None,
517
481
  include_values: Optional[bool] = None,
@@ -521,78 +485,38 @@ class Index(ImportFeatureMixin):
521
485
  ] = None,
522
486
  **kwargs,
523
487
  ) -> QueryNamespacesResults:
524
- """The query_namespaces() method is used to make a query to multiple namespaces in parallel and combine the results into one result set.
525
-
526
- Since several asynchronous calls are made on your behalf when calling this method, you will need to tune the pool_threads and connection_pool_maxsize parameter of the Index constructor to suite your workload.
527
-
528
- Examples:
529
-
530
- ```python
531
- from pinecone import Pinecone
532
-
533
- pc = Pinecone(api_key="your-api-key")
534
- index = pc.Index(
535
- host="index-name",
536
- pool_threads=32,
537
- connection_pool_maxsize=32
538
- )
539
-
540
- query_vec = [0.1, 0.2, 0.3] # An embedding that matches the index dimension
541
- combined_results = index.query_namespaces(
542
- vector=query_vec,
543
- namespaces=['ns1', 'ns2', 'ns3', 'ns4'],
544
- metric="cosine",
545
- top_k=10,
546
- filter={'genre': {"$eq": "drama"}},
547
- include_values=True,
548
- include_metadata=True
549
- )
550
- for vec in combined_results.matches:
551
- print(vec.id, vec.score)
552
- print(combined_results.usage)
553
- ```
554
-
555
- Args:
556
- vector (List[float]): The query vector, must be the same length as the dimension of the index being queried.
557
- namespaces (List[str]): The list of namespaces to query.
558
- top_k (Optional[int], optional): The number of results you would like to request from each namespace. Defaults to 10.
559
- metric (str): Must be one of 'cosine', 'euclidean', 'dotproduct'. This is needed in order to merge results across namespaces, since the interpretation of score depends on the index metric type.
560
- filter (Optional[Dict[str, Union[str, float, int, bool, List, dict]]], optional): Pass an optional filter to filter results based on metadata. Defaults to None.
561
- include_values (Optional[bool], optional): Boolean field indicating whether vector values should be included with results. Defaults to None.
562
- include_metadata (Optional[bool], optional): Boolean field indicating whether vector metadata should be included with results. Defaults to None.
563
- sparse_vector (Optional[ Union[SparseValues, Dict[str, Union[List[float], List[int]]]] ], optional): If you are working with a dotproduct index, you can pass a sparse vector as part of your hybrid search. Defaults to None.
564
-
565
- Returns:
566
- QueryNamespacesResults: A QueryNamespacesResults object containing the combined results from all namespaces, as well as the combined usage cost in read units.
567
- """
568
- if namespaces is None or len(namespaces) == 0:
488
+ if len(namespaces) == 0:
569
489
  raise ValueError("At least one namespace must be specified")
570
490
  if len(vector) == 0:
571
491
  raise ValueError("Query vector must not be empty")
572
492
 
493
+ # The caller may only want the top_k=1 result across all queries,
494
+ # but we need to get at least 2 results from each query in order to
495
+ # aggregate them correctly. So we'll temporarily set topK to 2 for the
496
+ # subqueries, and then we'll take the topK=1 results from the aggregated
497
+ # results.
573
498
  overall_topk = top_k if top_k is not None else 10
574
- aggregator = QueryResultsAggregator(top_k=overall_topk, metric=metric)
499
+ aggregator = QueryResultsAggregator(top_k=overall_topk)
500
+ subquery_topk = overall_topk if overall_topk > 2 else 2
575
501
 
576
502
  target_namespaces = set(namespaces) # dedup namespaces
577
- async_futures = [
503
+ async_results = [
578
504
  self.query(
579
505
  vector=vector,
580
506
  namespace=ns,
581
- top_k=overall_topk,
507
+ top_k=subquery_topk,
582
508
  filter=filter,
583
509
  include_values=include_values,
584
510
  include_metadata=include_metadata,
585
511
  sparse_vector=sparse_vector,
586
- async_threadpool_executor=True,
587
- _preload_content=False,
512
+ async_req=True,
588
513
  **kwargs,
589
514
  )
590
515
  for ns in target_namespaces
591
516
  ]
592
517
 
593
- for result in as_completed(async_futures):
594
- raw_result = result.result()
595
- response = json.loads(raw_result.data.decode("utf-8"))
518
+ for result in async_results:
519
+ response = result.get()
596
520
  aggregator.add_results(response)
597
521
 
598
522
  final_results = aggregator.get_results()
@@ -1,8 +1,7 @@
1
- from typing import List, Tuple, Optional, Any, Dict, Literal
1
+ from typing import List, Tuple, Optional, Any, Dict
2
2
  import json
3
3
  import heapq
4
4
  from pinecone.core.openapi.data.models import Usage
5
- from pinecone.core.openapi.data.models import QueryResponse as OpenAPIQueryResponse
6
5
 
7
6
  from dataclasses import dataclass, asdict
8
7
 
@@ -31,9 +30,6 @@ class ScoredVectorWithNamespace:
31
30
  else:
32
31
  raise KeyError(f"'{key}' not found in ScoredVectorWithNamespace")
33
32
 
34
- def get(self, key, default=None):
35
- return getattr(self, key, default)
36
-
37
33
  def __repr__(self):
38
34
  return json.dumps(self._truncate(asdict(self)), indent=4)
39
35
 
@@ -75,9 +71,6 @@ class QueryNamespacesResults:
75
71
  else:
76
72
  raise KeyError(f"'{key}' not found in QueryNamespacesResults")
77
73
 
78
- def get(self, key, default=None):
79
- return getattr(self, key, default)
80
-
81
74
  def __repr__(self):
82
75
  return json.dumps(
83
76
  {
@@ -88,38 +81,46 @@ class QueryNamespacesResults:
88
81
  )
89
82
 
90
83
 
84
+ class QueryResultsAggregregatorNotEnoughResultsError(Exception):
85
+ def __init__(self):
86
+ super().__init__(
87
+ "Cannot interpret results without at least two matches. In order to aggregate results from multiple queries, top_k must be greater than 1 in order to correctly infer the similarity metric from scores."
88
+ )
89
+
90
+
91
91
  class QueryResultsAggregatorInvalidTopKError(Exception):
92
92
  def __init__(self, top_k: int):
93
- super().__init__(f"Invalid top_k value {top_k}. top_k must be at least 1.")
93
+ super().__init__(
94
+ f"Invalid top_k value {top_k}. To aggregate results from multiple queries the top_k must be at least 2."
95
+ )
94
96
 
95
97
 
96
98
  class QueryResultsAggregator:
97
- def __init__(self, top_k: int, metric: Literal["cosine", "euclidean", "dotproduct"]):
98
- if top_k < 1:
99
+ def __init__(self, top_k: int):
100
+ if top_k < 2:
99
101
  raise QueryResultsAggregatorInvalidTopKError(top_k)
100
-
101
- if metric in ["dotproduct", "cosine"]:
102
- self.is_bigger_better = True
103
- elif metric in ["euclidean"]:
104
- self.is_bigger_better = False
105
- else:
106
- raise ValueError(
107
- f"Cannot merge results for unknown similarity metric {metric}. Supported metrics are 'dotproduct', 'cosine', and 'euclidean'."
108
- )
109
-
110
102
  self.top_k = top_k
111
103
  self.usage_read_units = 0
112
104
  self.heap: List[Tuple[float, int, object, str]] = []
113
105
  self.insertion_counter = 0
106
+ self.is_dotproduct = None
114
107
  self.read = False
115
108
  self.final_results: Optional[QueryNamespacesResults] = None
116
109
 
117
- def _bigger_better_heap_item(self, match, ns):
118
- # This 4-tuple is used to ensure that the heap is sorted by score followed by
119
- # insertion order. The insertion order is used to break any ties in the score.
110
+ def _is_dotproduct_index(self, matches):
111
+ # The interpretation of the score depends on the similar metric used.
112
+ # Unlike other index types, in indexes configured for dotproduct,
113
+ # a higher score is better. We have to infer this is the case by inspecting
114
+ # the order of the scores in the results.
115
+ for i in range(1, len(matches)):
116
+ if matches[i].get("score") > matches[i - 1].get("score"): # Found an increase
117
+ return False
118
+ return True
119
+
120
+ def _dotproduct_heap_item(self, match, ns):
120
121
  return (match.get("score"), -self.insertion_counter, match, ns)
121
122
 
122
- def _smaller_better_heap_item(self, match, ns):
123
+ def _non_dotproduct_heap_item(self, match, ns):
123
124
  return (-match.get("score"), -self.insertion_counter, match, ns)
124
125
 
125
126
  def _process_matches(self, matches, ns, heap_item_fn):
@@ -129,10 +130,10 @@ class QueryResultsAggregator:
129
130
  heapq.heappush(self.heap, heap_item_fn(match, ns))
130
131
  else:
131
132
  # Assume we have dotproduct scores sorted in descending order
132
- if self.is_bigger_better and match["score"] < self.heap[0][0]:
133
+ if self.is_dotproduct and match["score"] < self.heap[0][0]:
133
134
  # No further matches can improve the top-K heap
134
135
  break
135
- elif not self.is_bigger_better and match["score"] > -self.heap[0][0]:
136
+ elif not self.is_dotproduct and match["score"] > -self.heap[0][0]:
136
137
  # No further matches can improve the top-K heap
137
138
  break
138
139
  heapq.heappushpop(self.heap, heap_item_fn(match, ns))
@@ -146,18 +147,23 @@ class QueryResultsAggregator:
146
147
 
147
148
  matches = results.get("matches", [])
148
149
  ns: str = results.get("namespace", "")
149
- if isinstance(results, OpenAPIQueryResponse):
150
- self.usage_read_units += results.usage.read_units
151
- else:
152
- self.usage_read_units += results.get("usage", {}).get("readUnits", 0)
150
+ self.usage_read_units += results.get("usage", {}).get("readUnits", 0)
153
151
 
154
152
  if len(matches) == 0:
155
153
  return
156
154
 
157
- if self.is_bigger_better:
158
- self._process_matches(matches, ns, self._bigger_better_heap_item)
155
+ if self.is_dotproduct is None:
156
+ if len(matches) == 1:
157
+ # This condition should match the second time we add results containing
158
+ # only one match. We need at least two matches in a single response in order
159
+ # to infer the similarity metric
160
+ raise QueryResultsAggregregatorNotEnoughResultsError()
161
+ self.is_dotproduct = self._is_dotproduct_index(matches)
162
+
163
+ if self.is_dotproduct:
164
+ self._process_matches(matches, ns, self._dotproduct_heap_item)
159
165
  else:
160
- self._process_matches(matches, ns, self._smaller_better_heap_item)
166
+ self._process_matches(matches, ns, self._non_dotproduct_heap_item)
161
167
 
162
168
  def get_results(self) -> QueryNamespacesResults:
163
169
  if self.read:
@@ -12,6 +12,8 @@ from pinecone.core.openapi.shared.exceptions import (
12
12
  )
13
13
  from .exceptions import PineconeConfigurationError, PineconeProtocolError, ListConversionException
14
14
 
15
+ PineconeNotFoundException = NotFoundException
16
+
15
17
  __all__ = [
16
18
  "PineconeConfigurationError",
17
19
  "PineconeProtocolError",
@@ -22,6 +24,7 @@ __all__ = [
22
24
  "PineconeApiKeyError",
23
25
  "PineconeApiException",
24
26
  "NotFoundException",
27
+ "PineconeNotFoundException",
25
28
  "UnauthorizedException",
26
29
  "ForbiddenException",
27
30
  "ServiceException",
@@ -45,26 +45,23 @@ index.query(vector=[...], top_k=10)
45
45
  """
46
46
 
47
47
  from .index_grpc import GRPCIndex
48
+ from .index_grpc_asyncio import GRPCIndexAsyncio
48
49
  from .pinecone import PineconeGRPC
49
50
  from .config import GRPCClientConfig
50
- from .future import PineconeGrpcFuture
51
51
 
52
52
  from pinecone.core.grpc.protos.vector_service_pb2 import (
53
53
  Vector as GRPCVector,
54
54
  SparseValues as GRPCSparseValues,
55
55
  Vector,
56
56
  SparseValues,
57
- DeleteResponse as GRPCDeleteResponse,
58
57
  )
59
58
 
60
59
  __all__ = [
61
60
  "GRPCIndex",
62
61
  "PineconeGRPC",
63
- "GRPCDeleteResponse",
64
62
  "GRPCClientConfig",
65
63
  "GRPCVector",
66
64
  "GRPCSparseValues",
67
65
  "Vector",
68
66
  "SparseValues",
69
- "PineconeGrpcFuture",
70
67
  ]