Change8

v9.1.0

Breaking Changes
📦 pinecone-clientView on GitHub →
2 breaking7 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

  1. If you explicitly configured `RetryConfig.max_retries`, consider increasing the value by 1 for REST transports to maintain the same number of total attempts.
  2. 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.
  3. 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