Skip to content

Commit 7074373

Browse files
authored
fix(langchain): avoid duplicating structured tool inputs in metadata (#1722)
1 parent 90133cd commit 7074373

2 files changed

Lines changed: 36 additions & 4 deletions

File tree

langfuse/langchain/CallbackHandler.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,9 @@ def on_tool_start(
962962
"on_tool_start", run_id, parent_run_id, input_str=input_str
963963
)
964964

965+
structured_input = kwargs.get("inputs")
966+
tool_input = structured_input if structured_input is not None else input_str
967+
965968
meta = self._get_langchain_observation_metadata(
966969
parent_run_id=parent_run_id,
967970
tags=tags,
@@ -972,15 +975,16 @@ def on_tool_start(
972975
meta = {}
973976

974977
meta.update(
975-
{key: value for key, value in kwargs.items() if value is not None}
978+
{
979+
key: value
980+
for key, value in kwargs.items()
981+
if value is not None and key != "inputs"
982+
}
976983
)
977984

978985
observation_type = self._get_observation_type_from_serialized(
979986
serialized, "tool", **kwargs
980987
)
981-
tool_input = kwargs.get("inputs")
982-
if tool_input is None:
983-
tool_input = input_str
984988

985989
parent_observation = self._get_parent_observation(parent_run_id)
986990
if isinstance(parent_observation, Langfuse):

tests/unit/test_langchain.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,34 @@ def test_tool_start_prefers_structured_inputs_when_available(
818818
)
819819

820820

821+
def test_tool_when_structured_inputs_only_store_in_inputs_attribute_not_metadata(
822+
langfuse_memory_client, get_span, json_attr
823+
):
824+
handler = CallbackHandler()
825+
run_id = uuid4()
826+
structured_inputs = {
827+
"path": "/tmp/example.md",
828+
"content": "this should be in inputs, not metadata",
829+
}
830+
831+
handler.on_tool_start(
832+
{"name": "write_document"},
833+
str(structured_inputs),
834+
run_id=run_id,
835+
metadata={"custom_key": "custom_value"},
836+
inputs=structured_inputs,
837+
)
838+
handler.on_tool_end("ok", run_id=run_id)
839+
840+
langfuse_memory_client.flush()
841+
span = get_span("write_document")
842+
843+
metadata_prefix = LangfuseOtelSpanAttributes.OBSERVATION_METADATA
844+
845+
assert span.attributes[f"{metadata_prefix}.custom_key"] == "custom_value"
846+
assert f"{metadata_prefix}.inputs" not in span.attributes
847+
848+
821849
def test_handled_tool_error_marks_observation_error(
822850
langfuse_memory_client, get_span, json_attr
823851
):

0 commit comments

Comments
 (0)