- Task Planning
-
- TodoListMiddleware for breaking down complex tasks
- Context Management
-
- Filesystem tools with pluggable backends
- Task Delegation
-
- SubAgent middleware for spawning specialized agents
- Long-term Memory
-
- Persistent storage across threads via Store
- Human-in-the-loop
-
- Approval workflows for sensitive operations
- Skills
- On-demand loading of specialized capabilities
The agent harness provides these capabilities automatically - you configure, not implement.
Use Deep Agents When
Use LangChain's create_agent When
Multi-step tasks requiring planning
Simple, single-purpose tasks
Large context requiring file management
Context fits in a single prompt
Need for specialized subagents
Single agent is sufficient
Persistent memory across sessions
Ephemeral, single-session work
If you need to...
Middleware
Notes
Track complex tasks
TodoListMiddleware
Default enabled
Manage file context
FilesystemMiddleware
Configure backend
Delegate work
SubAgentMiddleware
Add custom subagents
Add human approval
HumanInTheLoopMiddleware
Requires checkpointer
Load skills
SkillsMiddleware
Provide skill directories
Access memory
MemoryMiddleware
Requires Store instance
@tool
def get_weather(city: str) -> str:
"""Get the weather for a given city."""
return f"It is always sunny in {city}"
agent = create_deep_agent(
model="claude-sonnet-4-5-20250929",
tools=[get_weather],
system_prompt="You are a helpful assistant"
)
config = {"configurable": {"thread_id": "user-123"}}
result = agent.invoke({
"messages": [{"role": "user", "content": "What's the weather in Tokyo?"}]
}, config=config)
Create a basic deep agent with a custom tool and invoke it with a user message. typescript import { createDeepAgent } from "deepagents"; import { tool } from "@langchain/core/tools"; import { z } from "zod"; const getWeather = tool( async ({ city }) => `It is always sunny in ${city}`, { name: "get_weather", description: "Get weather for a city", schema: z.object({ city: z.string() }) } ); const agent = await createDeepAgent({ model: "claude-sonnet-4-5-20250929", tools: [getWeather], systemPrompt: "You are a helpful assistant" }); const config = { configurable: { thread_id: "user-123" } }; const result = await agent.invoke({ messages: [{ role: "user", content: "What's the weather in Tokyo?" }] }, config); agent = create_deep_agent( name="my-assistant", model="claude-sonnet-4-5-20250929", tools=[custom_tool1, custom_tool2], system_prompt="Custom instructions", subagents=[research_agent, code_agent], backend=FilesystemBackend(root_dir=".", virtual_mode=True), interrupt_on={"write_file": True}, skills=["./skills/"], checkpointer=MemorySaver(), store=InMemoryStore() ) </python> <typescript> Configure a deep agent with all available options including subagents, skills, and persistence.typescript import { createDeepAgent, FilesystemBackend } from "deepagents"; import { MemorySaver, InMemoryStore } from "@langchain/langgraph"; const agent = await createDeepAgent({ name: "my-assistant", model: "claude-sonnet-4-5-20250929", tools: [customTool1, customTool2], systemPrompt: "Custom instructions", subagents: [researchAgent, codeAgent], backend: new FilesystemBackend({ rootDir: ".", virtualMode: true }), interruptOn: { write_file: true }, skills: ["./skills/"], checkpointer: new MemorySaver(), store: new InMemoryStore() }); Planning : write_todos - Track multi-step tasks Filesystem : ls , read_file , write_file , edit_file , glob , grep Delegation : task - Spawn specialized subagents SKILL.md Format Directory Structure skills/ └── my-skill/ ├── SKILL.md # Required: main skill file ├── examples.py # Optional: supporting files └── templates/ # Optional: templates SKILL.md Format
name : my - skill description : Clear , specific description of what this skill does
Skill Name
Overview Brief explanation of the skill's purpose.
When to Use Conditions when this skill applies.
Instructions
Step-by-step guidance for the agent.
Skills
Memory (AGENTS.md)
On-demand loading
Always loaded at startup
Task-specific instructions
General preferences
Large documentation
Compact context
SKILL.md in directories
Single AGENTS.md file
agent = create_deep_agent(
backend=FilesystemBackend(root_dir=".", virtual_mode=True),
skills=["./skills/"],
checkpointer=MemorySaver()
)
result = agent.invoke({
"messages": [{"role": "user", "content": "Use the python-testing skill"}]
}, config={"configurable": {"thread_id": "session-1"}})
What Agents CAN Configure
- Model selection and parameters
- Additional custom tools
- System prompt customization
- Backend storage strategy
- Which tools require approval
- Custom subagents with specialized tools
What Agents CANNOT Configure
- Core middleware removal (TodoList, Filesystem, SubAgent always present)
- The write_todos, task, or filesystem tool names
- The SKILL.md frontmatter format
Interrupts require a checkpointer. ```python
WRONG
agent = create_deep_agent(interrupt_on={"write_file": True})
CORRECT
agent = create_deep_agent(interrupt_on={"write_file": True}, checkpointer=MemorySaver())
// CORRECT
const agent = await createDeepAgent({ interruptOn: { write_file: true }, checkpointer: new MemorySaver() });
WRONG
agent = create_deep_agent(backend=lambda rt: StoreBackend(rt))
CORRECT
agent = create_deep_agent(backend=lambda rt: StoreBackend(rt), store=InMemoryStore())
// CORRECT
const agent = await createDeepAgent({ backend: (config) => new StoreBackend(config), store: new InMemoryStore() });
WRONG: Each invocation is isolated
agent.invoke({"messages": [{"role": "user", "content": "Hi"}]}) agent.invoke({"messages": [{"role": "user", "content": "What did I say?"}]})
CORRECT
config = {"configurable": {"thread_id": "user-123"}}
agent.invoke({"messages": [...]}, config=config)
agent.invoke({"messages": [...]}, config=config)
// CORRECT
const config = { configurable: { thread_id: "user-123" } };
await agent.invoke({ messages: [...] }, config);
await agent.invoke({ messages: [...] }, config);
WRONG: Missing frontmatter in SKILL.md
My Skill
This is my skill...
CORRECT: Include YAML frontmatter
name: my-skill description: Python testing best practices with pytest fixtures and mocking
My Skill
This is my skill...
CORRECT: Use FilesystemBackend for local skills
agent = create_deep_agent(
backend=FilesystemBackend(root_dir=".", virtual_mode=True),
skills=["./skills/"]
)
WRONG: Vague description
name: helper description: Helpful skill
CORRECT: Specific description
name: python-testing description: Python testing best practices with pytest fixtures, mocking, and async patterns
CORRECT: Provide skills explicitly agent = create_deep_agent( skills=["/main-skills/"], subagents=[{"name": "helper", "skills": ["/helper-skills/"], ...}] )