Skip to content

Commit 6c23d4d

Browse files
authored
fix: Fix langfuse tracer when input messages is None (#3324)
1 parent 5336f47 commit 6c23d4d

2 files changed

Lines changed: 23 additions & 4 deletions

File tree

integrations/langfuse/src/haystack_integrations/tracing/langfuse/tracer.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def set_content_tag(self, key: str, value: Any) -> None:
9090
return
9191
if key.endswith(".input"):
9292
if "messages" in value:
93-
messages = [m.to_openai_dict_format(require_tool_call_ids=False) for m in value["messages"]]
93+
messages = [m.to_openai_dict_format(require_tool_call_ids=False) for m in (value.get("messages") or [])]
9494
if isinstance(gen_kwargs := value.get("generation_kwargs"), dict):
9595
self._span.update(input={"messages": messages, "generation_kwargs": gen_kwargs})
9696
else:
@@ -100,10 +100,11 @@ def set_content_tag(self, key: str, value: Any) -> None:
100100
self._span.update(input=coerced_value)
101101
elif key.endswith(".output"):
102102
if "replies" in value:
103-
if all(isinstance(r, ChatMessage) for r in value["replies"]):
104-
replies = [m.to_openai_dict_format(require_tool_call_ids=False) for m in value["replies"]]
103+
replies_list = value.get("replies") or []
104+
if all(isinstance(r, ChatMessage) for r in replies_list):
105+
replies = [m.to_openai_dict_format(require_tool_call_ids=False) for m in replies_list]
105106
else:
106-
replies = value["replies"]
107+
replies = replies_list
107108
self._span.update(output=replies)
108109
else:
109110
coerced_value = tracing_utils.coerce_tag_value(value)

integrations/langfuse/tests/test_tracer.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,24 @@ def test_set_content_tag_updates_input_and_output_with_messages(self):
180180
# check we handle properly string list replies
181181
assert mock_context_manager._span.update.call_args_list[0][1] == {"output": ["reply1", "reply2"]}
182182

183+
def test_set_content_tag_messages_none_does_not_raise(self):
184+
mock_context_manager = MockContextManager()
185+
span = LangfuseSpan(mock_context_manager)
186+
187+
with patch("haystack_integrations.tracing.langfuse.tracer.proxy_tracer.is_content_tracing_enabled", True):
188+
span.set_content_tag("key.input", {"messages": None})
189+
assert mock_context_manager._span.update.call_count == 1
190+
assert mock_context_manager._span.update.call_args_list[0][1] == {"input": []}
191+
192+
def test_set_content_tag_replies_none_does_not_raise(self):
193+
mock_context_manager = MockContextManager()
194+
span = LangfuseSpan(mock_context_manager)
195+
196+
with patch("haystack_integrations.tracing.langfuse.tracer.proxy_tracer.is_content_tracing_enabled", True):
197+
span.set_content_tag("key.output", {"replies": None})
198+
assert mock_context_manager._span.update.call_count == 1
199+
assert mock_context_manager._span.update.call_args_list[0][1] == {"output": []}
200+
183201

184202
class TestSpanContext:
185203
def test_post_init(self):

0 commit comments

Comments
 (0)