Загрузка...

LibreChat: свой ChatGPT-клон с RouterAI через Custom Endpoints

LibreChat — это бесплатный open-source веб-интерфейс в стиле ChatGPT (лицензия MIT, около 46 тыс. звёзд на GitHub), который вы разворачиваете на своём сервере. Внутри: чаты с историей, агенты, поддержка MCP-серверов, Skills (повторно используемые инструкции для агентов), загрузка файлов и мультипользовательский режим с регистрацией и ролями. Своих моделей LibreChat не запускает: он отправляет запросы провайдерам, которых вы настроили, поэтому видеокарта не нужна. Любой OpenAI-совместимый API подключается как Custom Endpoint без прокси, и RouterAI подходит ему без доработок: один ключ и один Base URL открывают сотни моделей (Claude, GPT, Gemini, DeepSeek и другие), работа идёт из России без VPN, а оплата — в рублях.

В статье поднимем LibreChat в Docker, опишем RouterAI в файле librechat.yaml, выберем модели, подключим Claude по нативному Anthropic API и разберём типичные ошибки.

Требования

  • Git и Docker с плагином Compose. Для всего набора контейнеров (LibreChat, MongoDB, Meilisearch, RAG API) выделите Docker хотя бы 2 ГБ памяти.
  • Аккаунт на RouterAI с положительным балансом.
  • API-ключ из раздела «Ключи API»: он начинается с sk-or-... и показывается один раз.
  • Свободный порт 3080 (иначе смените его в docker-compose.override.yml).

Установка

По официальной инструкции LibreChat ставится так:

git clone https://github.com/LibreChat-AI/LibreChat.git
cd LibreChat
cp .env.example .env
docker compose up -d

Первый запуск скачивает образы и занимает несколько минут. Затем откройте http://localhost:3080 и нажмите «Зарегистрироваться». Паролей по умолчанию нет: первая зарегистрированная учётная запись становится администратором.

Форма «Создать аккаунт» в LibreChat: полное имя, имя пользователя, Email, пароль и подтверждение пароля

Язык интерфейса зависит от языка браузера: на скриншотах он русский, в документации названия на английском.

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

Настройка состоит из трёх файлов в корне проекта (там же, где docker-compose.yml).

  1. Ключ в .env. Добавьте строку (вместо заглушки подставьте свой ключ):

    ROUTERAI_API_KEY=sk-xxxxxxxxxxxxxxxx
    

    Имя переменной любое, но оно должно совпадать с тем, что вы укажете в apiKey. Не называйте переменную OPENROUTER_API_KEY или OPENAI_API_KEY: это имена, зарезервированные LibreChat под встроенные endpoint'ы.

  2. Монтирование конфига. Скопируйте пример override-файла и раскомментируйте блок с librechat.yaml:

    cp docker-compose.override.yml.example docker-compose.override.yml
    
    services:
      api:
        volumes:
          - type: bind
            source: ./librechat.yaml
            target: /app/librechat.yaml
    
  3. Описание endpoint в librechat.yaml. Создайте файл (или скопируйте librechat.example.yaml) и добавьте RouterAI в endpoints.custom:

    version: 1.3.17
    cache: true
    endpoints:
      custom:
        - name: 'RouterAI'
          apiKey: '${ROUTERAI_API_KEY}'
          baseURL: 'https://routerai.ru/api/v1'
          models:
            default:
              - 'anthropic/claude-sonnet-5.5'
              - 'anthropic/claude-haiku-5.5'
              - 'openai/gpt-5.5'
              - 'google/gemini-3.1-pro-preview'
              - 'deepseek/deepseek-v4-flash'
            fetch: true
          titleConvo: true
          titleModel: 'anthropic/claude-haiku-5.5'
          modelDisplayLabel: 'RouterAI'
    

Что означают поля (по справочнику):

Поле Назначение
name Имя endpoint в селекторе; должно быть уникальным
apiKey Ключ; лучше ссылка ${ROUTERAI_API_KEY} на переменную из .env
baseURL https://routerai.ru/api/v1: LibreChat сам добавляет /chat/completions
models.default Модели, которые показываются всегда и используются, если загрузка каталога не удалась
models.fetch true — подтянуть список моделей из /models RouterAI
titleConvo, titleModel Автоназвания чатов и модель для них; current_model берёт модель текущего чата
modelDisplayLabel Подпись над ответами модели

Перезапустите контейнеры, чтобы LibreChat прочитал конфиг:

docker compose down && docker compose up -d

После перезапуска в селекторе моделей нового чата появится endpoint RouterAI, а справа от него откроется список моделей, подтянутый из каталога.

Селектор моделей LibreChat: endpoint RouterAI рядом с My Agents и список моделей RouterAI с полем поиска

Claude через Anthropic Messages API

RouterAI отвечает и по нативному Anthropic API. Для него в LibreChat есть отдельный тип: provider: 'anthropic'. Базовый адрес здесь — https://routerai.ru/api (SDK сам добавит /v1/messages), а модели нужно перечислить явно: автозагрузка по /models для этого провайдера не используется.

    - name: 'RouterAI Claude'
      provider: 'anthropic'
      apiKey: '${ROUTERAI_API_KEY}'
      baseURL: 'https://routerai.ru/api'
      models:
        default:
          - 'anthropic/claude-sonnet-5.5'
          - 'anthropic/claude-haiku-5.5'
        fetch: false
      titleConvo: true
      titleModel: 'anthropic/claude-haiku-5.5'

