mirror of
https://github.com/hwchase17/langchain.git
synced 2025-09-11 16:01:33 +00:00
chore(langchain): rename create_react_agent
-> create_agent
(#32789)
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
"""langgraph.prebuilt exposes a higher-level API for creating and executing agents and tools."""
|
||||
|
||||
from langchain.agents.react_agent import AgentState, create_react_agent
|
||||
from langchain.agents.react_agent import AgentState, create_agent
|
||||
from langchain.agents.tool_node import ToolNode
|
||||
|
||||
__all__ = [
|
||||
"AgentState",
|
||||
"ToolNode",
|
||||
"create_react_agent",
|
||||
"create_agent",
|
||||
]
|
||||
|
@@ -898,7 +898,7 @@ def _supports_native_structured_output(
|
||||
)
|
||||
|
||||
|
||||
def create_react_agent( # noqa: D417
|
||||
def create_agent( # noqa: D417
|
||||
model: Union[
|
||||
str,
|
||||
BaseChatModel,
|
||||
@@ -928,7 +928,7 @@ def create_react_agent( # noqa: D417
|
||||
) -> CompiledStateGraph[StateT, ContextT]:
|
||||
"""Creates an agent graph that calls tools in a loop until a stopping condition is met.
|
||||
|
||||
For more details on using `create_react_agent`, visit [Agents](https://langchain-ai.github.io/langgraph/agents/overview/) documentation.
|
||||
For more details on using `create_agent`, visit [Agents](https://langchain-ai.github.io/langgraph/agents/overview/) documentation.
|
||||
|
||||
Args:
|
||||
model: The language model for the agent. Supports static and dynamic
|
||||
@@ -1096,13 +1096,13 @@ def create_react_agent( # noqa: D417
|
||||
|
||||
Example:
|
||||
```python
|
||||
from langchain.agents import create_react_agent
|
||||
from langchain.agents import create_agent
|
||||
|
||||
def check_weather(location: str) -> str:
|
||||
'''Return the weather forecast for the specified location.'''
|
||||
return f"It's always sunny in {location}"
|
||||
|
||||
graph = create_react_agent(
|
||||
graph = create_agent(
|
||||
"anthropic:claude-3-7-sonnet-latest",
|
||||
tools=[check_weather],
|
||||
prompt="You are a helpful assistant",
|
||||
@@ -1123,7 +1123,7 @@ def create_react_agent( # noqa: D417
|
||||
context_schema = config_schema
|
||||
|
||||
if len(deprecated_kwargs) > 0:
|
||||
msg = f"create_react_agent() got unexpected keyword arguments: {deprecated_kwargs}"
|
||||
msg = f"create_agent() got unexpected keyword arguments: {deprecated_kwargs}"
|
||||
raise TypeError(msg)
|
||||
|
||||
if response_format and not isinstance(response_format, (ToolStrategy, ProviderStrategy)):
|
||||
@@ -1171,5 +1171,5 @@ __all__ = [
|
||||
"AgentStatePydantic",
|
||||
"AgentStateWithStructuredResponse",
|
||||
"AgentStateWithStructuredResponsePydantic",
|
||||
"create_react_agent",
|
||||
"create_agent",
|
||||
]
|
||||
|
@@ -2,7 +2,7 @@ import pytest
|
||||
from langchain_core.messages import HumanMessage
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from langchain.agents import create_react_agent
|
||||
from langchain.agents import create_agent
|
||||
from langchain.agents.structured_output import ToolStrategy
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ def test_inference_to_native_output() -> None:
|
||||
from langchain_openai import ChatOpenAI
|
||||
|
||||
model = ChatOpenAI(model="gpt-5")
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
prompt=(
|
||||
"You are a helpful weather assistant. Please call the get_weather tool, "
|
||||
@@ -54,7 +54,7 @@ def test_inference_to_tool_output() -> None:
|
||||
from langchain_openai import ChatOpenAI
|
||||
|
||||
model = ChatOpenAI(model="gpt-4")
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
prompt=(
|
||||
"You are a helpful weather assistant. Please call the get_weather tool, "
|
||||
|
@@ -32,7 +32,7 @@ from typing_extensions import TypedDict
|
||||
from langchain.agents import (
|
||||
AgentState,
|
||||
ToolNode,
|
||||
create_react_agent,
|
||||
create_agent,
|
||||
)
|
||||
from langchain.agents.react_agent import _validate_chat_history
|
||||
from langchain.agents.tool_node import (
|
||||
@@ -52,7 +52,7 @@ pytestmark = pytest.mark.anyio
|
||||
def test_no_prompt(sync_checkpointer: BaseCheckpointSaver) -> None:
|
||||
model = FakeToolCallingModel()
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[],
|
||||
checkpointer=sync_checkpointer,
|
||||
@@ -82,7 +82,7 @@ def test_no_prompt(sync_checkpointer: BaseCheckpointSaver) -> None:
|
||||
async def test_no_prompt_async(async_checkpointer: BaseCheckpointSaver) -> None:
|
||||
model = FakeToolCallingModel()
|
||||
|
||||
agent = create_react_agent(model, [], checkpointer=async_checkpointer)
|
||||
agent = create_agent(model, [], checkpointer=async_checkpointer)
|
||||
inputs = [HumanMessage("hi?")]
|
||||
thread = {"configurable": {"thread_id": "123"}}
|
||||
response = await agent.ainvoke({"messages": inputs}, thread, debug=True)
|
||||
@@ -107,7 +107,7 @@ async def test_no_prompt_async(async_checkpointer: BaseCheckpointSaver) -> None:
|
||||
|
||||
def test_system_message_prompt() -> None:
|
||||
prompt = SystemMessage(content="Foo")
|
||||
agent = create_react_agent(FakeToolCallingModel(), [], prompt=prompt)
|
||||
agent = create_agent(FakeToolCallingModel(), [], prompt=prompt)
|
||||
inputs = [HumanMessage("hi?")]
|
||||
response = agent.invoke({"messages": inputs})
|
||||
expected_response = {"messages": [*inputs, AIMessage(content="Foo-hi?", id="0", tool_calls=[])]}
|
||||
@@ -116,7 +116,7 @@ def test_system_message_prompt() -> None:
|
||||
|
||||
def test_string_prompt() -> None:
|
||||
prompt = "Foo"
|
||||
agent = create_react_agent(FakeToolCallingModel(), [], prompt=prompt)
|
||||
agent = create_agent(FakeToolCallingModel(), [], prompt=prompt)
|
||||
inputs = [HumanMessage("hi?")]
|
||||
response = agent.invoke({"messages": inputs})
|
||||
expected_response = {"messages": [*inputs, AIMessage(content="Foo-hi?", id="0", tool_calls=[])]}
|
||||
@@ -128,7 +128,7 @@ def test_callable_prompt() -> None:
|
||||
modified_message = f"Bar {state['messages'][-1].content}"
|
||||
return [HumanMessage(content=modified_message)]
|
||||
|
||||
agent = create_react_agent(FakeToolCallingModel(), [], prompt=prompt)
|
||||
agent = create_agent(FakeToolCallingModel(), [], prompt=prompt)
|
||||
inputs = [HumanMessage("hi?")]
|
||||
response = agent.invoke({"messages": inputs})
|
||||
expected_response = {"messages": [*inputs, AIMessage(content="Bar hi?", id="0")]}
|
||||
@@ -140,7 +140,7 @@ async def test_callable_prompt_async() -> None:
|
||||
modified_message = f"Bar {state['messages'][-1].content}"
|
||||
return [HumanMessage(content=modified_message)]
|
||||
|
||||
agent = create_react_agent(FakeToolCallingModel(), [], prompt=prompt)
|
||||
agent = create_agent(FakeToolCallingModel(), [], prompt=prompt)
|
||||
inputs = [HumanMessage("hi?")]
|
||||
response = await agent.ainvoke({"messages": inputs})
|
||||
expected_response = {"messages": [*inputs, AIMessage(content="Bar hi?", id="0")]}
|
||||
@@ -152,7 +152,7 @@ def test_runnable_prompt() -> None:
|
||||
lambda state: [HumanMessage(content=f"Baz {state['messages'][-1].content}")]
|
||||
)
|
||||
|
||||
agent = create_react_agent(FakeToolCallingModel(), [], prompt=prompt)
|
||||
agent = create_agent(FakeToolCallingModel(), [], prompt=prompt)
|
||||
inputs = [HumanMessage("hi?")]
|
||||
response = agent.invoke({"messages": inputs})
|
||||
expected_response = {"messages": [*inputs, AIMessage(content="Baz hi?", id="0")]}
|
||||
@@ -179,7 +179,7 @@ def test_prompt_with_store() -> None:
|
||||
model = FakeToolCallingModel()
|
||||
|
||||
# test state modifier that uses store works
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[add],
|
||||
prompt=prompt,
|
||||
@@ -189,7 +189,7 @@ def test_prompt_with_store() -> None:
|
||||
assert response["messages"][-1].content == "User name is Alice-hi"
|
||||
|
||||
# test state modifier that doesn't use store works
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[add],
|
||||
prompt=prompt_no_store,
|
||||
@@ -219,14 +219,14 @@ async def test_prompt_with_store_async() -> None:
|
||||
model = FakeToolCallingModel()
|
||||
|
||||
# test state modifier that uses store works
|
||||
agent = create_react_agent(model, [add], prompt=prompt, store=in_memory_store)
|
||||
agent = create_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_react_agent(model, [add], prompt=prompt_no_store, store=in_memory_store)
|
||||
agent = create_agent(model, [add], prompt=prompt_no_store, store=in_memory_store)
|
||||
response = await agent.ainvoke(
|
||||
{"messages": [("user", "hi")]}, {"configurable": {"user_id": "2"}}
|
||||
)
|
||||
@@ -267,7 +267,7 @@ def test_model_with_tools(tool_style: str, include_builtin: bool) -> None:
|
||||
)
|
||||
# check valid agent constructor
|
||||
with pytest.raises(ValueError):
|
||||
create_react_agent(
|
||||
create_agent(
|
||||
model.bind_tools(tools),
|
||||
tools,
|
||||
)
|
||||
@@ -414,7 +414,7 @@ def test_react_agent_with_structured_response() -> None:
|
||||
model = FakeToolCallingModel[WeatherResponse](
|
||||
tool_calls=tool_calls, structured_response=expected_structured_response
|
||||
)
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[get_weather],
|
||||
response_format=WeatherResponse,
|
||||
@@ -472,7 +472,7 @@ def test_react_agent_update_state(
|
||||
|
||||
tool_calls = [[{"args": {}, "id": "1", "name": "get_user_name"}]]
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[get_user_name],
|
||||
state_schema=CustomState,
|
||||
@@ -523,7 +523,7 @@ def test_react_agent_parallel_tool_calls(
|
||||
[],
|
||||
]
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[human_assistance, get_weather],
|
||||
checkpointer=sync_checkpointer,
|
||||
@@ -561,7 +561,7 @@ class AgentStateExtraKey(AgentState):
|
||||
foo: int
|
||||
|
||||
|
||||
def test_create_react_agent_inject_vars() -> None:
|
||||
def test_create_agent_inject_vars() -> None:
|
||||
"""Test that the agent can inject state and store into tool functions."""
|
||||
store = InMemoryStore()
|
||||
namespace = ("test",)
|
||||
@@ -583,7 +583,7 @@ def test_create_react_agent_inject_vars() -> None:
|
||||
"type": "tool_call",
|
||||
}
|
||||
model = FakeToolCallingModel(tool_calls=[[tool_call], []])
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
ToolNode([tool1], handle_tool_errors=False),
|
||||
state_schema=AgentStateExtraKey,
|
||||
@@ -623,7 +623,7 @@ async def test_return_direct() -> None:
|
||||
tool_calls=first_tool_call,
|
||||
)
|
||||
model = FakeToolCallingModel(tool_calls=[first_tool_call, []])
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[tool_return_direct, tool_normal],
|
||||
)
|
||||
@@ -648,7 +648,7 @@ async def test_return_direct() -> None:
|
||||
),
|
||||
]
|
||||
model = FakeToolCallingModel(tool_calls=[second_tool_call, []])
|
||||
agent = create_react_agent(model, [tool_return_direct, tool_normal])
|
||||
agent = create_agent(model, [tool_return_direct, tool_normal])
|
||||
result = agent.invoke({"messages": [HumanMessage(content="Test normal", id="hum1")]})
|
||||
assert result["messages"] == [
|
||||
HumanMessage(content="Test normal", id="hum1"),
|
||||
@@ -675,7 +675,7 @@ async def test_return_direct() -> None:
|
||||
),
|
||||
]
|
||||
model = FakeToolCallingModel(tool_calls=[both_tool_calls, []])
|
||||
agent = create_react_agent(model, [tool_return_direct, tool_normal])
|
||||
agent = create_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"),
|
||||
@@ -712,7 +712,7 @@ def test__get_state_args() -> None:
|
||||
|
||||
def test_inspect_react() -> None:
|
||||
model = FakeToolCallingModel(tool_calls=[])
|
||||
agent = create_react_agent(model, [])
|
||||
agent = create_agent(model, [])
|
||||
inspect.getclosurevars(agent.nodes["agent"].bound.func)
|
||||
|
||||
|
||||
@@ -766,7 +766,7 @@ def test_react_with_subgraph_tools(
|
||||
]
|
||||
)
|
||||
tool_node = ToolNode([addition, multiplication], handle_tool_errors=False)
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
tool_node,
|
||||
checkpointer=sync_checkpointer,
|
||||
@@ -812,7 +812,7 @@ def test_react_agent_subgraph_streaming_sync() -> None:
|
||||
]
|
||||
)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
tools=[get_weather],
|
||||
prompt="You are a helpful travel assistant.",
|
||||
@@ -899,7 +899,7 @@ async def test_react_agent_subgraph_streaming() -> None:
|
||||
]
|
||||
)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
tools=[get_weather],
|
||||
prompt="You are a helpful travel assistant.",
|
||||
@@ -994,7 +994,7 @@ def test_tool_node_node_interrupt(
|
||||
]
|
||||
)
|
||||
config = {"configurable": {"thread_id": "1"}}
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[tool_interrupt, tool_normal],
|
||||
checkpointer=sync_checkpointer,
|
||||
@@ -1045,7 +1045,7 @@ def test_dynamic_model_basic() -> None:
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
|
||||
agent = create_react_agent(dynamic_model, [])
|
||||
agent = create_agent(dynamic_model, [])
|
||||
|
||||
result = agent.invoke({"messages": [HumanMessage("hello")]})
|
||||
assert len(result["messages"]) == 2
|
||||
@@ -1082,7 +1082,7 @@ def test_dynamic_model_with_tools() -> None:
|
||||
tool_calls=[[{"args": {"x": 1}, "id": "1", "name": "basic_tool"}], []]
|
||||
)
|
||||
|
||||
agent = create_react_agent(dynamic_model, [basic_tool, advanced_tool])
|
||||
agent = create_agent(dynamic_model, [basic_tool, advanced_tool])
|
||||
|
||||
# Test basic tool usage
|
||||
result = agent.invoke({"messages": [HumanMessage("basic request")]})
|
||||
@@ -1114,7 +1114,7 @@ def test_dynamic_model_with_context() -> None:
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
|
||||
agent = create_react_agent(dynamic_model, [], context_schema=Context)
|
||||
agent = create_agent(dynamic_model, [], context_schema=Context)
|
||||
|
||||
# Test with basic user
|
||||
result = agent.invoke(
|
||||
@@ -1143,7 +1143,7 @@ def test_dynamic_model_with_state_schema() -> None:
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
|
||||
agent = create_react_agent(dynamic_model, [], state_schema=CustomDynamicState)
|
||||
agent = create_agent(dynamic_model, [], state_schema=CustomDynamicState)
|
||||
|
||||
result = agent.invoke({"messages": [HumanMessage("hello")], "model_preference": "advanced"})
|
||||
assert len(result["messages"]) == 2
|
||||
@@ -1157,7 +1157,7 @@ def test_dynamic_model_with_prompt() -> None:
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
|
||||
# Test with string prompt
|
||||
agent = create_react_agent(dynamic_model, [], prompt="system_msg")
|
||||
agent = create_agent(dynamic_model, [], prompt="system_msg")
|
||||
result = agent.invoke({"messages": [HumanMessage("human_msg")]})
|
||||
assert result["messages"][-1].content == "system_msg-human_msg"
|
||||
|
||||
@@ -1166,7 +1166,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_react_agent(dynamic_model, [], prompt=dynamic_prompt)
|
||||
agent = create_agent(dynamic_model, [], prompt=dynamic_prompt)
|
||||
result = agent.invoke({"messages": [HumanMessage("human_msg")]})
|
||||
assert result["messages"][-1].content == "system_msg-human_msg"
|
||||
|
||||
@@ -1177,7 +1177,7 @@ async def test_dynamic_model_async() -> None:
|
||||
def dynamic_model(state: AgentState, runtime: Runtime) -> BaseChatModel:
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
|
||||
agent = create_react_agent(dynamic_model, [])
|
||||
agent = create_agent(dynamic_model, [])
|
||||
|
||||
result = await agent.ainvoke({"messages": [HumanMessage("hello async")]})
|
||||
assert len(result["messages"]) == 2
|
||||
@@ -1205,7 +1205,7 @@ def test_dynamic_model_with_structured_response() -> None:
|
||||
],
|
||||
)
|
||||
|
||||
agent = create_react_agent(dynamic_model, [], response_format=TestResponse)
|
||||
agent = create_agent(dynamic_model, [], response_format=TestResponse)
|
||||
|
||||
result = agent.invoke({"messages": [HumanMessage("hello")]})
|
||||
assert "structured_response" in result
|
||||
@@ -1229,7 +1229,7 @@ def test_dynamic_model_with_checkpointer(sync_checkpointer) -> None:
|
||||
index=call_count,
|
||||
)
|
||||
|
||||
agent = create_react_agent(dynamic_model, [], checkpointer=sync_checkpointer)
|
||||
agent = create_agent(dynamic_model, [], checkpointer=sync_checkpointer)
|
||||
config = {"configurable": {"thread_id": "test_dynamic"}}
|
||||
|
||||
# First call
|
||||
@@ -1267,7 +1267,7 @@ def test_dynamic_model_state_dependent_tools() -> None:
|
||||
tool_calls=[[{"args": {"x": 1}, "id": "1", "name": "tool_a"}], []]
|
||||
)
|
||||
|
||||
agent = create_react_agent(dynamic_model, [tool_a, tool_b])
|
||||
agent = create_agent(dynamic_model, [tool_a, tool_b])
|
||||
|
||||
# Ask to use tool B
|
||||
result = agent.invoke({"messages": [HumanMessage("use_b please")]})
|
||||
@@ -1291,7 +1291,7 @@ def test_dynamic_model_error_handling() -> None:
|
||||
raise ValueError(msg)
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
|
||||
agent = create_react_agent(failing_dynamic_model, [])
|
||||
agent = create_agent(failing_dynamic_model, [])
|
||||
|
||||
# Normal operation should work
|
||||
result = agent.invoke({"messages": [HumanMessage("hello")]})
|
||||
@@ -1306,13 +1306,13 @@ def test_dynamic_model_vs_static_model_behavior() -> None:
|
||||
"""Test that dynamic and static models produce equivalent results when configured the same."""
|
||||
# Static model
|
||||
static_model = FakeToolCallingModel(tool_calls=[])
|
||||
static_agent = create_react_agent(static_model, [])
|
||||
static_agent = create_agent(static_model, [])
|
||||
|
||||
# Dynamic model returning the same model
|
||||
def dynamic_model(state, runtime: Runtime):
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
|
||||
dynamic_agent = create_react_agent(dynamic_model, [])
|
||||
dynamic_agent = create_agent(dynamic_model, [])
|
||||
|
||||
input_msg = {"messages": [HumanMessage("test message")]}
|
||||
|
||||
@@ -1337,7 +1337,7 @@ def test_dynamic_model_receives_correct_state() -> None:
|
||||
received_states.append(state)
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
|
||||
agent = create_react_agent(dynamic_model, [], state_schema=CustomAgentState)
|
||||
agent = create_agent(dynamic_model, [], state_schema=CustomAgentState)
|
||||
|
||||
# Test with initial state
|
||||
input_state = {"messages": [HumanMessage("hello")], "custom_field": "test_value"}
|
||||
@@ -1368,7 +1368,7 @@ async def test_dynamic_model_receives_correct_state_async() -> None:
|
||||
received_states.append(state)
|
||||
return FakeToolCallingModel(tool_calls=[])
|
||||
|
||||
agent = create_react_agent(dynamic_model, [], state_schema=CustomAgentStateAsync)
|
||||
agent = create_agent(dynamic_model, [], state_schema=CustomAgentStateAsync)
|
||||
|
||||
# Test with initial state
|
||||
input_state = {
|
||||
@@ -1397,7 +1397,7 @@ def test_pre_model_hook() -> None:
|
||||
def pre_model_hook(state: AgentState):
|
||||
return {"llm_input_messages": [HumanMessage("Hello!")]}
|
||||
|
||||
agent = create_react_agent(model, [], pre_model_hook=pre_model_hook)
|
||||
agent = create_agent(model, [], pre_model_hook=pre_model_hook)
|
||||
assert "pre_model_hook" in agent.nodes
|
||||
result = agent.invoke({"messages": [HumanMessage("hi?")]})
|
||||
assert result == {
|
||||
@@ -1411,7 +1411,7 @@ def test_pre_model_hook() -> None:
|
||||
def pre_model_hook(state: AgentState):
|
||||
return {"messages": [RemoveMessage(id=REMOVE_ALL_MESSAGES), HumanMessage("Hello!")]}
|
||||
|
||||
agent = create_react_agent(model, [], pre_model_hook=pre_model_hook)
|
||||
agent = create_agent(model, [], pre_model_hook=pre_model_hook)
|
||||
result = agent.invoke({"messages": [HumanMessage("hi?")]})
|
||||
assert result == {
|
||||
"messages": [
|
||||
@@ -1430,9 +1430,7 @@ def test_post_model_hook() -> None:
|
||||
def post_model_hook(state: FlagState) -> dict[str, bool]:
|
||||
return {"flag": True}
|
||||
|
||||
pmh_agent = create_react_agent(
|
||||
model, [], post_model_hook=post_model_hook, state_schema=FlagState
|
||||
)
|
||||
pmh_agent = create_agent(model, [], post_model_hook=post_model_hook, state_schema=FlagState)
|
||||
|
||||
assert "post_model_hook" in pmh_agent.nodes
|
||||
|
||||
@@ -1480,7 +1478,7 @@ def test_post_model_hook_with_structured_output() -> None:
|
||||
return {"flag": True}
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[get_weather],
|
||||
response_format=WeatherResponse,
|
||||
@@ -1496,7 +1494,7 @@ def test_post_model_hook_with_structured_output() -> None:
|
||||
|
||||
# Reset the state of the model
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[get_weather],
|
||||
response_format=WeatherResponse,
|
||||
@@ -1568,7 +1566,7 @@ def test_post_model_hook_with_structured_output() -> None:
|
||||
]
|
||||
|
||||
|
||||
def test_create_react_agent_inject_vars_with_post_model_hook() -> None:
|
||||
def test_create_agent_inject_vars_with_post_model_hook() -> None:
|
||||
store = InMemoryStore()
|
||||
namespace = ("test",)
|
||||
store.put(namespace, "test_key", {"bar": 3})
|
||||
@@ -1594,7 +1592,7 @@ def test_create_react_agent_inject_vars_with_post_model_hook() -> None:
|
||||
return {"foo": 2}
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=[[tool_call], []])
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
ToolNode([tool1], handle_tool_errors=False),
|
||||
state_schema=AgentStateExtraKey,
|
||||
@@ -1629,7 +1627,7 @@ def test_response_format_using_tool_choice() -> None:
|
||||
|
||||
expected_structured_response = WeatherResponse(temperature=75)
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[get_weather],
|
||||
response_format=WeatherResponse,
|
||||
|
@@ -5,7 +5,7 @@ import pytest
|
||||
from pydantic import BaseModel
|
||||
from syrupy.assertion import SnapshotAssertion
|
||||
|
||||
from langchain.agents import create_react_agent
|
||||
from langchain.agents import create_agent
|
||||
|
||||
from .model import FakeToolCallingModel
|
||||
|
||||
@@ -39,7 +39,7 @@ def test_react_agent_graph_structure(
|
||||
pre_model_hook: Union[Callable, None],
|
||||
post_model_hook: Union[Callable, None],
|
||||
) -> None:
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
tools=tools,
|
||||
pre_model_hook=pre_model_hook,
|
||||
|
@@ -1,4 +1,4 @@
|
||||
"""Test suite for create_react_agent with structured output response_format permutations."""
|
||||
"""Test suite for create_agent with structured output response_format permutations."""
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -6,7 +6,7 @@ from dataclasses import dataclass
|
||||
from typing import Union
|
||||
|
||||
from langchain_core.messages import HumanMessage
|
||||
from langchain.agents import create_react_agent
|
||||
from langchain.agents import create_agent
|
||||
from langchain.agents.structured_output import (
|
||||
MultipleStructuredOutputsError,
|
||||
ProviderStrategy,
|
||||
@@ -114,7 +114,7 @@ class TestResponseFormatAsModel:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(model, [get_weather], response_format=WeatherBaseModel)
|
||||
agent = create_agent(model, [get_weather], response_format=WeatherBaseModel)
|
||||
response = agent.invoke({"messages": [HumanMessage("What's the weather?")]})
|
||||
|
||||
assert response["structured_response"] == EXPECTED_WEATHER_PYDANTIC
|
||||
@@ -135,7 +135,7 @@ class TestResponseFormatAsModel:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(model, [get_weather], response_format=WeatherDataclass)
|
||||
agent = create_agent(model, [get_weather], response_format=WeatherDataclass)
|
||||
response = agent.invoke({"messages": [HumanMessage("What's the weather?")]})
|
||||
|
||||
assert response["structured_response"] == EXPECTED_WEATHER_DATACLASS
|
||||
@@ -156,7 +156,7 @@ class TestResponseFormatAsModel:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(model, [get_weather], response_format=WeatherTypedDict)
|
||||
agent = create_agent(model, [get_weather], response_format=WeatherTypedDict)
|
||||
response = agent.invoke({"messages": [HumanMessage("What's the weather?")]})
|
||||
|
||||
assert response["structured_response"] == EXPECTED_WEATHER_DICT
|
||||
@@ -177,7 +177,7 @@ class TestResponseFormatAsModel:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(model, [get_weather], response_format=weather_json_schema)
|
||||
agent = create_agent(model, [get_weather], response_format=weather_json_schema)
|
||||
response = agent.invoke({"messages": [HumanMessage("What's the weather?")]})
|
||||
|
||||
assert response["structured_response"] == EXPECTED_WEATHER_DICT
|
||||
@@ -200,9 +200,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(
|
||||
model, [get_weather], response_format=ToolStrategy(WeatherBaseModel)
|
||||
)
|
||||
agent = create_agent(model, [get_weather], response_format=ToolStrategy(WeatherBaseModel))
|
||||
response = agent.invoke({"messages": [HumanMessage("What's the weather?")]})
|
||||
|
||||
assert response["structured_response"] == EXPECTED_WEATHER_PYDANTIC
|
||||
@@ -223,9 +221,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(
|
||||
model, [get_weather], response_format=ToolStrategy(WeatherDataclass)
|
||||
)
|
||||
agent = create_agent(model, [get_weather], response_format=ToolStrategy(WeatherDataclass))
|
||||
response = agent.invoke({"messages": [HumanMessage("What's the weather?")]})
|
||||
|
||||
assert response["structured_response"] == EXPECTED_WEATHER_DATACLASS
|
||||
@@ -246,9 +242,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(
|
||||
model, [get_weather], response_format=ToolStrategy(WeatherTypedDict)
|
||||
)
|
||||
agent = create_agent(model, [get_weather], response_format=ToolStrategy(WeatherTypedDict))
|
||||
response = agent.invoke({"messages": [HumanMessage("What's the weather?")]})
|
||||
|
||||
assert response["structured_response"] == EXPECTED_WEATHER_DICT
|
||||
@@ -269,7 +263,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model, [get_weather], response_format=ToolStrategy(weather_json_schema)
|
||||
)
|
||||
response = agent.invoke({"messages": [HumanMessage("What's the weather?")]})
|
||||
@@ -292,7 +286,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[get_weather, get_location],
|
||||
response_format=ToolStrategy({"oneOf": [weather_json_schema, location_json_schema]}),
|
||||
@@ -316,7 +310,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model_location = FakeToolCallingModel(tool_calls=tool_calls_location)
|
||||
|
||||
agent_location = create_react_agent(
|
||||
agent_location = create_agent(
|
||||
model_location,
|
||||
[get_weather, get_location],
|
||||
response_format=ToolStrategy({"oneOf": [weather_json_schema, location_json_schema]}),
|
||||
@@ -344,7 +338,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
tool_calls=tool_calls
|
||||
)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[get_weather, get_location],
|
||||
response_format=ToolStrategy(Union[WeatherBaseModel, LocationResponse]),
|
||||
@@ -368,7 +362,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model_location = FakeToolCallingModel(tool_calls=tool_calls_location)
|
||||
|
||||
agent_location = create_react_agent(
|
||||
agent_location = create_agent(
|
||||
model_location,
|
||||
[get_weather, get_location],
|
||||
response_format=ToolStrategy(Union[WeatherBaseModel, LocationResponse]),
|
||||
@@ -397,7 +391,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[],
|
||||
response_format=ToolStrategy(
|
||||
@@ -438,7 +432,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[],
|
||||
response_format=ToolStrategy(
|
||||
@@ -467,7 +461,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[],
|
||||
response_format=ToolStrategy(
|
||||
@@ -503,7 +497,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[],
|
||||
response_format=ToolStrategy(
|
||||
@@ -549,7 +543,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
return "Custom error: Multiple outputs not allowed"
|
||||
return "Custom error"
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[],
|
||||
response_format=ToolStrategy(
|
||||
@@ -587,7 +581,7 @@ class TestResponseFormatAsToolStrategy:
|
||||
|
||||
model = FakeToolCallingModel(tool_calls=tool_calls)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[],
|
||||
response_format=ToolStrategy(
|
||||
@@ -617,7 +611,7 @@ class TestResponseFormatAsProviderStrategy:
|
||||
tool_calls=tool_calls, structured_response=EXPECTED_WEATHER_PYDANTIC
|
||||
)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model, [get_weather], response_format=ProviderStrategy(WeatherBaseModel)
|
||||
)
|
||||
response = agent.invoke({"messages": [HumanMessage("What's the weather?")]})
|
||||
@@ -635,7 +629,7 @@ class TestResponseFormatAsProviderStrategy:
|
||||
tool_calls=tool_calls, structured_response=EXPECTED_WEATHER_DATACLASS
|
||||
)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model, [get_weather], response_format=ProviderStrategy(WeatherDataclass)
|
||||
)
|
||||
response = agent.invoke(
|
||||
@@ -655,7 +649,7 @@ class TestResponseFormatAsProviderStrategy:
|
||||
tool_calls=tool_calls, structured_response=EXPECTED_WEATHER_DICT
|
||||
)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model, [get_weather], response_format=ProviderStrategy(WeatherTypedDict)
|
||||
)
|
||||
response = agent.invoke({"messages": [HumanMessage("What's the weather?")]})
|
||||
@@ -673,7 +667,7 @@ class TestResponseFormatAsProviderStrategy:
|
||||
tool_calls=tool_calls, structured_response=EXPECTED_WEATHER_DICT
|
||||
)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model, [get_weather], response_format=ProviderStrategy(weather_json_schema)
|
||||
)
|
||||
response = agent.invoke({"messages": [HumanMessage("What's the weather?")]})
|
||||
@@ -699,7 +693,7 @@ def test_union_of_types() -> None:
|
||||
tool_calls=tool_calls, structured_response=EXPECTED_WEATHER_PYDANTIC
|
||||
)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
[get_weather, get_location],
|
||||
response_format=ToolStrategy(Union[WeatherBaseModel, LocationResponse]),
|
||||
|
@@ -119,7 +119,7 @@ def test_responses_integration_matrix(case: TestCase) -> None:
|
||||
http_client=http_client,
|
||||
)
|
||||
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
tools=[role_tool["tool"], dept_tool["tool"]],
|
||||
prompt=AGENT_PROMPT,
|
||||
|
@@ -71,14 +71,14 @@ def test_return_direct_integration_matrix(case: TestCase) -> None:
|
||||
)
|
||||
|
||||
if case.response_format:
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
tools=[poll_tool["tool"]],
|
||||
prompt=AGENT_PROMPT,
|
||||
response_format=ToolStrategy(case.response_format),
|
||||
)
|
||||
else:
|
||||
agent = create_react_agent(
|
||||
agent = create_agent(
|
||||
model,
|
||||
tools=[poll_tool["tool"]],
|
||||
prompt=AGENT_PROMPT,
|
||||
|
Reference in New Issue
Block a user