diff --git a/libs/langchain/langchain/agents/agent.py b/libs/langchain/langchain/agents/agent.py index 07ecf577b5284..5d8f1a7e18885 100644 --- a/libs/langchain/langchain/agents/agent.py +++ b/libs/langchain/langchain/agents/agent.py @@ -1428,11 +1428,19 @@ def _perform_agent_action( if return_direct: tool_run_kwargs["llm_prefix"] = "" # We then call the tool on the tool input to get an observation + # Get tool_call_id if exists for content_and_artifact + tool_call_id = ( + agent_action.tool_call_id + if hasattr(agent_action, "tool_call_id") + else None + ) + observation = tool.run( agent_action.tool_input, verbose=self.verbose, color=color, callbacks=run_manager.get_child() if run_manager else None, + tool_call_id=tool_call_id, **tool_run_kwargs, ) else: diff --git a/libs/langchain/langchain/agents/format_scratchpad/tools.py b/libs/langchain/langchain/agents/format_scratchpad/tools.py index 2f59b23e2dcc4..872234e4b3b9d 100644 --- a/libs/langchain/langchain/agents/format_scratchpad/tools.py +++ b/libs/langchain/langchain/agents/format_scratchpad/tools.py @@ -33,6 +33,10 @@ def _create_tool_message( """ if not isinstance(observation, str): try: + # if observation is already a ToolMessage, just update name and return it + if isinstance(observation, ToolMessage): + observation.additional_kwargs["name"] = agent_action.tool + return observation content = json.dumps(observation, ensure_ascii=False) except TypeError: content = str(observation)