Files
langchain-evolution-deck/research/per-tech/openswe.md
T
petya 75601988c2 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
2026-06-22 11:29:03 +03:00

322 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).