Skip to content

Commit

Permalink
core: dont mutate tool_kwargs during tool run (#28824)
Browse files Browse the repository at this point in the history
fixes #24621
  • Loading branch information
efriis authored Dec 19, 2024
1 parent 033ac41 commit 6a37899
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
4 changes: 2 additions & 2 deletions libs/core/langchain_core/tools/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -687,9 +687,9 @@ def run(
context.run(_set_config_context, child_config)
tool_args, tool_kwargs = self._to_args_and_kwargs(tool_input, tool_call_id)
if signature(self._run).parameters.get("run_manager"):
tool_kwargs["run_manager"] = run_manager
tool_kwargs = tool_kwargs | {"run_manager": run_manager}
if config_param := _get_runnable_config_param(self._run):
tool_kwargs[config_param] = config
tool_kwargs = tool_kwargs | {config_param: config}
response = context.run(self._run, *tool_args, **tool_kwargs)
if self.response_format == "content_and_artifact":
if not isinstance(response, tuple) or len(response) != 2:
Expand Down
17 changes: 17 additions & 0 deletions libs/core/tests/unit_tests/test_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -2268,3 +2268,20 @@ def foo(x: int) -> Bar:
assert foo.invoke(
{"type": "tool_call", "args": {"x": 0}, "name": "foo", "id": "bar"}
) == Bar(x=0)


def test_tool_mutate_input() -> None:
class MyTool(BaseTool):
name: str = "MyTool"
description: str = "a tool"

def _run(
self,
x: str,
run_manager: Optional[CallbackManagerForToolRun] = None,
) -> str:
return "hi"

my_input = {"x": "hi"}
MyTool().invoke(my_input)
assert my_input == {"x": "hi"}

0 comments on commit 6a37899

Please sign in to comment.