Models & Messages

LangChain unifies messages and model interfaces via langchain-core. In 1.0, use provider:model strings and standardized content blocks.


Model identifiers

from langchain.agents import create_agent

agent = create_agent("openai:gpt-4.1-mini", tools=[])
agent = create_agent("anthropic:claude-sonnet-4-6", tools=[])
agent = create_agent("google_genai:gemini-2.0-flash", tools=[])

Format: provider:model_id; integrations read API keys from the environment.


Explicit model instances

For temperature, base_url, proxies, etc.:

from langchain_openai import ChatOpenAI
from langchain.agents import create_agent

model = ChatOpenAI(model="gpt-4.1-mini", temperature=0)
agent = create_agent(model, tools=[])

Same pattern for Anthropic, Google, and others.


Message types

Agent messages typically include:

TypeRole
HumanMessageUser input
AIMessageModel reply (may include tool_calls)
ToolMessageTool result
SystemMessageSystem instructions
from langchain_core.messages import HumanMessage, AIMessage

result = agent.invoke({"messages": [HumanMessage(content="Hello")]})
last = result["messages"][-1]

System prompt

agent = create_agent(
    "openai:gpt-4.1-mini",
    tools=[],
    system_prompt="You are a concise technical assistant.",
)

Use middleware for dynamic system prompts.


Tool calling

Models must support tool calling. Manual bind (outside create_agent):

llm_with_tools = ChatOpenAI(model="gpt-4.1-mini").bind_tools([my_tool])
msg = llm_with_tools.invoke("What is 2 times 3?")

create_agent handles bind + loop for you.


Structured output

Agent response_format:

class Plan(BaseModel):
    steps: list[str]

agent = create_agent("openai:gpt-4.1-mini", tools=[], response_format=Plan)

Model with_structured_output: for single-step nodes in workflows.


Content blocks

Rich/multimodal content is normalized as content blocks across providers.


Dynamic model selection

Middleware can swap models by task complexity for cost/quality tradeoffs.


Next steps