browser-agent - это автономный браузерный агент на Playwright и OpenAI.
Он работает в видимом Chromium, сам наблюдает страницу, получает от модели следующее действие, исполняет его и продолжает цикл, пока не завершит задачу или не упрётся в guardrails.
Текущий цикл выполнения:
observe -> decide -> act -> observe
Проект специально устроен просто:
- один основной агент принимает runtime-решения;
- нет
LangGraph; - нет planner/evaluator-стадий;
- нет отдельного vision-agent;
- нет sidecar-компонента, который может завершить задачу вместо основного агента.
Агент умеет:
- управлять реальным браузером через Playwright;
- извлекать видимый текст страницы и интерактивные элементы;
- прикладывать к каждому шагу скриншот с помеченными элементами;
- кликать по element id или по координатам;
- вводить текст, нажимать клавиши, скроллить, переключать вкладки, ждать, переходить по URL;
- хранить устойчивые факты между шагами через
save_memory; - спрашивать пользователя перед чувствительными действиями;
- локально детектировать часть циклов, blocked clicks и проблемных UI-состояний.
CLI / user task
-> Agent.run()
-> BrowserManager.observe()
-> page_parser.extract_page_state()
-> annotated screenshot
-> MessageManager
-> OpenAI JSON-schema response
-> ToolRegistry validation
-> BrowserManager / state actions
-> loop detection + security gate
-> next observation
Ключевые особенности текущего runtime:
- модель возвращает не произвольный текст, а JSON по схеме
AgentOutput; - runtime сам валидирует имя инструмента и аргументы;
- за шаг разрешён максимум один browser action;
- state actions вроде
save_memoryможно комбинировать с этим browser action; - старые части диалога могут сжиматься, поэтому всё важное для будущих шагов нужно сохранять через
save_memory; - OpenAI native tool calling сейчас не используется как execution contract: модель возвращает JSON, а инструменты исполняются локально.
src/agent/core.py- главный orchestration loopsrc/agent/message_manager.py- сборка observation messages и compression историиsrc/agent/tool_registry.py- схемы действий, валидация, action signaturessrc/agent/state.py- состояние агента, память, fingerprints, step historysrc/agent/prompts.py- главный system prompt и runtime-правилаsrc/browser/controller.py- запуск Playwright context и ожидание стабилизации страницыsrc/browser/manager.py- выполнение browser actions и нормализация результатовsrc/parser/page_parser.py- извлечение текста, интерактивных элементов, модалок и скриншотовsrc/security/security_layer.py- prompt-injection эвристикиsrc/security/classifier.pyиsrc/security/gate.py- классификация рискованных действий и подтверждение через CLI
- Python
3.12+ uvOPENAI_API_KEY
uv sync --dev
uv run playwright install chromiumСоздайте .env в корне проекта:
OPENAI_API_KEY=sk-...Минимальные полезные overrides:
BROWSER_AGENT_MAIN_MODEL=gpt-4o
BROWSER_AGENT_SECURITY_MODEL=gpt-4.1-nano
BROWSER_AGENT_MAX_STEPS=50uv run python -m src.mainПосле запуска откроется видимый Chromium, а CLI начнёт принимать задачи.
Поддерживаемые встроенные команды:
helpexitquit
Пример:
> Найди официальный сайт компании и открой страницу pricing
> Перейди в историю заказов и сохрани номера последних трёх заказов
> Найди товар, открой карточку и выпиши цену и условия доставки
- браузер запускается в visible mode;
- используется persistent profile, по умолчанию в
.browser-data; - locale контекста -
ru-RU; - загрузки сохраняются в
./downloads; - JavaScript dialogs автоматически принимаются в browser controller;
- на скриншоте элементы помечаются числовыми ref-метками;
- если
click(element_id)на той же странице выглядит ненадёжно, агент может перейти наclick_coordinates(x, y, description); - если клик заблокирован overlay/popup и безопасного
hreffallback нет, runtime возвращает failure вместо спама повторов.
Browser actions:
navigateclickclick_coordinatestype_textpress_keyscrollgo_backget_tabsswitch_tabwait
State actions:
save_memoryask_userdone
В проекте несколько защитных слоёв:
SecurityLayerищет prompt-injection паттерны в тексте страницы и labels элементов;SecurityGateотдельно классифицируетclick,click_coordinatesиtype_text;- для чувствительных действий может запрашиваться подтверждение в терминале;
- runtime дополнительно блокирует повтор одного и того же действия на той же странице и подсказывает сменить стратегию.
Это делает поведение безопаснее, но увеличивает latency и friction на checkout-like сценариях, изменениях аккаунта, отправке сообщений и других high-impact действиях.
Основные настройки лежат в src/config/settings.py.
Самые важные переменные:
| Variable | Default | Назначение |
|---|---|---|
OPENAI_API_KEY |
none | Обязательный API key |
BROWSER_AGENT_MAIN_MODEL |
gpt-4o |
Основная модель принятия решений |
BROWSER_AGENT_SECURITY_MODEL |
gpt-4.1-nano |
Модель security classifier |
BROWSER_AGENT_SECURITY_USE_SCREENSHOT |
false |
Передавать ли screenshot в security classification |
BROWSER_AGENT_BROWSER_DATA_DIR |
.browser-data |
Папка persistent browser profile |
BROWSER_AGENT_VIEWPORT_WIDTH |
1280 |
Ширина viewport |
BROWSER_AGENT_VIEWPORT_HEIGHT |
900 |
Высота viewport |
BROWSER_AGENT_NAVIGATION_TIMEOUT_MS |
30000 |
Таймаут навигации |
BROWSER_AGENT_MAX_STEPS |
50 |
Максимум шагов на run |
BROWSER_AGENT_MAX_RETRIES_PER_STEP |
3 |
Порог repeated failures |
BROWSER_AGENT_MAX_STUCK_STEPS |
4 |
Порог stuck behavior |
BROWSER_AGENT_SCREENSHOT_QUALITY |
75 |
Качество JPEG screenshot |
В src/config/settings.py есть и другие переменные.
Часть старых knobs может быть исторической или неактивной, поэтому source of truth - код, а не только имя переменной.
Базовые команды:
uv run python -m src.main
uv run pytest -q
uv run ruff check .
uv run pyrightНа каждом model step runtime пишет debug artifacts в debug_dumps/:
step_XXX_messages.json- snapshot сообщений без реального base64 screenshot payloadstep_XXX_summary.txt- читаемая выжимка по шагу и распарсенныйAgentOutput
Самые полезные лог-блоки при разборе поведения:
OBSERVEAGENT REASONINGEXECUTE- browser logs из
BrowserManager - security verdict logs из
SecurityGate
.
├── README.md
├── AGENTS.md
├── CLAUDE.md
├── src
│ ├── agent
│ ├── browser
│ ├── config
│ ├── parser
│ ├── security
│ ├── cli.py
│ └── main.py
└── tests