diff --git a/libs/core/langchain_core/callbacks/manager.py b/libs/core/langchain_core/callbacks/manager.py index 6908631869e..27792bbf70c 100644 --- a/libs/core/langchain_core/callbacks/manager.py +++ b/libs/core/langchain_core/callbacks/manager.py @@ -984,7 +984,6 @@ class CallbackManagerForToolRun(ParentRunManager, ToolManagerMixin): Args: output (Any): The output of the tool. """ - output = str(output) handle_event( self.handlers, "on_tool_end", diff --git a/libs/core/langchain_core/tracers/base.py b/libs/core/langchain_core/tracers/base.py index a20d85b07e6..cdecedb09df 100644 --- a/libs/core/langchain_core/tracers/base.py +++ b/libs/core/langchain_core/tracers/base.py @@ -506,7 +506,6 @@ class BaseTracer(BaseCallbackHandler, ABC): def on_tool_end(self, output: Any, *, run_id: UUID, **kwargs: Any) -> Run: """End a trace for a tool run.""" - output = str(output) tool_run = self._get_run(run_id, run_type="tool") tool_run.outputs = {"output": output} tool_run.end_time = datetime.now(timezone.utc) diff --git a/libs/core/tests/unit_tests/runnables/test_runnable_events.py b/libs/core/tests/unit_tests/runnables/test_runnable_events.py index 8d81f6c3473..042ce728bd2 100644 --- a/libs/core/tests/unit_tests/runnables/test_runnable_events.py +++ b/libs/core/tests/unit_tests/runnables/test_runnable_events.py @@ -52,6 +52,88 @@ async def _collect_events(events: AsyncIterator[StreamEvent]) -> List[StreamEven return events_ +async def test_event_stream_with_simple_function_tool() -> None: + """Test the event stream with a function and tool""" + + def foo(x: int) -> dict: + """Foo""" + return {"x": 5} + + @tool + def get_docs(x: int) -> List[Document]: + """Hello Doc""" + return [Document(page_content="hello")] + + chain = RunnableLambda(foo) | get_docs + events = await _collect_events(chain.astream_events({}, version="v1")) + assert events == [ + { + "event": "on_chain_start", + "run_id": "", + "name": "RunnableSequence", + "tags": [], + "metadata": {}, + "data": {"input": {}}, + }, + { + "event": "on_chain_start", + "name": "foo", + "run_id": "", + "tags": ["seq:step:1"], + "metadata": {}, + "data": {}, + }, + { + "event": "on_chain_stream", + "name": "foo", + "run_id": "", + "tags": ["seq:step:1"], + "metadata": {}, + "data": {"chunk": {"x": 5}}, + }, + { + "event": "on_chain_end", + "name": "foo", + "run_id": "", + "tags": ["seq:step:1"], + "metadata": {}, + "data": {"input": {}, "output": {"x": 5}}, + }, + { + "event": "on_tool_start", + "name": "get_docs", + "run_id": "", + "tags": ["seq:step:2"], + "metadata": {}, + "data": {"input": {"x": 5}}, + }, + { + "event": "on_tool_end", + "name": "get_docs", + "run_id": "", + "tags": ["seq:step:2"], + "metadata": {}, + "data": {"input": {"x": 5}, "output": [Document(page_content="hello")]}, + }, + { + "event": "on_chain_stream", + "run_id": "", + "tags": [], + "metadata": {}, + "name": "RunnableSequence", + "data": {"chunk": [Document(page_content="hello")]}, + }, + { + "event": "on_chain_end", + "name": "RunnableSequence", + "run_id": "", + "tags": [], + "metadata": {}, + "data": {"output": [Document(page_content="hello")]}, + }, + ] + + async def test_event_stream_with_single_lambda() -> None: """Test the event stream with a tool."""