# nanobot через RouterAI: персональный AI-агент с Claude, GPT и DeepSeek

## nanobot

nanobot — сверхлёгкий персональный AI-агент с открытым кодом от HKUDS (репозиторий [HKUDS/nanobot](https://github.com/HKUDS/nanobot)). Он ставится одной командой, работает в браузере (WebUI), в терминале и как бот в Telegram, Discord, Slack и других чатах. Агент читает PDF, Word, Excel и PowerPoint, запускает shell-команды, подключает MCP-серверы, выполняет задачи по расписанию и запоминает ваши предпочтения. Модель берётся у внешнего провайдера: nanobot сам её не поставляет.

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

![Первый запуск nanobot WebUI: приветствие «What are we building today?», поле ввода, кнопка Choose model и значок настроек слева внизу](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/615f169009d1a774ad0ccc6c0722b328.png)

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

- Python 3.11 или новее (нужен для установки через pip и uv; установщик подбирает окружение сам)
- macOS, Linux или Windows
- API-ключ из [личного кабинета](/settings/keys) RouterAI

## Установка

Автоматический установщик создаёт изолированное окружение в `~/.nanobot/venv` и открывает настройку модели:

```bash
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/HKUDS/nanobot/main/scripts/install.sh | sh
```

```powershell
# Windows PowerShell
irm https://raw.githubusercontent.com/HKUDS/nanobot/main/scripts/install.ps1 | iex
```

Если вы сами управляете окружениями, пакет называется `nanobot-ai`:

```bash
uv tool install nanobot-ai
# или, в активированном виртуальном окружении:
python -m pip install nanobot-ai
```

Проверьте версию. На момент написания статьи это 0.4.0:

```bash
nanobot --version
```

Запустите WebUI. Команда поднимает gateway и выводит ссылку для входа в браузере:

```bash
nanobot webui
```

Если подтвердить первичную настройку в терминале нельзя (например, в контейнере или по SSH), команда остановится с ошибкой `WebUI setup needs confirmation`. Добавьте флаг `--yes`; для запуска без браузера пригодятся `--no-open` и `--detach`. Конфигурация хранится в `~/.nanobot/config.json`, рабочая папка агента лежит в `~/.nanobot/workspace`.

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

### Через WebUI

1. Откройте **Settings** (шестерёнка слева внизу), затем **Models** и нажмите **New preset**.
2. В списке **Provider** выберите **Add provider**, затем **Custom** (пункт внизу окна).
3. Заполните форму: в поле **Name** введите `RouterAI`, в **API URL** — `https://routerai.ru/api/v1`, в **API key** — ключ из личного кабинета.
4. Нажмите **Add provider**. Вы вернётесь в форму пресета, где провайдер RouterAI уже выбран.
5. В поле **Preset name** введите имя, например `primary`. В списке **Model** найдите модель по названию (поиск работает по списку каталога RouterAI) и выберите `anthropic/claude-sonnet-5.5`. Нажмите **Save**.

![Форма Custom provider: 1 — поле Name, 2 — поле API URL с адресом RouterAI, 3 — поле API key с ключом-заглушкой](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/c6ac81c78eba0f99daee19fcfaf70c9f.png)

Список моделей nanobot подгружает из каталога RouterAI, контекст модели подставляется автоматически. Максимальная длина ответа по умолчанию 8192 токена, её можно изменить в **Advanced options**.

![Settings → Models: пресет primary с моделью anthropic/claude-sonnet-5.5, контекст 1M, отметка Primary](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/2ccf8415859cd69b607adb64cb0fbe27.png)

После сохранения пресет появляется в списке. В поле ввода на главном экране вместо **Choose model** показывается имя пресета.

### Через config.json

Для серверов без браузера и для конфигурации «как код» добавьте в `~/.nanobot/config.json` провайдера и пресет. Ключ лучше не писать в файл, а передать через переменную окружения: nanobot подставляет `${ИМЯ}` при запуске.

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

```json
{
  "providers": {
    "routerai": {
      "apiBase": "https://routerai.ru/api/v1",
      "apiKey": "${ROUTERAI_API_KEY}"
    }
  },
  "modelPresets": {
    "primary": {
      "provider": "routerai",
      "model": "anthropic/claude-sonnet-5.5"
    }
  },
  "agents": {
    "defaults": {
      "modelPreset": "primary"
    }
  }
}
```

Любой ключ под `providers`, кроме встроенных, nanobot считает отдельным кастомным провайдером, а пресет ссылается на него через `provider`. Это фрагмент для слияния с вашим конфигом, а не полный файл.

Не храните ключ открытым текстом в конфиге, который попадёт в git. Если переменная не задана, nanobot не запустится и покажет, какое поле ссылается на отсутствующую переменную.

### Anthropic Messages API

Модели `anthropic/*` можно вызывать и по нативному протоколу. Для этого провайдеру указывают, какой API он принимает:

```json
{
  "providers": {
    "routerai_claude": {
      "apiBase": "https://routerai.ru/api",
      "apiKey": "${ROUTERAI_API_KEY}",
      "api": {
        "supportedApis": ["anthropic_messages"],
        "preferredApi": "anthropic_messages"
      }
    }
  }
}
```

В WebUI то же самое делается в **Advanced options** окна провайдера (**Supported APIs**). Для обычной работы хватает OpenAI-совместимого режима из предыдущего раздела.

## Зачем отдельный провайдер, а не общий custom

В nanobot есть встроенный провайдер `custom` для одного OpenAI-совместимого эндпоинта. Документация советует для каждого дополнительного адреса заводить свой ключ в `providers`: у него собственные `apiBase` и `apiKey`, а пресеты ссылаются на него по имени. Так RouterAI для основного чата и локальная модель для мелких задач не мешают друг другу. Пример с Ollama:

```json
{
  "providers": {
    "routerai": {
      "apiBase": "https://routerai.ru/api/v1",
      "apiKey": "${ROUTERAI_API_KEY}"
    },
    "ollama": {
      "apiBase": "http://localhost:11434/v1"
    }
  },
  "modelPresets": {
    "main": { "provider": "routerai", "model": "anthropic/claude-sonnet-5.5" },
    "local": { "provider": "ollama", "model": "llama3.2" }
  },
  "agents": {
    "defaults": {
      "modelPreset": "main",
      "fallbackModels": ["local"]
    }
  }
}
```

В `fallbackModels` указываются имена пресетов, а не id моделей. Если основной пресет недоступен, nanobot переходит к следующему в цепочке. Модель `llama3.2` должна быть заранее скачана в Ollama.

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

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

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

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

Быстрая проверка из терминала. Команда отправляет одно сообщение через пресет по умолчанию и печатает ответ:

```bash
nanobot agent -m "Ответь одним словом: работаешь?"
```

`nanobot status` показывает, какой пресет и какая модель выбраны, и сообщает, готова ли конфигурация (`Agent: ✓ provider/model configuration is ready`).

В WebUI откройте новый чат, убедитесь, что в поле ввода выбран ваш пресет, и дайте агенту задачу. На кадре агент читает демо-проект со счетами из рабочей папки `workspace` и отвечает по его файлам.

![Чат в nanobot WebUI: вопрос про папку invoices, ответ агента про функции allInvoices и totalAmount, в поле ввода выбран пресет primary](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/7ee63d0aea27f847b482072daaf172b4.png)

## Сценарии

### Ассистент в Telegram

Создайте бота у `@BotFather` командой `/newbot` и скопируйте токен. Затем в WebUI откройте **Channels → Telegram**, вставьте токен, сохраните и включите канал. Для первой настройки оставьте список разрешённых отправителей пустым: новый пользователь получит код сопряжения и сможет писать боту только после вашего подтверждения. Значение `*` лучше не задавать.

Для сервера без браузера:

```bash
nanobot plugins enable telegram
nanobot gateway
```

```json
{
  "channels": {
    "telegram": {
      "enabled": true,
      "token": "${TELEGRAM_TOKEN}"
    }
  }
}
```

Бот отвечает той же моделью, с теми же инструментами и памятью, что и WebUI. Если gateway не достаёт до Telegram напрямую, адрес прокси задаётся в **Settings → Advanced → Shared proxy**, а в настройках канала включается **Use proxy**. Подробности — в [гайде nanobot по Telegram](https://github.com/HKUDS/nanobot/blob/main/docs/guides/telegram-ai-agent.md).

### Работа с файлами

Агент работает в папке `~/.nanobot/workspace`. Положите туда проект или документы и попросите разобрать их: прочитать PDF и Word, свести таблицу Excel, найти функцию в коде. Режим доступа выбирается в поле ввода (на кадрах выше стоит **Full Access**). Для общего бота разрешения лучше сузить: настройки безопасности описаны в [документации nanobot](https://github.com/HKUDS/nanobot/blob/main/docs/configuration.md).

### Несколько пресетов под разные задачи

Заведите пресеты `main` (Sonnet), `fast` (Haiku) и `local` (Ollama) и переключайтесь между ними командой `/model <имя_пресета>` в чате или выбором модели в поле ввода WebUI. Правка конфига при этом не нужна. Включённые пресеты можно упорядочить в **Settings → Models**: первый становится основным, остальные работают как запасные.

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

### Model 'claude-sonnet-5.5' not found

В `model` указан id без префикса провайдера. У RouterAI id вида `производитель/модель`: `anthropic/claude-sonnet-5.5`. Сверьте написание с [каталогом](/models). Поле `provider` в пресете — это имя ключа из `providers` (`routerai`), а в `model` пишется только id модели из каталога, без имени провайдера nanobot.

### Error: Not Found

Скорее всего, в `apiBase` нет `/v1`. Для OpenAI-совместимого режима нужен `https://routerai.ru/api/v1`. Адрес `https://routerai.ru/api` без `/v1` годится только для режима `anthropic_messages`.

### Environment variable is not set

Ключ записан как `${ROUTERAI_API_KEY}`, а переменной нет в окружении процесса, который запускает nanobot. Тогда запуск останавливается с сообщением о поле `providers.routerai.apiKey`. Экспортируйте переменную в том же терминале или задайте её в окружении сервиса (systemd, Docker). Для долгоживущего gateway переменная нужна именно в его окружении, после изменений перезапустите его: `nanobot gateway restart`.

### Агент отвечает ошибкой про модель, которую вы не выбирали

Пресет не назначен основным. Тогда nanobot берёт модель по умолчанию из `agents.defaults` (в свежем конфиге это `anthropic/claude-opus-4-5`), и RouterAI отвечает, что такой модели нет. Проверьте `nanobot status`: в строке `Model` должен стоять ваш пресет. Если нет, задайте `agents.defaults.modelPreset` или включите пресет в **Settings → Models**.

### 401 Unauthorized и 402 Payment Required

401 означает неверный или неполный ключ, скопируйте его из [личного кабинета](/settings/keys). 402 — на балансе не хватает средств, пополнить его можно в разделе [Биллинг](/settings/billing).

## Что дальше

- [Каталог моделей](/models): подберите модель под задачу
- [Аутентификация](/docs/guides/overview/authentication): управление API-ключами
- [Вайб-кодинг в Crush](/pages/vibe-coding-crush): терминальный агент с кодом в проекте
- [AstrBot через RouterAI](/pages/astrbot-routerai): другой self-hosted бот для Telegram
- [Документация nanobot](https://nanobot.wiki/docs/latest/getting-started/nanobot-overview) и [справка по провайдерам](https://github.com/HKUDS/nanobot/blob/main/docs/providers.md)
