SillyTavern has no model of its own; it talks to whatever endpoint you give it. A SillyTavern uncensored API setup is the Chat Completion API set to the Custom (OpenAI-compatible) source, one base URL, one key and a model id from the catalog, then four sampler sliders that suit an abliterated roleplay build. We set it up on SillyTavern 1.19.0 and priced the evening on three real models.
What you will have at the end
A SillyTavern connection profile that reaches every uncensored model on one key, samplers tuned for an abliterated roleplay build, and a cost per evening you can read off the live catalog before you start. The whole connection is three values.
- API
- Chat Completion
- Source
- Custom (OpenAI-compatible)
- Custom Endpoint
- https://api.uncensoredllm.ai/v1No /chat/completions on the end; SillyTavern adds it
- Custom API Key
- sk-ullm-live-…Created in the console, shown once
- Model
- roleplay-uncensoredAny id from the Models page
The same three values drive every client on the docs page. SillyTavern is the one where the sampler sliders matter most, so this guide spends its time there.
Prerequisites
- SillyTavern 1.19 or newer, running on your own machine or a server you control. We set this up on 1.19.0; the labels below are from that release.
- A key from the console. It starts with
sk-ullm-and is shown once. Prepaid balance from $10; a key with $0 on it connects but answers 402 on the first message. - One model id from the uncensored model list. The ids in this guide are roleplay-uncensored, cydonia-24b-v4.3, deepseek-v4-pro-uncensored.
- A character card loaded, so the Test Message has a persona to answer from. The default Seraphina card that ships with SillyTavern is fine.
Connect SillyTavern to the uncensored API
Open the API Connections panel (the plug icon in the top bar). Everything below is on that one panel.
- Set API to Chat Completion. Text Completion is the other option; it needs an instruct template and is not what this guide covers.
- Set Chat Completion Source to Custom (OpenAI-compatible). The panel changes to show the custom fields.
- Paste
https://api.uncensoredllm.ai/v1into Custom Endpoint (Base URL). Keep the/v1. Do not append/chat/completions: SillyTavern adds the path itself and a doubled path answers 404. - Paste your key into Custom API Key. SillyTavern stores it in its own secrets file on the machine running the server, not in the browser.
- Press Connect. SillyTavern calls
GET /v1/modelswith your key and fills the model dropdown with every id the key can reach. Pickroleplay-uncensoredfrom the list, or type it into Enter a Model ID if you would rather pin the id by hand. - Leave Prompt Post-Processing on None. The API accepts system messages anywhere in the list, so the merge options are not needed.
- Press Test Message. A one-line reply in the chat window means the connection, the key and the model id are all right. A red toast means one of the three is wrong; the status code in it tells you which (see the troubleshooting section).
- Save the setup as a Connection Profile (the bookmark icon next to the profile dropdown). Name it after the model so you can keep one profile per build and switch mid-chat.
SillyTavern's own reference for this panel is the API Connections page in the official docs. It names the two API types and links each source's setup page.
Samplers for an abliterated roleplay build
The sliders live on the AI Response Configuration panel (the sliders icon, left of the plug). An abliterated build has the refusal direction removed from its weights, so there is no jailbreak text to maintain and the samplers only shape the prose. These are the values we start every roleplay profile from.
| Setting | Start value | Why |
|---|---|---|
| Temperature | 0.9 | 1.0 is the model's own distribution. 0.9 keeps the variety and trims the odd word salad; drop to 0.7 if a build rambles. |
| Top P | 0.95 | Cuts the long tail of unlikely tokens. 1.0 disables it; going under 0.9 flattens the writing. |
| Top K | 0 | 0 is off. Top P already does the job; stacking both narrows the model twice. |
| Repetition Penalty | 1.05 | 1.0 is off. Roleplay tunes loop on pet phrases over long chats; 1.05 to 1.1 breaks the loop without mangling names. |
| Frequency Penalty | 0 | Leave at 0 when Repetition Penalty is set; two penalties on the same tokens make the model avoid its own character names. |
| Presence Penalty | 0 | Same reason. Raise to 0.2 only on a build that keeps restating the scene. |
| Max Response Length (tokens) | 300 | About one paragraph. A model that thinks before it answers needs 1,000 or more, or the reply is cut inside the thinking step. |
| Streaming | on | Tokens appear as they are generated. The usage block still arrives at the end of the stream, so the charge is the same. |
Context Size (tokens) is the one slider that changes the bill. SillyTavern sends up to this many tokens of card, lorebook and history on every message. Set it from the model's context_window in the catalog, with 16K of headroom and a 64K cap, and never above the window: a prompt past the window is refused, not trimmed.
| Model | Context window in the catalog | Context Size we set |
|---|---|---|
| Roleplay Uncensored | not published | 32768 |
| Cydonia 24B v4.3 | 131,072 tokens | 65536 |
| DeepSeek V4 Pro Uncensored | not published | 32768 |
A 24B roleplay tune does not get better past about 32K of history; it gets slower and dearer. The number that matters more than the window is how much of it you fill, which is why the cost section below prices two fill levels.
Check it works
Test Message proves the UI path. This proves the API path with the same body SillyTavern sends: a system message for the persona, one user turn, the samplers above. Swap in your key and run it from a terminal.
curl https://api.uncensoredllm.ai/v1/chat/completions \ -H "Authorization: Bearer sk-ullm-live-…" \ -H "Content-Type: application/json" \ -d '{ "model": "roleplay-uncensored", "messages": [ {"role": "system", "content": "You are Mara, a lighthouse keeper on a storm-bound island. Stay in character."}, {"role": "user", "content": "The lamp went out an hour ago. What do you do?"} ], "temperature": 0.9, "top_p": 0.95, "max_tokens": 300, "stream": false }'A 200 comes back in the OpenAI shape. The reply is in the first choice; the usage block is what the request is billed on.
{ "id": "chatcmpl-…", "object": "chat.completion", "model": "roleplay-uncensored", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "I pull the oilskin over my head and…" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": …, "completion_tokens": …, "total_tokens": … }}Two headers ride on every answer: x-uplink-request-id for support and x-uplink-cost with the settled charge for that call. Add -i to the curl to see them. The daily real-model check sends a fixed prompt to every model each day and records whether the answer still matches, so the model behind the id is the one on the label.
What a 300-message evening costs
The per-token prices come from the live catalog. Three builds, in the order we would try them: a roleplay tune that answers at once, a 24B fine-tune with a published 131K window, and the uncensored DeepSeek V4 Pro for when the plot needs a bigger model.
| Wire formats | |||||
|---|---|---|---|---|---|
| Roleplay Uncensored | Roleplay | $0.30 | $0.60 | ||
| Cydonia 24B v4.3 | Roleplay | $0.605 | $0.75 | 131K | |
| DeepSeek V4 Pro Uncensored | Uncensored | $1.25 | $2.00 |
The worked example: 300 messages in one sitting, each reply about 250 tokens, each prompt carrying the card plus history. The short column fills about 6,000 tokens of context per message (a card and the last few dozen turns); the long column fills 16,000 (a lorebook and a long chat). Input is what dominates: 300 × 6,000 is 1,800,000 input tokens against 75,000 output tokens.
| Model | 300 messages at 6,000 context | 300 messages at 16,000 context |
|---|---|---|
| Roleplay Uncensored | $0.59 | $1.49 |
| Cydonia 24B v4.3 | $1.15 | $2.96 |
| DeepSeek V4 Pro Uncensored | $2.40 | $6.15 |
Two settings move these figures more than the model choice. Context Size is the first: the long column is the short column with the same card and more history. The second is the per-message prompt SillyTavern builds from the card, the example dialogues and the lorebook; a 1,500-token card costs 1,500 tokens on every one of the 300 messages. Trim the card, not the replies. The full list of per-token rates is on the pricing page.
Troubleshooting by status code
SillyTavern puts the API's message field in the red toast and the full body in the server console. The body is always the OpenAI error shape; the code field is stable and says what to fix. These are the four you will meet, with the bodies the API sent on 2026-10-24.
401: the key
HTTP 401{"error":{"message":"The API key is not valid.","type":"authentication_error","param":null,"code":"invalid_api_key"}}The key in Custom API Key is wrong, truncated or revoked. "No API key was sent." in the message means the field is empty on the connection profile you are on. Create a fresh key in the console and paste it whole; several wrong keys in a row lock the address for a while and answer 429 instead.
404: the model id or the URL
HTTP 404{"error":{"message":"No such model: roleplay-uncensord.","type":"not_found_error","param":null,"code":"model_not_found"}}model_not_found means the id in Enter a Model ID is not in the catalog. Copy it from the model list rather than typing it. A 404 without that code, or a page of HTML, means the URL is wrong: a missing /v1 or an appended /chat/completions.
402: the balance
HTTP 402x-uplink-topup-url: …{"error":{"message":"The prepaid balance does not cover this request. Top up at … to continue.","type":"insufficient_quota","param":null,"code":"insufficient_balance"}}insufficient_balance is a prepaid balance at zero; the x-uplink-topup-url header on the response is the top-up page. Two cousins use the same status: spend_cap_reached is a new account's cap before its first payment settles, and monthly_limit_reached is a limit you set on the key in the console. A request that fails with 402 is not charged.
429: the rate
HTTP 429retry-after: …{"error":{"message":"Rate limit reached for this key.","type":"rate_limit_error","param":null,"code":"rate_limited"}}rate_limited means too many requests on one key in a short window; the retry-after header says how long to wait. In SillyTavern this shows up when a group chat fires several characters at once or when regenerate is pressed in a burst. Wait the seconds given and send again; nothing is charged for the refused calls.
A reply that is cut off
Not an error. finish_reason is length and Max Response Length is too low for the build. Builds that think before they answer spend their first few hundred tokens on the thinking step; raise the limit to 1,000 and the visible reply returns.
Questions
Any OpenAI-compatible endpoint works through the Custom source, so the question is which models it serves and at what price. For roleplay, pick an endpoint that lists abliterated and roleplay builds and prices them per token; the model list here shows both for every id. See the uncensored model list.
Yes. SillyTavern is an open-source front end and an API key is a paid service you are licensed to use. What you may generate is set by the provider’s acceptable-use terms, not by the client.
There is no free tier here; the balance is prepaid from $10 and settles per token, so a $10 top-up lasts as long as the usage table above says it does. Free endpoints exist elsewhere and usually rate-limit or log the chat. See per-token prices.
The same endpoint, through Janitor’s Proxy setting instead of SillyTavern’s Custom source: the URL takes /chat/completions on the end there, and the model id is typed rather than picked from a list. See the Janitor AI proxy guide.
The endpoint answered with a status other than 200 and SillyTavern is showing its message. The status code tells you which of the three settings to fix: 401 is the key, 404 is the model id or URL, 402 is the balance, 429 is the request rate.
For an abliterated build: temperature 0.9, Top P 0.95, Top K 0, Repetition Penalty 1.05, both OpenAI penalties at 0, and Context Size under the model’s window. Save it as a preset per model and adjust temperature first when a build drifts.