chore(prebuilt): revert back to create_react_agent (#6017)

This commit is contained in:
Sydney Runkle
2025-08-26 09:18:32 -04:00
committed by GitHub
parent cf615a46e6
commit 33ae3d4a8a
9 changed files with 91 additions and 91 deletions
+47 -47
View File
@@ -27,7 +27,7 @@ from langgraph.graph import START, MessagesState, StateGraph
from langgraph.graph.message import REMOVE_ALL_MESSAGES
from langgraph.prebuilt import (
ToolNode,
create_agent,
create_react_agent,
)
from langgraph.prebuilt.chat_agent_executor import (
AgentState,
@@ -53,7 +53,7 @@ pytestmark = pytest.mark.anyio
def test_no_prompt(sync_checkpointer: BaseCheckpointSaver) -> None:
model = FakeToolCallingModel()
agent = create_agent(
agent = create_react_agent(
model,
[],
checkpointer=sync_checkpointer,
@@ -83,7 +83,7 @@ def test_no_prompt(sync_checkpointer: BaseCheckpointSaver) -> None:
async def test_no_prompt_async(async_checkpointer: BaseCheckpointSaver) -> None:
model = FakeToolCallingModel()
agent = create_agent(model, [], checkpointer=async_checkpointer)
agent = create_react_agent(model, [], checkpointer=async_checkpointer)
inputs = [HumanMessage("hi?")]
thread = {"configurable": {"thread_id": "123"}}
response = await agent.ainvoke({"messages": inputs}, thread, debug=True)
@@ -108,7 +108,7 @@ async def test_no_prompt_async(async_checkpointer: BaseCheckpointSaver) -> None:
def test_system_message_prompt():
prompt = SystemMessage(content="Foo")
agent = create_agent(FakeToolCallingModel(), [], prompt=prompt)
agent = create_react_agent(FakeToolCallingModel(), [], prompt=prompt)
inputs = [HumanMessage("hi?")]
response = agent.invoke({"messages": inputs})
expected_response = {
@@ -119,7 +119,7 @@ def test_system_message_prompt():
def test_string_prompt():
prompt = "Foo"
agent = create_agent(FakeToolCallingModel(), [], prompt=prompt)
agent = create_react_agent(FakeToolCallingModel(), [], prompt=prompt)
inputs = [HumanMessage("hi?")]
response = agent.invoke({"messages": inputs})
expected_response = {
@@ -133,7 +133,7 @@ def test_callable_prompt():
modified_message = f"Bar {state['messages'][-1].content}"
return [HumanMessage(content=modified_message)]
agent = create_agent(FakeToolCallingModel(), [], prompt=prompt)
agent = create_react_agent(FakeToolCallingModel(), [], prompt=prompt)
inputs = [HumanMessage("hi?")]
response = agent.invoke({"messages": inputs})
expected_response = {"messages": inputs + [AIMessage(content="Bar hi?", id="0")]}
@@ -145,7 +145,7 @@ async def test_callable_prompt_async():
modified_message = f"Bar {state['messages'][-1].content}"
return [HumanMessage(content=modified_message)]
agent = create_agent(FakeToolCallingModel(), [], prompt=prompt)
agent = create_react_agent(FakeToolCallingModel(), [], prompt=prompt)
inputs = [HumanMessage("hi?")]
response = await agent.ainvoke({"messages": inputs})
expected_response = {"messages": inputs + [AIMessage(content="Bar hi?", id="0")]}
@@ -157,7 +157,7 @@ def test_runnable_prompt():
lambda state: [HumanMessage(content=f"Baz {state['messages'][-1].content}")]
)
agent = create_agent(FakeToolCallingModel(), [], prompt=prompt)
agent = create_react_agent(FakeToolCallingModel(), [], prompt=prompt)
inputs = [HumanMessage("hi?")]
response = agent.invoke({"messages": inputs})
expected_response = {"messages": inputs + [AIMessage(content="Baz hi?", id="0")]}
@@ -184,7 +184,7 @@ def test_prompt_with_store():
model = FakeToolCallingModel()
# test state modifier that uses store works
agent = create_agent(
agent = create_react_agent(
model,
[add],
prompt=prompt,
@@ -196,7 +196,7 @@ def test_prompt_with_store():
assert response["messages"][-1].content == "User name is Alice-hi"
# test state modifier that doesn't use store works
agent = create_agent(
agent = create_react_agent(
model,
[add],
prompt=prompt_no_store,
@@ -234,14 +234,14 @@ async def test_prompt_with_store_async():
model = FakeToolCallingModel()
# test state modifier that uses store works
agent = create_agent(model, [add], prompt=prompt, store=in_memory_store)
agent = create_react_agent(model, [add], prompt=prompt, store=in_memory_store)
response = await agent.ainvoke(
{"messages": [("user", "hi")]}, {"configurable": {"user_id": "1"}}
)
assert response["messages"][-1].content == "User name is Alice-hi"
# test state modifier that doesn't use store works
agent = create_agent(model, [add], prompt=prompt_no_store, store=in_memory_store)
agent = create_react_agent(model, [add], prompt=prompt_no_store, store=in_memory_store)
response = await agent.ainvoke(
{"messages": [("user", "hi")]}, {"configurable": {"user_id": "2"}}
)
@@ -282,7 +282,7 @@ def test_model_with_tools(tool_style: str, include_builtin: bool) -> None:
)
# check valid agent constructor
with pytest.raises(ValueError):
create_agent(
create_react_agent(
model.bind_tools(tools),
tools,
)
@@ -431,7 +431,7 @@ def test_react_agent_with_structured_response() -> None:
model = FakeToolCallingModel[WeatherResponse](
tool_calls=tool_calls, structured_response=expected_structured_response
)
agent = create_agent(
agent = create_react_agent(
model,
[get_weather],
response_format=WeatherResponse,
@@ -491,7 +491,7 @@ def test_react_agent_update_state(
tool_calls = [[{"args": {}, "id": "1", "name": "get_user_name"}]]
model = FakeToolCallingModel(tool_calls=tool_calls)
agent = create_agent(
agent = create_react_agent(
model,
[get_user_name],
state_schema=CustomState,
@@ -542,7 +542,7 @@ def test_react_agent_parallel_tool_calls(
[],
]
model = FakeToolCallingModel(tool_calls=tool_calls)
agent = create_agent(
agent = create_react_agent(
model,
[human_assistance, get_weather],
checkpointer=sync_checkpointer,
@@ -606,7 +606,7 @@ def test_create_react_agent_inject_vars() -> None:
"type": "tool_call",
}
model = FakeToolCallingModel(tool_calls=[[tool_call], []])
agent = create_agent(
agent = create_react_agent(
model,
ToolNode([tool1], handle_tool_errors=False),
state_schema=AgentStateExtraKey,
@@ -646,7 +646,7 @@ async def test_return_direct() -> None:
tool_calls=first_tool_call,
)
model = FakeToolCallingModel(tool_calls=[first_tool_call, []])
agent = create_agent(
agent = create_react_agent(
model,
[tool_return_direct, tool_normal],
)
@@ -673,7 +673,7 @@ async def test_return_direct() -> None:
),
]
model = FakeToolCallingModel(tool_calls=[second_tool_call, []])
agent = create_agent(model, [tool_return_direct, tool_normal])
agent = create_react_agent(model, [tool_return_direct, tool_normal])
result = agent.invoke(
{"messages": [HumanMessage(content="Test normal", id="hum1")]}
)
@@ -702,7 +702,7 @@ async def test_return_direct() -> None:
),
]
model = FakeToolCallingModel(tool_calls=[both_tool_calls, []])
agent = create_agent(model, [tool_return_direct, tool_normal])
agent = create_react_agent(model, [tool_return_direct, tool_normal])
result = agent.invoke({"messages": [HumanMessage(content="Test both", id="hum2")]})
assert result["messages"] == [
HumanMessage(content="Test both", id="hum2"),
@@ -739,7 +739,7 @@ def test__get_state_args() -> None:
def test_inspect_react() -> None:
model = FakeToolCallingModel(tool_calls=[])
agent = create_agent(model, [])
agent = create_react_agent(model, [])
inspect.getclosurevars(agent.nodes["model"].bound.func)
@@ -796,7 +796,7 @@ def test_react_with_subgraph_tools(
]
)
tool_node = ToolNode([addition, multiplication], handle_tool_errors=False)
agent = create_agent(
agent = create_react_agent(
model,
tool_node,
checkpointer=sync_checkpointer,
@@ -846,7 +846,7 @@ def test_react_agent_subgraph_streaming_sync() -> None:
]
)
agent = create_agent(
agent = create_react_agent(
model,
tools=[get_weather],
prompt="You are a helpful travel assistant.",
@@ -935,7 +935,7 @@ async def test_react_agent_subgraph_streaming() -> None:
]
)
agent = create_agent(
agent = create_react_agent(
model,
tools=[get_weather],
prompt="You are a helpful travel assistant.",
@@ -1033,7 +1033,7 @@ def test_tool_node_node_interrupt(
]
)
config = {"configurable": {"thread_id": "1"}}
agent = create_agent(
agent = create_react_agent(
model,
[tool_interrupt, tool_normal],
checkpointer=sync_checkpointer,
@@ -1085,7 +1085,7 @@ def test_dynamic_model_basic() -> None:
else:
return FakeToolCallingModel(tool_calls=[])
agent = create_agent(dynamic_model, [])
agent = create_react_agent(dynamic_model, [])
result = agent.invoke({"messages": [HumanMessage("hello")]})
assert len(result["messages"]) == 2
@@ -1123,7 +1123,7 @@ def test_dynamic_model_with_tools() -> None:
tool_calls=[[{"args": {"x": 1}, "id": "1", "name": "basic_tool"}], []]
)
agent = create_agent(dynamic_model, [basic_tool, advanced_tool])
agent = create_react_agent(dynamic_model, [basic_tool, advanced_tool])
# Test basic tool usage
result = agent.invoke({"messages": [HumanMessage("basic request")]})
@@ -1156,7 +1156,7 @@ def test_dynamic_model_with_context() -> None:
else:
return FakeToolCallingModel(tool_calls=[])
agent = create_agent(dynamic_model, [], context_schema=Context)
agent = create_react_agent(dynamic_model, [], context_schema=Context)
# Test with basic user
result = agent.invoke(
@@ -1186,7 +1186,7 @@ def test_dynamic_model_with_state_schema() -> None:
else:
return FakeToolCallingModel(tool_calls=[])
agent = create_agent(dynamic_model, [], state_schema=CustomDynamicState)
agent = create_react_agent(dynamic_model, [], state_schema=CustomDynamicState)
result = agent.invoke(
{"messages": [HumanMessage("hello")], "model_preference": "advanced"}
@@ -1202,7 +1202,7 @@ def test_dynamic_model_with_prompt() -> None:
return FakeToolCallingModel(tool_calls=[])
# Test with string prompt
agent = create_agent(dynamic_model, [], prompt="system_msg")
agent = create_react_agent(dynamic_model, [], prompt="system_msg")
result = agent.invoke({"messages": [HumanMessage("human_msg")]})
assert result["messages"][-1].content == "system_msg-human_msg"
@@ -1211,7 +1211,7 @@ def test_dynamic_model_with_prompt() -> None:
"""Generate a dynamic system message based on state."""
return [{"role": "system", "content": "system_msg"}] + list(state["messages"])
agent = create_agent(dynamic_model, [], prompt=dynamic_prompt)
agent = create_react_agent(dynamic_model, [], prompt=dynamic_prompt)
result = agent.invoke({"messages": [HumanMessage("human_msg")]})
assert result["messages"][-1].content == "system_msg-human_msg"
@@ -1222,7 +1222,7 @@ async def test_dynamic_model_async() -> None:
def dynamic_model(state: AgentState, runtime: Runtime) -> BaseChatModel:
return FakeToolCallingModel(tool_calls=[])
agent = create_agent(dynamic_model, [])
agent = create_react_agent(dynamic_model, [])
result = await agent.ainvoke({"messages": [HumanMessage("hello async")]})
assert len(result["messages"]) == 2
@@ -1250,7 +1250,7 @@ def test_dynamic_model_with_structured_response() -> None:
],
)
agent = create_agent(dynamic_model, [], response_format=TestResponse)
agent = create_react_agent(dynamic_model, [], response_format=TestResponse)
result = agent.invoke({"messages": [HumanMessage("hello")]})
assert "structured_response" in result
@@ -1274,7 +1274,7 @@ def test_dynamic_model_with_checkpointer(sync_checkpointer):
index=call_count,
)
agent = create_agent(dynamic_model, [], checkpointer=sync_checkpointer)
agent = create_react_agent(dynamic_model, [], checkpointer=sync_checkpointer)
config = {"configurable": {"thread_id": "test_dynamic"}}
# First call
@@ -1313,7 +1313,7 @@ def test_dynamic_model_state_dependent_tools() -> None:
tool_calls=[[{"args": {"x": 1}, "id": "1", "name": "tool_a"}], []]
)
agent = create_agent(dynamic_model, [tool_a, tool_b])
agent = create_react_agent(dynamic_model, [tool_a, tool_b])
# Ask to use tool B
result = agent.invoke({"messages": [HumanMessage("use_b please")]})
@@ -1336,7 +1336,7 @@ def test_dynamic_model_error_handling() -> None:
raise ValueError("Dynamic model failed")
return FakeToolCallingModel(tool_calls=[])
agent = create_agent(failing_dynamic_model, [])
agent = create_react_agent(failing_dynamic_model, [])
# Normal operation should work
result = agent.invoke({"messages": [HumanMessage("hello")]})
@@ -1351,13 +1351,13 @@ def test_dynamic_model_vs_static_model_behavior():
"""Test that dynamic and static models produce equivalent results when configured the same."""
# Static model
static_model = FakeToolCallingModel(tool_calls=[])
static_agent = create_agent(static_model, [])
static_agent = create_react_agent(static_model, [])
# Dynamic model returning the same model
def dynamic_model(state, runtime: Runtime):
return FakeToolCallingModel(tool_calls=[])
dynamic_agent = create_agent(dynamic_model, [])
dynamic_agent = create_react_agent(dynamic_model, [])
input_msg = {"messages": [HumanMessage("test message")]}
@@ -1382,7 +1382,7 @@ def test_dynamic_model_receives_correct_state():
received_states.append(state)
return FakeToolCallingModel(tool_calls=[])
agent = create_agent(dynamic_model, [], state_schema=CustomAgentState)
agent = create_react_agent(dynamic_model, [], state_schema=CustomAgentState)
# Test with initial state
input_state = {"messages": [HumanMessage("hello")], "custom_field": "test_value"}
@@ -1413,7 +1413,7 @@ async def test_dynamic_model_receives_correct_state_async():
received_states.append(state)
return FakeToolCallingModel(tool_calls=[])
agent = create_agent(dynamic_model, [], state_schema=CustomAgentStateAsync)
agent = create_react_agent(dynamic_model, [], state_schema=CustomAgentStateAsync)
# Test with initial state
input_state = {
@@ -1443,7 +1443,7 @@ def test_pre_model_hook() -> None:
def pre_model_hook(state: AgentState):
return {"llm_input_messages": [HumanMessage("Hello!")]}
agent = create_agent(model, [], pre_model_hook=pre_model_hook)
agent = create_react_agent(model, [], pre_model_hook=pre_model_hook)
assert "pre_model_hook" in agent.nodes
result = agent.invoke({"messages": [HumanMessage("hi?")]})
assert result == {
@@ -1459,7 +1459,7 @@ def test_pre_model_hook() -> None:
"messages": [RemoveMessage(id=REMOVE_ALL_MESSAGES), HumanMessage("Hello!")]
}
agent = create_agent(model, [], pre_model_hook=pre_model_hook)
agent = create_react_agent(model, [], pre_model_hook=pre_model_hook)
result = agent.invoke({"messages": [HumanMessage("hi?")]})
assert result == {
"messages": [
@@ -1478,7 +1478,7 @@ def test_post_model_hook() -> None:
def post_model_hook(state: FlagState) -> dict[str, bool]:
return {"flag": True}
pmh_agent = create_agent(
pmh_agent = create_react_agent(
model, [], post_model_hook=post_model_hook, state_schema=FlagState
)
@@ -1528,7 +1528,7 @@ def test_post_model_hook_with_structured_output() -> None:
return {"flag": True}
model = FakeToolCallingModel(tool_calls=tool_calls)
agent = create_agent(
agent = create_react_agent(
model,
[get_weather],
response_format=WeatherResponse,
@@ -1546,7 +1546,7 @@ def test_post_model_hook_with_structured_output() -> None:
# Reset the state of the model
model = FakeToolCallingModel(tool_calls=tool_calls)
agent = create_agent(
agent = create_react_agent(
model,
[get_weather],
response_format=WeatherResponse,
@@ -1646,7 +1646,7 @@ def test_create_react_agent_inject_vars_with_post_model_hook() -> None:
return {"foo": 2}
model = FakeToolCallingModel(tool_calls=[[tool_call], []])
agent = create_agent(
agent = create_react_agent(
model,
ToolNode([tool1], handle_tool_errors=False),
state_schema=AgentStateExtraKey,
@@ -1681,7 +1681,7 @@ def test_response_format_using_tool_choice() -> None:
expected_structured_response = WeatherResponse(temperature=75)
model = FakeToolCallingModel(tool_calls=tool_calls)
agent = create_agent(
agent = create_react_agent(
model,
[get_weather],
response_format=WeatherResponse,