LibreChat
LibreChat is a self-hosted, multi-model chat app.
It connects to any OpenAI-compatible service through a custom endpoint in
its librechat.yaml config, so the proxy slots in next to whatever else you
run.
Before you start
Do the shared setup from How-to guides first: the proxy must be running and funded.
LibreChat runs in Docker by default, so — like Open WebUI — the container
can't reach localhost:9376 on your host. Read the
Docker networking note: point LibreChat
at http://host.docker.internal:9376/v1 and bind the proxy off loopback
(PROXY_SERVER_LISTEN=0.0.0.0:9376).
Connect it
Add a custom endpoint to librechat.yaml
Add ZeroSignal under endpoints.custom:
endpoints:
custom:
- name: 'ZeroSignal'
apiKey: 'zerosignal' # any non-empty value; the proxy ignores it
baseURL: 'http://host.docker.internal:9376/v1' # localhost:9376/v1 if LibreChat runs natively
models:
default: ['qwen3-coder'] # a starting model; used until the list loads
fetch: true # pull the live catalog from /v1/models
titleConvo: true
titleModel: 'qwen3-coder' # a real model id from the catalog
modelDisplayLabel: 'ZeroSignal'
fetch: true tells LibreChat to populate the model dropdown from the proxy's
/v1/models. titleModel must be a concrete model id — it's what LibreChat
uses to name conversations.
(Optional) Keep the key out of the file
The key is a throwaway, but if you'd rather not hardcode it, use an environment
variable and set it in .env:
apiKey: '${ZEROSIGNAL_KEY}'
# .env
ZEROSIGNAL_KEY=zerosignal
Restart LibreChat
For a Docker install, make sure librechat.yaml is mounted (via
docker-compose.override.yml) and restart:
docker compose down && docker compose up -d
A native install just needs a restart. The ZeroSignal endpoint now appears in the model/endpoint switcher.
Start a chat
Pick ZeroSignal in the endpoint switcher, choose a model, and send a message. The first reply confirms the path works end to end.
Troubleshooting
| Symptom | Fix |
|---|---|
| ZeroSignal endpoint doesn't appear | All three pieces must line up: the endpoints.custom block in librechat.yaml, the mounted config in Docker, and (if used) the .env key. Restart after editing. |
| Endpoint appears but every chat errors | The container can't reach the proxy. Use host.docker.internal in baseURL and bind the proxy to 0.0.0.0:9376. On Linux add --add-host=host.docker.internal:host-gateway. |
| Empty model list | fetch: true failed to reach /v1/models (same networking cause as above), or the proxy was down. The models.default list is the fallback. |
wallet_unfunded / payment errors | zs-proxy fund — see Wallet & funding. |
What's next
- Configuration —
server.listen, spend caps, and the output ceiling. - Custom endpoints in LibreChat's own docs — every field on the endpoint object.
- How-to guides — connect another app.