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:
2026-06-22 11:29:03 +03:00
parent ed5b5c91bf
commit 75601988c2
220 changed files with 13069 additions and 3 deletions
+321
View File
@@ -0,0 +1,321 @@
# Open SWE
## Что это в одном абзаце
Open SWE — это open-source фреймворк LangChain Inc. для построения **внутренних кодинг-агентов организации**. Анонсирован в августе 2025, стабильная версия репозитория набрала 971+ коммитов и 10k stars к июню 2026. Open SWE — это **не готовое SaaS-решение**, а стартовый шаблон: он скомпонован поверх Deep Agents (а значит поверх LangGraph), поддерживает pluggable sandbox-провайдеры (Modal, Daytona, Runloop, LangSmith), триггеры из Slack / Linear / GitHub, и автоматически создаёт draft PR. Архитектура намеренно воспроизводит паттерны, которые Stripe (Minions), Ramp (Inspect) и Coinbase (Cloudbot) построили как proprietary — Open SWE даёт open-source реализацию «reference architecture» для кастомных внутренних coding agent-ов.
**Метаданные на дату snapshot 2026-06-22:**
- GitHub stars: ~10k
- Commits: 971+ (активная разработка)
- License: MIT
- JS-аналог: нет (Python-only проект, плюс TypeScript UI в `ui/`)
- Главный blog-пост: первоначальный анонс — август 2025, переработанная версия — 17 марта 2026
**Источники:**
- README `github.com/langchain-ai/open-swe` (raw-форма успешно получена)
- `blog.langchain.com/open-swe-an-open-source-framework-for-internal-coding-agents`
- https://github.com/langchain-ai/open-swe/blob/main/INSTALLATION.md
- https://github.com/langchain-ai/open-swe/blob/main/CUSTOMIZATION.md
---
## Ключевые API и архитектурные компоненты
Open SWE — это не библиотека, а **приложение**, состоящее из backend-агента (Python), UI (TypeScript), и набора middleware/интеграций. Поэтому «API» здесь — это точки расширения, через которые организация кастомизирует фреймворк.
### Импорты внутри Open SWE
```python
from open_swe.agent import create_agent # точка входа в агент
from open_swe.middleware import (
check_message_queue_before_model,
notify_step_limit_reached,
open_pr_if_needed,
ToolErrorMiddleware,
)
from open_swe.sandbox import (
SandboxBackend,
ModalBackend,
DaytonaBackend,
RunloopBackend,
LangSmithBackend,
)
from open_swe.tools import (
execute,
fetch_url,
http_request,
linear_comment,
slack_thread_reply,
)
```
### Основная точка расширения — `create_deep_agent`
```python
from deepagents import create_deep_agent
from open_swe.middleware import check_message_queue_before_model
from open_swe.sandbox import DaytonaBackend
agent = create_deep_agent(
model="anthropic:claude-opus-4-6",
system_prompt=construct_system_prompt(repo_dir, ...),
tools=[
execute,
fetch_url,
http_request,
linear_comment,
slack_thread_reply,
],
backend=DaytonaBackend(api_key="..."),
middleware=[
ToolErrorMiddleware(),
check_message_queue_before_model,
open_pr_if_needed,
],
)
```
### Sandboxes (pluggable)
```python
from open_swe.sandbox import DaytonaBackend, ModalBackend, RunloopBackend
backend = DaytonaBackend(api_key="...")
# или ModalBackend(token_id="...", token_secret="...")
# или RunloopBackend(api_key="...")
```
Каждый backend — изолированный Linux-контейнер с полным shell-доступом, клоном репозитория и persistent state для thread-а.
### Triggers (поверхности вызова)
- **Slack** — `@openswe` в любом thread. Поддерживает синтаксис `repo:owner/name`.
- **Linear** — `@openswe` в комментарии к issue.
- **GitHub** — `@openswe` в PR-комментарии для авто-ответа на review.
Каждый триггер создаёт deterministic thread_id, чтобы follow-up сообщения маршрутизировались в тот же запущенный агент.
### Built-in tools
| Tool | Назначение |
|---|---|
| `execute` | shell-команды в sandbox |
| `fetch_url` | загрузка web-страниц как markdown |
| `http_request` | API calls (GET, POST, etc.) |
| `linear_comment` | комментарии в Linear-тикетах |
| `slack_thread_reply` | ответы в Slack-тредах |
| `read_file` / `write_file` / `edit_file` / `ls` / `glob` / `grep` | Deep Agents filesystem tools |
| `write_todos` | planning tool от Deep Agents |
| `task` | spawning subagent-ов |
GitHub-операции делаются через `gh` CLI внутри sandbox с `GH_TOKEN=dummy`, авторизация через LangSmith-прокси.
### AGENTS.md конвенция
Если в репозитории есть файл `AGENTS.md` в корне, он автоматически читается из sandbox и инжектится в system prompt. Это «правила команды» — conventions, testing requirements, архитектурные решения.
### Middleware (точки расширения)
```python
from langchain.agents.middleware import AgentMiddleware
class MyCustomMiddleware(AgentMiddleware):
def before_model(self, state, runtime):
# модифицировать state перед model call
return state
def after_model(self, state, runtime):
# логирование / проверка результата
return state
```
Типичные middleware в Open SWE:
- `check_message_queue_before_model` — инжектит follow-up сообщения до следующего model call.
- `notify_step_limit_reached` — после-agent hook для Slack-уведомления, если лимит исчерпан.
- `open_pr_if_needed` — safety net: коммитит и открывает PR, если агент этого не сделал.
- `ToolErrorMiddleware` — graceful handling ошибок tool-ов.
### Customization точка: `CUSTOMIZATION.md`
Согласно документации, pluggable компоненты:
1. **Sandbox provider** — Modal / Daytona / Runloop / LangSmith / свой.
2. **Model** — любой провайдер через `langchain.chat_models.init_chat_model`.
3. **Tools** — добавить/удалить через массив `tools`.
4. **Triggers** — модифицировать Slack / Linear / GitHub интеграции.
5. **System prompt** — база + логика инкорпорирования AGENTS.md.
6. **Middleware** — добавить свой для validation / approval / logging.
---
## Что нового в первом релизе
### Оригинальный анонс (август 2025)
- Multi-agent архитектура: Manager + Planner + Programmer + Reviewer.
- Single sandbox (Daytona).
- GitHub Issues + Web UI триггеры.
### Переработанная архитектура (март 2026)
- Замена multi-agent на единый `create_deep_agent` harness + subagents + middleware.
- Добавление pluggable sandbox providers (Modal, Runloop, LangSmith).
- Добавление Slack и Linear триггеров.
- Subagent-ы через `task` tool от Deep Agents.
- Middleware-система для deterministic orchestration.
### Ключевой сдвиг
Open SWE **переехал с multi-agent на single-deep-agent-harness + subagents**. Это консолидация архитектурного паттерна: вместо явных Manager/Planner/Programmer/Reviewer — один главный агент с набором subagent-специализаций и middleware для orchestration. Бенефиты: upgrade path (подтягивать улучшения Deep Agents), меньше кастомного кода, чище orchestration через `Send` API.
---
## Что нужно раскрыть в презентации
- **Почему «внутренний» кодинг-агент, а не IDE-assistant** — модель «colleague, not copilot».
- **«Trust the LLM» внутри sandbox** — изоляция важнее confirmation prompts.
- **Pluggable sandboxes** — почему несколько провайдеров и как мигрировать.
- **AGENTS.md как организационный паттерн** — те же conventions применяются и для AI.
- **Subagent isolation** — каждый child получает свой контекст.
- **Middleware для validation** — детерминированные проверки между шагами агента.
- **Сравнение со Stripe Minions / Ramp Inspect / Coinbase Cloudbot** — почему конвергенция паттернов важна.
- **Open source как reference architecture** — не finished product, а стартовая точка.
---
## 5 рабочих примеров кода Python
### 1. Минимальный запуск агента Open SWE (из README)
```python
from deepagents import create_deep_agent
from open_swe.sandbox import DaytonaBackend
from open_swe.middleware import check_message_queue_before_model, open_pr_if_needed
agent = create_deep_agent(
model="openai:gpt-5.5",
system_prompt="You are an internal coding agent.",
tools=[], # будут добавлены built-in
backend=DaytonaBackend(api_key="..."),
middleware=[check_message_queue_before_model, open_pr_if_needed],
)
```
### 2. Кастомный system prompt с инкорпорированием AGENTS.md
```python
def construct_system_prompt(repo_dir: str, base_prompt: str) -> str:
agents_md_path = Path(repo_dir) / "AGENTS.md"
extra = ""
if agents_md_path.exists():
extra = f"\n\nRepository rules:\n{agents_md_path.read_text()}"
return base_prompt + extra
```
### 3. Кастомный middleware для логирования
```python
from langchain.agents.middleware import AgentMiddleware
class AuditMiddleware(AgentMiddleware):
def __init__(self, logger):
self.logger = logger
def after_model(self, state, runtime):
self.logger.info(f"model_called_at_step_{state.get('step')}")
return state
```
### 4. Subagent-конфигурация для специализаций
```python
test_runner = {
"name": "test_runner",
"description": "Runs project tests and reports results",
"system_prompt": "You run tests, parse failures, suggest fixes.",
"tools": ["execute", "read_file"],
}
doc_writer = {
"name": "doc_writer",
"description": "Updates documentation after code changes",
"system_prompt": "You update markdown docs based on code changes.",
"tools": ["read_file", "edit_file"],
}
agent = create_deep_agent(
model="anthropic:claude-opus-4-6",
tools=[],
subagents=[test_runner, doc_writer],
)
```
### 5. Кастомный sandbox backend (заглушка)
```python
from open_swe.sandbox import SandboxBackend
class MyInternalBackend(SandboxBackend):
def __init__(self, connection_string: str):
self.conn = connection_string
def execute(self, command: str) -> str:
# подключение к внутреннему devbox-пулу
return self._run_in_devbox(command)
def read_file(self, path: str) -> str:
return self._fetch_from_devbox(path)
```
---
## TypeScript
**UI:** репозиторий содержит `ui/` (TypeScript, 26.6% от кода). Это web-приложение для управления: GitHub login, per-user model/profile settings, team defaults, enabled-repo management, chat UI.
```typescript
// Пример из ui/ (псевдокод, точная структура зависит от версии)
import { OpenSWEClient } from "@openswe/client";
const client = new OpenSWEClient({
langsmithApiKey: process.env.LANGSMITH_API_KEY,
});
await client.invoke({
threadId: "issue-123",
prompt: "Fix the bug in src/auth.py",
repo: "owner/name",
});
```
**Где нет TS-аналога для backend:** Open SWE — это Python-приложение (LangGraph/Deep Agents), TypeScript только в UI-слое.
---
## Плюсы и минусы
### Плюсы
- **MIT license** — можно форкать и адаптировать.
- **Pluggable sandbox** — Modal / Daytona / Runloop / LangSmith / свой.
- **Subagents + middleware** — composable вместо monolithic.
- **AGENTS.md convention** — переиспользует существующий паттерн документации.
- **Multiple triggers** — Slack / Linear / GitHub / Web UI.
- **Built on Deep Agents** — automatic upgrade path для improvements.
- **Хорошая документация** — INSTALLATION.md и CUSTOMIZATION.md детальные.
- **Active development** — 971+ коммитов, 10k stars.
### Минусы
- **Не finished product** — нужно кастомизировать под свою org.
- **Sandbox costs** — Modal / Daytona / Runloop требуют платных аккаунтов.
- **Slack / Linear / GitHub интеграции** — нужен OAuth setup для каждого.
- **Security model «trust the LLM»** — высокие требования к sandbox-изоляции.
- **Production deployment сложный** — требует LangSmith, GitHub App, sandbox provider, secrets management.
- **Observability** — нужен Datadog или LangSmith setup.
- **Документация быстро устаревает** — архитектура переписывалась за 9 месяцев.
---
## Заметки для презентации
- Это **reference architecture, not product**. Подчеркнуть, что каждый компонент заменяем.
- Использовать аналогию: **Open SWE = «Kubernetes для AI агентов»** — даёт framework, но ожидает ops-работу.
- Показать, как именно Open SWE воспроизводит паттерны Stripe/Ramp/Coinbase — это главный аргумент «convergence proof».
- Если есть audience с enterprise-бэкграундом — акцент на **sandbox isolation как security primitive**.
- Подчеркнуть, что Open SWE **не замена Cursor или Claude Code**, а инфраструктура для «своего Claude Code».
- Если показывать схему архитектуры — выделить слои: Harness (Deep Agents) → Sandbox (pluggable) → Tools (curated) → Context (AGENTS.md) → Orchestration (subagents + middleware) → Invocation (Slack/Linear/GitHub) → Validation (prompt + middleware).