Compositev12
menu_book Composite docs

Set up your key, use community assets, build on the API

Base URL https://composite.lucidity.sh/v1, a Bearer key, and /v1/chat/completions. Every field to paste is under Paste values.

Start here

Paste values

Use these fields in apps that ask for an OpenAI-compatible provider, proxy, reverse proxy, or custom endpoint.

chat

Most Chat Apps

Use this for SillyTavern, ChubAI, Open WebUI, and any app with OpenAI-compatible settings.

API TypeOpenAI
Base URLhttps://composite.lucidity.sh/v1
API KeyYOUR_API_KEY
Modelminimax/minimax-m3
code

Application Developers

Point an OpenAI SDK at Composite and keep your existing chat completions flow.

SDK Base URLhttps://composite.lucidity.sh/v1
HeaderAuthorization: Bearer YOUR_API_KEY
Chat URLhttps://composite.lucidity.sh/v1/chat/completions
Models URLhttps://composite.lucidity.sh/v1/models

App guides

Select your client for a dedicated setup guide.

web_assetOpen WebUI
Add Composite under OpenAI API connections.
expand_more
  1. Go to Settings, then Connections, then OpenAI API.
  2. Set API Base URL to https://composite.lucidity.sh/v1.
  3. Set API Key to your Composite key.

The preset on your key

Every new API key is created with one preset already attached: Lost in the World, Composite's stock roleplay instruction set. It plays the model as a co-author: it carries earlier details forward by how urgent they are, adds complications of its own, lets unrealistic plans fail in-story, keeps characters true to their cards, and steers clear of slop prose. It is added to the system prompt your client sends. A front-end that sends only a character card gets a full instruction set instead of nothing.

It is an ordinary preset, not a hidden rule. Open Create to see the exact text of every section, switch individual sections on and off for a key, replace it with a SillyTavern preset of your own, or take it off entirely from the Presets tab under Key setup. Keys created before this shipped are untouched.

If your client already sends its own full system prompt, removing the preset is usually the right call: two complete instruction sets in one request tend to argue with each other.

Quickstart

Composite accepts standard OpenAI-style chat completion requests. Replace the model with any allowed model ID from Models.

data_objectJavaScript / TypeScript
Use `fetch` to post directly to the chat completions endpoint.
expand_more
JavaScript
const response = await fetch('https://composite.lucidity.sh/v1/chat/completions', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer YOUR_API_KEY',
  },
  body: JSON.stringify({
    model: 'minimax/minimax-m3',
    messages: [{ role: 'user', content: 'Hello!' }],
  }),
});

if (!response.ok) {
  throw new Error(`Request failed: ${response.status} ${response.statusText}`);
}

const completion = await response.json();
console.log(completion.choices[0].message.content);
deployed_codePython
Use the standard library to post directly to the chat completions endpoint.
expand_more
Python
import json
from urllib.request import Request, urlopen

payload = {
    "model": "minimax/minimax-m3",
    "messages": [{"role": "user", "content": "Hello!"}],
}

request = Request(
    "https://composite.lucidity.sh/v1/chat/completions",
    data=json.dumps(payload).encode("utf-8"),
    headers={
        "Content-Type": "application/json",
        "Authorization": "Bearer YOUR_API_KEY",
    },
    method="POST",
)

with urlopen(request) as response:
    completion = json.loads(response.read().decode("utf-8"))

print(completion["choices"][0]["message"]["content"])
httpcURL
Raw HTTP request for testing or custom clients.
expand_more
cURL
curl https://composite.lucidity.sh/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "model": "minimax/minimax-m3",
    "messages": [{ "role": "user", "content": "Hello!" }]
  }'

API reference

These sections are for application integrations that need request fields, alternate protocols, or streaming behavior.

POST/v1/chat/completions
OpenAI-compatible chat completions endpoint.
expand_more
Endpointhttps://composite.lucidity.sh/v1/chat/completions
ParameterTypeDescription
modelstringModel ID from /v1/models.
messagesarrayConversation messages with role and content.
temperaturenumberSampling temperature, clamped by the server.
max_tokensintegerMaximum output tokens. Defaults to 8192 when omitted.
streambooleanStreams the response as server-sent events.
POST/v1/responses
OpenAI Responses API style requests.
expand_more

