# 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»](/settings/keys): он начинается с `sk-or-...` и показывается один раз.
- Свободный порт 3080 (иначе смените его в `docker-compose.override.yml`).

## Установка

По [официальной инструкции](https://www.librechat.ai/docs/local/docker) LibreChat ставится так:

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

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

![Форма «Создать аккаунт» в LibreChat: полное имя, имя пользователя, Email, пароль и подтверждение пароля](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/9cdb412d5dc2d7d0c4dab9ab6158acc4.png)

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

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

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

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

   ```bash
   ROUTERAI_API_KEY=sk-xxxxxxxxxxxxxxxx
   ```

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

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

   ```bash
   cp docker-compose.override.yml.example docker-compose.override.yml
   ```

   ```yaml
   services:
     api:
       volumes:
         - type: bind
           source: ./librechat.yaml
           target: /app/librechat.yaml
   ```

3. **Описание endpoint в `librechat.yaml`.** Создайте файл (или скопируйте `librechat.example.yaml`) и добавьте RouterAI в `endpoints.custom`:

   ```yaml
   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'
   ```

Что означают поля (по [справочнику](https://www.librechat.ai/docs/configuration/librechat_yaml/object_structure/custom_endpoint)):

| Поле | Назначение |
|---|---|
| `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 прочитал конфиг:

```bash
docker compose down && docker compose up -d
```

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

![Селектор моделей LibreChat: endpoint RouterAI рядом с My Agents и список моделей RouterAI с полем поиска](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/b26b1e089d852f2371277d4d2ba7035e.png)

### Claude через Anthropic Messages API

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

```yaml
    - 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 берите в [каталоге моделей](/models): он обновляется чаще, чем статьи.

| Модель | Для чего |
|---|---|
| `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-серверы](https://www.librechat.ai/docs/features/mcp) доступны прямо в чате при выборе модели с поддержкой инструментов. В [конструкторе агентов](https://www.librechat.ai/docs/features/agents) можно собрать ассистента с инструкциями, инструментами и [Skills](https://www.librechat.ai/docs/features/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](https://b51bc417-3ee0-451a-a83b-8a681d027a96.selstorage.ru/public/eb65f6e98ef037b3d47682532012dec7.png)

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

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

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

```bash
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` либо ключ скопирован с пробелом или переносом строки. Создайте новый ключ в [личном кабинете](/settings/keys), обновите `.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 есть средства.

## Что дальше

- Подберите модели в [каталоге RouterAI](/models).
- Похожие самостоятельно разворачиваемые интерфейсы и конструкторы: [Open WebUI](/pages/open-webui-routerai), [Dify](/pages/dify-routerai) и [n8n с блоком AI Agent](/pages/n8n-ai-agent-routerai) подключаются к RouterAI по тому же адресу.
- Документация LibreChat: [Custom Endpoints](https://www.librechat.ai/docs/quick_start/custom_endpoints), [руководство по librechat.yaml](https://www.librechat.ai/docs/configuration/librechat_yaml) и [репозиторий на GitHub](https://github.com/LibreChat-AI/LibreChat).
