Skip to content

Commit 5486330

Browse files
authored
fix(langchain): do not stringify metadata unnecessarily (#1237)
1 parent 83d7fea commit 5486330

File tree

3 files changed

+22
-25
lines changed

3 files changed

+22
-25
lines changed

langfuse/_client/attributes.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,10 @@ def _flatten_and_serialize_metadata(
170170
metadata_attributes[prefix] = _serialize(metadata)
171171
else:
172172
for key, value in metadata.items():
173-
metadata_attributes[f"{prefix}.{key}"] = _serialize(value)
173+
metadata_attributes[f"{prefix}.{key}"] = (
174+
value
175+
if isinstance(value, str) or isinstance(value, int)
176+
else _serialize(value)
177+
)
174178

175179
return metadata_attributes

tests/test_core_sdk.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ async def update_generation(i, langfuse: Langfuse):
5959
# Verify metadata
6060
observation = generation_obs[0]
6161
assert observation.name == str(i)
62-
assert observation.metadata["count"] == f"{i}"
62+
assert observation.metadata["count"] == i
6363

6464

6565
def test_flush():

tests/test_otel.py

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,9 @@ def test_span_attributes(self, langfuse_client, memory_exporter):
346346
output_data = json.loads(
347347
attributes[LangfuseOtelSpanAttributes.OBSERVATION_OUTPUT]
348348
)
349-
metadata_data = json.loads(
350-
attributes[f"{LangfuseOtelSpanAttributes.OBSERVATION_METADATA}.session"]
351-
)
349+
metadata_data = attributes[
350+
f"{LangfuseOtelSpanAttributes.OBSERVATION_METADATA}.session"
351+
]
352352

353353
# Verify attribute values
354354
assert input_data == {"prompt": "Test prompt"}
@@ -425,9 +425,7 @@ def test_trace_update(self, langfuse_client, memory_exporter):
425425
tags = list(attributes[LangfuseOtelSpanAttributes.TRACE_TAGS])
426426

427427
input_data = json.loads(attributes[LangfuseOtelSpanAttributes.TRACE_INPUT])
428-
metadata = json.loads(
429-
attributes[f"{LangfuseOtelSpanAttributes.TRACE_METADATA}.trace-meta"]
430-
)
428+
metadata = attributes[f"{LangfuseOtelSpanAttributes.TRACE_METADATA}.trace-meta"]
431429

432430
# Check attribute values
433431
assert sorted(tags) == sorted(["tag1", "tag2"])
@@ -501,11 +499,9 @@ def test_complex_scenario(self, langfuse_client, memory_exporter):
501499
)
502500

503501
# Parse metadata
504-
proc_metadata = json.loads(
505-
proc["attributes"][
506-
f"{LangfuseOtelSpanAttributes.OBSERVATION_METADATA}.step"
507-
]
508-
)
502+
proc_metadata = proc["attributes"][
503+
f"{LangfuseOtelSpanAttributes.OBSERVATION_METADATA}.step"
504+
]
509505
assert proc_metadata == "processing"
510506

511507
# Parse input/output JSON
@@ -980,12 +976,14 @@ def test_complex_metadata_serialization(self):
980976
assert (
981977
f"{LangfuseOtelSpanAttributes.OBSERVATION_METADATA}.key2" in simple_result
982978
)
983-
assert simple_result[
984-
f"{LangfuseOtelSpanAttributes.OBSERVATION_METADATA}.key1"
985-
] == _serialize("value1")
986-
assert simple_result[
987-
f"{LangfuseOtelSpanAttributes.OBSERVATION_METADATA}.key2"
988-
] == _serialize(123)
979+
assert (
980+
simple_result[f"{LangfuseOtelSpanAttributes.OBSERVATION_METADATA}.key1"]
981+
== "value1"
982+
)
983+
assert (
984+
simple_result[f"{LangfuseOtelSpanAttributes.OBSERVATION_METADATA}.key2"]
985+
== 123
986+
)
989987

990988
# Test case 3: Nested dict (will be flattened in current implementation)
991989
nested_dict = {
@@ -1037,7 +1035,7 @@ def test_complex_metadata_serialization(self):
10371035

10381036
# The nested structures are serialized as JSON strings
10391037
assert json.loads(complex_result[level1_key]) == complex_dict["level1"]
1040-
assert complex_result[sibling_key] == _serialize("value")
1038+
assert complex_result[sibling_key] == "value"
10411039

10421040
def test_nested_metadata_updates(self):
10431041
"""Test that nested metadata updates don't overwrite unrelated keys."""
@@ -2130,11 +2128,6 @@ async def async_task(parent_span, task_id):
21302128
)
21312129
assert output["result"] == f"Task {i} completed"
21322130

2133-
metadata = self.verify_json_attribute(
2134-
task_span, f"{LangfuseOtelSpanAttributes.OBSERVATION_METADATA}.task_id"
2135-
)
2136-
assert metadata == i
2137-
21382131
# Verify main span output
21392132
main_output = self.verify_json_attribute(
21402133
main, LangfuseOtelSpanAttributes.OBSERVATION_OUTPUT

0 commit comments

Comments
 (0)