HomeDocsIntegrations
8 clients · 1 endpoint · 0 wrappers

Integrations

Copy-paste setup for Cursor, Cline, Roo Code, OpenCode, Continue.dev, Codex CLI, LibreChat, SillyTavern — plus the raw Python, Node and cURL snippets. Every client speaks the same OpenAI-compatible endpoint, so one key covers all of them.

Get a key
One endpoint · every model

Every client below uses the same base URL and the same key

All models are served from one OpenAI-compatible endpoint. You do not pick a provider or a regional host per model — change the model string and the gateway routes the request. Codex CLI is the one exception: it speaks the Responses wire and needs wire_api = "responses", but it uses the same base URL and key.

Base URL

https://api.selora.lol/v1

API key

sk-gw-...

Provider type

OpenAI-compatible

Models

3 examples below

deepseek-v4.1-flash-1017kimi-k3.1-proclaude-sonnet-4-5

Cursor

Cursor ships an OpenAI key override. Paste the gateway endpoint and key there, then add the model ids you want in the picker.

OpenAI-compatible
  1. 01Open Settings (⌘⇧J on macOS, Ctrl+Shift+J on Windows/Linux) and go to Models.
  2. 02Paste your Selora key into OpenAI API Key and enable Override OpenAI Base URL.
  3. 03Add each model id under Models → Add model, then select it in chat.
Cursor · Settings → Models
OpenAI API Key:             sk-gw-...
Override OpenAI Base URL:   https://api.selora.lol/v1
Add model:                  deepseek-v4.1-flash-1017
                            kimi-k3.1-pro
                            claude-sonnet-4-5

Cursor's own hosted models stay on Cursor's billing. Only requests sent through the override are billed to your Selora key. If your build has no override field, install Cline inside Cursor and point that at the same endpoint.

Cline (VS Code)

Cline is a VS Code extension with an OpenAI Compatible provider. Three fields and a model id is the whole setup.

OpenAI-compatible
  1. 01Install Cline from the VS Code Marketplace (or your fork’s extension panel).
  2. 02Open the Cline panel → gear icon → API Provider: OpenAI Compatible.
  3. 03Fill in the three fields below and click Verify.
Cline settings
API Provider:  OpenAI Compatible
Base URL:      https://api.selora.lol/v1
API Key:       sk-gw-...
Model ID:      claude-sonnet-4-5

“Invalid API Key” means the key was mistyped; “Model Not Found” means the Model ID is not one the gateway serves. Run the model check below to list valid ids.

Roo Code

Roo Code (the Cline fork) exposes the same OpenAI Compatible provider, so the values carry over unchanged.

OpenAI-compatible
  1. 01Install the Roo Code extension, then open its settings (gear icon).
  2. 02Set API Provider to OpenAI Compatible.
  3. 03Enter the base URL and key, then pick or type a model id.
Roo Code settings
API Provider:  OpenAI Compatible
Base URL:      https://api.selora.lol/v1
API Key:       sk-gw-...
Model ID:      kimi-k3.1-pro

Roo Code keeps its own context-window and pricing metadata per model. Set Context Window / Max Output Tokens to match the model you chose — the values are on the Models page.

OpenCode

OpenCode reads a JSON provider block. Declare the gateway once in opencode.json and switch models with /models.

OpenAI-compatible
  1. 01Install OpenCode: curl -fsSL https://opencode.ai/install | bash
  2. 02Add the provider block to ~/.config/opencode/opencode.json (or a project opencode.json).
  3. 03Export SELORA_API_KEY, launch opencode, then pick selora/<model> with /models.
~/.config/opencode/opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "selora": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Selora",
      "options": {
        "baseURL": "https://api.selora.lol/v1",
        "apiKey": "{env:SELORA_API_KEY}"
      },
      "models": {
        "deepseek-v4.1-flash-1017": { "name": "DeepSeek V4.1 Flash" },
        "kimi-k3.1-pro": { "name": "Kimi K3.1 Pro" },
        "claude-sonnet-4-5": { "name": "Claude Sonnet 4.5" }
      }
    }
  },
  "model": "selora/kimi-k3.1-pro"
}
Launch
export SELORA_API_KEY="sk-gw-..."
cd /path/to/project
opencode

Keep the key out of the file: set SELORA_API_KEY in your shell and reference it with {env:SELORA_API_KEY}.

Continue.dev

Continue takes several models at once. Declare each Selora model in config.yaml with provider: openai and an apiBase override.

OpenAI-compatible
  1. 01Open ~/.continue/config.yaml (Continue 1.x; the legacy config.json uses the same fields in JSON).
  2. 02Add one entry per model you want, with apiBase pointing at the gateway.
  3. 03Reload the Continue panel — the models appear in the picker.
