# Вайб-кодинг в zerostack: настройка Rust-агента через RouterAI (Claude, GLM, DeepSeek)

## zerostack

zerostack — терминальный coding-агент с открытым исходным кодом на Rust (репозиторий [gi-dellav/zerostack](https://github.com/gi-dellav/zerostack), лицензия GPL-3.0). Автор описывает его как минимальный агент, вдохновлённый [pi](https://pi.dev/docs/latest/usage) и [opencode](https://opencode.ai/): он читает и правит файлы, запускает команды, читает `AGENTS.md` и `CLAUDE.md`, работает в интерактивном TUI и в режиме ACP — как агент-бэкенд для редакторов, поддерживающих Agent Client Protocol (например, Zed).

Главная особенность — расход памяти. В README проекта указано: бинарник около 26 МБ, потребление RAM в среднем ~16 МБ с пиками до ~24 МБ, тогда как JS-агенты занимают сотни мегабайт. Это делает zerostack удобным для слабых машин, контейнеров и работы в нескольких параллельных сессиях.

RouterAI подключается как кастомный OpenAI-совместимый провайдер: в одном агенте доступны Claude, GLM и DeepSeek из [каталога моделей](/models), работа из России без VPN и оплата в рублях. Важная деталь: по умолчанию zerostack настроен на OpenRouter, поэтому провайдера нужно переопределить явно — об этом ниже.

## Требования

- Linux или macOS. Windows в README помечен как непроверенный — запуск в WSL или контейнере надёжнее.
- Для установки из релизов ничего, кроме терминала, не нужно. Для `cargo install` — свежий Rust (rustup).
- API-ключ из [личного кабинета](/settings/keys).
- Для ACP-режима — редактор с поддержкой Agent Client Protocol (например, Zed).

## Установка

Самый быстрый способ — скрипт из репозитория:

```bash
curl -fsSL https://raw.githubusercontent.com/gi-dellav/zerostack/main/install.sh | bash
zerostack --version
```

Либо готовый архив с [GitHub Releases](https://github.com/gi-dellav/zerostack/releases). Для x86_64 Linux берите `zerostack-x86_64-unknown-linux-musl.tar.gz`: сборка на glibc требует библиотеку 2.39 и на Debian 12 / Ubuntu 22.04 не запустится, а musl-сборка статическая и работает везде.

```bash
tar xzf zerostack-x86_64-unknown-linux-musl.tar.gz
install -m755 zerostack-x86_64-unknown-linux-musl /usr/local/bin/zerostack
zerostack --version
```

Через Cargo — с набором функций на выбор. По умолчанию собираются `git-worktree`, `mcp`, `subagents`, `archmd`, `status-signals` и `logging`; ACP, память, hooks, advisor и мультимодальный ввод включаются флагами:

```bash
cargo install zerostack                    # базовый набор
cargo install zerostack --features acp,memory,hooks,advisor
```

Есть также Homebrew (`brew tap gi-dellav/tap && brew install zerostack`) и Nix. Команда `zerostack --version` должна вывести версию — на момент написания это `zerostack 1.8.5`.

## Подключение к RouterAI

Настройки zerostack читает из файла `config.toml`, `config.yaml` или `config.json`. Порядок поиска: `$ZS_CONFIG_DIR`, затем `~/.config/zerostack/`, затем `~/.local/share/zerostack/`. На практике удобнее всего `~/.config/zerostack/config.toml`. Файл `settings.json` в zerostack — это конфигурация hooks, а не провайдеров; не путайте.

RouterAI подключается через секцию `custom_providers`: тип провайдера `openai` (Chat Completions, `https://routerai.ru/api/v1`), ключ — из переменной окружения, чтобы он не лежал в файле.

1. Создайте каталог и файл конфигурации:

```bash
mkdir -p ~/.config/zerostack
```

```toml
# ~/.config/zerostack/config.toml
provider = "routerai"
model = "anthropic/claude-sonnet-5.5"
context_window = 1000000
enable-exa-mcp = false

[custom_providers.routerai]
provider_type = "openai"
base_url = "https://routerai.ru/api/v1"
api_key_env = "ROUTERAI_API_KEY"
```

![Файл ~/.config/zerostack/config.toml с провайдером RouterAI: provider, model и секция custom_providers с base_url и api_key_env](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/20adbf58775b7a0f660d415dea8ed342.png)

2. Положите ключ в переменную окружения — в `~/.bashrc`, `~/.zshrc` или в файл, который подключаете перед запуском:

```bash
export ROUTERAI_API_KEY="sk-xxxxxxxxxxxxxxxx"
```

3. Проверьте, что zerostack видит провайдера и модель: `zerostack --print-config` показывает путь к загруженному файлу, провайдера, модель и лимиты контекста.

![Вывод zerostack --print-config: config file /root/.config/zerostack/config.toml, провайдер routerai и модель anthropic/claude-sonnet-5.5](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/c2f5d77a5a572db6251539e33bc86d02.png)

Поля секции `custom_providers`:

| Поле | Что задаёт |
| --- | --- |
| `provider_type` | Базовый тип транспорта: для RouterAI — `openai` |
| `base_url` | Адрес API: `https://routerai.ru/api/v1` |
| `api_key_env` | Имя переменной окружения с ключом |
| `api_style` | `completions` (по умолчанию при заданном `base_url`) или `responses` |
| `model` | Модель по умолчанию для этого провайдера |
| `headers`, `timeout_secs` | Дополнительные заголовки и таймаут запроса |

Помимо файла, провайдера можно указать флагами командной строки. Это удобно для разового запроса или для проверки:

```bash
zerostack --provider routerai --model deepseek/deepseek-v4.1-flash -p "Объясни, что делает invoices.js"
```

Флаги `--provider` и `--model` (а также переменные `ZS_PROVIDER` и `ZS_MODEL`) имеют приоритет над файлом конфигурации.

### Почему важно явно задать провайдера

Провайдер по умолчанию в zerostack — OpenRouter, и если ключ RouterAI лежит в окружении, а провайдер не переопределён, агент всё равно попытается уйти в OpenRouter. Признак этого — ошибка при старте:

```
No API key found. Set the OPENROUTER_API_KEY environment variable, add it to
config.api_keys under 'openrouter' ...
```

Значит, секция `custom_providers` не загрузилась или `provider` не переключён. Если ключ OpenRouter у вас тоже есть в окружении, уберите его из сессии (`unset OPENROUTER_API_KEY`) — так ошибки конфигурации видны сразу, а не маскируются чужим ключом.

### Как проверить, какой эндпоинт реально используется

Самый надёжный способ — включить отладочный вывод и посмотреть, к какому хосту идёт соединение:

```bash
zerostack -p --no-session --log-level debug "скажи OK" 2>&1 | grep -i routerai
```

В выводе будут строки вида `starting new connection: routerai.ru` и `connecting to ... :443`. Полный подробный лог с трассировкой запросов пишется в файл `~/.local/share/zerostack/logs/` при флаге `-v`; путь можно переопределить через `--log-file`.

Ещё два признака: команда `/provider` внутри агента показывает текущего провайдера, а заведомо неверный ключ при правильно заданном `base_url` даёт ответ `401 Unauthorized` от RouterAI — это и подтверждает, куда уходит запрос.

```bash
ROUTERAI_API_KEY=sk-invalid zerostack -p --provider routerai --model z-ai/glm-5.3-flash "hi"
```

## ACP-режим

ACP — протокол на JSON-RPC, по которому редактор запускает агента отдельным процессом и общается с ним. В README zerostack он назван Agent Communication Protocol, а в Zed — [Agent Client Protocol](https://zed.dev/docs/ai/external-agents); стороны совместимы, что проверяется уже на рукопожатии. С включённой функцией `acp` zerostack становится ACP-сервером, и редактор может открывать в нём треды.

```bash
# stdio: редактор запускает процесс сам
zerostack --acp

# TCP: слушает на порту (по умолчанию 7243)
zerostack --acp --acp-host 0.0.0.0 --acp-port 7243
```

В Zed добавьте агента через **Agent Settings** → **External Agents** → **Add Agent** → **Add Custom Agent** и укажите в настройках:

```json
{
  "agent_servers": {
    "zerostack": {
      "type": "custom",
      "command": "zerostack",
      "args": ["--acp"],
      "env": {
        "ROUTERAI_API_KEY": "sk-xxxxxxxxxxxxxxxx"
      }
    }
  }
}
```

Режим stdio подходит для редакторов, которые запускают агента подпроцессом; TCP-вариант нужен, если редактор подключается к уже запущенному серверу.

Ответ на запрос `initialize` по stdio выглядит так:

![Ответ ACP-сервера zerostack на JSON-RPC initialize: версия агента и поддерживаемые возможности](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/4561cd4c190eedc581a5de000cee1d1a.png)

Ключевой момент: ACP не заменяет настройку провайдера. Zed в треде внешнего агента не подставляет свои модели и ключи — провайдер, ключ и выбор модели остаются за zerostack. Поэтому перед подключением к редактору убедитесь, что `custom_providers` и `provider = "routerai"` работают в терминале: в ACP-режиме без настроенного провайдера агент просто не обработает запрос.

## Выбор модели

Идентификаторы взяты из [каталога RouterAI](/models) на момент написания; актуальные цены и список смотрите там же. Для агента важно уверенное вызывание инструментов (tool calling) — от него зависит, сможет ли модель править файлы и запускать команды.

| Модель | Контекст | Для чего |
| --- | --- | --- |
| `anthropic/claude-sonnet-5.5` | 1M | Основная модель: фичи, отладка, рефакторинг среднего размера |
| `anthropic/claude-opus-5` | 1M | Сложные рефакторинги и архитектурные изменения |
| `anthropic/claude-haiku-5.5` | 1M | Быстрые мелкие задачи, массовые правки |
| `z-ai/glm-5.3-flash` | 1M | Рутина: дешёвые правки, переименования, шаблонный код |
| `deepseek/deepseek-v4.1-flash` | 1M | Рутина и длинные файлы: дешёвый ввод, контекст 1M |
| `openai/gpt-5.5` | 1M | Альтернатива Claude от OpenAI для тех же задач |

У zerostack есть механизм быстрых моделей (`quick_models`). Они задаются в том же `config.toml` и переключаются командой `/models <имя>`, флагом `--quick-model` или по `Alt+M`:

```toml
[quick_models.fast]
provider = "routerai"
model = "z-ai/glm-5.3-flash"

[quick_models.cheap]
provider = "routerai"
model = "deepseek/deepseek-v4.1-flash"
```

```bash
zerostack --quick-model=fast
```

Рабочая схема — держать Sonnet для сложных задач и переключаться на GLM Flash или DeepSeek Flash для рутины. Для разового запуска с другой моделью достаточно `/model <id>` или `--model` в командной строке.

## Проверка подключения

Быстрая проверка без интерактивного интерфейса — один запрос флагом `-p` (`--print`):

```bash
zerostack -p --no-session "Ответь одним словом: OK"
```

Ответ `OK` означает, что конфигурация верна. Дальше проверьте агента в работе: запустите `zerostack` в папке проекта и дайте небольшую задачу — например, добавить функцию и тест к ней, а затем прогнать тесты.

На первом запуске в новом проекте zerostack спросит, создать ли `ARCHITECTURE.md` — файл с описанием архитектуры для агентов. Ответьте `n`, если не хотите добавлять его в репозиторий; отказ ни на что не влияет.

![TUI zerostack в демо-проекте Invoices: заголовок с моделью anthropic/claude-sonnet-5.5 и строка ввода](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/cbb750f24d3bea524f8f00bb0e2e9ea2.png)

В строке статуса видно рабочую папку, модель, занятый контекст (`~3k/1.0M`) и активный prompt (`code`). Для примера ниже агент получил задачу добавить в демо-проект функцию `pendingInvoices()` и тест к ней.

![Задача в zerostack: агент прочитал файлы проекта, внёс правки в invoices.js и invoices.test.js и запустил npm test](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/e8848e9f5b9c32ebd4526eeeee485ced.png)

В конце агент отвечает, что сделал: функция фильтрует счета со статусом `pending`, тест проверяет состав, статусы и что выборка не равна полному списку, `npm test` — 2 из 2. В строке статуса — израсходованные токены (`⇡38k ⇣2k`).

![Дифф изменений в invoices.js после задачи и успешный прогон npm test](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/c17e8ea2800afd506017e0d41b330449.png)

## Решение проблем

### `No API key found. Set the OPENROUTER_API_KEY ...`

Провайдер остался по умолчанию. Проверьте, что `config.toml` лежит в `~/.config/zerostack/`, что в нём есть `provider = "routerai"` и секция `[custom_providers.routerai]`, а переменная из `api_key_env` экспортирована в том же терминале. Быстрая диагностика — `zerostack --print-config`.

### `401 Unauthorized`

Ключ не найден или неверен, но запрос уже уходит на RouterAI. Проверьте значение в переменной из `api_key_env` и что ключ скопирован из [личного кабинета](/settings/keys) целиком. Если 401 приходит от другого сервиса — значит, `base_url` указывает не туда.

### `404` или «модель не найдена»

`base_url` должен быть `https://routerai.ru/api/v1` — с `/v1`. Идентификатор модели пишется целиком, с префиксом производителя: `anthropic/claude-sonnet-5.5`, `z-ai/glm-5.3-flash`. Сверьтесь с [каталогом](/models).

### `402 Payment Required`

Недостаточно средств на балансе — пополните его в разделе [Биллинг](/settings/billing).

### Сборка из релиза не запускается: `GLIBC_2.39 not found`

Возьмите `zerostack-x86_64-unknown-linux-musl.tar.gz` вместо варианта с `gnu` в имени: он статический и не зависит от версии системной glibc.

### В логах WARN про `error sending request` при старте

Повторяющиеся предупреждения в начале сессии относятся к служебному запросу списка моделей для автоопределения контекста. Если указать `context_window` в конфигурации явно (например, `1000000` для моделей из таблицы выше), автозапрос не нужен и предупреждения пропадают.

### Ошибка подключения к `mcp.exa.ai`

В новой установке zerostack сам подключает MCP-сервер Exa для веб-поиска, и он может быть недоступен из вашей сети. На работу агента это не влияет; чтобы не видеть ошибку, добавьте в конфигурацию `enable-exa-mcp = false`.

## zerostack, Cline, OpenCode и Aider: чем отличается

zerostack — молодой проект: репозиторий появился в мае 2026 года, на Hacker News его представили постом [«Zerostack – A Unix-inspired coding agent written in pure Rust»](https://news.ycombinator.com/item?id=48164287) — 575 баллов. Для сравнения, у OpenCode, Cline и Aider аудитория и экосистема заметно больше, и это честное ограничение: меньше готовых рецептов, меньше ответов на форумах, API может меняться между версиями.

Зато по расходу ресурсов он в другой категории. OpenCode и другие JS-агенты, по данным README zerostack, занимают ~300 МБ RAM с пиками до ~700 МБ против ~16–24 МБ у zerostack, а CPU в простое — ~2 % против 0 %. Если вы держите два-три агента одновременно или работаете на ноутбуке с 8 ГБ, разница заметна. Плюс zerostack не требует Node.js: это один бинарник, который запускается сразу.

По возможностям набор стандартный для 2026 года: правка файлов, bash, MCP, субагенты, сессии, режимы разрешений (`readonly`, `guarded`, `standard`, `yolo`), песочница через bubblewrap, system prompts для разных фаз работы (`code`, `plan`, `review`, `debug`). Cline — расширение VS Code, Aider — CLI-агент с фокусом на git-коммиты и историю правок; zerostack ближе к минималистичным TUI-агентам вроде Crush и Pi.

## Что дальше

- [Каталог моделей](/models) — подберите модель под задачу и посмотрите цены
- [Аутентификация](/docs/guides/overview/authentication) — управление API-ключами
- [Вайб-кодинг в OpenCode](/pages/vibe-coding-opencode) и [Вайб-кодинг в Aider](/pages/vibe-coding-aider) — более зрелые CLI-агенты через RouterAI
- [Вайб-кодинг в Codex](/pages/vibe-coding-codex) и [Вайб-кодинг в Crush](/pages/vibe-coding-crush) — другие терминальные агенты
- [Codewhale через RouterAI](/pages/codewhale-routerai) — ещё один Rust-агент с любым Base URL
- [Документация zerostack](https://github.com/gi-dellav/zerostack/tree/main/docs) — CONFIG.md, PROVIDERS.md, GET_STARTED.md
