From b0689f99a472f128e7a7e3e4b32d69c9bc14f6d9 Mon Sep 17 00:00:00 2001 From: tandede <1090179959@qq.com> Date: Wed, 19 Aug 2026 16:42:03 +0800 Subject: [PATCH] fix(logging): serialize mixed-type sets safely --- litellm/litellm_core_utils/safe_json_dumps.py | 5 ++++- .../litellm_core_utils/test_safe_json_dumps.py | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/litellm/litellm_core_utils/safe_json_dumps.py b/litellm/litellm_core_utils/safe_json_dumps.py index a1b71593dda..f94b3dc2894 100644 --- a/litellm/litellm_core_utils/safe_json_dumps.py +++ b/litellm/litellm_core_utils/safe_json_dumps.py @@ -62,7 +62,10 @@ def safe_dumps( seen.remove(id(obj)) return result elif isinstance(obj, set): - result = sorted([_serialize(item, seen, depth + 1, key) for item in obj]) + result = sorted( + [_serialize(item, seen, depth + 1, key) for item in obj], + key=lambda item: json.dumps(item, sort_keys=True, default=str), + ) seen.remove(id(obj)) return result elif isinstance(obj, BaseModel): diff --git a/tests/test_litellm/litellm_core_utils/test_safe_json_dumps.py b/tests/test_litellm/litellm_core_utils/test_safe_json_dumps.py index ad24105588d..8c1d1514152 100644 --- a/tests/test_litellm/litellm_core_utils/test_safe_json_dumps.py +++ b/tests/test_litellm/litellm_core_utils/test_safe_json_dumps.py @@ -69,6 +69,14 @@ def test_complex_types(): assert result["tuple"] == [4, 5, 6] # Tuples are converted to lists +def test_set_with_mixed_types(): + data = {"metadata": {"labels": {"beta", 7, None}}} + + result = json.loads(safe_dumps(data)) + + assert result["metadata"]["labels"] == ["beta", 7, None] + + def test_unserializable_object(): # Test handling of unserializable objects class TestClass: