Добавьте APIsRouter как кастомный эндпоинт LibreChat.

Updated 2026-07-29

LibreChat относится к кастомным OpenAI-совместимым эндпоинтам как к полноценной функции: один блок endpoints.custom в librechat.yaml с baseURL, apiKey и models.fetch, установленным в true, — и весь каталог появляется в селекторе моделей под одним ключом.

Короткий ответ: один блок в librechat.yaml.

Кастомные эндпоинты LibreChat настраиваются в librechat.yaml под endpoints.custom — массиве, где каждая запись это один провайдер. Три важных поля: name (подпись в селекторе эндпоинта), apiKey (который интерполирует переменные окружения в форме ${VARIABLE}, так что ключ живёт в .env и никогда в YAML) и baseURL. Для APIsRouter baseURL — это https://api.apisrouter.com/v1, с включённым /v1, потому что LibreChat дописывает пути маршрутов вроде /chat/completions к тому base, который вы дали. Блок models решает, что появляется в выпадающем списке моделей. Установите models.fetch в true, и LibreChat запросит листинг /v1/models эндпоинта при загрузке, так что каждый ID каталога станет доступен без ведения списка вручную. models.default всё равно обязателен как массив и служит фолбэком, показываемым до или вместо получения списка. Это задокументированная вышестоящая конфигурация, а не патч: структура объекта кастомного эндпоинта в документации LibreChat определяет каждый использованный здесь ключ.

version: 1.2.1
endpoints:
  custom:
    - name: "APIsRouter"
      apiKey: "${APISROUTER_API_KEY}"
      baseURL: "https://api.apisrouter.com/v1"
      models:
        default: ["claude-sonnet-4-6"]
        fetch: true

Как LibreChat маршрутизирует кастомные эндпоинты.

LibreChat (danny-avila на GitHub, около 41K звёзд) — самый широко развёрнутый self-hosted интерфейс в стиле ChatGPT: мультипользовательский, мультимодельный, с поиском по разговорам, агентами, обработкой файлов и ключами на пользователя. В отличие от клиентов с захардкоженным списком провайдеров, его массив endpoints.custom принимает любой OpenAI-совместимый сервис, и несколько известных провайдеров в документации настроены именно через этот механизм. Когда пользователь выбирает модель из кастомного эндпоинта, LibreChat отправляет стандартный запрос /v1/chat/completions на baseURL этого эндпоинта с полем model как простой строкой. Клиенту неважно, какой вендор обучил модель; строка передаётся как есть. Когда эндпоинт за baseURL обслуживает несколько вендоров, одна запись librechat.yaml помещает ID Claude, GPT, Gemini, DeepSeek и GLM в один выпадающий список, и пользователь переключает вендоров посреди разговора точно так же, как переключался бы между двумя вариантами GPT. Это сворачивает обычную мультипровайдерную настройку LibreChat. Вместо одной кастомной записи на вендора, каждой со своим ключом в .env и своей поверхностью биллинга, одна запись с одним ключом покрывает каталог, а админ видит использование по модели в одном месте, вместо сверки нескольких дашбордов.

Полная настройка: YAML, .env и монтирование в Docker.

Создайте librechat.yaml в корне проекта и поместите ключ в .env. Ссылка ${APISROUTER_API_KEY} в YAML резолвится из окружения при старте, так что конфиг-файл остаётся коммитируемым. Шаг, который чаще всего упускают при первой настройке, специфичен для Docker: контейнер не видит ваш librechat.yaml, пока вы его не смонтируете. Документация просит создать docker-compose.override.yml с bind-монтированием из ./librechat.yaml в /app/librechat.yaml, а затем пересоздать контейнеры. Правка YAML после этого тоже требует перезапуска, потому что файл читается при старте, а не отслеживается. Несколько опциональных полей стоит задать в записи шлюза. titleConvo включает автоматические заголовки разговоров, а titleModel выбирает модель, которая их пишет; задокументированное значение по умолчанию LibreChat для titleModel — gpt-3.5-turbo, ID, который эндпоинт не от OpenAI может не обслуживать, так что задайте его явно на быстрый ID каталога или на специальное значение current_model. modelDisplayLabel управляет именем, показываемым в сообщениях ассистента. А apiKey принимает специальное значение user_provided, если хотите, чтобы каждый пользователь вставлял собственный ключ вместо использования общего серверного.

version: 1.2.1
endpoints:
  custom:
    - name: "APIsRouter"
      apiKey: "${APISROUTER_API_KEY}"
      baseURL: "https://api.apisrouter.com/v1"
      models:
        default: ["claude-sonnet-4-6", "gpt-5.5", "deepseek-v4-pro"]
        fetch: true
      titleConvo: true
      titleModel: "claude-haiku-4-5-20251001"
      modelDisplayLabel: "APIsRouter"

Выбор моделей для общего рабочего пространства чата.

Поскольку каждая модель тарифицируется через один и тот же ключ, практический цикл для админа — наблюдать неделю использования в консоли, видеть, какие модели реально выбирают пользователи, и подрезать models.default под это, оставляя fetch включённым, чтобы продвинутые пользователи всё равно могли дотянуться до полного списка.

  • Ежедневный чат хочет сильного генералиста. claude-sonnet-4-6 и gpt-5.5 несут длинные разговоры, обсуждение файлов и прогоны агента без тревоги о модели на каждое сообщение.
  • Частые короткие вопросы — это объёмная работа. claude-haiku-4-5-20251001 и gemini-3.5-flash отвечают быстро и не дают многопользовательскому деплою концентрировать расходы на одноразовых репликах.
  • Генерация заголовков срабатывает на каждом разговоре. Направьте titleModel на быстрый ID; оплата флагманских тарифов за написание шестисловных заголовков — самая частая тихая трата в деплое LibreChat.
  • Многоязычным командам стоит протестировать deepseek-v4-pro и glm-5.2 на своём реальном языковом миксе; мультивендорный выпадающий список делает это сравнением внутри приложения, а не переконфигурацией.
  • models.fetch означает, что новые модели каталога появляются без правки YAML, так что модель, добавленная выше по цепочке, становится доступной при следующем обновлении списка.

Оплата по факту · дешевле официальных цен

Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.

МодельОфициальная ценаНаша цена
Claude Sonnet 4.6$3.00 / $15.00 per M$2.40 / $12.00 per M
Claude Haiku 4.5 20251001$1.00 / $5.00 per M$0.80 / $4.00 per M
GPT-5.5$5.00 / $30.00 per M$4.00 / $24.00 per M
Gemini 3.5 Flash$1.50 / $9.00 per M$1.20 / $7.20 per M
DeepSeek V4 Pro$0.43 / $0.87 per M$0.40 / $0.90 per M

Сбои, специфичные именно для LibreChat.

Конфиг тихо не загружается — классика, и почти всегда виновато монтирование Docker. Без bind-монтирования в docker-compose.override.yml контейнер работает вообще без librechat.yaml, кастомный эндпоинт никогда не появляется в селекторе, и ничего не сообщает об ошибке. Подтвердите, что файл существует внутри контейнера, прежде чем отлаживать что-либо ещё. apiKey, приходящий буквально как ${APISROUTER_API_KEY}, означает, что переменная отсутствовала в окружении, с которым стартовал сервер; интерполяция происходит при старте из .env, так что ключ, добавленный после, требует перезапуска контейнера. Симптом — 401 от шлюза с бессмысленным bearer-токеном. baseURL без /v1 даёт 404 на каждом запросе, потому что LibreChat дописывает /chat/completions к base как есть. Обратная ошибка, вставка полного URL completions как baseURL, относится к отдельной опции directEndpoint и не должна комбинироваться с обычной записью. Пустой выпадающий список моделей при выключенном fetch означает, что models.default отсутствует или пуст; это обязательный массив. При включённом fetch пустой выпадающий список обычно означает, что сам fetch не удался, что возвращает к ключу или baseURL. А неудачные заголовки разговоров при в остальном работающем эндпоинте — это значение titleModel по умолчанию, указывающее на ID, который шлюз не обслуживает; задайте его явно.

