From bbf12272a195e9b11e52ba735b14573af354d011 Mon Sep 17 00:00:00 2001 From: Andy Stark Date: Fri, 6 Nov 2026 16:47:13 +0000 Subject: [PATCH] DOC-7267 Update the stale redis_py entries and drop the nonexistent methods The last redis_py items from the DOC-7267 sweep, checked against redis-py 8.1.0, the current release. Ten command files change, and only their redis_py lists. Stale: JSON.SET lacked the fpha parameter and declared Optional[str] where set returns bool or None. TS.MRANGE and TS.MREVRANGE lacked exclude_empty, and their aggregation_type takes a string or a list of strings. XREAD and XREADGROUP lacked max_count and max_size, which need Redis 8.10.0. Each entry's parameter names now equal the method's signature. Nonexistent: client_caching, cursor_del, cursor_read and _list are not methods. CLIENT CACHING, FT.CURSOR DEL and FT._LIST have no redis-py method at all, so their lists are empty and the status file marks redis_py generic_only. FT.CURSOR READ is not a separate method either: aggregate() issues it when given a Cursor, so that entry is now the aggregate signature. That exposed FT.AGGREGATE's entry, which typed query as Union[str, Query]. The method takes a Union[AggregateRequest, Cursor], so the entry is corrected too. Learned: a redis-py command can be served by an existing method that branches on its argument type (FT.CURSOR READ through aggregate), so no method named after the command is not proof it is unsupported Directive: take the type of a parameter from the released signature, not from what the command's arguments look like Gaps: only the entries the earlier sweep flagged were rechecked, other redis_py entries may still differ in parameter types or returns Gaps: returns for XREAD, XREADGROUP and the TS range commands still say ResponseT and Any, redis-py 8.1.0 declares more specific types Ticket: DOC-7267 Co-Authored-By: Claude Sonnet 5.5 --- data/command-api-mapping-status.json | 9 +- data/command-api-mapping.json | 121 +++++++++---------- data/command-api-mapping/CLIENT CACHING.json | 22 +--- data/command-api-mapping/FT.AGGREGATE.json | 6 +- data/command-api-mapping/FT.CURSOR DEL.json | 17 +-- data/command-api-mapping/FT.CURSOR READ.json | 14 +-- data/command-api-mapping/FT._LIST.json | 11 +- data/command-api-mapping/JSON.SET.json | 9 +- data/command-api-mapping/TS.MRANGE.json | 9 +- data/command-api-mapping/TS.MREVRANGE.json | 9 +- data/command-api-mapping/XREAD.json | 12 +- data/command-api-mapping/XREADGROUP.json | 12 +- 12 files changed, 118 insertions(+), 133 deletions(-) diff --git a/data/command-api-mapping-status.json b/data/command-api-mapping-status.json index 8f29495df3..44b4cc45b8 100644 --- a/data/command-api-mapping-status.json +++ b/data/command-api-mapping-status.json @@ -105,7 +105,8 @@ "nredisstack_async": "unsupported", "redis_rs_sync": "generic_only", "redis_rs_async": "generic_only", - "php": "generic_only" + "php": "generic_only", + "redis_py": "generic_only" }, "CLIENT GETNAME": { "nredisstack_sync": "unsupported", @@ -654,7 +655,8 @@ }, "FT.CURSOR DEL": { "redis_rs_sync": "generic_only", - "redis_rs_async": "generic_only" + "redis_rs_async": "generic_only", + "redis_py": "generic_only" }, "FT.CURSOR READ": { "redis_rs_sync": "generic_only", @@ -745,7 +747,8 @@ }, "FT._LIST": { "redis_rs_sync": "generic_only", - "redis_rs_async": "generic_only" + "redis_rs_async": "generic_only", + "redis_py": "generic_only" }, "FUNCTION DELETE": { "lettuce_sync": "generic_only", diff --git a/data/command-api-mapping.json b/data/command-api-mapping.json index 7c6784aaaf..c5c81def2e 100644 --- a/data/command-api-mapping.json +++ b/data/command-api-mapping.json @@ -20465,27 +20465,7 @@ }, "CLIENT CACHING": { "api_calls": { - "redis_py": [ - { - "signature": "client_caching(enabled: bool, **kwargs)", - "params": [ - { - "name": "enabled", - "type": "bool", - "description": "" - }, - { - "name": "**kwargs", - "type": "Any", - "description": "" - } - ], - "returns": { - "type": "str", - "description": "" - } - } - ], + "redis_py": [], "jedis": [ { "signature": "String clientCaching(boolean enabled)", @@ -37077,16 +37057,16 @@ "api_calls": { "redis_py": [ { - "signature": "aggregate(query: Union[str, Query], query_params: Optional[Dict[str, Union[str, int, float]]] = None)", + "signature": "aggregate(query: Union[AggregateRequest, Cursor], query_params: Optional[Dict[str, Union[str, int, float, bytes]]] = None)", "params": [ { "name": "query", - "type": "Union[str, Query]", + "type": "Union[AggregateRequest, Cursor]", "description": "The aggregation query" }, { "name": "query_params", - "type": "Optional[Dict[str, Union[str, int, float]]]", + "type": "Optional[Dict[str, Union[str, int, float, bytes]]]", "description": "Optional query parameters" } ], @@ -38977,22 +38957,7 @@ }, "FT.CURSOR DEL": { "api_calls": { - "redis_py": [ - { - "signature": "cursor_del(cursor_id: int)", - "params": [ - { - "name": "cursor_id", - "type": "int", - "description": "The cursor ID to delete" - } - ], - "returns": { - "type": "str", - "description": "OK on success" - } - } - ], + "redis_py": [], "jedis": [ { "signature": "String ftCursorDel(String indexName, long cursorId)", @@ -39207,17 +39172,17 @@ "api_calls": { "redis_py": [ { - "signature": "cursor_read(cursor_id: int, read_size: Optional[int] = None)", + "signature": "aggregate(query: Union[AggregateRequest, Cursor], query_params: Optional[Dict[str, Union[str, int, float, bytes]]] = None)", "params": [ { - "name": "cursor_id", - "type": "int", - "description": "The cursor ID to read from" + "name": "query", + "type": "Union[AggregateRequest, Cursor]", + "description": "A Cursor built from the cursor ID of a previous AggregateResult; its count attribute sets the read size" }, { - "name": "read_size", - "type": "Optional[int]", - "description": "Number of results to read" + "name": "query_params", + "type": "Optional[Dict[str, Union[str, int, float, bytes]]]", + "description": "Optional query parameters" } ], "returns": { @@ -44866,16 +44831,7 @@ }, "FT._LIST": { "api_calls": { - "redis_py": [ - { - "signature": "_list()", - "params": [], - "returns": { - "type": "List[str]", - "description": "A list of all existing indexes" - } - } - ], + "redis_py": [], "jedis": [ { "signature": "Set ftList()", @@ -82007,7 +81963,7 @@ "api_calls": { "redis_py": [ { - "signature": "set(name: str, path: str, obj: JsonType, nx: Optional[bool] = False, xx: Optional[bool] = False, decode_keys: Optional[bool] = False)", + "signature": "set(name: str, path: str, obj: JsonType, nx: Optional[bool] = False, xx: Optional[bool] = False, decode_keys: Optional[bool] = False, fpha: Optional[Union[FPHAType, str]] = None)", "params": [ { "name": "name", @@ -82038,10 +81994,15 @@ "name": "decode_keys", "type": "Optional[bool] = False", "description": "" + }, + { + "name": "fpha", + "type": "Optional[Union[FPHAType, str]] = None", + "description": "Force Redis to store all floating-point homogeneous arrays in obj as this type: BF16, FP16, FP32 or FP64" } ], "returns": { - "type": "Optional[str]", + "type": "Optional[bool]", "description": "" } }, @@ -129019,7 +128980,7 @@ "api_calls": { "redis_py": [ { - "signature": "mrange(from_time: Union[int, str], to_time: Union[int, str], filters: List[str], count: Optional[int] = None, aggregation_type: Optional[str] = None, bucket_size_msec: Optional[int] = 0, with_labels: Optional[bool] = False, filter_by_ts: Optional[List[int]] = None, filter_by_min_value: Optional[int] = None, filter_by_max_value: Optional[int] = None, groupby: Optional[str] = None, reduce: Optional[str] = None, select_labels: Optional[List[str]] = None, align: Optional[Union[int, str]] = None, latest: Optional[bool] = False, bucket_timestamp: Optional[str] = None, empty: Optional[bool] = False)", + "signature": "mrange(from_time: Union[int, str], to_time: Union[int, str], filters: List[str], count: Optional[int] = None, aggregation_type: Optional[Union[str, List[str]]] = None, bucket_size_msec: Optional[int] = 0, with_labels: Optional[bool] = False, filter_by_ts: Optional[List[int]] = None, filter_by_min_value: Optional[int] = None, filter_by_max_value: Optional[int] = None, groupby: Optional[str] = None, reduce: Optional[str] = None, select_labels: Optional[List[str]] = None, align: Optional[Union[int, str]] = None, latest: Optional[bool] = False, bucket_timestamp: Optional[str] = None, empty: Optional[bool] = False, exclude_empty: Optional[bool] = False)", "params": [ { "name": "from_time", @@ -129043,7 +129004,7 @@ }, { "name": "aggregation_type", - "type": "Optional[str] = None", + "type": "Optional[Union[str, List[str]]] = None", "description": "" }, { @@ -129105,6 +129066,11 @@ "name": "empty", "type": "Optional[bool] = False", "description": "" + }, + { + "name": "exclude_empty", + "type": "Optional[bool] = False", + "description": "Leave out series that have no samples in the range; not allowed with groupby" } ], "returns": { @@ -129453,7 +129419,7 @@ "api_calls": { "redis_py": [ { - "signature": "mrevrange(from_time: Union[int, str], to_time: Union[int, str], filters: List[str], count: Optional[int] = None, aggregation_type: Optional[str] = None, bucket_size_msec: Optional[int] = 0, with_labels: Optional[bool] = False, filter_by_ts: Optional[List[int]] = None, filter_by_min_value: Optional[int] = None, filter_by_max_value: Optional[int] = None, groupby: Optional[str] = None, reduce: Optional[str] = None, select_labels: Optional[List[str]] = None, align: Optional[Union[int, str]] = None, latest: Optional[bool] = False, bucket_timestamp: Optional[str] = None, empty: Optional[bool] = False)", + "signature": "mrevrange(from_time: Union[int, str], to_time: Union[int, str], filters: List[str], count: Optional[int] = None, aggregation_type: Optional[Union[str, List[str]]] = None, bucket_size_msec: Optional[int] = 0, with_labels: Optional[bool] = False, filter_by_ts: Optional[List[int]] = None, filter_by_min_value: Optional[int] = None, filter_by_max_value: Optional[int] = None, groupby: Optional[str] = None, reduce: Optional[str] = None, select_labels: Optional[List[str]] = None, align: Optional[Union[int, str]] = None, latest: Optional[bool] = False, bucket_timestamp: Optional[str] = None, empty: Optional[bool] = False, exclude_empty: Optional[bool] = False)", "params": [ { "name": "from_time", @@ -129477,7 +129443,7 @@ }, { "name": "aggregation_type", - "type": "Optional[str] = None", + "type": "Optional[Union[str, List[str]]] = None", "description": "" }, { @@ -129539,6 +129505,11 @@ "name": "empty", "type": "Optional[bool] = False", "description": "" + }, + { + "name": "exclude_empty", + "type": "Optional[bool] = False", + "description": "Leave out series that have no samples in the range; not allowed with groupby" } ], "returns": { @@ -149883,7 +149854,7 @@ "api_calls": { "redis_py": [ { - "signature": "xread(streams: Dict[KeyT, StreamIdT], count: Optional[int] = None, block: Optional[int] = None)", + "signature": "xread(streams: Dict[KeyT, StreamIdT], count: Optional[int] = None, block: Optional[int] = None, max_count: Optional[int] = None, max_size: Optional[int] = None)", "params": [ { "name": "streams", @@ -149899,6 +149870,16 @@ "name": "block", "type": "Optional[int] = None", "description": "" + }, + { + "name": "max_count", + "type": "Optional[int] = None", + "description": "Cap on the total number of entries returned across all streams, where count is per stream. Requires Redis 8.10.0 or later" + }, + { + "name": "max_size", + "type": "Optional[int] = None", + "description": "Soft cap, in bytes, on the total reply size across all streams. Requires Redis 8.10.0 or later" } ], "returns": { @@ -150671,7 +150652,7 @@ "api_calls": { "redis_py": [ { - "signature": "xreadgroup(groupname: str, consumername: str, streams: Dict[KeyT, StreamIdT], count: Optional[int] = None, block: Optional[int] = None, noack: bool = False, claim_min_idle_time: Optional[int] = None)", + "signature": "xreadgroup(groupname: str, consumername: str, streams: Dict[KeyT, StreamIdT], count: Optional[int] = None, block: Optional[int] = None, noack: bool = False, claim_min_idle_time: Optional[int] = None, max_count: Optional[int] = None, max_size: Optional[int] = None)", "params": [ { "name": "groupname", @@ -150707,6 +150688,16 @@ "name": "claim_min_idle_time", "type": "Optional[int] = None", "description": "" + }, + { + "name": "max_count", + "type": "Optional[int] = None", + "description": "Cap on the total number of entries returned across all streams, where count is per stream. Requires Redis 8.10.0 or later" + }, + { + "name": "max_size", + "type": "Optional[int] = None", + "description": "Soft cap, in bytes, on the total reply size across all streams. Requires Redis 8.10.0 or later" } ], "returns": { diff --git a/data/command-api-mapping/CLIENT CACHING.json b/data/command-api-mapping/CLIENT CACHING.json index 48ef48b245..932ea7e769 100644 --- a/data/command-api-mapping/CLIENT CACHING.json +++ b/data/command-api-mapping/CLIENT CACHING.json @@ -1,26 +1,6 @@ { "api_calls": { - "redis_py": [ - { - "signature": "client_caching(enabled: bool, **kwargs)", - "params": [ - { - "name": "enabled", - "type": "bool", - "description": "" - }, - { - "name": "**kwargs", - "type": "Any", - "description": "" - } - ], - "returns": { - "type": "str", - "description": "" - } - } - ], + "redis_py": [], "jedis": [ { "signature": "String clientCaching(boolean enabled)", diff --git a/data/command-api-mapping/FT.AGGREGATE.json b/data/command-api-mapping/FT.AGGREGATE.json index d3b7721472..62febd3376 100644 --- a/data/command-api-mapping/FT.AGGREGATE.json +++ b/data/command-api-mapping/FT.AGGREGATE.json @@ -2,16 +2,16 @@ "api_calls": { "redis_py": [ { - "signature": "aggregate(query: Union[str, Query], query_params: Optional[Dict[str, Union[str, int, float]]] = None)", + "signature": "aggregate(query: Union[AggregateRequest, Cursor], query_params: Optional[Dict[str, Union[str, int, float, bytes]]] = None)", "params": [ { "name": "query", - "type": "Union[str, Query]", + "type": "Union[AggregateRequest, Cursor]", "description": "The aggregation query" }, { "name": "query_params", - "type": "Optional[Dict[str, Union[str, int, float]]]", + "type": "Optional[Dict[str, Union[str, int, float, bytes]]]", "description": "Optional query parameters" } ], diff --git a/data/command-api-mapping/FT.CURSOR DEL.json b/data/command-api-mapping/FT.CURSOR DEL.json index 807d49f394..e4018334d3 100644 --- a/data/command-api-mapping/FT.CURSOR DEL.json +++ b/data/command-api-mapping/FT.CURSOR DEL.json @@ -1,21 +1,6 @@ { "api_calls": { - "redis_py": [ - { - "signature": "cursor_del(cursor_id: int)", - "params": [ - { - "name": "cursor_id", - "type": "int", - "description": "The cursor ID to delete" - } - ], - "returns": { - "type": "str", - "description": "OK on success" - } - } - ], + "redis_py": [], "jedis": [ { "signature": "String ftCursorDel(String indexName, long cursorId)", diff --git a/data/command-api-mapping/FT.CURSOR READ.json b/data/command-api-mapping/FT.CURSOR READ.json index 9d3b92683a..16a411205c 100644 --- a/data/command-api-mapping/FT.CURSOR READ.json +++ b/data/command-api-mapping/FT.CURSOR READ.json @@ -2,17 +2,17 @@ "api_calls": { "redis_py": [ { - "signature": "cursor_read(cursor_id: int, read_size: Optional[int] = None)", + "signature": "aggregate(query: Union[AggregateRequest, Cursor], query_params: Optional[Dict[str, Union[str, int, float, bytes]]] = None)", "params": [ { - "name": "cursor_id", - "type": "int", - "description": "The cursor ID to read from" + "name": "query", + "type": "Union[AggregateRequest, Cursor]", + "description": "A Cursor built from the cursor ID of a previous AggregateResult; its count attribute sets the read size" }, { - "name": "read_size", - "type": "Optional[int]", - "description": "Number of results to read" + "name": "query_params", + "type": "Optional[Dict[str, Union[str, int, float, bytes]]]", + "description": "Optional query parameters" } ], "returns": { diff --git a/data/command-api-mapping/FT._LIST.json b/data/command-api-mapping/FT._LIST.json index 41838c26a3..8b6e6be939 100644 --- a/data/command-api-mapping/FT._LIST.json +++ b/data/command-api-mapping/FT._LIST.json @@ -1,15 +1,6 @@ { "api_calls": { - "redis_py": [ - { - "signature": "_list()", - "params": [], - "returns": { - "type": "List[str]", - "description": "A list of all existing indexes" - } - } - ], + "redis_py": [], "jedis": [ { "signature": "Set ftList()", diff --git a/data/command-api-mapping/JSON.SET.json b/data/command-api-mapping/JSON.SET.json index bd025e7816..a8607b8959 100644 --- a/data/command-api-mapping/JSON.SET.json +++ b/data/command-api-mapping/JSON.SET.json @@ -2,7 +2,7 @@ "api_calls": { "redis_py": [ { - "signature": "set(name: str, path: str, obj: JsonType, nx: Optional[bool] = False, xx: Optional[bool] = False, decode_keys: Optional[bool] = False)", + "signature": "set(name: str, path: str, obj: JsonType, nx: Optional[bool] = False, xx: Optional[bool] = False, decode_keys: Optional[bool] = False, fpha: Optional[Union[FPHAType, str]] = None)", "params": [ { "name": "name", @@ -33,10 +33,15 @@ "name": "decode_keys", "type": "Optional[bool] = False", "description": "" + }, + { + "name": "fpha", + "type": "Optional[Union[FPHAType, str]] = None", + "description": "Force Redis to store all floating-point homogeneous arrays in obj as this type: BF16, FP16, FP32 or FP64" } ], "returns": { - "type": "Optional[str]", + "type": "Optional[bool]", "description": "" } }, diff --git a/data/command-api-mapping/TS.MRANGE.json b/data/command-api-mapping/TS.MRANGE.json index 57ac4c3d56..5c1bb5a8e0 100644 --- a/data/command-api-mapping/TS.MRANGE.json +++ b/data/command-api-mapping/TS.MRANGE.json @@ -2,7 +2,7 @@ "api_calls": { "redis_py": [ { - "signature": "mrange(from_time: Union[int, str], to_time: Union[int, str], filters: List[str], count: Optional[int] = None, aggregation_type: Optional[str] = None, bucket_size_msec: Optional[int] = 0, with_labels: Optional[bool] = False, filter_by_ts: Optional[List[int]] = None, filter_by_min_value: Optional[int] = None, filter_by_max_value: Optional[int] = None, groupby: Optional[str] = None, reduce: Optional[str] = None, select_labels: Optional[List[str]] = None, align: Optional[Union[int, str]] = None, latest: Optional[bool] = False, bucket_timestamp: Optional[str] = None, empty: Optional[bool] = False)", + "signature": "mrange(from_time: Union[int, str], to_time: Union[int, str], filters: List[str], count: Optional[int] = None, aggregation_type: Optional[Union[str, List[str]]] = None, bucket_size_msec: Optional[int] = 0, with_labels: Optional[bool] = False, filter_by_ts: Optional[List[int]] = None, filter_by_min_value: Optional[int] = None, filter_by_max_value: Optional[int] = None, groupby: Optional[str] = None, reduce: Optional[str] = None, select_labels: Optional[List[str]] = None, align: Optional[Union[int, str]] = None, latest: Optional[bool] = False, bucket_timestamp: Optional[str] = None, empty: Optional[bool] = False, exclude_empty: Optional[bool] = False)", "params": [ { "name": "from_time", @@ -26,7 +26,7 @@ }, { "name": "aggregation_type", - "type": "Optional[str] = None", + "type": "Optional[Union[str, List[str]]] = None", "description": "" }, { @@ -88,6 +88,11 @@ "name": "empty", "type": "Optional[bool] = False", "description": "" + }, + { + "name": "exclude_empty", + "type": "Optional[bool] = False", + "description": "Leave out series that have no samples in the range; not allowed with groupby" } ], "returns": { diff --git a/data/command-api-mapping/TS.MREVRANGE.json b/data/command-api-mapping/TS.MREVRANGE.json index 0a83979ac5..a1ec1149bf 100644 --- a/data/command-api-mapping/TS.MREVRANGE.json +++ b/data/command-api-mapping/TS.MREVRANGE.json @@ -2,7 +2,7 @@ "api_calls": { "redis_py": [ { - "signature": "mrevrange(from_time: Union[int, str], to_time: Union[int, str], filters: List[str], count: Optional[int] = None, aggregation_type: Optional[str] = None, bucket_size_msec: Optional[int] = 0, with_labels: Optional[bool] = False, filter_by_ts: Optional[List[int]] = None, filter_by_min_value: Optional[int] = None, filter_by_max_value: Optional[int] = None, groupby: Optional[str] = None, reduce: Optional[str] = None, select_labels: Optional[List[str]] = None, align: Optional[Union[int, str]] = None, latest: Optional[bool] = False, bucket_timestamp: Optional[str] = None, empty: Optional[bool] = False)", + "signature": "mrevrange(from_time: Union[int, str], to_time: Union[int, str], filters: List[str], count: Optional[int] = None, aggregation_type: Optional[Union[str, List[str]]] = None, bucket_size_msec: Optional[int] = 0, with_labels: Optional[bool] = False, filter_by_ts: Optional[List[int]] = None, filter_by_min_value: Optional[int] = None, filter_by_max_value: Optional[int] = None, groupby: Optional[str] = None, reduce: Optional[str] = None, select_labels: Optional[List[str]] = None, align: Optional[Union[int, str]] = None, latest: Optional[bool] = False, bucket_timestamp: Optional[str] = None, empty: Optional[bool] = False, exclude_empty: Optional[bool] = False)", "params": [ { "name": "from_time", @@ -26,7 +26,7 @@ }, { "name": "aggregation_type", - "type": "Optional[str] = None", + "type": "Optional[Union[str, List[str]]] = None", "description": "" }, { @@ -88,6 +88,11 @@ "name": "empty", "type": "Optional[bool] = False", "description": "" + }, + { + "name": "exclude_empty", + "type": "Optional[bool] = False", + "description": "Leave out series that have no samples in the range; not allowed with groupby" } ], "returns": { diff --git a/data/command-api-mapping/XREAD.json b/data/command-api-mapping/XREAD.json index 2d817215c4..8100a272d8 100644 --- a/data/command-api-mapping/XREAD.json +++ b/data/command-api-mapping/XREAD.json @@ -2,7 +2,7 @@ "api_calls": { "redis_py": [ { - "signature": "xread(streams: Dict[KeyT, StreamIdT], count: Optional[int] = None, block: Optional[int] = None)", + "signature": "xread(streams: Dict[KeyT, StreamIdT], count: Optional[int] = None, block: Optional[int] = None, max_count: Optional[int] = None, max_size: Optional[int] = None)", "params": [ { "name": "streams", @@ -18,6 +18,16 @@ "name": "block", "type": "Optional[int] = None", "description": "" + }, + { + "name": "max_count", + "type": "Optional[int] = None", + "description": "Cap on the total number of entries returned across all streams, where count is per stream. Requires Redis 8.10.0 or later" + }, + { + "name": "max_size", + "type": "Optional[int] = None", + "description": "Soft cap, in bytes, on the total reply size across all streams. Requires Redis 8.10.0 or later" } ], "returns": { diff --git a/data/command-api-mapping/XREADGROUP.json b/data/command-api-mapping/XREADGROUP.json index ceb4b9c73c..155a3ec1a9 100644 --- a/data/command-api-mapping/XREADGROUP.json +++ b/data/command-api-mapping/XREADGROUP.json @@ -2,7 +2,7 @@ "api_calls": { "redis_py": [ { - "signature": "xreadgroup(groupname: str, consumername: str, streams: Dict[KeyT, StreamIdT], count: Optional[int] = None, block: Optional[int] = None, noack: bool = False, claim_min_idle_time: Optional[int] = None)", + "signature": "xreadgroup(groupname: str, consumername: str, streams: Dict[KeyT, StreamIdT], count: Optional[int] = None, block: Optional[int] = None, noack: bool = False, claim_min_idle_time: Optional[int] = None, max_count: Optional[int] = None, max_size: Optional[int] = None)", "params": [ { "name": "groupname", @@ -38,6 +38,16 @@ "name": "claim_min_idle_time", "type": "Optional[int] = None", "description": "" + }, + { + "name": "max_count", + "type": "Optional[int] = None", + "description": "Cap on the total number of entries returned across all streams, where count is per stream. Requires Redis 8.10.0 or later" + }, + { + "name": "max_size", + "type": "Optional[int] = None", + "description": "Soft cap, in bytes, on the total reply size across all streams. Requires Redis 8.10.0 or later" } ], "returns": {