75601988c2
- Cover, TOC, 5 dividers, 3 recap slides - 5 sections (chains, langgraph, deepagents, openswe, ecosystem) - design-system.js with theme tokens + 9 helper functions - research/: timeline + sources + per-tech notes - final-compile.js + merge.js for rebuild pipeline - output/: langchain-evolution.pptx (2.3 MB) + langchain-evolution.pdf (1.1 MB) + 7 sample previews
329 lines
12 KiB
Markdown
329 lines
12 KiB
Markdown
# Deep Agents
|
||
|
||
## Что это в одном абзаце
|
||
|
||
Deep Agents — это Python-библиотека LangChain Inc., позиционируемая как «batteries-included agent harness». Построена поверх LangGraph (граф-рантайм) и `langchain.agents.create_agent` (минимальный harness от LangChain 1.0). Deep Agents добавляет opinionated defaults: встроенный planning tool, pluggable filesystem backend, subagent-ы для изоляции контекста, persistent memory через `Store`, human-in-the-loop middleware. Вдохновлена Claude Code, Deep Research и Manus — то есть это попытка формализовать то, что делает Claude Code, в виде переиспользуемой библиотеки. **Важно: на дату snapshot 2026-06-22 формального major 1.0 для пакета не выпущено — последняя стабильная версия `deepagents==0.6.11`**, хотя README и блог-посты уже описывают архитектуру как «1.0-ready».
|
||
|
||
**Метаданные на дату snapshot 2026-06-22:**
|
||
- GitHub stars: ~24.9k
|
||
- Latest stable (Python): `deepagents==0.6.11` (от 18.06.2026)
|
||
- License: MIT
|
||
- JS-аналог: `deepagents` (npm, репо `langchain-ai/deepagentsjs`)
|
||
|
||
**Источники:**
|
||
- README `github.com/langchain-ai/deepagents`
|
||
- https://docs.langchain.com/oss/python/deepagents/overview
|
||
- https://www.langchain.com/blog/introducing-deepagents-cli
|
||
- https://medium.com/data-science-collective/building-deep-agents-with-langchain-1-0s-middleware-architecture-7fdbb3e47123
|
||
|
||
---
|
||
|
||
## Ключевые API (≥ 0.6.x)
|
||
|
||
### Импорты верхнего уровня
|
||
|
||
```python
|
||
from deepagents import create_deep_agent
|
||
from deepagents.middleware import SubAgentMiddleware
|
||
from deepagents.backends import FilesystemBackend, SandboxBackend
|
||
```
|
||
|
||
### Минимальный агент
|
||
|
||
```python
|
||
from deepagents import create_deep_agent
|
||
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[my_custom_tool],
|
||
system_prompt="You are a research assistant.",
|
||
)
|
||
result = agent.invoke({"messages": "Research LangGraph and write a summary"})
|
||
```
|
||
|
||
### Subagents (делегирование в изолированный контекст)
|
||
|
||
```python
|
||
from deepagents import create_deep_agent
|
||
|
||
research_agent = {
|
||
"name": "research",
|
||
"description": "Does deep web research",
|
||
"system_prompt": "You are a research specialist.",
|
||
"tools": [web_search],
|
||
}
|
||
|
||
writing_agent = {
|
||
"name": "writer",
|
||
"description": "Writes polished reports",
|
||
"system_prompt": "You are a writing specialist.",
|
||
"tools": [],
|
||
}
|
||
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
subagents=[research_agent, writing_agent],
|
||
)
|
||
# Main agent может вызывать subagents через `task` tool
|
||
```
|
||
|
||
### Filesystem backend
|
||
|
||
```python
|
||
from deepagents.backends import FilesystemBackend
|
||
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
backend=FilesystemBackend(root_dir="./workspace"),
|
||
)
|
||
# Встроенные tools: read_file, write_file, edit_file, ls, glob, grep
|
||
```
|
||
|
||
### Sandbox backend (для удалённого выполнения)
|
||
|
||
```python
|
||
from deepagents.backends import SandboxBackend
|
||
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
backend=SandboxBackend(provider="daytona", api_key="..."),
|
||
)
|
||
```
|
||
|
||
### Custom middleware (через LangChain 1.0 middleware)
|
||
|
||
```python
|
||
from langchain.agents.middleware import HumanInTheLoopMiddleware
|
||
from deepagents import create_deep_agent
|
||
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
middleware=[HumanInTheLoopMiddleware(interrupt_on={"bash": True})],
|
||
)
|
||
```
|
||
|
||
### Persistent memory через Store
|
||
|
||
```python
|
||
from langgraph.store.memory import InMemoryStore
|
||
|
||
store = InMemoryStore()
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
store=store,
|
||
)
|
||
# Cross-session memory через `store` namespace
|
||
```
|
||
|
||
### Skills (reusable behaviors)
|
||
|
||
```python
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
skills=[
|
||
{"name": "code_review", "path": "./skills/code_review.md"},
|
||
{"name": "deploy", "path": "./skills/deploy.md"},
|
||
],
|
||
)
|
||
```
|
||
|
||
---
|
||
|
||
## Что нового
|
||
|
||
### Архитектурные изменения по сравнению с просто `create_agent`
|
||
- **Planning tool `write_todos`** — встроенный, не надо писать свой.
|
||
- **Filesystem tools** — `read_file` / `write_file` / `edit_file` / `ls` / `glob` / `grep` — стандартный набор.
|
||
- **Subagent tool `task`** — вызов child-агента с изолированным контекстом.
|
||
- **Context management** — суммаризация длинных тредов, offloading tool outputs на диск.
|
||
- **Shell access** — `bash` tool для выполнения команд.
|
||
- **Pluggable backends** — local filesystem или remote sandbox.
|
||
- **Persistent memory** — cross-session recall через Store.
|
||
- **HITL middleware** — approve/edit/reject tool calls до их исполнения.
|
||
- **Skills system** — переиспользуемые поведения, загружаемые on-demand.
|
||
|
||
### Что нового в 0.6.x (последняя ветка на snapshot)
|
||
- Полная интеграция с LangChain 1.0 middleware-системой.
|
||
- Поддержка `Send` API для параллельных subagent-вызовов.
|
||
- Стабилизация плагинной системы backends.
|
||
- Улучшения в skills: версионирование и hot-reload.
|
||
|
||
---
|
||
|
||
## Что нужно раскрыть в презентации
|
||
|
||
- **Зачем Deep Agents поверх LangChain и LangGraph?** — opinionated defaults, батарейки в комплекте.
|
||
- **`task` tool и subagent isolation** — почему subagent-ы получают свой контекст, а не общий.
|
||
- **`write_todos` planning** — как агент декомпозирует задачу.
|
||
- **Filesystem как context overflow protection** — большие результаты offload-ятся на диск.
|
||
- **Sandbox backends** — Daytona, Modal, Runloop, LangSmith — паттерн «isolate first, full permissions inside».
|
||
- **Skills vs Tools** — skills это «знания» (markdown-инструкции), tools это «действия».
|
||
- **Security model** — «trust the LLM», границы только на уровне tool / sandbox.
|
||
- **Сравнение с Claude Code** — попытка воспроизвести паттерн, но в виде библиотеки.
|
||
|
||
---
|
||
|
||
## 7 рабочих примеров кода Python
|
||
|
||
### 1. Hello world
|
||
|
||
```python
|
||
from deepagents import create_deep_agent
|
||
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
system_prompt="You are a helpful assistant.",
|
||
)
|
||
result = agent.invoke({"messages": "Write a haiku about Python"})
|
||
```
|
||
|
||
### 2. С кастомным tool
|
||
|
||
```python
|
||
from langchain.tools import tool
|
||
from deepagents import create_deep_agent
|
||
|
||
@tool
|
||
def get_stock_price(ticker: str) -> str:
|
||
"""Return current stock price."""
|
||
return f"${ticker}: 123.45 USD"
|
||
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[get_stock_price],
|
||
)
|
||
result = agent.invoke({"messages": "What's the price of AAPL?"})
|
||
```
|
||
|
||
### 3. Subagent для делегирования
|
||
|
||
```python
|
||
from deepagents import create_deep_agent
|
||
|
||
researcher = {
|
||
"name": "researcher",
|
||
"description": "Researches topics on the web",
|
||
"system_prompt": "You do thorough research.",
|
||
"tools": [],
|
||
}
|
||
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
subagents=[researcher],
|
||
)
|
||
result = agent.invoke({"messages": "Research quantum computing and write a 200-word summary"})
|
||
```
|
||
|
||
### 4. Filesystem backend
|
||
|
||
```python
|
||
from deepagents import create_deep_agent
|
||
from deepagents.backends import FilesystemBackend
|
||
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
backend=FilesystemBackend(root_dir="./workspace"),
|
||
)
|
||
result = agent.invoke({"messages": "Create a file notes.md with Python best practices"})
|
||
```
|
||
|
||
### 5. HITL middleware
|
||
|
||
```python
|
||
from langchain.agents.middleware import HumanInTheLoopMiddleware
|
||
from deepagents import create_deep_agent
|
||
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
middleware=[HumanInTheLoopMiddleware(interrupt_on={"bash": True, "write_file": True})],
|
||
)
|
||
# При попытке выполнить bash или write_file — interrupt, ждёт человека
|
||
```
|
||
|
||
### 6. Persistent memory
|
||
|
||
```python
|
||
from langgraph.store.memory import InMemoryStore
|
||
from deepagents import create_deep_agent
|
||
|
||
store = InMemoryStore()
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
store=store,
|
||
system_prompt="Remember user preferences.",
|
||
)
|
||
# Store put/get вызываются изнутри нод агента
|
||
```
|
||
|
||
### 7. Skills (загрузка поведений)
|
||
|
||
```python
|
||
from deepagents import create_deep_agent
|
||
|
||
agent = create_deep_agent(
|
||
model="openai:gpt-4.1",
|
||
tools=[],
|
||
skills=["./skills/code_review.md", "./skills/deploy.md"],
|
||
)
|
||
# Агент загрузит skill когда посчитает нужным
|
||
```
|
||
|
||
---
|
||
|
||
## TypeScript-аналог
|
||
|
||
```typescript
|
||
import { createDeepAgent } from "deepagents";
|
||
|
||
const agent = await createDeepAgent({
|
||
model: "openai:gpt-4.1",
|
||
tools: [],
|
||
systemPrompt: "You are a helpful assistant.",
|
||
});
|
||
|
||
const result = await agent.invoke({ messages: "Write a haiku" });
|
||
```
|
||
|
||
JS-версия (`langchain-ai/deepagentsjs`) покрывает базовый API, но filesystem/sandbox backend-ы и subagents-конфигурация могут отставать от Python.
|
||
|
||
---
|
||
|
||
## Плюсы и минусы текущей версии (0.6.x)
|
||
|
||
### Плюсы
|
||
- **Batteries included** — planning + filesystem + subagents + skills из коробки.
|
||
- **Меньше boilerplate** чем LangGraph, opinionated defaults.
|
||
- **Плагинные backends** — local / Daytona / Modal / Runloop / LangSmith.
|
||
- **Skills system** — переиспользуемые поведения on-demand.
|
||
- **Open source + MIT** — можно форкать и адаптировать.
|
||
- **Хорошо документированный security model** — «trust the LLM, restrict at tool level».
|
||
|
||
### Минусы
|
||
- **Major 1.0 не зафиксирован** — нумерация 0.6.x может означать breaking changes в minor.
|
||
- **Opinionated** — если дефолты не подходят, override-ы могут быть сложными.
|
||
- **Sandbox providers требуют внешние аккаунты** — Daytona / Modal / Runloop — это SaaS.
|
||
- **Skills — новый концепт** — экосистема готовых skills ещё формируется.
|
||
- **Документация по middleware+skills** — некоторые edge cases не покрыты.
|
||
- **Performance overhead** — плагинная архитектура добавляет latency.
|
||
|
||
---
|
||
|
||
## Заметки для презентации
|
||
|
||
- Подчеркнуть иерархию: **LangGraph = runtime, LangChain.create_agent = thin harness, Deep Agents = opinionated harness**.
|
||
- Использовать аналогию: **Deep Agents = "Django поверх raw WSGI"**, даёт быстрый старт, но с conventions.
|
||
- Показать, как `task` tool позволяет main agent делегировать без загрязнения своего контекста.
|
||
- Объяснить, почему именно Claude Code вдохновил — это конкурентный аргумент: «посмотрите, что сделал Anthropic, мы сделали то же в open source».
|
||
- Если рассказывать про Open SWE — это **реальный пример использования Deep Agents как harness-а** для кодинг-агента.
|