diff --git a/langfuse/langchain/CallbackHandler.py b/langfuse/langchain/CallbackHandler.py index aba644a41..01b3b3829 100644 --- a/langfuse/langchain/CallbackHandler.py +++ b/langfuse/langchain/CallbackHandler.py @@ -594,7 +594,7 @@ def on_chain_start( session_id=parsed_trace_attributes.get("session_id", None), tags=parsed_trace_attributes.get("tags", None), metadata=parsed_trace_attributes.get("metadata", None), - trace_name=parsed_trace_attributes.get("trace_name", None), + trace_name=parsed_trace_attributes.get("trace_name", span_name), ) root_run_state = self._get_root_run_state(run_id) diff --git a/tests/unit/test_langchain.py b/tests/unit/test_langchain.py index 6f8fe458b..70e1f662c 100644 --- a/tests/unit/test_langchain.py +++ b/tests/unit/test_langchain.py @@ -1,6 +1,6 @@ import importlib from contextvars import copy_context -from unittest.mock import patch +from unittest.mock import MagicMock, patch from uuid import uuid4 import pytest @@ -276,6 +276,27 @@ def test_root_chain_exports_when_end_runs_in_copied_context( otel_context.detach(context_token) +def test_root_chain_propagates_run_name_as_default_trace_name(): + handler = CallbackHandler() + run_id = uuid4() + propagation_context_manager = MagicMock() + + with patch.object( + callback_handler_module, + "propagate_attributes", + return_value=propagation_context_manager, + ) as mock_propagate: + handler.on_chain_start( + {"id": ["langgraph", "Pregel"]}, + {"messages": ["hello"]}, + run_id=run_id, + name="my-agent", + ) + + mock_propagate.assert_called_once() + assert mock_propagate.call_args.kwargs["trace_name"] == "my-agent" + + def test_control_flow_errors_use_default_level_and_keep_status_message( langfuse_memory_client, get_span, monkeypatch ):