deep-agents-core

작성자: langchain-ai

Deep Agents 애플리케이션을 구축할 때 이 스킬을 호출하세요. create_deep_agent(), 하네스 아키텍처, SKILL.md 형식 및 구성 옵션을 다룹니다.

npx skills add https://github.com/langchain-ai/skills-benchmarks --skill deep-agents-core
Deep Agents are an opinionated agent framework built on LangChain/LangGraph with built-in middleware:
  • 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 WhenUse LangChain's create_agent When
Multi-step tasks requiring planningSimple, single-purpose tasks
Large context requiring file managementContext fits in a single prompt
Need for specialized subagentsSingle agent is sufficient
Persistent memory across sessionsEphemeral, single-session work
If you need to...MiddlewareNotes
Track complex tasksTodoListMiddlewareDefault enabled
Manage file contextFilesystemMiddlewareConfigure backend
Delegate workSubAgentMiddlewareAdd custom subagents
Add human approvalHumanInTheLoopMiddlewareRequires checkpointer
Load skillsSkillsMiddlewareProvide skill directories
Access memoryMemoryMiddlewareRequires Store instance
Create a basic deep agent with a custom tool and invoke it with a user message. ```python from deepagents import create_deep_agent from langchain.tools import tool

@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)

</python>
<typescript>
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);
Configure a deep agent with all available options including subagents, skills, and persistence. ```python from deepagents import create_deep_agent from deepagents.backends import FilesystemBackend from langgraph.checkpoint.memory import MemorySaver from langgraph.store.memory import InMemoryStore

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()
});
Every deep agent has access to:
  1. Planning: write_todos - Track multi-step tasks
  2. Filesystem: ls, read_file, write_file, edit_file, glob, grep
  3. Delegation: task - Spawn specialized subagents

SKILL.md Format

Skills use **progressive disclosure** - agents only load content when relevant.

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.
SkillsMemory (AGENTS.md)
On-demand loadingAlways loaded at startup
Task-specific instructionsGeneral preferences
Large documentationCompact context
SKILL.md in directoriesSingle AGENTS.md file
Set up an agent with skills directory and filesystem backend for on-demand skill loading. ```python from deepagents import create_deep_agent from deepagents.backends import FilesystemBackend from langgraph.checkpoint.memory import MemorySaver

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"}})

</python>
<typescript>
Set up an agent with skills directory and filesystem backend for on-demand skill loading.
```typescript
import { createDeepAgent, FilesystemBackend } from "deepagents";
import { MemorySaver } from "@langchain/langgraph";

const agent = await createDeepAgent({
  backend: new FilesystemBackend({ rootDir: ".", virtualMode: true }),
  skills: ["./skills/"],
  checkpointer: new MemorySaver()
});

const result = await agent.invoke({
  messages: [{ role: "user", content: "Use the python-testing skill" }]
}, { configurable: { thread_id: "session-1" } });
Load skill content into a Store backend for environments without filesystem access. ```python from deepagents import create_deep_agent from deepagents.backends import StoreBackend from deepagents.backends.utils import create_file_data from langgraph.store.memory import InMemoryStore

store = InMemoryStore()

Load skill content into store

skill_content = """--- name: python-testing description: Best practices for Python testing with pytest

Python Testing Skill

..."""

store.put( namespace=("filesystem",), key="/skills/python-testing/SKILL.md", value=create_file_data(skill_content) )

agent = create_deep_agent( backend=lambda rt: StoreBackend(rt), store=store, skills=["/skills/"] )

</python>
</ex-skills-with-store-backend>

<boundaries>
### 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
</boundaries>

<fix-checkpointer-for-interrupts>
<python>
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())
Interrupts require a checkpointer. ```typescript // WRONG const agent = await createDeepAgent({ interruptOn: { write_file: true } });

// CORRECT const agent = await createDeepAgent({ interruptOn: { write_file: true }, checkpointer: new MemorySaver() });

</typescript>
</fix-checkpointer-for-interrupts>

<fix-store-for-memory>
<python>
StoreBackend requires a Store instance for persistent memory across threads.
```python
# WRONG
agent = create_deep_agent(backend=lambda rt: StoreBackend(rt))

# CORRECT
agent = create_deep_agent(backend=lambda rt: StoreBackend(rt), store=InMemoryStore())
StoreBackend requires a Store instance for persistent memory across threads. ```typescript // WRONG const agent = await createDeepAgent({ backend: (config) => new StoreBackend(config) });

// CORRECT const agent = await createDeepAgent({ backend: (config) => new StoreBackend(config), store: new InMemoryStore() });

</typescript>
</fix-store-for-memory>

<fix-thread-id-for-conversations>
<python>
Use consistent thread_id to maintain conversation context across invocations.
```python
# 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)
Use consistent thread_id to maintain conversation context across invocations. ```typescript // WRONG: Each invocation is isolated await agent.invoke({ messages: [{ role: "user", content: "Hi" }] }); await agent.invoke({ messages: [{ role: "user", content: "What did I say?" }] });

// CORRECT const config = { configurable: { thread_id: "user-123" } }; await agent.invoke({ messages: [...] }, config); await agent.invoke({ messages: [...] }, config);

</typescript>
</fix-thread-id-for-conversations>

