Initial commit: LangChain evolution tutorial deck (132 slides)
- 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
This commit is contained in:
@@ -0,0 +1,328 @@
|
||||
# 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-а** для кодинг-агента.
|
||||
Reference in New Issue
Block a user