Dodaj APIsRouter jako niestandardowy endpoint w LibreChat.

Updated 2026-07-29

LibreChat traktuje niestandardowe endpointy kompatybilne z OpenAI jako pełnoprawną funkcję: jeden blok endpoints.custom w librechat.yaml z baseURL, apiKey i models.fetch ustawionym na true, a cały katalog pojawia się w selektorze modeli pod jednym kluczem.

Szybka odpowiedź: jeden blok w librechat.yaml.

Niestandardowe endpointy LibreChat są konfigurowane w librechat.yaml pod endpoints.custom, tablicy, w której każdy wpis to jeden dostawca. Trzy pola, które mają znaczenie, to name (etykieta w selektorze endpointów), apiKey (który interpoluje zmienne środowiskowe w formie ${VARIABLE}, więc klucz żyje w .env, a nigdy w YAML) oraz baseURL. Dla APIsRouter baseURL to https://api.apisrouter.com/v1, z dołączonym /v1, ponieważ LibreChat dokleja ścieżki tras, takie jak /chat/completions, do dowolnej podanej przez Ciebie bazy. Blok models decyduje, co pojawia się w rozwijanej liście modeli. Ustaw models.fetch na true, a LibreChat odpytuje listę /v1/models endpointu przy starcie, więc każdy identyfikator z katalogu staje się wybieralny bez utrzymywania ręcznie pisanej listy. models.default jest wciąż wymagane jako tablica i służy jako fallback pokazywany przed pobraniem albo zamiast niego. To udokumentowana konfiguracja upstream, nie łatka: struktura obiektu niestandardowego endpointu w dokumentacji LibreChat definiuje każdy klucz użyty tutaj.

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

Jak LibreChat kieruje niestandardowe endpointy.

LibreChat (danny-avila na GitHubie, ok. 41 tys. gwiazdek) to najszerzej wdrażany, samodzielnie hostowany interfejs w stylu ChatGPT: wieloużytkownikowy, wielomodelowy, z wyszukiwaniem konwersacji, agentami, obsługą plików i kluczami per użytkownik. W przeciwieństwie do klientów z listą providerów zaszytą na stałe, jego tablica endpoints.custom akceptuje dowolną usługę kompatybilną z OpenAI, a kilku znanych dostawców w dokumentacji jest konfigurowanych dokładnie przez ten mechanizm. Gdy użytkownik wybiera model z niestandardowego endpointu, LibreChat wysyła standardowe żądanie /v1/chat/completions do baseURL tego endpointu, z polem model jako zwykłym stringiem. Nic w kliencie nie obchodzi, który dostawca wytrenował model; string jest przekazywany bez zmian. Gdy endpoint za baseURL obsługuje kilku dostawców, jeden wpis librechat.yaml umieszcza identyfikatory Claude, GPT, Gemini, DeepSeek i GLM w tej samej rozwijanej liście, a użytkownik przełącza dostawców w trakcie konwersacji dokładnie tak, jak przełączałby się między dwoma wariantami GPT. To spłaszcza typową wielodostawcową konfigurację LibreChat. Zamiast jednego niestandardowego wpisu na dostawcę, każdego z własnym kluczem w .env i własną powierzchnią rozliczeniową, jeden wpis z jednym kluczem obejmuje cały katalog, a administrator widzi użycie per model w jednym miejscu, zamiast uzgadniać kilka paneli.

Pełna konfiguracja: YAML, .env i mount Dockera.

Utwórz librechat.yaml w katalogu głównym projektu i umieść klucz w .env. Referencja ${APISROUTER_API_KEY} w YAML rozwiązuje się ze środowiska przy starcie, więc plik konfiguracyjny pozostaje bezpieczny do commitowania. Krok, który najczęściej umyka przy pierwszej konfiguracji, jest specyficzny dla Dockera: kontener nie widzi Twojego librechat.yaml, dopóki go nie zamontujesz. Dokumentacja każe utworzyć docker-compose.override.yml z bind mountem z ./librechat.yaml do /app/librechat.yaml, a następnie odtworzyć kontenery. Późniejsza edycja YAML również wymaga restartu, bo plik jest czytany przy starcie, a nie obserwowany na bieżąco. Kilka opcjonalnych pól warto ustawić na wpisie bramki. titleConvo włącza automatyczne tytuły konwersacji, a titleModel wybiera model, który je pisze; udokumentowaną wartością domyślną LibreChat dla titleModel jest gpt-3.5-turbo, identyfikator, którego endpoint spoza OpenAI może nie obsługiwać, więc ustaw go jawnie na szybki identyfikator z katalogu albo na specjalną wartość current_model. modelDisplayLabel kontroluje nazwę pokazywaną na wiadomościach asystenta. A apiKey akceptuje specjalną wartość user_provided, jeśli chcesz, żeby każdy użytkownik wklejał własny klucz zamiast współdzielić klucz serwera.

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"

Dobór modeli do współdzielonego workspace'u czatu.

Ponieważ każdy model rozlicza się przez ten sam klucz, praktyczna pętla dla administratora to obserwowanie tygodnia użycia w konsoli, sprawdzenie, które modele faktycznie wybierają użytkownicy, i przycięcie models.default odpowiednio, przy zostawieniu fetch włączonego, żeby zaawansowani użytkownicy wciąż mieli dostęp do pełnej listy.

  • Czat na co dzień chce silnego generalisty. claude-sonnet-4-6 i gpt-5.5 dźwigają długie konwersacje, dyskusje o plikach i przebiegi agenta bez niepokoju o model przy każdej wiadomości.
  • Częste krótkie pytania to praca o dużej objętości. claude-haiku-4-5-20251001 i gemini-3.5-flash odpowiadają szybko i chronią wieloużytkownikowe wdrożenie przed koncentracją wydatków na jednorazowych turach.
  • Generowanie tytułów uruchamia się przy każdej konwersacji. Wskaż titleModel na szybki identyfikator; płacenie flagowych stawek za napisanie sześciowyrazowych tytułów to najczęstsze ciche marnotrawstwo we wdrożeniu LibreChat.
  • Zespoły wielojęzyczne powinny przetestować deepseek-v4-pro i glm-5.2 na swoim prawdziwym miksie językowym; wielodostawcowa rozwijana lista czyni to porównaniem wewnątrz aplikacji, a nie rekonfiguracją.
  • models.fetch oznacza, że nowe modele z katalogu pojawiają się bez dotykania YAML, więc model dodany po stronie upstream jest wybieralny przy następnym odświeżeniu listy.

Płatność za użycie · poniżej cen oficjalnych

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

ModelCena oficjalnaNasza cena
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

Tryby awarii charakterystyczne dla LibreChat.

Cichy brak wczytania konfiguracji to klasyk i to prawie zawsze mount Dockera. Bez bind mounta docker-compose.override.yml kontener działa bez żadnego librechat.yaml, niestandardowy endpoint nigdy nie pojawia się w selektorze, a nic nie zgłasza błędu. Potwierdź, że plik istnieje wewnątrz kontenera, zanim zaczniesz debugować cokolwiek innego. apiKey, który dociera dosłownie jako ${APISROUTER_API_KEY}, oznacza, że zmiennej nie było w środowisku, z jakim wystartował serwer; interpolacja zachodzi przy starcie z .env, więc klucz dodany później wymaga restartu kontenera. Objawem jest 401 z bramki z bezsensownym tokenem bearer. baseURL bez /v1 produkuje błędy 404 przy każdym żądaniu, bo LibreChat dokleja /chat/completions do podanej bazy. Odwrotny błąd, wklejenie pełnego URL completions jako baseURL, należy do osobnej opcji directEndpoint i nie powinien być łączony ze zwykłym wpisem. Pusta rozwijana lista modeli przy wyłączonym fetch oznacza, że models.default jest brakujące albo puste; to wymagana tablica. Przy włączonym fetch pusta lista zwykle oznacza, że samo pobranie zawiodło, co wraca do klucza albo baseURL. A nieudane tytuły konwersacji przy poza tym działającym endpoincie to domyślna wartość titleModel wskazująca na identyfikator, którego bramka nie obsługuje; ustaw ją jawnie.

