diff --git a/tests/test_market_toolnode.py b/tests/test_market_toolnode.py new file mode 100644 index 000000000..4c4a811e0 --- /dev/null +++ b/tests/test_market_toolnode.py @@ -0,0 +1,23 @@ +"""The market analyst is bound (and prompt-instructed) to call +get_verified_market_snapshot; if the executor ToolNode doesn't register it, the +call fails and the model reports the tool "unavailable" and skips verification. + +Regression guard for that wiring gap (snapshot bound to the LLM but missing from +the market ToolNode). +""" +import pytest + +from tradingagents.graph.trading_graph import TradingAgentsGraph + + +@pytest.mark.unit +def test_market_toolnode_can_execute_verified_snapshot(): + # _create_tool_nodes does not use self -> call unbound (avoids building LLMs). + nodes = TradingAgentsGraph._create_tool_nodes(None) + market_tools = set(nodes["market"].tools_by_name) + assert "get_verified_market_snapshot" in market_tools, ( + "get_verified_market_snapshot is bound to the market analyst but not " + "registered in the market ToolNode, so the model's call fails." + ) + # the other core market tools must remain too + assert {"get_stock_data", "get_indicators"} <= market_tools diff --git a/tradingagents/graph/trading_graph.py b/tradingagents/graph/trading_graph.py index a3de660f7..20dff4e91 100644 --- a/tradingagents/graph/trading_graph.py +++ b/tradingagents/graph/trading_graph.py @@ -32,6 +32,7 @@ from tradingagents.agents.utils.agent_utils import ( resolve_instrument_identity, get_stock_data, get_indicators, + get_verified_market_snapshot, get_fundamentals, get_balance_sheet, get_cashflow, @@ -173,6 +174,10 @@ class TradingAgentsGraph: get_stock_data, # Technical indicators get_indicators, + # Deterministic verification snapshot (bound to the analyst + # LLM and required by its prompt; must be executable here or + # the call fails and the model reports it "unavailable"). + get_verified_market_snapshot, ] ), "social": ToolNode(