v9.1.0
Breaking Changes📦 pinecone-clientView on GitHub →
⚠ 2 breaking✨ 7 features🐛 2 fixes🔧 16 symbols
Summary
This release focuses on retry resilience, introducing decorrelated jitter and automatic concurrency back-off under throttling, alongside a new dedicated `RateLimitError`. It also brings `GrpcIndex` to feature parity with REST clients and restores compatibility for v8 search query syntax.
⚠️ Breaking Changes
- The behavior of `RetryConfig.max_retries` on the REST transport has changed to match gRPC: it now counts retries only (N retries after the initial attempt, up to N+1 total requests), instead of counting total attempts. If you explicitly set `max_retries`, you may need to increase its value by 1 to maintain the same number of total requests.
- The default value for `RetryConfig.backoff_factor` has changed from `2.0` to `0.25`. This factor is now interpreted as the minimum delay floor in the decorrelated-jitter formula, resulting in shorter initial waits. Callers relying on the old default should re-evaluate their desired wait times; a v8 `backoff_factor=2.0` roughly maps to a new value of `0.5` for a comparable first-retry delay.
Migration Steps
- If you explicitly configured `RetryConfig.max_retries`, consider increasing the value by 1 for REST transports to maintain the same number of total attempts.
- If you explicitly configured `RetryConfig.backoff_factor`, re-read its documentation as its meaning has changed from an exponential multiplier to a minimum delay floor in the jitter calculation. Adjust the value based on desired initial wait times.
- Update code that catches throttling errors to use the new `pinecone.errors.RateLimitError` for specific handling of HTTP 429s.
✨ New Features
- Implemented decorrelated jitter on every transport (REST sync/async and gRPC) for retry backoff, spreading retries across time.
- Introduced automatic per-host concurrency back-off for bulk operations under throttling (429/503/RESOURCE_EXHAUSTED), using an AIMD control loop.
- Added dedicated `RateLimitError` (subclass of `ApiError`) raised for HTTP 429 responses, allowing distinct handling of throttling.
- Restored the v8 `search(query={...})` request shape, allowing `Index`, `AsyncIndex`, and `GrpcIndex.search` to accept a single query body argument.
- `AsyncIndex.query_namespaces` is now bounded to 10 in-flight requests to prevent self-inflicted 429 storms.
- Full parity added to `GrpcIndex`, including `query_namespaces`, `query_namespaces_async`, `fetch_by_metadata`, and all bulk-import operations (`start_import`, etc.).
- Dense-vector queries via `GrpcIndex.search()` are now correctly shaped to match REST clients.
🐛 Bug Fixes
- Fixed `GrpcIndex.search()` sending bare `list[float]` queries in the wrong wire shape, causing dense-vector queries to fail.
- Corrected the default value for `error_mode` in the `start_import` docstring from "abort" to "continue".
Affected Symbols
RetryConfig.max_retriesRetryConfig.backoff_factorpinecone.errors.RateLimitErrorIndex.searchAsyncIndex.searchGrpcIndex.searchGrpcIndexAsyncIndex.query_namespacesGrpcIndex.query_namespacesGrpcIndex.query_namespaces_asyncGrpcIndex.fetch_by_metadataGrpcIndex.start_importGrpcIndex.describe_importGrpcIndex.cancel_importGrpcIndex.list_importsGrpcIndex.list_imports_paginated