Kto kieruje LibreChat przez bramkę.

  • Zespoły samodzielnie hostujące współdzielony workspace czatu, które chcą mieć Claude, GPT, Gemini i DeepSeek w jednej rozwijanej liście, bez utrzymywania po jednym wpisie endpoints.custom i jednym koncie u dostawcy na każdego z nich.
  • Administratorzy prowadzący wieloużytkownikowe wdrożenia, którzy potrzebują jednej powierzchni użycia. Logi per klucz pokazują, których modeli faktycznie używa zespół, wycenionych, bez łączenia paneli od różnych dostawców.
  • Operatorzy dający działom własne klucze: ten sam YAML, jeden klucz na grupę, a log użycia staje się raportem kosztów per zespół.
  • Gospodarstwa domowe i małe grupy zastępujące kilka subskrypcji czatu jednym rozliczanym endpointem, płacące za zużyte tokeny, a nie za stanowiska.
  • Deweloperzy bez dostępu do rozliczeń danego dostawcy. Dostęp oparty na doładowaniu, bez wymogu karty, usuwa zależność od rejestracji u każdego dostawcy.

Zweryfikuj endpoint i debuguj pierwszą wiadomość.

Potwierdź połowę dotyczącą bramki, zanim zaczniesz dotykać LibreChat: wylistuj modele swoim kluczem i potwierdź, że identyfikatory, które umieściłeś w models.default, się pojawiają. Jeśli to działa, każdy pozostały objaw leży po stronie LibreChat. Następnie uruchom stack i otwórz selektor endpointów. Samo pojawienie się wpisu APIsRouter dowodzi, że YAML się wczytał; wypełnienie się listy modeli dowodzi fetcha i klucza; pierwsza odpowiedź dowodzi ścieżki czatu. Przejdź przez te trzy rzeczy po kolei, a nie wszystkie naraz, bo każda ma osobny zestaw awarii, odpowiednio mount, zmienną środowiskową i baseURL. Gdy wiadomości już płyną, konsola APIsRouter pokazuje model per żądanie, liczbę tokenów i wydatki. Współdzielona instancja LibreChat to dokładnie ten rodzaj wdrożenia, w którym użycie po cichu koncentruje się na dwóch albo trzech modelach, a log użycia to sposób, żeby dowiedzieć się których, zanim zrobi to faktura.

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

Częste pytania

Gdzie skonfigurować niestandardowy endpoint kompatybilny z OpenAI w LibreChat?

W librechat.yaml pod endpoints.custom, tablicy wpisów dostawców z name, apiKey, baseURL i blokiem models. Przy instalacjach Docker plik musi być zamontowany bind mountem do kontenera przez docker-compose.override.yml, w przeciwnym razie jest po cichu ignorowany.

Czy baseURL powinno zawierać /v1?

Tak dla APIsRouter: https://api.apisrouter.com/v1. LibreChat dokleja ścieżki tras, takie jak /chat/completions, do podanej bazy, więc brakujące /v1 produkuje 404 przy każdym żądaniu.

Czy jeden endpoint LibreChat może obsługiwać razem modele Claude, GPT i DeepSeek?

Tak. LibreChat przekazuje wybrany identyfikator modelu jako zwykły string do baseURL endpointu. Gdy endpoint obsługuje wielu dostawców, jeden wpis endpoints.custom umieszcza wszystkie ich identyfikatory w tej samej rozwijanej liście, a models.fetch automatycznie utrzymuje tę listę aktualną.

Dlaczego mój niestandardowy endpoint brakuje w selektorze?

YAML się nie wczytał. Na Dockerze zwykłą przyczyną jest brakujący bind mount dla librechat.yaml; kontener działa bez pliku, a nic nie zgłasza błędu. Potwierdź, że plik istnieje wewnątrz kontenera, a następnie zrestartuj, bo konfiguracja jest czytana przy starcie.

Dlaczego tytuły konwersacji zawodzą, mimo że czat działa?

titleConvo używa titleModel, którego udokumentowaną wartością domyślną jest gpt-3.5-turbo, identyfikator, którego Twój endpoint może nie obsługiwać. Ustaw titleModel jawnie na szybki identyfikator z katalogu, taki jak claude-haiku-4-5-20251001, albo na specjalną wartość current_model.

Czy każdy użytkownik może przynieść własny klucz zamiast współdzielić klucz serwera?

Tak. Ustaw apiKey na specjalną wartość user_provided, a LibreChat poprosi każdego użytkownika o klucz, przechowywany per użytkownik. To dobrze pasuje do kluczy bramki, bo jeden klucz na użytkownika zamienia log użycia w widok kosztu per osoba.