Загрузка...

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

nanobot

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

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

Первый запуск nanobot WebUI: приветствие «What are we building today?», поле ввода, кнопка Choose model и значок настроек слева внизу

Требования

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

Установка

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

# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/HKUDS/nanobot/main/scripts/install.sh | sh
# Windows PowerShell
irm https://raw.githubusercontent.com/HKUDS/nanobot/main/scripts/install.ps1 | iex

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

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

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

nanobot --version

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

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 с ключом-заглушкой

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

Settings → Models: пресет primary с моделью anthropic/claude-sonnet-5.5, контекст 1M, отметка Primary

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

Через config.json

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

export ROUTERAI_API_KEY="sk-xxxxxxxxxxxxxxxx"
{
  "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 он принимает:

{
  "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:

{
  "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 на момент написания; цены и актуальный список смотрите в каталоге.

Модель Для чего
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 Быстрые ответы в чат-ботах

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

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

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

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

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

Чат в nanobot WebUI: вопрос про папку invoices, ответ агента про функции allInvoices и totalAmount, в поле ввода выбран пресет primary

Сценарии

Ассистент в Telegram

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

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

nanobot plugins enable telegram
nanobot gateway
{
  "channels": {
    "telegram": {
      "enabled": true,
      "token": "${TELEGRAM_TOKEN}"
    }
  }
}

Бот отвечает той же моделью, с теми же инструментами и памятью, что и WebUI. Если gateway не достаёт до Telegram напрямую, адрес прокси задаётся в Settings → Advanced → Shared proxy, а в настройках канала включается Use proxy. Подробности — в гайде nanobot по Telegram.

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

Агент работает в папке ~/.nanobot/workspace. Положите туда проект или документы и попросите разобрать их: прочитать PDF и Word, свести таблицу Excel, найти функцию в коде. Режим доступа выбирается в поле ввода (на кадрах выше стоит Full Access). Для общего бота разрешения лучше сузить: настройки безопасности описаны в документации nanobot.

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

Заведите пресеты 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. Сверьте написание с каталогом. Поле 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 означает неверный или неполный ключ, скопируйте его из личного кабинета. 402 — на балансе не хватает средств, пополнить его можно в разделе Биллинг.

Что дальше