Supports input, instructions, tools, max_output_tokens, and stream.

Python
import json
from urllib.request import Request, urlopen

payload = {
    "model": "minimax/minimax-m3",
    "input": "What is the capital of France?",
}

request = Request(
    "https://composite.lucidity.sh/v1/responses",
    data=json.dumps(payload).encode("utf-8"),
    headers={
        "Content-Type": "application/json",
        "Authorization": "Bearer YOUR_API_KEY",
    },
    method="POST",
)

with urlopen(request) as response:
    data = json.loads(response.read().decode("utf-8"))

print(data["output"][0]["content"][0]["text"])
POST/v1/messages
Anthropic Messages-compatible requests.
expand_more

Accepts Authorization: Bearer ... and x-api-key. Use https://composite.lucidity.sh as the Anthropic base URL.

Python
import anthropic

client = anthropic.Anthropic(
    api_key="YOUR_API_KEY",
    base_url="https://composite.lucidity.sh",
)

message = client.messages.create(
    model="anthropic/claude-opus-4-8",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello!"}],
)

print(message.content[0].text)
POST/v1beta/models/*
Gemini-style generateContent routes.
expand_more

Supports /v1beta/models/{model}:generateContent and /v1beta/models/{model}:streamGenerateContent. Accepts Authorization: Bearer ... or x-goog-api-key.

cURL
curl "https://composite.lucidity.sh/v1beta/models/google/gemini-3-flash:generateContent" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [{ "role": "user", "parts": [{ "text": "Explain quantum entanglement." }] }]
  }'

Use a full model id from Models. Add :streamGenerateContent instead for a streamed response.

POST/mari/
Structured conversation format with multimodal support.
expand_more
cURL
curl https://composite.lucidity.sh/mari/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "minimax/minimax-m3",
    "turns": [{ "role": "user", "content": "Hello!" }]
  }'

Model modifiers

Append a modifier to a model ID to adjust how Composite handles the request.

psychologyReasoning effort

Append one of [minimal], [low], [medium], [high], [xhigh] or [max] to the model name in your app to choose its thinking level.

provider/model[high]

Combine it with an available routing variation, such as provider/model:fast[low], or a planning modifier, such as provider/model:cheapThink[high]. The suffix controls the answering model.

The suffix overrides reasoning settings in the request body or preset. Use one effort suffix per model. Each model supports its own efforts; an unsupported level may be rejected or adjusted by its provider. Higher effort can use more tokens and take longer.

Available for Composite models and OpenAI-compatible provider keys. Native Anthropic provider keys do not translate these efforts into thinking controls.

psychology:cheapThink

Provides cost-conscious reasoning assistance for tasks that benefit from planning or multi-step analysis while keeping the selected model responsible for the final response.

minimax/minimax-m3:cheapThink

This modifier requires credits and may add latency and usage cost. Model-specific limitations still apply.

alt_route-normal

Composite normally routes a request to the cheapest endpoint that can serve it. -normal leaves the choice of provider to OpenRouter's own routing instead.

provider/model-normal

Available on models that publish more than one usable endpoint, which are the same models that have :fast, :cheapest-provider and :quality variations.

layersCombining modifiers

Place :cheapThink after another model variation to combine their behavior.

provider/model:fast:cheapThink

It can also be combined with :cheapest-provider and :quality variations when those variations are available for the model. :cheap is the former name of :cheapest-provider and still resolves; it is unrelated to -cheap, which is a different model rather than another endpoint for the same one.

A model's available variations appear as separate ids in Models and in GET /v1/models.

Auth & models

verified_userAuthentication

Authorization: Bearer YOUR_API_KEY

Anthropic and Gemini-compatible routes also accept their native key headers for clients that require them.

listList Models

GET https://composite.lucidity.sh/v1/models

Returns available models. For a visual list with pricing and availability, use the Models page.