Skip to content

Commit 458f618

Browse files
fix: support more types for JSON serialization (#357)
Co-authored-by: Max Deichmann <m.deichmann@tum.de>
1 parent 38a46c1 commit 458f618

2 files changed

Lines changed: 34 additions & 0 deletions

File tree

langfuse/serializer.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from datetime import date, datetime
2+
from dataclasses import is_dataclass, asdict
23
from json import JSONEncoder
34
from typing import Any
5+
from uuid import UUID
46

57
from langfuse.api.core import serialize_datetime
68

@@ -19,6 +21,12 @@ def default(self, obj: Any):
1921
if isinstance(obj, (datetime)):
2022
# Timezone-awareness check
2123
return serialize_datetime(obj)
24+
if is_dataclass(obj):
25+
return asdict(obj)
26+
if isinstance(obj, UUID):
27+
return str(obj)
28+
if isinstance(obj, bytes):
29+
return obj.decode("utf-8")
2230
if isinstance(obj, (date)):
2331
return obj.isoformat()
2432
if isinstance(obj, BaseModel):

tests/test_json.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import builtins
2+
from dataclasses import dataclass
23
import importlib
34
import json
45
from datetime import datetime, timezone, date
56
from unittest.mock import patch
7+
import uuid
68

79
import pytest
810
from langchain.schema.messages import HumanMessage
@@ -97,3 +99,27 @@ def test_json_decoder_without_langchain_serializer_with_none():
9799
default = json.dumps(None)
98100
assert result == "null"
99101
assert result == default
102+
103+
104+
def test_data_class():
105+
@dataclass
106+
class InventoryItem:
107+
"""Class for keeping track of an item in inventory."""
108+
109+
name: str
110+
unit_price: float
111+
quantity_on_hand: int = 0
112+
113+
item = InventoryItem("widget", 3.0, 10)
114+
115+
result = json.dumps(item, cls=EventSerializer)
116+
117+
assert result == '{"name": "widget", "unit_price": 3.0, "quantity_on_hand": 10}'
118+
119+
120+
def test_data_uuid():
121+
test_id = uuid.uuid4()
122+
123+
result = json.dumps(test_id, cls=EventSerializer)
124+
125+
assert result == f'"{str(test_id)}"'

0 commit comments

Comments
 (0)