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,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).
|
||||
Reference in New Issue
Block a user