<fix-frontmatter-required>
```markdown
# 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...
Skills require a proper backend to load from the filesystem. ```python # WRONG: Skills won't load without proper backend agent = create_deep_agent(skills=["./skills/"])

CORRECT: Use FilesystemBackend for local skills

agent = create_deep_agent( backend=FilesystemBackend(root_dir=".", virtual_mode=True), skills=["./skills/"] )

</python>
</fix-backend-for-skills>

<fix-specific-skill-descriptions>
Use specific descriptions to help agents decide when to use a skill.
```markdown
# 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
---
Skills are not inherited by subagents - provide them explicitly. ```python # WRONG: Custom subagents don't inherit skills agent = create_deep_agent( skills=["/main-skills/"], subagents=[{"name": "helper", ...}] # No skills )

CORRECT: Provide skills explicitly

agent = create_deep_agent( skills=["/main-skills/"], subagents=[{"name": "helper", "skills": ["/helper-skills/"], ...}] )

</python>
</fix-subagent-skills>

langchain-ai의 다른 스킬

langgraph-docs
langchain-ai
LangGraph 문서에 접근하여 상태 기반 에이전트 및 멀티 에이전트 워크플로우를 구축합니다. 공식 LangGraph Python 문서를 가져오며, 상태 머신, 그래프 기반 에이전트 설계, 인간 개입 패턴을 다룹니다. 쿼리 유형에 따라 관련 문서를 우선시합니다: 방법 질문에는 구현 가이드, 이론에는 개념 페이지, 종단 간 예제에는 튜토리얼, 기술 세부 사항에는 API 참조를 제공합니다. 자동으로 가장 관련성 높은 2~4개의 문서 URL을 선택하고 해당 콘텐츠를 검색하여 답변합니다...
official
langgraph-human-in-the-loop
langchain-ai
그래프 실행을 일시 중지하여 사람의 검토, 승인 또는 검증을 받은 후, 입력을 받아 다시 실행합니다. 세 가지 구성 요소가 필요합니다: 체크포인터(InMemorySaver 또는 PostgresSaver), config의 스레드 ID, JSON 직렬화 가능한 인터럽트 페이로드. interrupt(value)는 데이터를 일시 중지하고 표시하며, Command(resume=value)는 다시 시작하여 일시 중지된 노드에 해당 값을 반환합니다. interrupt() 이전의 모든 코드는 다시 시작 시 재실행되므로, 부작용은 멱등성을 가져야 합니다(insert 대신 upsert 사용). 승인 워크플로우를 지원합니다,...
official
web-research
langchain-ai
웹 리서치와 관련된 요청에 이 스킬을 사용하세요. 포괄적인 웹 리서치를 수행하기 위한 체계적인 접근 방식을 제공합니다.
official
langchain-oss-primer
langchain-ai
LangChain, Deep Agents 또는 LangGraph 에이전트 구축 프로젝트를 시작할 때는 항상 여기서 시작하세요. 다른 스킬을 선택하거나 코드를 작성하기 전에 반드시 거쳐야 하는 시작점입니다.
official
skill-creator
langchain-ai
에이전트의 기능을 확장하기 위한 효과적인 스킬을 만드는 가이드로, 특화된 지식, 워크플로우 또는 도구 통합을 포함합니다. 사용자가...
official
social-media
langchain-ai
플랫폼별 소셜 미디어 게시물을 초안 작성하며, 연구 기반 콘텐츠와 함께 생성된 보조 이미지를 제공합니다. 링크드인 게시물(1,300자, 전문적인 어조)과 트위터/X 스레드(트윗당 280자, 1/🧵 형식)를 지원합니다. 작성 전에 하위 에이전트에 연구를 위임한 후, 결과를 읽어 정확성과 관련성을 확인해야 합니다. generate_social_image 도구를 사용하여 자동으로 눈에 띄는 소셜 이미지를 생성하며, 작은 화면에 최적화된 대담하고 대비가 높은 구성을 사용합니다.
official
deep-agents-memory
langchain-ai
Deep Agents를 위한 플러그형 메모리 및 파일 백엔드로, 임시, 영구 및 하이브리드 라우팅 옵션을 제공합니다. 네 가지 백엔드 유형: StateBackend(스레드 범위, 임시), StoreBackend(세션 간 영구), FilesystemBackend(로컬 개발을 위한 실제 디스크 액세스), CompositeBackend(다른 경로를 다른 백엔드로 라우팅). FilesystemMiddleware는 ls, read_file, write_file, edit_file, glob, grep의 여섯 가지 파일 작업 도구를 제공합니다. CompositeBackend는 최장 접두사 일치를 사용하여 라우팅합니다...
official
deep-agents-orchestration
langchain-ai
서브 에이전트를 조율하고, 다단계 작업을 계획하며, 민감한 작업에 대해 인간의 승인을 요구합니다. task 도구를 통해 전문화된 서브 에이전트에 작업을 위임합니다. 맞춤형 서브 에이전트는 격리된 도구 세트와 시스템 프롬프트를 지원하며, 기본 "범용" 서브 에이전트는 메인 에이전트 구성을 상속받습니다. write_todos를 사용하여 복잡한 워크플로우를 계획 및 추적하고, 보류 중, 진행 중, 완료 상태로 작업을 구성합니다. 호출 간 지속성을 위해 thread_id가 필요합니다. 구현...
official