Кто направляет LibreChat через шлюз.

  • Команды, самостоятельно хостящие общее рабочее пространство чата и желающие видеть Claude, GPT, Gemini и DeepSeek в одном выпадающем списке, не поддерживая по одной записи endpoints.custom и одному вендорскому аккаунту на каждого.
  • Админы, ведущие мультипользовательские деплои, которым нужна одна поверхность использования. Логи по ключу показывают, какие модели команда реально использует, с ценами, без слияния вендорских дашбордов.
  • Операторы, выдающие отделам собственные ключи: тот же YAML, один ключ на группу, а лог использования становится отчётом о расходах по команде.
  • Домохозяйства и небольшие группы, заменяющие несколько подписок на чат одним тарифицируемым эндпоинтом, платя за использованные токены, а не за места.
  • Разработчики без доступа к биллингу конкретного вендора. Доступ на основе пополнения без требования карты убирает зависимость от регистрации у каждого провайдера.

Проверьте эндпоинт и отладьте первое сообщение.

Подтвердите половину со стороны шлюза до того, как трогать LibreChat: получите список моделей своим ключом и убедитесь, что ID, указанные в models.default, в нём есть. Если это работает, любой оставшийся симптом — на стороне LibreChat. Затем запустите стек и откройте селектор эндпоинта. Появление записи APIsRouter вообще доказывает, что YAML загрузился; заполнение списка моделей доказывает fetch и ключ; первый ответ доказывает путь чата. Проходите эти три по порядку, а не все сразу, потому что у каждого свой набор сбоев — монтирование, переменная окружения и baseURL соответственно. Как только сообщения пойдут, консоль APIsRouter покажет модель на запрос, счётчики токенов и расходы. Общий инстанс LibreChat — именно тот тип деплоя, где использование незаметно концентрируется на двух-трёх моделях, и лог использования — это то, как вы узнаёте, на каких именно, раньше, чем это покажет счёт.

curl -s https://api.apisrouter.com/v1/models \
  -H "Authorization: Bearer $APISROUTER_API_KEY" | head -50

Частые вопросы

Где настроить кастомный OpenAI-совместимый эндпоинт в LibreChat?

В librechat.yaml под endpoints.custom — массиве записей провайдера с name, apiKey, baseURL и блоком models. На установках Docker файл должен быть bind-смонтирован в контейнер через docker-compose.override.yml, иначе он тихо игнорируется.

Должен ли baseURL включать /v1?

Да, для APIsRouter: https://api.apisrouter.com/v1. LibreChat дописывает пути маршрутов вроде /chat/completions к base как есть, так что отсутствующий /v1 даёт 404 на каждом запросе.

Может ли один эндпоинт LibreChat обслуживать модели Claude, GPT и DeepSeek вместе?

Да. LibreChat передаёт выбранный ID модели как простую строку на baseURL эндпоинта. Когда эндпоинт обслуживает несколько вендоров, одна запись endpoints.custom помещает все их ID в один выпадающий список, а models.fetch автоматически держит этот список актуальным.

Почему мой кастомный эндпоинт отсутствует в селекторе?

YAML не загрузился. На Docker обычная причина — отсутствующее bind-монтирование для librechat.yaml; контейнер работает без файла, и ничего не сообщает об ошибке. Подтвердите, что файл существует внутри контейнера, затем перезапустите, поскольку конфиг читается при старте.

Почему заголовки разговоров не работают, хотя чат работает?

titleConvo использует titleModel, чьё задокументированное значение по умолчанию — gpt-3.5-turbo, ID, который ваш эндпоинт может не обслуживать. Задайте titleModel явно на быстрый ID каталога вроде claude-haiku-4-5-20251001, либо на специальное значение current_model.

Может ли каждый пользователь принести собственный ключ вместо общего серверного?

Да. Установите apiKey в специальное значение user_provided, и LibreChat запросит ключ у каждого пользователя, хранимый по пользователю. Это хорошо подходит ключам шлюза, поскольку один ключ на пользователя превращает лог использования в отчёт о расходах на человека.