Freeze mutable values nested inside tuple arguments

This commit is contained in:
Andras Schmelczer 2026-10-27 19:53:55 +00:00
commit 32df6504cc
2 changed files with 23 additions and 0 deletions

View file

@ -68,6 +68,12 @@ def freeze(value: Union[Sequence[Any], Mapping[str, Any], Set[Any], BaseModel])
if isinstance(value, set):
return FrozenSet(value)
if isinstance(value, tuple):
values = tuple(freeze(item) for item in value)
if hasattr(type(value), "_fields"): # preserve named-tuple argument types
return type(value)(*values)
return values
if isinstance(value, BaseModel):
# Keep the already-validated values, aliases, nested types and private
# attributes. Reconstructing from model_dump() runs validators again.

View file

@ -0,0 +1,17 @@
from typing import Dict, Tuple
from great_ai import GreatAI
def test_nested_tuple_inputs_can_be_cached(isolated_context: None) -> None:
calls = 0
@GreatAI.create
def predict(value: Tuple[Dict[str, int]]) -> int:
nonlocal calls
calls += 1
return value[0]["x"]
assert predict(({"x": 7},)).output == 7
assert predict(({"x": 7},)).output == 7
assert calls == 1