diff --git a/docs/docs/agents/models.md b/docs/docs/agents/models.md index 46db9c41d..f209a1a09 100644 --- a/docs/docs/agents/models.md +++ b/docs/docs/agents/models.md @@ -70,6 +70,103 @@ When using `create_react_agent` you can specify the model by its name string, wh ) ``` +### Dynamic model selection + +Pass a callable function to `create_react_agent` to dynamically select the model at runtime. This is useful for scenarios where you want to choose a model based on user input, configuration settings, or other runtime conditions. + +The selector function must return an instance of a `BaseChatModel`. If you're using tools, you must bind the tools to the model within the selector function. + +```python +openai_model = init_chat_model("openai:gpt-4o") +anthropic_model = init_chat_model("anthropic:claude-sonnet-4-20250514") + +# highlight-next-line +def select_model(state, runtime: Runtime[CustomContext]) -> BaseChatModel: + if runtime.context.provider == "anthropic": + model = anthropic_model + elif runtime.context.provider == "openai": + model = openai_model + else: + raise ValueError(f"Unsupported provider: {runtime.context.provider}") + # With dynamic model selection, you must bind tools explicitly + # highlight-next-line + return model.bind_tools(tools_to_use) + +# Create agent with dynamic model selection +agent = create_react_agent( + # highlight-next-line + select_model, + tools=all_known_tools +) +``` + + +??? example "Extended example: dynamically select model and tools" + + ```python + from dataclasses import dataclass + from typing import Literal + from langchain.chat_models import init_chat_model + from langchain_core.language_models import BaseChatModel + from langchain_core.tools import tool + from langgraph.prebuilt import create_react_agent + from langgraph.prebuilt.chat_agent_executor import AgentState + from langgraph.runtime import Runtime + + # Define the runtime context + @dataclass + class CustomContext: + provider: Literal["anthropic", "openai"] + + @tool + def weather() -> str: + """Returns the current weather conditions.""" + return "It's nice and sunny." + + # Initialize models + openai_model = init_chat_model("openai:gpt-4o") + anthropic_model = init_chat_model("anthropic:claude-sonnet-4-20250514") + + @dataclass + class CustomContext: + provider: Literal["anthropic", "openai"] + + # Initialize models + openai_model = init_chat_model("openai:gpt-4o") + anthropic_model = init_chat_model("anthropic:claude-sonnet-4-20250514") + + # Selector function for model choice + def select_model(state: AgentState, runtime: Runtime[CustomContext]) -> BaseChatModel: + if runtime.context.provider == "anthropic": + model = anthropic_model + elif runtime.context.provider == "openai": + model = openai_model + else: + raise ValueError(f"Unsupported provider: {runtime.context.provider}") + + # With dynamic model selection, you must bind tools explicitly + return model.bind_tools([weather]) + + # Create agent with dynamic model selection + agent = create_react_agent(select_model, tools=[weather]) + + # Invoke with context to select model + output = agent.invoke( + { + "messages": [ + { + "role": "user", + "content": "Which model is handling this?", + } + ] + }, + context=CustomContext(provider="openai"), + ) + + print(output["messages"][-1].text()) + ``` + + ## Advanced model configuration ### Disable streaming diff --git a/docs/docs/how-tos/tool-calling.md b/docs/docs/how-tos/tool-calling.md index 368ac3d06..d2c6a85ed 100644 --- a/docs/docs/how-tos/tool-calling.md +++ b/docs/docs/how-tos/tool-calling.md @@ -130,10 +130,8 @@ agent = create_react_agent( """Returns the direction the user is facing.""" return "North" - model = init_chat_model("anthropic:claude-sonnet-4-20250514") - # highlight-next-line def configure_model(state: AgentState, runtime: Runtime[CustomContext]): """Configure the model with tools based on runtime context."""