core: dont mutate tool_kwargs during tool run (#28824)

fixes https://github.com/langchain-ai/langchain/issues/24621
This commit is contained in:
Erick Friis 2024-12-19 10:11:56 -08:00 committed by GitHub
parent 033ac41760
commit 6a37899b39
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 19 additions and 2 deletions

View File

@ -687,9 +687,9 @@ class ChildTool(BaseTool):
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:

View File

@ -2268,3 +2268,20 @@ def test_tool_return_output_mixin() -> None:
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"}