Aggiungi APIsRouter come endpoint personalizzato di LibreChat.

Updated 2026-07-29

LibreChat tratta gli endpoint personalizzati compatibili OpenAI come una funzionalità di prima classe: un blocco endpoints.custom in librechat.yaml con una baseURL, una apiKey, e models.fetch impostato su true, e l'intero catalogo compare nel selettore di modelli sotto un'unica chiave.

Risposta rapida: un blocco in librechat.yaml.

Gli endpoint personalizzati di LibreChat si configurano in librechat.yaml sotto endpoints.custom, un array dove ogni voce è un provider. I tre campi che contano sono name (l'etichetta nel selettore endpoint), apiKey (che interpola variabili d'ambiente nella forma ${VARIABLE}, così la chiave risiede in .env e mai nello YAML), e baseURL. Per APIsRouter la baseURL è https://api.apisrouter.com/v1, con /v1 incluso, perché LibreChat aggiunge percorsi di route come /chat/completions a qualunque base tu gli dia. Il blocco models decide cosa compare nel menu a tendina dei modelli. Imposta models.fetch su true e LibreChat interroga l'elenco /v1/models dell'endpoint al caricamento, quindi ogni id di catalogo diventa selezionabile senza mantenere una lista scritta a mano. models.default è comunque richiesto come array e serve da fallback mostrato prima o al posto di un fetch. Questa è configurazione a monte documentata, non una patch: la struttura dell'oggetto endpoint personalizzato nella documentazione di LibreChat definisce ogni chiave usata qui.

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

Come LibreChat instrada gli endpoint personalizzati.

LibreChat (danny-avila su GitHub, circa 41K stelle) è l'interfaccia self-hosted in stile ChatGPT più diffusa: multi-utente, multi-modello, con ricerca nelle conversazioni, agenti, gestione file, e chiavi per utente. A differenza dei client che codificano rigidamente una lista di provider, il suo array endpoints.custom accetta qualsiasi servizio compatibile OpenAI, e diversi provider noti nella documentazione sono configurati esattamente tramite questo meccanismo. Quando un utente sceglie un modello da un endpoint personalizzato, LibreChat invia una richiesta /v1/chat/completions standard alla baseURL di quell'endpoint con il campo model come semplice stringa. Nulla nel client si preoccupa di quale fornitore abbia addestrato il modello; la stringa viene inoltrata così com'è. Quando l'endpoint dietro la baseURL serve diversi fornitori, una voce in librechat.yaml mette gli id Claude, GPT, Gemini, DeepSeek e GLM nello stesso menu a tendina, e un utente cambia fornitore a metà conversazione nello stesso modo in cui cambierebbe tra due varianti GPT. Questo comprime la solita configurazione multi-provider di LibreChat. Invece di una voce personalizzata per fornitore, ciascuna con la propria chiave in .env e la propria superficie di fatturazione, una voce con una chiave copre il catalogo, e l'admin vede l'utilizzo per modello in un unico posto invece di riconciliare diverse dashboard.

Configurazione completa: YAML, .env, e il mount Docker.

Crea librechat.yaml nella radice del progetto e metti la chiave in .env. Il riferimento ${APISROUTER_API_KEY} nello YAML si risolve dall'ambiente all'avvio, quindi il file di configurazione resta committable. Il passo che la maggior parte delle configurazioni alla prima volta manca è specifico di Docker: il container non vede il tuo librechat.yaml finché non lo monti. La documentazione ti fa creare docker-compose.override.yml con un bind mount da ./librechat.yaml a /app/librechat.yaml, poi ricreare i container. Modificare lo YAML in seguito richiede anche un riavvio, perché il file viene letto all'avvio, non osservato. Vale la pena impostare alcuni campi opzionali su una voce gateway. titleConvo abilita i titoli automatici delle conversazioni, e titleModel sceglie il modello che li scrive; il default documentato di LibreChat per titleModel è gpt-3.5-turbo, un id che un endpoint non-OpenAI potrebbe non servire, quindi impostalo esplicitamente su un id di catalogo veloce o sul valore speciale current_model. modelDisplayLabel controlla il nome mostrato sui messaggi dell'assistente. E apiKey accetta il valore speciale user_provided se vuoi che ogni utente incolli la propria chiave invece di condividere quella del server.

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"

Scegliere modelli per uno spazio di lavoro chat condiviso.

Poiché ogni modello fattura attraverso la stessa chiave, il ciclo pratico per un admin è osservare una settimana di utilizzo nella console, vedere quali modelli scelgono davvero gli utenti, e potare models.default di conseguenza, mantenendo fetch attivo così che gli utenti avanzati possano ancora raggiungere la lista completa.

  • La chat daily-driver vuole un generalista forte. claude-sonnet-4-6 e gpt-5.5 portano conversazioni lunghe, discussione di file, ed esecuzioni agente senza ansia da modello per messaggio.
  • Le domande brevi ad alta frequenza sono lavoro a volume. claude-haiku-4-5-20251001 e gemini-3.5-flash rispondono velocemente e impediscono a un deployment multi-utente di concentrare la spesa su turni usa-e-getta.
  • La generazione dei titoli si attiva su ogni conversazione. Punta titleModel su un id veloce; pagare tariffe di frontiera per scrivere titoli di sei parole è lo spreco silenzioso più comune in un deployment LibreChat.
  • I team multilingue dovrebbero testare deepseek-v4-pro e glm-5.2 sul loro mix linguistico reale; un menu a tendina multi-fornitore rende questo un confronto in-app piuttosto che una riconfigurazione.
  • models.fetch significa che i nuovi modelli del catalogo compaiono senza toccare lo YAML, quindi un modello aggiunto a monte è selezionabile la prossima volta che la lista si aggiorna.