Блок добавляется в тот же список custom рядом с первым. Для обычного чата достаточно OpenAI-совместимого endpoint'а; нативный вариант нужен, если вам важны возможности именно Anthropic API.

Выбор модели

С fetch: true в селекторе окажется весь каталог RouterAI, включая модели для картинок, видео и эмбеддингов. Если нужен короткий список, поставьте fetch: false — тогда будут только модели из default. Все id берите в каталоге моделей: он обновляется чаще, чем статьи.

Модель Для чего
anthropic/claude-sonnet-5.5 основная модель: тексты, код, анализ документов, работа агентов
anthropic/claude-haiku-5.5 быстрые недорогие ответы, названия чатов (titleModel)
openai/gpt-5.5 сложные рассуждения и многошаговые задачи
google/gemini-3.1-pro-preview длинный контекст (около 1 млн токенов): большие документы
deepseek/deepseek-v4-flash недорогой вариант для обычного чата и суммаризации

Цены за токены различаются в десятки раз, актуальные значения смотрите в каталоге. Для повседневных чатов разумно оставить по умолчанию недорогую модель, а дорогие выбирать под конкретную задачу.

LibreChat умеет больше обычного чата. Подключённые MCP-серверы доступны прямо в чате при выборе модели с поддержкой инструментов. В конструкторе агентов можно собрать ассистента с инструкциями, инструментами и Skills (файлами SKILL.md с повторно используемыми процедурами), а в поле Model выбрать нужного провайдера и модель.

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

  1. Откройте http://localhost:3080 и войдите в свою учётную запись.
  2. В селекторе вверху выберите endpoint RouterAI и модель, например anthropic/claude-sonnet-5.5.
  3. Отправьте сообщение: «Объясни одним предложением, что такое LibreChat». Над ответом будет подпись из modelDisplayLabel.

Чат в LibreChat: выбрана модель anthropic/claude-sonnet-5.5, ответ с подписью RouterAI

Проверить ключ отдельно от интерфейса можно из командной строки:

curl -s https://routerai.ru/api/v1/models -H "Authorization: Bearer sk-xxxxxxxxxxxxxxxx" | head -c 300

Ответ с JSON-списком моделей означает, что ключ рабочий. Сам запрос к модели выглядит так:

curl -s https://routerai.ru/api/v1/chat/completions \
  -H "Authorization: Bearer sk-xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"model":"anthropic/claude-haiku-5.5","messages":[{"role":"user","content":"Привет"}]}'

Безопасность и расходы

  • Закройте регистрацию. Создав нужные учётные записи, поставьте в .env ALLOW_REGISTRATION=false и перезапустите LibreChat, иначе любой, кто откроет сайт, сможет зарегистрироваться и тратить ваш баланс. Если регистрация нужна, ограничьте домены почты через registration.allowedDomains в librechat.yaml.
  • Ключ в .env, а не в YAML. Файл librechat.yaml часто попадает в репозитории; ссылка ${ROUTERAI_API_KEY} держит ключ вне конфига. Режим apiKey: 'user_provided' позволяет каждому пользователю вводить в интерфейсе свой ключ: тогда расходы идут с его аккаунта RouterAI.
  • Лимиты сообщений. В .env есть LIMIT_MESSAGE_USER и MESSAGE_USER_MAX (число сообщений на пользователя), LIMIT_MESSAGE_IP и LIMIT_CONCURRENT_MESSAGES (ограничения по IP и числу параллельных запросов).
  • Внутренние кредиты. Блок balance в librechat.yaml (enabled, startBalance) заводит каждому пользователю лимит в кредитах LibreChat. Это отдельный счётчик внутри приложения: реальные списания всё равно идут с баланса RouterAI.
  • Список моделей. Короткий default с fetch: false не даёт пользователям выбирать дорогие модели случайно.

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

Endpoint RouterAI не появился в селекторе. LibreChat молча отбрасывает блок, в котором нет name, baseURL, apiKey или models (в models нужен fetch: true или непустой default). Проверьте отступы (блок лежит внутри списка endpoints.custom), опечатки в именах полей и уникальность name, затем перезапустите контейнеры. Лог — docker compose logs api.

Правки librechat.yaml не применяются. Убедитесь, что файл смонтирован в docker-compose.override.yml и после правки выполнен docker compose down && docker compose up -d. Если ошибка в схеме, сервер завершится с кодом 1: смотрите docker compose logs api.

Ошибка Missing API Key for RouterAI или 401. Переменной ROUTERAI_API_KEY нет в .env либо ключ скопирован с пробелом или переносом строки. Создайте новый ключ в личном кабинете, обновите .env и перезапустите.

Контейнер api падает при старте с ошибкой про credentials. В версии 0.8.8 LibreChat отказывается стартовать со слабыми или шаблонными секретами. Задайте в .env свои значения: CREDS_KEY (64 hex-символа, openssl rand -hex 32), CREDS_IV (32 hex-символа, openssl rand -hex 16), JWT_SECRET и JWT_REFRESH_SECRET (openssl rand -hex 32).

В списке нет нужной модели или ответ не приходит. Проверьте, что id точно совпадает с каталогом (например, anthropic/claude-sonnet-5.5), и повторите запрос с другой моделью, чтобы отделить проблему модели от проблемы подключения. Убедитесь, что на балансе RouterAI есть средства.

Что дальше