
# Chat apps

Any chat client that lets you set a **base URL** and an **API key**
can use LowRouter as a custom OpenAI-compatible provider. This page
gives the pattern once, then walks through two popular desktop
clients, [Chatbox](https://chatboxai.app/) and
[Jan](https://www.jan.ai/), and the self-hosted web app
[LibreChat](https://www.librechat.ai/). Coding tools have their own
pages ([OpenCode](opencode), [Cline](cline), [Goose](goose));
libraries are on [Frameworks](frameworks), and other non-chat tools
on [generic OpenAI-compatible clients](openai-compatible).

## The pattern

| Setting | Value |
|---------|-------|
| Provider type | OpenAI Compatible (sometimes "Custom OpenAI" or "OpenAI API") |
| Base URL | `https://api.lowrouter.ai/v1` |
| API Key | your `sk-lr-...` token |
| Path / endpoint | `/chat/completions` (most clients handle this automatically) |

Chat clients build their model picker from `GET /v1/models` on the
base URL. LowRouter's listing draws on the same catalogue as the
[model browser](/models), so once the provider is saved the picker
fills itself with everything currently routable, and you do not need
to type model IDs. That includes an `auto/<creator>/<model>` entry for every
routable model, which lets LowRouter pick the provider and region for
you.

The picker can be long. To trim it to a short, relevant selection,
see [catalog curation](../models/curation).

## Worked example: Chatbox

1. Open **Settings → Model Provider**.
2. Click **Add custom provider**.
3. Fill in:
   - **Name**: `LowRouter`
   - **API Mode**: `OpenAI API Compatible`
   - **API Host**: `https://api.lowrouter.ai/v1`
   - **API Path**: `/chat/completions`
   - **API Key**: your `sk-lr-...` token
4. Save.

Under **Model**, pick from the fetched list, or choose **Custom model
name** and enter any LowRouter model ID, such as
`auto/mistralai/mistral-large-2512`, `openai/openai/gpt-4.1`,
`anthropic/anthropic/claude-sonnet-4.5`, etc.

Chatbox reads model capabilities from the OpenRouter-style
`architecture` and `supported_parameters` fields LowRouter publishes
on every model row, aliases included. After re-fetching the model
list, a vision-capable model accepts images with no manual toggle.
Agent Mode (Work Mode) is the exception: current Chatbox releases
never derive tool use from any listing field, so if **Agent Mode**
is greyed out, enable **Tool use** on the model in the provider's
model settings — the alias id works there too.

## Worked example: Jan

1. Open **Settings → Model Providers** and click **Add Provider**.
2. Choose the **OpenAI-compatible** API format.
3. Fill in:
   - **Provider name**: `LowRouter`
   - **Base URL**: `https://api.lowrouter.ai/v1`. The `/v1` must be
     included, or every request 404s.
   - **API key**: your `sk-lr-...` token
4. Save. Jan fetches the model list from the base URL and populates
   the provider's **Models** section.

Two Jan quirks:

- There is no free-form model input. The chat picker only offers what
  is in the provider's Models list, and there is nowhere to type an
  arbitrary ID mid-chat. If an ID you want is missing from the
  fetched list, add it with the **+** button in the provider's
  Models section, entering the ID exactly as LowRouter expects it.
- Capabilities are not auto-detected for custom providers. If
  you use vision or tools, enable those per model in the provider's
  Models section.

## Worked example: LibreChat

LibreChat is configured by its administrator in `librechat.yaml`
(schema version 1.3.13, LibreChat 0.8.7). Add LowRouter as a custom
endpoint:

```yaml
version: 1.3.13
endpoints:
  custom:
    - name: "LowRouter"
      apiKey: "${LOWROUTER_API_KEY}"
      baseURL: "https://api.lowrouter.ai/v1"
      models:
        default: ["auto/mistralai/mistral-large-2512"]
        fetch: true
      titleConvo: true
      titleModel: "auto/mistralai/mistral-large-2512"
      modelDisplayLabel: "LowRouter"
```

Put the key in LibreChat's `.env` as `LOWROUTER_API_KEY=sk-lr-...`,
or set `apiKey: "user_provided"` to have each user enter their own
key in the UI. Restart LibreChat after editing either file.

Two settings to check:

- `titleModel` names the model LibreChat uses to title conversations.
  It defaults to `gpt-3.5-turbo`, which is not a LowRouter model ID,
  so without it every new conversation's title request fails.
- `fetch: true` fills the model picker from `GET /v1/models`. The
  `default` list is what the picker shows if that fetch fails; with
  `fetch: false` it is the whole list.

## Picking a model

The picker mirrors `GET /v1/models` and holds three kinds of ID:

- `<provider>/<creator>/<model>`, an explicit ID, e.g.
  `anthropic/anthropic/claude-sonnet-4.5`. You choose who serves the
  request; the region is picked for you. See
  [available models](../models/available).
- `auto/<creator>/<model>`: you name the model, and the router
  picks the provider and region, preferring EU-sovereign routes. This
  is the right default for chat. See [routing](../models/routing).
- `alias/<name>`: your account's
  [aliases](../models/aliases), listed for the account behind the
  API key. An alias is a named pointer to one exact
  (provider, model, region) route that you can repoint from the
  dashboard at any time while the client keeps its configuration.

### Targeting a region from a chat app

Picker entries are not region-pinned, and chat apps have no field
for a fourth `/<locode>` segment. To pin a region:

1. In the dashboard, create an alias pointing at a region-pinned
   route, from the [Aliases page](/app/aliases) or the **Alias** button on
   any provider/region row in the [model browser](/models). For example,
   `eu-chat` → `scaleway/mistralai/mistral-medium-3.5-128b/fr-par`.
2. In the chat app's picker, select `alias/eu-chat`.

Every message now routes through that region. If you change your mind
later, repoint the alias in the dashboard and the next message
follows it, with no change in the client. If `alias/eu-chat` is not
in the client's fetched list, you do not have to wait for it: add it in
Jan with the **+** button in the provider's Models section, or enter
it in Chatbox as a custom model name. Aliases resolve at request
time whether or not the listing showed them.

## Recommended setup

These apply to any chat app, not just the two above:

- Use a key dedicated to the app. A chat app's key sits in a
  desktop config file, so treat it as leakable: give it its own name
  so its usage stays attributable, and revoke it on any doubt without
  touching the keys your other tools use. See
  [API keys](../guides/api-keys).
- Turn streaming on. The desktop UX expects streaming and
  LowRouter supports it the same way OpenAI does.
- Check the client's telemetry settings if you care about not
  exposing prompt content to the publisher's analytics. The clients
  themselves do not see prompts in normal operation, but features
  like crash reporting can capture context.

## Troubleshooting

- **401 / Unauthorized**: confirm the API key starts with `sk-lr-`
  and has not been revoked. Test with `curl` from
  [the curl page](curl) using the same key.
- **404 / Not Found**: the base URL must end in `/v1` and the path
  must be `/chat/completions`. Some Chatbox versions default the
  API Path to `/v1/chat/completions`, which becomes
  `https://api.lowrouter.ai/v1/v1/chat/completions`. Drop the
  leading `/v1/`.
- **Model not available**: look up the exact model ID on the
  [model browser](/models). Auto-complete in these clients is not
  always accurate, and a stale fetched list is refreshed by
  re-saving the provider.