Pagamento a consumo · sotto i prezzi ufficiali

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

ModelloPrezzo ufficialeIl nostro prezzo
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

Modalità di errore specifiche di LibreChat.

La config che non si carica silenziosamente è il classico, ed è quasi sempre il mount Docker. Senza il bind mount di docker-compose.override.yml, il container gira senza alcun librechat.yaml, l'endpoint personalizzato non compare mai nel selettore, e nulla dà errore. Conferma che il file esista dentro il container prima di fare debug di qualsiasi altra cosa. Una apiKey che arriva letteralmente come ${APISROUTER_API_KEY} significa che la variabile non era presente nell'ambiente con cui il server è partito; l'interpolazione avviene all'avvio da .env, quindi una chiave aggiunta in seguito richiede un riavvio del container. Il sintomo è un 401 dal gateway con un bearer token privo di senso. Una baseURL senza /v1 produce 404 su ogni richiesta, perché LibreChat aggiunge /chat/completions alla base così com'è data. L'errore inverso, incollare un URL completions completo come baseURL, appartiene alla separata opzione directEndpoint e non dovrebbe essere combinato con una voce normale. Un menu a tendina dei modelli vuoto con fetch disattivato significa che models.default è mancante o vuoto; è un array richiesto. Con fetch attivo, un menu a tendina vuoto di solito significa che il fetch stesso è fallito, il che riporta alla chiave o alla baseURL. E titoli di conversazione falliti su un endpoint altrimenti funzionante sono il default di titleModel che punta a un id che il gateway non serve; impostalo esplicitamente.

Chi instrada LibreChat tramite un gateway.

  • Team che self-hostano uno spazio di lavoro chat condiviso e vogliono Claude, GPT, Gemini e DeepSeek in un unico menu a tendina senza mantenere una voce endpoints.custom e un account fornitore ciascuno.
  • Admin che gestiscono deployment multi-utente e hanno bisogno di un'unica superficie di utilizzo. I log per chiave mostrano quali modelli usa davvero il team, prezzati, senza unire dashboard fornitore.
  • Operatori che danno ai reparti le proprie chiavi: stesso YAML, una chiave per gruppo, e il log di utilizzo diventa il report di costo per team.
  • Famiglie e piccoli gruppi che sostituiscono diversi abbonamenti chat con un unico endpoint a consumo, pagando per i token usati invece che per le postazioni.
  • Sviluppatori senza accesso alla fatturazione di un dato fornitore. L'accesso basato su ricarica senza obbligo di carta rimuove la dipendenza dalla registrazione per provider.

Verifica l'endpoint e fai debug del primo messaggio.

Dimostra la metà gateway prima di toccare LibreChat: elenca i modelli con la tua chiave, e conferma che gli id che hai messo in models.default compaiano. Se funziona, ogni sintomo rimanente è sul lato LibreChat del collegamento. Poi avvia lo stack e apri il selettore endpoint. La voce APIsRouter che compare affatto dimostra che lo YAML si è caricato; la lista modelli che si popola dimostra il fetch e la chiave; la prima risposta dimostra il percorso chat. Lavora su questi tre in ordine piuttosto che tutti insieme, perché ciascuno ha un insieme distinto di fallimenti, il mount, la variabile d'ambiente, e la baseURL rispettivamente. Una volta che i messaggi scorrono, la console di APIsRouter mostra modello per richiesta, conteggi dei token e spesa. Un'istanza LibreChat condivisa è esattamente il tipo di deployment dove l'utilizzo si concentra silenziosamente su due o tre modelli, e il log di utilizzo è come scopri quali prima che lo faccia la fattura.

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

Domande frequenti

Dove configuro un endpoint personalizzato compatibile OpenAI in LibreChat?

In librechat.yaml sotto endpoints.custom, un array di voci provider con name, apiKey, baseURL, e un blocco models. Sulle installazioni Docker il file deve essere bind-mounted nel container tramite docker-compose.override.yml altrimenti viene ignorato silenziosamente.

La baseURL dovrebbe includere /v1?

Sì per APIsRouter: https://api.apisrouter.com/v1. LibreChat aggiunge percorsi di route come /chat/completions alla base così com'è data, quindi un /v1 mancante produce 404 su ogni richiesta.

Un endpoint LibreChat può servire insieme modelli Claude, GPT e DeepSeek?

Sì. LibreChat inoltra l'id del modello selezionato come semplice stringa alla baseURL dell'endpoint. Quando l'endpoint serve più fornitori, una voce endpoints.custom mette tutti i loro id nello stesso menu a tendina, e models.fetch mantiene automaticamente aggiornata quella lista.

Perché il mio endpoint personalizzato manca dal selettore?

Lo YAML non si è caricato. Su Docker la causa abituale è un bind mount mancante per librechat.yaml; il container gira senza il file e nulla dà errore. Conferma che il file esista dentro il container, poi riavvia, dato che la config viene letta all'avvio.

Perché i titoli di conversazione falliscono quando la chat funziona?

titleConvo usa titleModel, il cui default documentato è gpt-3.5-turbo, un id che il tuo endpoint potrebbe non servire. Imposta titleModel esplicitamente su un id di catalogo veloce come claude-haiku-4-5-20251001, o sul valore speciale current_model.

Ogni utente può portare la propria chiave invece di condividere quella del server?

Sì. Imposta apiKey sul valore speciale user_provided e LibreChat chiede a ogni utente una chiave, memorizzata per utente. Questo si adatta bene alle chiavi gateway, dato che una chiave per utente trasforma il log di utilizzo in una vista di costo per persona.