key Guide
Keys, memory and plans
Everything that decides what a request does lives on the API key: its provider, memory, quota, attached assets and model pool. This page explains each setting, then how Synth, plans and credits pay for what the key runs.
Each key card on the API Keys page shows Provider, Memory and Quota first. Default tags, the model pool and helper settings sit under Advanced, which opens by itself when any of them is set. Changes save as you make them and apply from the next request.
| Setting | What it does |
|---|
| Provider | Composite, or a provider you connected. A provider key sends requests to your own account with that provider. |
| Memory | What happens when a chat outgrows the model's context. See memory layers below. |
| Quota | My account, or a shared quota you joined. Not available on a key bound to a provider. |
| Attached assets | The preset, prompts, lorebooks and plugins applied from Discovery or Create. Save as profile bundles them with the memory and helper settings. |
| Versions | Shared assets stay on the version you applied unless Auto-update is ticked. When the author publishes a newer one, the key offers Update and shows what changed. |
| Default tags | Tags added to every request on the key, such as [preset: CODE] [tool: dice], so a frontend with no room for tags still gets them. |
| Model pool | A list of models the key picks from on each request. See model pools below. |
| Helper calls and helper model | Provider keys only: whether plugin directors, thinking helpers and memory summaries run on your provider (free, on the helper model or the requested one) or on Composite, billed to your credits or plan. |
| Decision model for rewrites | Before a rewrite, checks whether the reply needs changing. Choose Composite to use Jev (typesafe/jev-1.13) or a Composite chat model, billed to credits or a plan, without another API key. External uses your own Jev / System One endpoint and key. The threshold sets the minimum probability needed to run the rewrite. A failed decision leaves the usual rewrite behavior in place. |
Every model has a fixed context window. A memory layer decides what happens once a chat is longer than that. A chat that still fits is sent untouched on every layer, so a premium layer costs nothing extra until it is needed.
| Layer | Available to | What it does |
|---|
| Satori Lite | Everyone | Drops the oldest messages until the chat fits. The default. |
| Off (raw input) | Keys on your own provider | No memory layer at all: the conversation goes to your provider exactly as sent, untrimmed. On a key without a provider it runs as Satori Lite. |
| Satori | Credits or a plan | Summarises the system prompt and the oldest part of the chat instead of dropping it, and brings back earlier messages that mention names in your latest turn. |
| Heavy | Credits or a plan | Everything in Satori, and trims from the middle instead of the start, then searches the removed middle for what is relevant to the current turn. |
| Ultra | Credits or a plan | Everything in Heavy, plus a running record of characters, relationships, location, goals and open threads, and lower-detail reading of older images. |
If an account without credits or a plan uses a key set to a premium layer, the request runs as Satori Lite. On a provider key the chosen layer stays saved and comes back once credits or a plan are added; its summaries then run on your provider unless Helper calls is set to Composite. Satori suits most long roleplay; Heavy and Ultra are for chats that run to hundreds of turns.
POST /v1/audio/speech turns text into audio with the same bearer key as chat. A voice is a Create asset: either a short recording of someone speaking, or a preset voice that a speech model already has. Name it with its eight-character code in the voice field, or write [voice: CODE] in a key's Default tags to give the key a voice; a request that names no voice then speaks in the key's. In SillyTavern, put the codes in the OpenAI Compatible TTS voice list. The Chat page has a Listen button under every reply and a Voice for replies setting.
| Limit | Value |
|---|
| Recording length | 3 to 15 seconds, at most 1 MB. Create trims and converts it in your browser. |
| Recordings kept | 50 per account, and 20 uploads an hour |
| Text per request | Up to 4,000 characters |
| Requests | 30 a minute |
Price. A speech call on credits costs the speech model's own price for the text you send, plus 25%. On a plan it uses plan credits at the provider's own price. On your own OpenRouter, OpenAI or Mistral provider key it is billed by that provider and Composite charges nothing. GET /v1/audio/models lists the models, their rates and which can speak in a recorded voice. Free accounts without credits or a plan can't use speech.
Audio replies. Add [SPEAK] to a message, or send "audio": true in the chat body, and a chat request with a voice also speaks the reply (up to 4,000 characters, cut at a sentence end). It is billed as its own speech call, after the reply. A non-streamed response carries audio as { format: "mp3", data: base64, generation_id }; a streamed one sends it as a last event before [DONE]. If the audio fails, the reply still arrives, with audio_error in its place. Without a voice the opt-in is ignored.
External voices. A voice can instead point at a voice on your own ElevenLabs, Fish Audio or Cartesia account: choose External voice in Create and paste its voice id. Add that service's API key to the API key under Keys; it is stored encrypted and never shown again. These calls run on your own account, so Composite charges nothing for them. External voices stay private and only work on your own keys, and the content filter still applies to the text.
Consent. To save a voice made from a recording you confirm that it is your voice, or that you have the speaker's permission, and the time you confirmed is stored with the voice. The recording stays private to you: Composite never serves it to anyone else, and it is sent to the speech model only when a request uses the voice. Other people hear a voice only through speech requests and, for a published voice, through its sample.
A model pool makes the key choose the model itself, which keeps replies varied without changing anything in your frontend. While a pool is set, the model your frontend asks for is ignored. Each request draws one model from the pool; *N after a model draws it N times as often. If the drawn model is not available to your account, the key tries another from the pool. A pool holds up to 20 lines.
deepseek/deepseek-v4-flash
anthropic/claude-haiku-4-5*2
minimax/minimax-m3
In this example Claude Haiku answers about half the time and the other two a quarter each. A profile can carry a pool, so applying it sets the pool too.
Shared quota lets one account pay for other people's requests: a group chat, a team, or friends trying a model. It lives in the Shared quota tab of the API Keys page.
- The sharer creates a quota, funded by their own credits or plan. It is invite only (joined with its invite code) or public (anyone can join).
- The sharer sets a pool limit per day and a default per-member limit, each in dollars, requests, a percentage of the subscription, or unlimited. Individual members can get their own limit, be blocked or be removed.
- A member joins, then sets the Quota setting on one of their keys to that quota. Its paid requests are charged to the sharer from then on.
A shared quota pays for paid models only; Synth still counts against the member's own daily limit. When the quota or a member's limit runs out, requests fail with an error saying so. They never fall back to charging the member. A key uses either a provider or a shared quota, not both. Members' usage history stays their own, and the sharer sees each member's spend and request count for the day.
Synth (lucidityai/synth-2.5-flash) is LuciditySH's creative writing model and the only free model on Composite. Any account can use it with no provider key: 80 requests a day, or 300 a day for the first week after joining with a referral code. The count resets once a day at the time shown on your account page. Any credits or an active plan make Synth unlimited. The old :free variants of other models were retired; asking for one returns a model-not-found error and charges nothing.
A plan includes a monthly pool of plan credits. 1,000 plan credits buy $1 of model usage at the provider's own price, and each call uses what it actually cost: long context and long replies use more, prompt-cache hits use less. An inexpensive model stretches a plan across thousands of calls; a flagship model gets dozens. The Models page shows what a typical call (8k tokens in, 1k out) uses on each model, and the plans and account pages estimate how many calls you have left on the model you pick.
| Plan | Price a month | Plan credits a month | Most that roll over |
|---|
| Basic | $5 | 2,600 | 650 |
| Plus | $10 | 5,450 | 1,362 |
| Pro | $15 | 8,350 | 2,087 |
| Ultra | $20 | 11,250 | 2,812 |
| Enterprise | $50 | 28,650 | 7,162 |
Every plan can use every model. Credits refill monthly on the day you subscribed. Up to a quarter of a month's credits carry into the next month, are spent first, and expire at the end of it. When a plan runs out, requests stop with an error naming the refill date; they continue on wallet credits only if you turn on "Continue on credits when my plan runs out" on the account page. Every plan includes unlimited Synth and the premium memory layers.
Now and then we hand out resets. A reset refills this month's plan credits; carried-over credits and your refill date stay as they were. Some apply straight away, others are banked on your account page so you can use one when you run low.
Cancelling stops the renewal, not the plan: its credits stay usable until the end of the period you paid for, and the account page shows the date. Switching plans starts the new one at full price the day you approve it, with no refund for the old one.
Credits are a prepaid balance charged per request at the price on the Models page: the provider's price plus 25%, input and output alike. Orders run from $5 to $1,000 on the plans page, and the account page can recharge automatically when the balance runs low. Repeated prompts that the provider serves from cache are billed at a lower rate, so long chats with a stable preset cost less. Holding any credits also makes Synth unlimited and unlocks the premium memory layers.
Retries
Before anything reaches your frontend, a request that fails upstream with a temporary error (5xx, 429 or a timeout) is retried on the same model. Retries never happen once a reply has started streaming. Requests on your own provider key are never retried: Composite sends exactly one request to your provider per message.
Model failure fallback
On by default. If the model still fails, Composite answers with a healthy model at a similar price. Turn it off under Usage on the account page to get the error instead.
Wallet spending limits
Optional caps on how much of your credit balance requests may spend, set under Usage on the account page. They apply to credits only, not to a plan or your own provider.
Memory lives in your chat, not on our servers. Edit or swipe and it follows. The rest is below; the privacy policy lists every retention period.
| Data | What we keep |
|---|
| Your messages | Not kept for the request itself. Training collection keeps a copy with no account or key attached unless you turn it off on the account page. A key with data logging on keeps one tied to the key for 30 days. |
| Memory state | Nothing on our servers. The state tool writes into your own chat, so editing or swiping a message changes it too. |
| Memory summaries | Premium layers cache summaries keyed by a hash of the text, not by account, in a cache capped at 50,000 entries. |
| API keys | A hash only. The key is shown once when you create it. |
| Provider keys | Encrypted with AES-256-GCM. |
| Usage history | Model, tokens and cost per request. After 180 days the account and key are replaced with an unlinkable ID. |
| Error records | Deleted after 30 days. |