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
322 lines
15 KiB
Markdown
322 lines
15 KiB
Markdown
# 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).
|