diff --git a/docs/docs/modules/agents/how_to/streaming.ipynb b/docs/docs/modules/agents/how_to/streaming.ipynb index b6095de0a468a..abe3d1f5e36b5 100644 --- a/docs/docs/modules/agents/how_to/streaming.ipynb +++ b/docs/docs/modules/agents/how_to/streaming.ipynb @@ -1068,7 +1068,7 @@ "\n", " def on_tool_end(\n", " self,\n", - " output: str,\n", + " output: Any,\n", " *,\n", " run_id: UUID,\n", " parent_run_id: Optional[UUID] = None,\n", @@ -1076,7 +1076,7 @@ " ) -> Any:\n", " \"\"\"Run when tool ends running.\"\"\"\n", " print(\"Tool end\")\n", - " print(output)\n", + " print(str(output))\n", "\n", " async def on_llm_end(\n", " self,\n", diff --git a/docs/docs/modules/callbacks/index.mdx b/docs/docs/modules/callbacks/index.mdx index 7be32ccd0ecd9..b41f90c046b01 100644 --- a/docs/docs/modules/callbacks/index.mdx +++ b/docs/docs/modules/callbacks/index.mdx @@ -59,7 +59,7 @@ class BaseCallbackHandler: ) -> Any: """Run when tool starts running.""" - def on_tool_end(self, output: str, **kwargs: Any) -> Any: + def on_tool_end(self, output: Any, **kwargs: Any) -> Any: """Run when tool ends running.""" def on_tool_error( diff --git a/libs/community/langchain_community/callbacks/aim_callback.py b/libs/community/langchain_community/callbacks/aim_callback.py index e36cfcceafe1b..46d7987c54eef 100644 --- a/libs/community/langchain_community/callbacks/aim_callback.py +++ b/libs/community/langchain_community/callbacks/aim_callback.py @@ -314,8 +314,9 @@ def on_tool_start( self._run.track(aim.Text(input_str), name="on_tool_start", context=resp) - def on_tool_end(self, output: str, **kwargs: Any) -> None: + def on_tool_end(self, output: Any, **kwargs: Any) -> None: """Run when tool ends running.""" + output = str(output) aim = import_aim() self.step += 1 self.tool_ends += 1 diff --git a/libs/community/langchain_community/callbacks/argilla_callback.py b/libs/community/langchain_community/callbacks/argilla_callback.py index 157075a283227..ad1fa9c90142b 100644 --- a/libs/community/langchain_community/callbacks/argilla_callback.py +++ b/libs/community/langchain_community/callbacks/argilla_callback.py @@ -328,7 +328,7 @@ def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any: def on_tool_end( self, - output: str, + output: Any, observation_prefix: Optional[str] = None, llm_prefix: Optional[str] = None, **kwargs: Any, diff --git a/libs/community/langchain_community/callbacks/arize_callback.py b/libs/community/langchain_community/callbacks/arize_callback.py index 83cba048455a1..d7905d8d8ca02 100644 --- a/libs/community/langchain_community/callbacks/arize_callback.py +++ b/libs/community/langchain_community/callbacks/arize_callback.py @@ -196,7 +196,7 @@ def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any: def on_tool_end( self, - output: str, + output: Any, observation_prefix: Optional[str] = None, llm_prefix: Optional[str] = None, **kwargs: Any, diff --git a/libs/community/langchain_community/callbacks/arthur_callback.py b/libs/community/langchain_community/callbacks/arthur_callback.py index b0b28328ab252..c9a81650e542b 100644 --- a/libs/community/langchain_community/callbacks/arthur_callback.py +++ b/libs/community/langchain_community/callbacks/arthur_callback.py @@ -279,7 +279,7 @@ def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any: def on_tool_end( self, - output: str, + output: Any, observation_prefix: Optional[str] = None, llm_prefix: Optional[str] = None, **kwargs: Any, diff --git a/libs/community/langchain_community/callbacks/clearml_callback.py b/libs/community/langchain_community/callbacks/clearml_callback.py index 8b8aa8e98ab90..34358973b41f8 100644 --- a/libs/community/langchain_community/callbacks/clearml_callback.py +++ b/libs/community/langchain_community/callbacks/clearml_callback.py @@ -243,8 +243,9 @@ def on_tool_start( if self.stream_logs: self.logger.report_text(resp) - def on_tool_end(self, output: str, **kwargs: Any) -> None: + def on_tool_end(self, output: Any, **kwargs: Any) -> None: """Run when tool ends running.""" + output = str(output) self.step += 1 self.tool_ends += 1 self.ends += 1 diff --git a/libs/community/langchain_community/callbacks/comet_ml_callback.py b/libs/community/langchain_community/callbacks/comet_ml_callback.py index 499e93a07b0db..b7e4e918d0c0b 100644 --- a/libs/community/langchain_community/callbacks/comet_ml_callback.py +++ b/libs/community/langchain_community/callbacks/comet_ml_callback.py @@ -303,8 +303,9 @@ def on_tool_start( resp.update({"input_str": input_str}) self.action_records.append(resp) - def on_tool_end(self, output: str, **kwargs: Any) -> None: + def on_tool_end(self, output: Any, **kwargs: Any) -> None: """Run when tool ends running.""" + output = str(output) self.step += 1 self.tool_ends += 1 self.ends += 1 diff --git a/libs/community/langchain_community/callbacks/confident_callback.py b/libs/community/langchain_community/callbacks/confident_callback.py index 4162dc12315c5..b078abf45074c 100644 --- a/libs/community/langchain_community/callbacks/confident_callback.py +++ b/libs/community/langchain_community/callbacks/confident_callback.py @@ -162,7 +162,7 @@ def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any: def on_tool_end( self, - output: str, + output: Any, observation_prefix: Optional[str] = None, llm_prefix: Optional[str] = None, **kwargs: Any, diff --git a/libs/community/langchain_community/callbacks/llmonitor_callback.py b/libs/community/langchain_community/callbacks/llmonitor_callback.py index f4f2882dac242..32e8820dbdb80 100644 --- a/libs/community/langchain_community/callbacks/llmonitor_callback.py +++ b/libs/community/langchain_community/callbacks/llmonitor_callback.py @@ -465,13 +465,14 @@ def on_tool_start( def on_tool_end( self, - output: str, + output: Any, *, run_id: UUID, parent_run_id: Union[UUID, None] = None, tags: Union[List[str], None] = None, **kwargs: Any, ) -> None: + output = str(output) if self.__has_valid_config is False: return try: diff --git a/libs/community/langchain_community/callbacks/mlflow_callback.py b/libs/community/langchain_community/callbacks/mlflow_callback.py index b81da0c166a79..294c3ec6825b1 100644 --- a/libs/community/langchain_community/callbacks/mlflow_callback.py +++ b/libs/community/langchain_community/callbacks/mlflow_callback.py @@ -518,8 +518,9 @@ def on_tool_start( self.records["action_records"].append(resp) self.mlflg.jsonf(resp, f"tool_start_{tool_starts}") - def on_tool_end(self, output: str, **kwargs: Any) -> None: + def on_tool_end(self, output: Any, **kwargs: Any) -> None: """Run when tool ends running.""" + output = str(output) self.metrics["step"] += 1 self.metrics["tool_ends"] += 1 self.metrics["ends"] += 1 diff --git a/libs/community/langchain_community/callbacks/sagemaker_callback.py b/libs/community/langchain_community/callbacks/sagemaker_callback.py index b791425ff0030..45295a0b5f7e2 100644 --- a/libs/community/langchain_community/callbacks/sagemaker_callback.py +++ b/libs/community/langchain_community/callbacks/sagemaker_callback.py @@ -186,8 +186,9 @@ def on_tool_start( self.jsonf(resp, self.temp_dir, f"tool_start_{tool_starts}") - def on_tool_end(self, output: str, **kwargs: Any) -> None: + def on_tool_end(self, output: Any, **kwargs: Any) -> None: """Run when tool ends running.""" + output = str(output) self.metrics["step"] += 1 self.metrics["tool_ends"] += 1 self.metrics["ends"] += 1 diff --git a/libs/community/langchain_community/callbacks/streamlit/streamlit_callback_handler.py b/libs/community/langchain_community/callbacks/streamlit/streamlit_callback_handler.py index 725862c53b697..89183fd5f46c5 100644 --- a/libs/community/langchain_community/callbacks/streamlit/streamlit_callback_handler.py +++ b/libs/community/langchain_community/callbacks/streamlit/streamlit_callback_handler.py @@ -183,13 +183,13 @@ def on_tool_start( def on_tool_end( self, - output: str, + output: Any, color: Optional[str] = None, observation_prefix: Optional[str] = None, llm_prefix: Optional[str] = None, **kwargs: Any, ) -> None: - self._container.markdown(f"**{output}**") + self._container.markdown(f"**{str(output)}**") def on_tool_error(self, error: BaseException, **kwargs: Any) -> None: self._container.markdown("**Tool encountered an error...**") @@ -363,12 +363,13 @@ def on_tool_start( def on_tool_end( self, - output: str, + output: Any, color: Optional[str] = None, observation_prefix: Optional[str] = None, llm_prefix: Optional[str] = None, **kwargs: Any, ) -> None: + output = str(output) self._require_current_thought().on_tool_end( output, color, observation_prefix, llm_prefix, **kwargs ) diff --git a/libs/community/langchain_community/callbacks/wandb_callback.py b/libs/community/langchain_community/callbacks/wandb_callback.py index 035c44640dda3..2ce3cf527ff13 100644 --- a/libs/community/langchain_community/callbacks/wandb_callback.py +++ b/libs/community/langchain_community/callbacks/wandb_callback.py @@ -356,8 +356,9 @@ def on_tool_start( if self.stream_logs: self.run.log(resp) - def on_tool_end(self, output: str, **kwargs: Any) -> None: + def on_tool_end(self, output: Any, **kwargs: Any) -> None: """Run when tool ends running.""" + output = str(output) self.step += 1 self.tool_ends += 1 self.ends += 1 diff --git a/libs/core/langchain_core/callbacks/base.py b/libs/core/langchain_core/callbacks/base.py index eb4d1de706030..900cb2fcffc02 100644 --- a/libs/core/langchain_core/callbacks/base.py +++ b/libs/core/langchain_core/callbacks/base.py @@ -133,7 +133,7 @@ class ToolManagerMixin: def on_tool_end( self, - output: str, + output: Any, *, run_id: UUID, parent_run_id: Optional[UUID] = None, @@ -440,7 +440,7 @@ async def on_tool_start( async def on_tool_end( self, - output: str, + output: Any, *, run_id: UUID, parent_run_id: Optional[UUID] = None, diff --git a/libs/core/langchain_core/callbacks/manager.py b/libs/core/langchain_core/callbacks/manager.py index b1f103871f131..3fceb33f00963 100644 --- a/libs/core/langchain_core/callbacks/manager.py +++ b/libs/core/langchain_core/callbacks/manager.py @@ -976,14 +976,15 @@ class CallbackManagerForToolRun(ParentRunManager, ToolManagerMixin): def on_tool_end( self, - output: str, + output: Any, **kwargs: Any, ) -> None: """Run when tool ends running. Args: - output (str): The output of the tool. + output (Any): The output of the tool. """ + output = str(output) handle_event( self.handlers, "on_tool_end", @@ -1038,12 +1039,13 @@ def get_sync(self) -> CallbackManagerForToolRun: ) @shielded - async def on_tool_end(self, output: str, **kwargs: Any) -> None: + async def on_tool_end(self, output: Any, **kwargs: Any) -> None: """Run when tool ends running. Args: - output (str): The output of the tool. + output (Any): The output of the tool. """ + output = str(output) await ahandle_event( self.handlers, "on_tool_end", diff --git a/libs/core/langchain_core/callbacks/stdout.py b/libs/core/langchain_core/callbacks/stdout.py index e129792a01090..0408eb19845a6 100644 --- a/libs/core/langchain_core/callbacks/stdout.py +++ b/libs/core/langchain_core/callbacks/stdout.py @@ -37,13 +37,14 @@ def on_agent_action( def on_tool_end( self, - output: str, + output: Any, color: Optional[str] = None, observation_prefix: Optional[str] = None, llm_prefix: Optional[str] = None, **kwargs: Any, ) -> None: """If not the final action, print out observation.""" + output = str(output) if observation_prefix is not None: print_text(f"\n{observation_prefix}") print_text(output, color=color or self.color) diff --git a/libs/core/langchain_core/callbacks/streaming_stdout.py b/libs/core/langchain_core/callbacks/streaming_stdout.py index aaac043ff93ac..4966aa2e11cb8 100644 --- a/libs/core/langchain_core/callbacks/streaming_stdout.py +++ b/libs/core/langchain_core/callbacks/streaming_stdout.py @@ -59,7 +59,7 @@ def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any: """Run on agent action.""" pass - def on_tool_end(self, output: str, **kwargs: Any) -> None: + def on_tool_end(self, output: Any, **kwargs: Any) -> None: """Run when tool ends running.""" def on_tool_error(self, error: BaseException, **kwargs: Any) -> None: diff --git a/libs/core/langchain_core/tools.py b/libs/core/langchain_core/tools.py index 356e326b50f49..a67a642329c1e 100644 --- a/libs/core/langchain_core/tools.py +++ b/libs/core/langchain_core/tools.py @@ -410,17 +410,13 @@ def run( f"Got unexpected type of `handle_tool_error`. Expected bool, str " f"or callable. Received: {self.handle_tool_error}" ) - run_manager.on_tool_end( - str(observation), color="red", name=self.name, **kwargs - ) + run_manager.on_tool_end(observation, color="red", name=self.name, **kwargs) return observation except (Exception, KeyboardInterrupt) as e: run_manager.on_tool_error(e) raise e else: - run_manager.on_tool_end( - str(observation), color=color, name=self.name, **kwargs - ) + run_manager.on_tool_end(observation, color=color, name=self.name, **kwargs) return observation async def arun( @@ -502,7 +498,7 @@ async def arun( f"or callable. Received: {self.handle_tool_error}" ) await run_manager.on_tool_end( - str(observation), color="red", name=self.name, **kwargs + observation, color="red", name=self.name, **kwargs ) return observation except (Exception, KeyboardInterrupt) as e: @@ -510,7 +506,7 @@ async def arun( raise e else: await run_manager.on_tool_end( - str(observation), color=color, name=self.name, **kwargs + observation, color=color, name=self.name, **kwargs ) return observation diff --git a/libs/core/langchain_core/tracers/base.py b/libs/core/langchain_core/tracers/base.py index 2481df4e254fa..a20d85b07e6c3 100644 --- a/libs/core/langchain_core/tracers/base.py +++ b/libs/core/langchain_core/tracers/base.py @@ -504,8 +504,9 @@ def on_tool_start( self._on_tool_start(tool_run) return tool_run - def on_tool_end(self, output: str, *, run_id: UUID, **kwargs: Any) -> Run: + 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)