Назад к обновлениям
New releaseJul 26, 2026

kuri v0.4.14

Автоматизация браузера, веб-скрапинг и управление устройствами iOS и Android для AI-агентов. Zig-native, эффективные по токенам CDP-снимки, запись HAR, нативный клиент adb wire-protocol и автономный fetcher.

Поделиться

Kuri

Kuri 🌰

Stable release License Zig node_modules status

Установка```sh

curl -fsSL https://kuri.trilok.ai/download | sh

macOS arm64/x86_64 и Linux x86_64/arm64. Один бинарный файл, без зависимостей времени выполнения.

Прямые загрузки: [macOS arm64](https://kuri.trilok.ai/download/v0.6.0/kuri-v0.6.0-aarch64-macos.tar.gz) · [macOS x86_64](https://kuri.trilok.ai/download/v0.6.0/kuri-v0.6.0-x86_64-macos.tar.gz) · [Linux x86_64](https://kuri.trilok.ai/download/v0.6.0/kuri-v0.6.0-x86_64-linux.tar.gz) · [Linux arm64](https://kuri.trilok.ai/download/v0.6.0/kuri-v0.6.0-aarch64-linux.tar.gz)

---

**Автоматизация браузера и веб-краулинг для ИИ-агентов. Написано на Zig. Ноль Node.js.**

Автоматизация CDP · A11y-снимки · Запись HAR · Автономный загрузчик · Интерактивный браузер в терминале · Агентный CLI · Тестирование безопасности · Управление устройствами iOS и Android

[Быстрый старт](#-quick-start) · [Бенчмарки](#-benchmarks) · [kuri-agent](#-kuri-agent) · [Тестирование безопасности](#-security-testing) · [API](#-http-api) · [Навыки](#-skills) · [Журнал изменений](https://github.com/justrach/kuri/blob/main/CHANGELOG.md)

> **Почему команды переходят на Kuri:** текущие сборки `ReleaseFast` для Apple Silicon остаются менее 2 МБ на бинарник, а свежий повторный прогон Google Flights от 2026-04-23 показал **3 392 токена** на полный цикл `kuri-agent` (`go→snap→click→snap→eval`). Межинструментальные расхождения стоит перепроверять в том же окружении, прежде чем приводить проценты.

---

## Почему Kuri выигрывает для агентов

Большинство инструментов для работы с браузером создавалось для QA-инженеров. Kuri создан для агентных циклов: прочитал страницу, удерживай низкую стоимость токенов, действуй по стабильным рефам и двигайся дальше.

- **135 HTTP-эндпоинтов** — полная совместимость с agent-browser и browser-use, от инспекции React до Core Web Vitals.
- **На 7-12% меньше токенов**, чем у agent-browser, на реальных страницах благодаря формату рефов `@eN` и рендерингу без префиксов.
- **В 44 раза более лёгкие наблюдения** с `/page/state` (48 токенов) против полного снимка (2 124 токена) для той же страницы Google Flights.
- **Пакетное выполнение** — `POST /batch` отправляет N команд за один HTTP-вызов, устраняя N-1 лишних сетевых запросов и N-1 обращений к LLM.
- **Совместимость с React** — достоверные события мыши через CDP и посимвольные события клавиатуры вызывают `onClick` и `onChange` в React 18/19.

### Токены снимков: Google Flights `SIN → TPE`

Свежий повторный прогон от 2026-05-24 в этом воркспейсе, замеренный с помощью `wc -c` и аппроксимации `chars/4`.

| Инструмент / Режим | Символы | ~Токены | Примечание |
|---|---:|---:|---|
| `kuri snap` (полный) | 8,499 | **2,124** | Все узлы + интерактивные рефы |
| `kuri snap` (только интерактивные) | ~3,000 | **~750** | Лучше всего для агентных циклов |
| `kuri /page/state` | 190 | **48** | Лёгкое наблюдение (url, заголовок, scroll%, счётчики) |
| agent-browser snap (оценка) | ~9,183 | **~2,295** | Накладные расходы формата `[ref=e0]` |

### Эффективность токенов: kuri против agent-browser

| Страница | токены kuri | токены agent-browser | Экономия |
|---|---:|---:|---|
| example.com | 40 | 35 | -13% (тривиальная страница, agent-browser пропускает корень) |
| Hacker News | 386 | ~440 | **на 12% меньше** |
| Google Flights SIN→TPE | 2,124 | ~2,295 | **на 7% меньше** |

Экономия достигается за счёт компактного формата kuri:
- рефы `@e0` (3 символа) вместо `[ref=e0]` (9 символов)
- нет префикса `- ` в каждой строке (экономия 2 символа × количество строк)
- та же вложенность, та же фильтрация узлов

### Стоимость полного цикла: `go → snap → click → snap → eval`

| Инструмент | Токенов за цикл |
|---|---:|
| **kuri-agent** | **~3,400** |
| С `/page/state` вместо второго snap | **~1,700** |
| С `POST /batch` (всё за один вызов) | **~1,700** (те же токены, 1 HTTP-вызов вместо 5) |

### kuri против libretto

[libretto](https://github.com/saffron-health/libretto) (Playwright + Node) — ближайший конкурент по стоимости токенов на шаг. Замерено в прямом сравнении 2026-07-04 — тот же Chrome, та же вкладка, реальные подсчёты `tiktoken` `o200k_base` (полная методология и воспроизведение: **[benchmarks/libretto_comparison.md](https://github.com/justrach/kuri/blob/main/benchmarks/libretto_comparison.md)**). Честное распределение:

| Критерий | Победитель | Детали |
|---|---|---|
| Задержка на вызов | **kuri** | 4–117 мс против 1,344–1,500 мс (**в 13–376× быстрее** — постоянный сервер против Node на каждую команду) |
| Токены снимка, типовая страница | **kuri** | простая 61 против 151 (2.5×), статья 265 против 363 (1.37×) — более компактная грамматика |
| Токены снимка, большой список | разделились | по умолчанию kuri 4,424 против 813 — kuri выводит все 259 рефов, libretto по умолчанию обрезает. С `limit=5` kuri выдаёт 555 токенов (**в 1.46× меньше, чем libretto**), 34 рефа + маркеры `… +45 more` |
| Траектория (лента, 9 кликов) | **kuri**, с трудом | 898 против 939 токенов (база `limit=5` + цикл диффов против цикла выполнений) — примерное равенство или лёгкое преимущество; утренний проигрыш 5.1× был из-за необрезанной базы |
| Повторные запуски | **libretto** | компилирует траектории в Playwright-скрипт → воспроизведение за 0 токенов; kuri каждый раз заново оплачивает цикл |

**Что Kuri почерпнул, изучив libretto** (всё вошло в этот релиз): цикл «сначала дифф» (`take_snapshot_diff`, ~38 токенов/шаг); адаптивный дифф, который при навигации переключается на полный снимок с заголовком `! page replaced`; строки удаления только по идентификаторам; скриншоты сохраняются на диск (возвращается путь, байты никогда не попадают в контекст); `get_page_state` через MCP; и — после переписывания `parseA11yNodes` как настоящего DFS-обхода дерева — **опциональное усечение списка** (`/snapshot?limit=N`, одна строка `… +K more` на каждый ограниченный запуск), **повторный захват в заданной области** (`scope=@ref`) и **иерархические отступы**, также доступные как `uid`/`limit` в MCP `take_snapshot`. Траектория из 9 кликов по ленте, которая стоила 44,285 токенов при наивных полных повторных снимках, теперь стоит **898** с усечённой базой + диффами — в 49× дешевле, и это меньше 939 у libretto.

> Таблицы выше используют аппроксимацию токенов `chars/4`; сравнение с libretto использует реальные подсчёты `tiktoken`. Перепроверяйте межинструментальные числа в своём окружении, прежде чем приводить проценты.

### Размер бинарника и память

Замерено на Apple M4 Pro, macOS 26.4.1. Текущие бинарники собраны с `-Doptimize=ReleaseFast`.

| Бинарник | Текущий размер |
|---|---:|
| `kuri` | 1,093,840 B (1.04 MiB) |
| `kuri-agent` | 629,904 B (615 KiB) |
| `kuri-browse` | 1,089,120 B (1.04 MiB) |
| `kuri-fetch` | 2,063,488 B (1.97 MiB) |

### RSS остался почти неизменным при переходе на Zig 0.16

Замерено на текущей сборке `v0.4.3` `ReleaseFast` с помощью `/usr/bin/time -l`.

| Команда | Средний максимум RSS в `v0.4.3` |
|---|---:|
| `kuri-fetch --version` | ~2.45 MiB |
| `kuri-browse --version` | ~2.45 MiB |
| `kuri-fetch --quiet --dump markdown http://example.com/` | ~9.17 MiB |

## Проблема

Категории