Skip to content

Commit 40f9266

Browse files
committed
refactor(index): loosen dict[str, Any] -> Mapping[str, Any] for read-only params (DX-0141)
## Purpose Public methods on Index, AsyncIndex, and GrpcIndex declared read-only filter/metadata/sparse_vector parameters as dict[str, Any], rejecting valid callers passing MappingProxyType, TypedDict, or other Mapping types. ## Solution Changed all read-only dict-typed parameters (filter, sparse_vector, sparse_values, set_metadata, inputs, rerank, match_terms) to Mapping[str, Any] across: - pinecone/index/__init__.py - pinecone/async_client/async_index.py - pinecone/grpc/__init__.py Also widened pinecone/grpc/_protocol.py (our protocol stub) to accept Mapping for the same parameters, propagating the loosening to the mypy boundary. Local body variables (request body dicts) left as dict since they are mutated. Added MappingProxyType and TypedDict smoke tests to tests/unit/test_input_type_compatibility.py.
1 parent 180ecd5 commit 40f9266

5 files changed

Lines changed: 93 additions & 68 deletions

File tree

‎pinecone/async_client/async_index.py‎

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -434,10 +434,10 @@ async def query(
434434
vector: Sequence[float] | None = None,
435435
id: str | None = None,
436436
namespace: str = "",
437-
filter: dict[str, Any] | None = None,
437+
filter: Mapping[str, Any] | None = None,
438438
include_values: bool = False,
439439
include_metadata: bool = False,
440-
sparse_vector: SparseValues | dict[str, Any] | None = None,
440+
sparse_vector: SparseValues | Mapping[str, Any] | None = None,
441441
scan_factor: float | None = None,
442442
max_candidates: int | None = None,
443443
timeout: float | None = None,
@@ -545,10 +545,10 @@ async def query_namespaces(
545545
namespaces: Sequence[str],
546546
metric: str,
547547
top_k: int | None = None,
548-
filter: dict[str, Any] | None = None,
548+
filter: Mapping[str, Any] | None = None,
549549
include_values: bool = False,
550550
include_metadata: bool = False,
551-
sparse_vector: SparseValues | dict[str, Any] | None = None,
551+
sparse_vector: SparseValues | Mapping[str, Any] | None = None,
552552
scan_factor: float | None = None,
553553
max_candidates: int | None = None,
554554
timeout: float | None = None,
@@ -703,7 +703,7 @@ async def fetch(
703703
async def fetch_by_metadata(
704704
self,
705705
*,
706-
filter: dict[str, Any],
706+
filter: Mapping[str, Any],
707707
namespace: str = "",
708708
limit: int | None = None,
709709
pagination_token: str | None = None,
@@ -772,7 +772,7 @@ async def delete(
772772
*,
773773
ids: Sequence[str] | None = None,
774774
delete_all: bool = False,
775-
filter: dict[str, Any] | None = None,
775+
filter: Mapping[str, Any] | None = None,
776776
namespace: str = "",
777777
timeout: float | None = None,
778778
) -> None:
@@ -834,10 +834,10 @@ async def update(
834834
*,
835835
id: str | None = None,
836836
values: Sequence[float] | None = None,
837-
sparse_values: SparseValues | dict[str, Any] | None = None,
838-
set_metadata: dict[str, Any] | None = None,
837+
sparse_values: SparseValues | Mapping[str, Any] | None = None,
838+
set_metadata: Mapping[str, Any] | None = None,
839839
namespace: str = "",
840-
filter: dict[str, Any] | None = None,
840+
filter: Mapping[str, Any] | None = None,
841841
dry_run: bool = False,
842842
timeout: float | None = None,
843843
) -> UpdateResponse:
@@ -917,13 +917,13 @@ async def search(
917917
*,
918918
namespace: str,
919919
top_k: int,
920-
inputs: SearchInputs | dict[str, Any] | None = None,
920+
inputs: SearchInputs | Mapping[str, Any] | None = None,
921921
vector: Sequence[float] | None = None,
922922
id: str | None = None,
923-
filter: dict[str, Any] | None = None,
923+
filter: Mapping[str, Any] | None = None,
924924
fields: Sequence[str] | None = None,
925-
rerank: RerankConfig | dict[str, Any] | None = None,
926-
match_terms: dict[str, Any] | None = None,
925+
rerank: RerankConfig | Mapping[str, Any] | None = None,
926+
match_terms: Mapping[str, Any] | None = None,
927927
timeout: float | None = None,
928928
) -> SearchRecordsResponse:
929929
"""Search records by text, vector, or ID with optional reranking.
@@ -1023,13 +1023,13 @@ async def search_records(
10231023
*,
10241024
namespace: str,
10251025
top_k: int,
1026-
inputs: SearchInputs | dict[str, Any] | None = None,
1026+
inputs: SearchInputs | Mapping[str, Any] | None = None,
10271027
vector: Sequence[float] | None = None,
10281028
id: str | None = None,
1029-
filter: dict[str, Any] | None = None,
1029+
filter: Mapping[str, Any] | None = None,
10301030
fields: Sequence[str] | None = None,
1031-
rerank: RerankConfig | dict[str, Any] | None = None,
1032-
match_terms: dict[str, Any] | None = None,
1031+
rerank: RerankConfig | Mapping[str, Any] | None = None,
1032+
match_terms: Mapping[str, Any] | None = None,
10331033
timeout: float | None = None,
10341034
) -> SearchRecordsResponse:
10351035
"""Alias for :meth:`search`.
@@ -1142,7 +1142,7 @@ async def list(
11421142
async def describe_index_stats(
11431143
self,
11441144
*,
1145-
filter: dict[str, Any] | None = None,
1145+
filter: Mapping[str, Any] | None = None,
11461146
timeout: float | None = None,
11471147
) -> DescribeIndexStatsResponse:
11481148
"""Return statistics for this index.

‎pinecone/grpc/__init__.py‎

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -339,10 +339,10 @@ def query(
339339
vector: Sequence[float] | None = None,
340340
id: str | None = None,
341341
namespace: str = "",
342-
filter: dict[str, Any] | None = None,
342+
filter: Mapping[str, Any] | None = None,
343343
include_values: bool = False,
344344
include_metadata: bool = False,
345-
sparse_vector: SparseValues | dict[str, Any] | None = None,
345+
sparse_vector: SparseValues | Mapping[str, Any] | None = None,
346346
scan_factor: float | None = None,
347347
max_candidates: int | None = None,
348348
timeout: float | None = None,
@@ -399,7 +399,7 @@ def query(
399399
raise ValidationError("At least one of vector, id, or sparse_vector must be provided")
400400

401401
# Convert SparseValues model to dict for GrpcChannel
402-
sv_dict: dict[str, Any] | None = None
402+
sv_dict: Mapping[str, Any] | None = None
403403
if sparse_vector is not None:
404404
if isinstance(sparse_vector, SparseValues):
405405
sv_dict = {
@@ -485,7 +485,7 @@ def delete(
485485
*,
486486
ids: Sequence[str] | None = None,
487487
delete_all: bool = False,
488-
filter: dict[str, Any] | None = None,
488+
filter: Mapping[str, Any] | None = None,
489489
namespace: str = "",
490490
timeout: float | None = None,
491491
) -> None:
@@ -543,10 +543,10 @@ def update(
543543
*,
544544
id: str | None = None,
545545
values: Sequence[float] | None = None,
546-
sparse_values: SparseValues | dict[str, Any] | None = None,
547-
set_metadata: dict[str, Any] | None = None,
546+
sparse_values: SparseValues | Mapping[str, Any] | None = None,
547+
set_metadata: Mapping[str, Any] | None = None,
548548
namespace: str = "",
549-
filter: dict[str, Any] | None = None,
549+
filter: Mapping[str, Any] | None = None,
550550
dry_run: bool = False,
551551
timeout: float | None = None,
552552
) -> UpdateResponse:
@@ -592,7 +592,7 @@ def update(
592592
raise ValidationError("Exactly one of id or filter must be provided, got neither")
593593

594594
# Convert SparseValues model to dict for GrpcChannel
595-
sv_dict: dict[str, Any] | None = None
595+
sv_dict: Mapping[str, Any] | None = None
596596
if sparse_values is not None:
597597
if isinstance(sparse_values, SparseValues):
598598
sv_dict = {
@@ -728,7 +728,7 @@ def list(
728728
def describe_index_stats(
729729
self,
730730
*,
731-
filter: dict[str, Any] | None = None,
731+
filter: Mapping[str, Any] | None = None,
732732
timeout: float | None = None,
733733
) -> DescribeIndexStatsResponse:
734734
"""Return statistics for this index.
@@ -929,10 +929,10 @@ def query_async(
929929
vector: Sequence[float] | None = None,
930930
id: str | None = None,
931931
namespace: str = "",
932-
filter: dict[str, Any] | None = None,
932+
filter: Mapping[str, Any] | None = None,
933933
include_values: bool = False,
934934
include_metadata: bool = False,
935-
sparse_vector: SparseValues | dict[str, Any] | None = None,
935+
sparse_vector: SparseValues | Mapping[str, Any] | None = None,
936936
scan_factor: float | None = None,
937937
max_candidates: int | None = None,
938938
timeout: float | None = None,
@@ -1010,7 +1010,7 @@ def delete_async(
10101010
*,
10111011
ids: Sequence[str] | None = None,
10121012
delete_all: bool = False,
1013-
filter: dict[str, Any] | None = None,
1013+
filter: Mapping[str, Any] | None = None,
10141014
namespace: str = "",
10151015
timeout: float | None = None,
10161016
) -> PineconeFuture[None]:
@@ -1052,9 +1052,9 @@ def update_async(
10521052
*,
10531053
id: str | None = None,
10541054
values: Sequence[float] | None = None,
1055-
sparse_values: SparseValues | dict[str, Any] | None = None,
1056-
set_metadata: dict[str, Any] | None = None,
1057-
filter: dict[str, Any] | None = None,
1055+
sparse_values: SparseValues | Mapping[str, Any] | None = None,
1056+
set_metadata: Mapping[str, Any] | None = None,
1057+
filter: Mapping[str, Any] | None = None,
10581058
namespace: str = "",
10591059
dry_run: bool = False,
10601060
timeout: float | None = None,
@@ -1161,13 +1161,13 @@ def search(
11611161
*,
11621162
namespace: str,
11631163
top_k: int,
1164-
inputs: SearchInputs | dict[str, Any] | None = None,
1164+
inputs: SearchInputs | Mapping[str, Any] | None = None,
11651165
vector: Sequence[float] | None = None,
11661166
id: str | None = None,
1167-
filter: dict[str, Any] | None = None,
1167+
filter: Mapping[str, Any] | None = None,
11681168
fields: Sequence[str] | None = None,
1169-
rerank: RerankConfig | dict[str, Any] | None = None,
1170-
match_terms: dict[str, Any] | None = None,
1169+
rerank: RerankConfig | Mapping[str, Any] | None = None,
1170+
match_terms: Mapping[str, Any] | None = None,
11711171
timeout: float | None = None,
11721172
) -> SearchRecordsResponse:
11731173
"""Search records by text, vector, or ID with optional reranking.
@@ -1291,13 +1291,13 @@ def search_records(
12911291
*,
12921292
namespace: str,
12931293
top_k: int,
1294-
inputs: SearchInputs | dict[str, Any] | None = None,
1294+
inputs: SearchInputs | Mapping[str, Any] | None = None,
12951295
vector: Sequence[float] | None = None,
12961296
id: str | None = None,
1297-
filter: dict[str, Any] | None = None,
1297+
filter: Mapping[str, Any] | None = None,
12981298
fields: Sequence[str] | None = None,
1299-
rerank: RerankConfig | dict[str, Any] | None = None,
1300-
match_terms: dict[str, Any] | None = None,
1299+
rerank: RerankConfig | Mapping[str, Any] | None = None,
1300+
match_terms: Mapping[str, Any] | None = None,
13011301
timeout: float | None = None,
13021302
) -> SearchRecordsResponse:
13031303
"""Alias for :meth:`search`.

‎pinecone/grpc/_protocol.py‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from __future__ import annotations
99

10-
from collections.abc import Sequence
10+
from collections.abc import Mapping, Sequence
1111
from typing import Any, Protocol, runtime_checkable
1212

1313

@@ -32,10 +32,10 @@ def query(
3232
vector: Sequence[float] | None = None,
3333
id: str | None = None,
3434
namespace: str | None = None,
35-
filter: dict[str, Any] | None = None,
35+
filter: Mapping[str, Any] | None = None,
3636
include_values: bool = False,
3737
include_metadata: bool = False,
38-
sparse_vector: dict[str, Any] | None = None,
38+
sparse_vector: Mapping[str, Any] | None = None,
3939
scan_factor: float | None = None,
4040
max_candidates: int | None = None,
4141
timeout_s: float | None = None,
@@ -59,7 +59,7 @@ def delete(
5959
ids: Sequence[str] | None = None,
6060
delete_all: bool = False,
6161
namespace: str | None = None,
62-
filter: dict[str, Any] | None = None,
62+
filter: Mapping[str, Any] | None = None,
6363
timeout_s: float | None = None,
6464
) -> None:
6565
"""Delete vectors."""
@@ -70,10 +70,10 @@ def update(
7070
id: str | None,
7171
*,
7272
values: Sequence[float] | None = None,
73-
sparse_values: dict[str, Any] | None = None,
74-
set_metadata: dict[str, Any] | None = None,
73+
sparse_values: Mapping[str, Any] | None = None,
74+
set_metadata: Mapping[str, Any] | None = None,
7575
namespace: str | None = None,
76-
filter: dict[str, Any] | None = None,
76+
filter: Mapping[str, Any] | None = None,
7777
dry_run: bool | None = None,
7878
timeout_s: float | None = None,
7979
) -> dict[str, Any]:
@@ -95,7 +95,7 @@ def list(
9595
def describe_index_stats(
9696
self,
9797
*,
98-
filter: dict[str, Any] | None = None,
98+
filter: Mapping[str, Any] | None = None,
9999
timeout_s: float | None = None,
100100
) -> dict[str, Any]:
101101
"""Describe index statistics."""

‎pinecone/index/__init__.py‎

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -551,10 +551,10 @@ def query(
551551
vector: Sequence[float] | None = None,
552552
id: str | None = None,
553553
namespace: str = "",
554-
filter: dict[str, Any] | None = None,
554+
filter: Mapping[str, Any] | None = None,
555555
include_values: bool = False,
556556
include_metadata: bool = False,
557-
sparse_vector: SparseValues | dict[str, Any] | None = None,
557+
sparse_vector: SparseValues | Mapping[str, Any] | None = None,
558558
scan_factor: float | None = None,
559559
max_candidates: int | None = None,
560560
timeout: float | None = None,
@@ -657,10 +657,10 @@ def query_namespaces(
657657
namespaces: Sequence[str],
658658
metric: str,
659659
top_k: int | None = None,
660-
filter: dict[str, Any] | None = None,
660+
filter: Mapping[str, Any] | None = None,
661661
include_values: bool = False,
662662
include_metadata: bool = False,
663-
sparse_vector: SparseValues | dict[str, Any] | None = None,
663+
sparse_vector: SparseValues | Mapping[str, Any] | None = None,
664664
scan_factor: float | None = None,
665665
max_candidates: int | None = None,
666666
timeout: float | None = None,
@@ -816,7 +816,7 @@ def fetch(
816816
def fetch_by_metadata(
817817
self,
818818
*,
819-
filter: dict[str, Any],
819+
filter: Mapping[str, Any],
820820
namespace: str = "",
821821
limit: int | None = None,
822822
pagination_token: str | None = None,
@@ -885,7 +885,7 @@ def delete(
885885
*,
886886
ids: Sequence[str] | None = None,
887887
delete_all: bool = False,
888-
filter: dict[str, Any] | None = None,
888+
filter: Mapping[str, Any] | None = None,
889889
namespace: str = "",
890890
timeout: float | None = None,
891891
) -> None:
@@ -947,10 +947,10 @@ def update(
947947
*,
948948
id: str | None = None,
949949
values: Sequence[float] | None = None,
950-
sparse_values: SparseValues | dict[str, Any] | None = None,
951-
set_metadata: dict[str, Any] | None = None,
950+
sparse_values: SparseValues | Mapping[str, Any] | None = None,
951+
set_metadata: Mapping[str, Any] | None = None,
952952
namespace: str = "",
953-
filter: dict[str, Any] | None = None,
953+
filter: Mapping[str, Any] | None = None,
954954
dry_run: bool = False,
955955
timeout: float | None = None,
956956
) -> UpdateResponse:
@@ -1034,7 +1034,7 @@ def update(
10341034
def describe_index_stats(
10351035
self,
10361036
*,
1037-
filter: dict[str, Any] | None = None,
1037+
filter: Mapping[str, Any] | None = None,
10381038
timeout: float | None = None,
10391039
) -> DescribeIndexStatsResponse:
10401040
"""Return statistics for this index.
@@ -1084,13 +1084,13 @@ def search(
10841084
*,
10851085
namespace: str,
10861086
top_k: int,
1087-
inputs: SearchInputs | dict[str, Any] | None = None,
1087+
inputs: SearchInputs | Mapping[str, Any] | None = None,
10881088
vector: Sequence[float] | None = None,
10891089
id: str | None = None,
1090-
filter: dict[str, Any] | None = None,
1090+
filter: Mapping[str, Any] | None = None,
10911091
fields: Sequence[str] | None = None,
1092-
rerank: RerankConfig | dict[str, Any] | None = None,
1093-
match_terms: dict[str, Any] | None = None,
1092+
rerank: RerankConfig | Mapping[str, Any] | None = None,
1093+
match_terms: Mapping[str, Any] | None = None,
10941094
timeout: float | None = None,
10951095
) -> SearchRecordsResponse:
10961096
"""Search records by text, vector, or ID with optional reranking.
@@ -1213,13 +1213,13 @@ def search_records(
12131213
*,
12141214
namespace: str,
12151215
top_k: int,
1216-
inputs: SearchInputs | dict[str, Any] | None = None,
1216+
inputs: SearchInputs | Mapping[str, Any] | None = None,
12171217
vector: Sequence[float] | None = None,
12181218
id: str | None = None,
1219-
filter: dict[str, Any] | None = None,
1219+
filter: Mapping[str, Any] | None = None,
12201220
fields: Sequence[str] | None = None,
1221-
rerank: RerankConfig | dict[str, Any] | None = None,
1222-
match_terms: dict[str, Any] | None = None,
1221+
rerank: RerankConfig | Mapping[str, Any] | None = None,
1222+
match_terms: Mapping[str, Any] | None = None,
12231223
timeout: float | None = None,
12241224
) -> SearchRecordsResponse:
12251225
"""Alias for :meth:`search`.

0 commit comments

Comments
 (0)