~/.continue/config.yaml
name: selora
version: 1.0.0
schema: v1
models:
  - name: Selora · Claude Sonnet 4.5
    provider: openai
    model: claude-sonnet-4-5
    apiBase: https://api.selora.lol/v1
    apiKey: sk-gw-...
    roles: [chat, edit, apply]
  - name: Selora · DeepSeek V4.1 Flash
    provider: openai
    model: deepseek-v4.1-flash-1017
    apiBase: https://api.selora.lol/v1
    apiKey: sk-gw-...
    roles: [autocomplete]

Do not append /chat/completions to apiBase — Continue adds the path itself. A 404 here almost always means the base URL ends in the wrong place.

OpenAI Codex CLI

Codex needs wire_api = "responses". The provider block below uses the same /v1 base URL as every other client.

Responses wire
  1. 01Install: npm install -g @openai/codex
  2. 02Add the provider block to ~/.codex/config.toml.
  3. 03Export SELORA_API_KEY and launch with codex --profile selora.
~/.codex/config.toml
[model_providers.selora]
name = "Selora"
base_url = "https://api.selora.lol/v1"
env_key = "SELORA_API_KEY"
wire_api = "responses"
requires_openai_auth = false

[profiles.selora]
model = "deepseek-v4.1-flash-1017"
model_provider = "selora"
Launch
export SELORA_API_KEY="sk-gw-..."
cd /path/to/project
codex --profile selora

wire_api = "responses" is what current Codex builds require for custom providers and targets /v1/responses. "chat" still works only on older pinned builds — treat it as legacy. Reserved provider names (openai, ollama, lmstudio) take precedence and cannot be overridden.

LibreChat

LibreChat adds the gateway as a custom endpoint in librechat.yaml — one block, any number of models.

OpenAI-compatible
  1. 01Add the endpoints.custom block to librechat.yaml.
  2. 02Set SELORA_API_KEY in the same .env LibreChat loads.
  3. 03Start with CONFIG_PATH=./librechat.yaml so the file is read.
librechat.yaml
version: 1.2.8
cache: true
endpoints:
  custom:
    - name: "Selora"
      apiKey: "${SELORA_API_KEY}"
      baseURL: "https://api.selora.lol/v1"
      models:
        default:
          - "claude-sonnet-4-5"
          - "kimi-k3.1-pro"
          - "deepseek-v4.1-flash-1017"
        fetch: false
      titleConvo: true
      titleModel: "deepseek-v4.1-flash-1017"
      modelDisplayLabel: "Selora"

fetch: false keeps the dropdown to the three ids above instead of probing the gateway on boot. Drop the field if you would rather list models live.

SillyTavern

SillyTavern calls any OpenAI-compatible endpoint through its Custom chat-completion source.

OpenAI-compatible
  1. 01Open AI Response Configuration → Chat Completion.
  2. 02Set Chat Completion Source to Custom (OpenAI-compatible).
  3. 03Paste the endpoint and key, click Connect, then pick a model.
SillyTavern · Chat Completion
Chat Completion Source:  Custom (OpenAI-compatible)
Custom Endpoint:         https://api.selora.lol/v1
Custom API Key:          sk-gw-...
Model:                   claude-sonnet-4-5

The endpoint is the /v1 root — SillyTavern appends /chat/completions itself. If the model dropdown stays empty after Connect, refresh it and type the id by hand.

Raw SDKs & HTTP

Any OpenAI-compatible client works: point it at https://api.selora.lol/v1 and pass your Selora key. The official openai packages need nothing else.

Python
agent.py
from openai import OpenAI

client = OpenAI(
    base_url="https://api.selora.lol/v1",
    api_key="sk-gw-...",
)

resp = client.chat.completions.create(
    model="deepseek-v4.1-flash-1017",
    messages=[{"role": "user", "content": "Say hello in one line."}],
)

print(resp.choices[0].message.content)
Node / TypeScript
agent.ts
import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://api.selora.lol/v1',
  apiKey: process.env.SELORA_API_KEY, // sk-gw-...
});

const resp = await client.chat.completions.create({
  model: 'kimi-k3.1-pro',
  messages: [{ role: 'user', content: 'Say hello in one line.' }],
});

console.log(resp.choices[0].message.content);
cURL
terminal · chat completions
curl https://api.selora.lol/v1/chat/completions \
  -H "Authorization: Bearer sk-gw-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4-5",
    "messages": [{ "role": "user", "content": "Say hello in one line." }]
  }'
terminal · list models
curl https://api.selora.lol/v1/models \
  -H "Authorization: Bearer sk-gw-..."

Streaming works on every client above — set stream: true (or the equivalent toggle) and read Server-Sent Events. All three models accept the same request shape, so switching models never means switching clients. Need somewhere to create a key first? Get a key.