diff --git a/libs/prebuilt/langgraph/prebuilt/tool_node.py b/libs/prebuilt/langgraph/prebuilt/tool_node.py index 3137309da..f5aa4d86d 100644 --- a/libs/prebuilt/langgraph/prebuilt/tool_node.py +++ b/libs/prebuilt/langgraph/prebuilt/tool_node.py @@ -44,7 +44,7 @@ import inspect import json from collections.abc import Awaitable, Callable from copy import copy, deepcopy -from dataclasses import dataclass, replace +from dataclasses import dataclass, field, replace from types import UnionType from typing import ( TYPE_CHECKING, @@ -1723,9 +1723,9 @@ class ToolRuntime(_DirectlyInjectedToolArg, Generic[ContextT, StateT]): context: ContextT config: RunnableConfig stream_writer: StreamWriter - tools: list[BaseTool] tool_call_id: str | None store: BaseStore | None + tools: list[BaseTool] = field(default_factory=list) execution_info: ExecutionInfo | None = None server_info: ServerInfo | None = None diff --git a/libs/prebuilt/tests/test_tool_node.py b/libs/prebuilt/tests/test_tool_node.py index c30787f74..acc5522fa 100644 --- a/libs/prebuilt/tests/test_tool_node.py +++ b/libs/prebuilt/tests/test_tool_node.py @@ -2016,6 +2016,19 @@ async def test_tool_node_inject_runtime_dynamic_tool_via_wrap_tool_call_async() assert tool_message.tool_call_id == "call_dynamic_2" +def test_tool_runtime_defaults_tools_to_empty_list() -> None: + runtime = ToolRuntime( + state={}, + context=None, + config={}, + stream_writer=lambda *args, **kwargs: None, + tool_call_id=None, + store=None, + ) + + assert runtime.tools == [] + + def test_tool_runtime_forwards_execution_info_server_info_and_tools() -> None: """Test that execution_info, server_info, and tools are forwarded from Runtime to ToolRuntime.""" from langgraph.runtime import ExecutionInfo, ServerInfo