Most Chat Apps
Use this for SillyTavern, ChubAI, Open WebUI, and any app with OpenAI-compatible settings.
OpenAIhttps://composite.lucidity.sh/v1YOUR_API_KEYminimax/minimax-m3Base URL https://composite.lucidity.sh/v1, a Bearer key, and /v1/chat/completions. Every field to paste is under Paste values.
Connect OpenRouter, DeepSeek, Anthropic, OpenAI, Gemini, Mistral or any OpenAI-compatible provider in two minutes.
Quickstart →Key settings, memory layers, model pools, shared quota, Synth's daily limit, and how plans and credits pay.
Read the guide →Share a profile, preset, lorebook, prompt or plugin with the community.
Read the guide →Every tag, shortcut, lorebook macro and model modifier Composite reads from a message.
Open the reference →Use these fields in apps that ask for an OpenAI-compatible provider, proxy, reverse proxy, or custom endpoint.
Use this for SillyTavern, ChubAI, Open WebUI, and any app with OpenAI-compatible settings.
OpenAIhttps://composite.lucidity.sh/v1YOUR_API_KEYminimax/minimax-m3Point an OpenAI SDK at Composite and keep your existing chat completions flow.
https://composite.lucidity.sh/v1Authorization: Bearer YOUR_API_KEYhttps://composite.lucidity.sh/v1/chat/completionshttps://composite.lucidity.sh/v1/modelsSelect your client for a dedicated setup guide.
Fast path for casual chat clients. Uses the OpenAI-compatible base URL.
View guide →Use Composite as a custom OpenAI-compatible provider in JanitorAI.
View guide →Use Composite as an OpenAI-compatible provider in ChubAI.
View guide →Add Composite as an OpenAI-compatible AI service preset in Agnai.
View guide →Use Composite as a custom OpenAI-compatible provider in RisuAI.
View guide →Add Composite as a custom provider in LuciditySH's character chat app.
View guide →https://composite.lucidity.sh/v1.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.
Composite accepts standard OpenAI-style chat completion requests. Replace the model with any allowed model ID from Models.
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);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"])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!" }]
}'These sections are for application integrations that need request fields, alternate protocols, or streaming behavior.
https://composite.lucidity.sh/v1/chat/completions| Parameter | Type | Description |
|---|---|---|
model | string | Model ID from /v1/models. |
messages | array | Conversation messages with role and content. |
temperature | number | Sampling temperature, clamped by the server. |
max_tokens | integer | Maximum output tokens. Defaults to 8192 when omitted. |
stream | boolean | Streams the response as server-sent events. |
Supports input, instructions, tools, max_output_tokens, and stream.
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"])Accepts Authorization: Bearer ... and x-api-key. Use https://composite.lucidity.sh as the Anthropic base URL.
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)Supports /v1beta/models/{model}:generateContent and /v1beta/models/{model}:streamGenerateContent. Accepts Authorization: Bearer ... or x-goog-api-key.
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.
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!" }]
}'Append a modifier to a model ID to adjust how Composite handles the request.
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.
:cheapThinkProvides 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:cheapThinkThis modifier requires credits and may add latency and usage cost. Model-specific limitations still apply.
-normalComposite 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-normalAvailable on models that publish more than one usable endpoint, which are the same models that have :fast, :cheapest-provider and :quality variations.
Place :cheapThink after another model variation to combine their behavior.
provider/model:fast:cheapThinkIt 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.
Authorization: Bearer YOUR_API_KEYAnthropic and Gemini-compatible routes also accept their native key headers for clients that require them.
GET https://composite.lucidity.sh/v1/modelsReturns available models. For a visual list with pricing and availability, use the Models page.