From 79e7feccb8c57b822d65b7f43d634b9a53863e1d Mon Sep 17 00:00:00 2001 From: Hassieb Pakzad <68423100+hassiebp@users.noreply.github.com> Date: Tue, 19 Aug 2025 14:47:06 +0200 Subject: [PATCH 1/3] feat(langchain): add update_trace argument --- langfuse/langchain/CallbackHandler.py | 30 +++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/langfuse/langchain/CallbackHandler.py b/langfuse/langchain/CallbackHandler.py index 7c898807c..8d6dfb126 100644 --- a/langfuse/langchain/CallbackHandler.py +++ b/langfuse/langchain/CallbackHandler.py @@ -56,7 +56,9 @@ class LangchainCallbackHandler(LangchainBaseCallbackHandler): - def __init__(self, *, public_key: Optional[str] = None) -> None: + def __init__( + self, *, public_key: Optional[str] = None, update_trace: Optional[bool] = False + ) -> None: self.client = get_client(public_key=public_key) self.runs: Dict[UUID, Union[LangfuseSpan, LangfuseGeneration]] = {} @@ -64,6 +66,7 @@ def __init__(self, *, public_key: Optional[str] = None) -> None: self.updated_completion_start_time_memo: Set[UUID] = set() self.last_trace_id: Optional[str] = None + self.update_trace = update_trace def on_llm_new_token( self, @@ -207,7 +210,19 @@ def on_chain_start( ), ) span.update_trace( - **self._parse_langfuse_trace_attributes_from_metadata(metadata) + **( + cast( + Any, + { + "input": inputs, + "name": span_name, + "metadata": span_metadata, + }, + ) + if self.update_trace + else {} + ), + **self._parse_langfuse_trace_attributes_from_metadata(metadata), ) self.runs[run_id] = span else: @@ -322,14 +337,21 @@ def on_chain_end( if run_id not in self.runs: raise Exception("run not found") - self.runs[run_id].update( + span = self.runs[run_id] + span.update( output=outputs, input=kwargs.get("inputs"), - ).end() + ) + + if parent_run_id is None and self.update_trace: + span.update_trace(output=outputs, input=kwargs.get("inputs")) + + span.end() del self.runs[run_id] self._deregister_langfuse_prompt(run_id) + except Exception as e: langfuse_logger.exception(e) From f7b064b38a9a4f0566db57fd1627959a8cd61451 Mon Sep 17 00:00:00 2001 From: Hassieb Pakzad <68423100+hassiebp@users.noreply.github.com> Date: Tue, 19 Aug 2025 14:52:07 +0200 Subject: [PATCH 2/3] Update langfuse/langchain/CallbackHandler.py Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- langfuse/langchain/CallbackHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/langfuse/langchain/CallbackHandler.py b/langfuse/langchain/CallbackHandler.py index 8d6dfb126..5de36966b 100644 --- a/langfuse/langchain/CallbackHandler.py +++ b/langfuse/langchain/CallbackHandler.py @@ -57,7 +57,7 @@ class LangchainCallbackHandler(LangchainBaseCallbackHandler): def __init__( - self, *, public_key: Optional[str] = None, update_trace: Optional[bool] = False + self, *, public_key: Optional[str] = None, update_trace: bool = False ) -> None: self.client = get_client(public_key=public_key) From e96f13b77ee42ee2d078617395621be0e7affdf4 Mon Sep 17 00:00:00 2001 From: Hassieb Pakzad <68423100+hassiebp@users.noreply.github.com> Date: Tue, 19 Aug 2025 14:50:14 +0200 Subject: [PATCH 3/3] add docs --- langfuse/langchain/CallbackHandler.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/langfuse/langchain/CallbackHandler.py b/langfuse/langchain/CallbackHandler.py index 5de36966b..ba2460c47 100644 --- a/langfuse/langchain/CallbackHandler.py +++ b/langfuse/langchain/CallbackHandler.py @@ -59,6 +59,12 @@ class LangchainCallbackHandler(LangchainBaseCallbackHandler): def __init__( self, *, public_key: Optional[str] = None, update_trace: bool = False ) -> None: + """Initialize the LangchainCallbackHandler. + + Args: + public_key: Optional Langfuse public key. If not provided, will use the default client configuration. + update_trace: Whether to update the Langfuse trace with the chains input / output / metadata / name. Defaults to False. + """ self.client = get_client(public_key=public_key) self.runs: Dict[UUID, Union[LangfuseSpan, LangfuseGeneration]] = {}