SillyTavern
Chat with SpicyAPI models in SillyTavern through the Custom (OpenAI-compatible) source, then add the free SpicyAPI extension for pictures, videos and an Animate button, with every run priced first.
SillyTavern can use SpicyAPI in two ways. The first is its normal chat connection: SillyTavern sends your messages to a SpicyAPI chat model through the Custom (OpenAI-compatible) source. The second is the SpicyAPI extension, which adds /spicy-img and /spicy-video commands and an Animate button so you can make pictures and short videos without leaving the chat.
You can use either one alone. Both use the same account, balance and prices as the rest of SpicyAPI, and you pay only for what you run. The extension is free and open source (MIT) at github.com/spicyapi-ai/sillytavern-spicyapi.
The short version
- Create a key at spicyapi.ai/console/keys. Use a separate key for SillyTavern with a daily spend cap.
- In SillyTavern, open API Connections, set API to Chat Completion and Chat Completion Source to Custom (OpenAI-compatible). Endpoint
https://api.spicyapi.ai/v1, your key, a model id ending in/chat, then Connect. - Turn on Streaming and set Response (tokens) to 2000 or more.
- For pictures and videos: Extensions > Install extension, paste
https://github.com/spicyapi-ai/sillytavern-spicyapi, then add your key under Extensions > SpicyAPI.
Before you start
- SillyTavern 1.19.0 or later. The steps on this page were checked against 1.19.0 on 2026-10-06. Menu labels may move in other versions.
giton the machine that runs SillyTavern, only if you want the extension. SillyTavern uses it to download extensions.- An API key. Keys start with
sk-spicy-. See Authentication for restrictions you can put on a key, and Account setup if you do not have an account yet. - A balance. Every request is paid from your prepaid USD balance. See Billing.
Connect SillyTavern's chat to SpicyAPI
SillyTavern's server sends the chat request, not your browser, so nothing else needs to be set up on your side.
Choose the Custom source
Open API Connections (the plug icon). Set API to Chat Completion, then set Chat Completion Source to Custom (OpenAI-compatible).
Fill in the three fields
| Field | What to enter |
|---|---|
| Custom Endpoint (Base URL) | https://api.spicyapi.ai/v1 |
| Custom API Key | Your sk-spicy- key |
| Enter a Model ID | A chat model id ending in /chat, copied from the live catalog (shown as MODEL_ID_FROM_CATALOG on this page) |
For the endpoint, include /v1, leave off /chat/completions (SillyTavern adds it) and do not end with a slash. A trailing slash makes SillyTavern request a path with a double slash.
Press Connect
SillyTavern asks SpicyAPI for the model list and then hides your key in the field. The key is kept on the SillyTavern server, in that user's secrets file. Use Test Message to confirm a reply comes back.
Pick a chat model
Chat models have ids that end in /chat. The Available Models dropdown is filled from SpicyAPI's full model list, so it also shows image, video and audio models, which cannot chat. The chat models come first: pick one at the top of the list, or type or paste a /chat id into Enter a Model ID.
To see every chat model and what each one accepts, browse the chat models on the site, or call GET https://api.spicyapi.ai/v1/models with your key (see Models). Each chat entry has context_length, max_output_tokens and supported_parameters.
For roleplay, the roleplay leaderboard ranks the chat models on character consistency and how freely they write. Some chat models are uncensored and some filter content; the catalogue marks each model's policy tier.
Recommended settings
| Setting | Value | Why |
|---|---|---|
| Streaming | On | Long answers appear as they are written, and a streamed request shows SpicyAPI's own error message. A non-streamed request that fails quickly only shows "Bad Request" in SillyTavern, and one that fails after about 30 seconds reports its error inside a successful response. |
| Response (tokens) | 2000 or more | Reasoning models count their thinking against this limit. The default preset allows 300, which a reasoning model can spend entirely on thinking and return nothing. |
| Request model reasoning | On | Shows the model's thinking in a collapsed block, when the model sends it. |
| Send inline media | Off for text-only models | See pictures in the chat. |
| Prompt Post-Processing | None | Change it only if you get an error about message roles. See troubleshooting. |
Sampling settings the chosen model does not support, such as temperature, top P, frequency penalty and presence penalty, are ignored instead of rejected. SpicyAPI lists the ones it skipped in the X-Spicy-Ignored-Params response header. You can leave SillyTavern's sliders where they are.
Reasoning effort
SillyTavern's Reasoning Effort dropdown is not sent to SpicyAPI models. If you want to set it, add it yourself and only for a model whose supported_parameters lists reasoning_effort:
- Click Additional Parameters under the Connect button.
- In Include Body Parameters, add one line, for example:
reasoning_effort: lowThe allowed values differ per model. A level the model does not offer is changed to the nearest one it does (named in the X-Spicy-Adjusted-Params response header), and on a model with no reasoning levels the line is ignored. Check the model's entry in the model list first. If the answer comes back empty or cut off, raise Response (tokens) or lower the effort.
Pictures in the chat
When Send inline media is on, SillyTavern attaches pictures from the chat to every later request. A model that cannot read images rejects the request with a 400, and since the picture stays in the chat, every following message fails too. Turn Send inline media off for text-only models, or hide the message that holds the picture.
Videos in the chat are not sent to the model.
Settings a model rejects
A few settings are still rejected when a model does not support them, because they change the answer rather than just tune it: Multiple swipes per generation above 1 (n), Logit Bias presets and Request token probabilities. If a request fails with a message naming one of these, switch the setting off. The error text names the field.
Custom Stopping Strings work on every model. A model without stop sequences (the Grok models, for example) ignores them, and a model that takes fewer than you set keeps the first ones; the response headers X-Spicy-Ignored-Params and X-Spicy-Adjusted-Params say which. A slider value outside a model's range, such as a temperature of 1.5 on a model that stops at 1, is lowered to the limit the same way.
The SpicyAPI extension
The extension makes pictures and short videos from inside a chat. Install it once, add your key, and pick models.
Install it
- Open Extensions (the stacked cubes icon) and choose Install extension.
- Paste
https://github.com/spicyapi-ai/sillytavern-spicyapiand press Install. - Reload the page if SillyTavern asks you to.
SillyTavern warns that this is a third-party extension. To update later, use Manage extensions in the same menu.
Add your key
Open Extensions > SpicyAPI, paste your key and press Check connection. It shows your balance when the key works.
Pick models
Choose a model for pictures, one for videos from text, and one for videos from a picture (the Animate button). Each list shows a starting price and groups models by content policy (Uncensored, Softened, Filtered). Automatic picks the cheapest Uncensored model. Under each model you can change its main settings, such as aspect ratio, resolution and length. Settings marked $ change the price.
Connect chat in one click (optional)
Connect chat in the panel does the chat setup for you: it picks Custom (OpenAI-compatible), sets the endpoint, saves your key and selects the chat model you chose.
Commands
| Command | What it does |
|---|---|
/spicy-img [prompt] | Makes a picture and posts it to the chat. |
/spicy-video [prompt] | Makes a video from text. |
/spicy-video image=last [prompt] | Animates the most recent picture in the chat. image= also takes a picture URL. |
/spicy-task <task id> | Adds the result of an earlier task to the chat, for example after Stop waiting or a page reload. |
/spicy-balance | Returns your available balance in USD. |
Named arguments you can add to the commands:
model=<id>uses a model for this run only. Press Tab aftermodel=for the list.edit=trueopens the prompt editor even when you typed a prompt.quiet=truesaves the result and returns its path without posting it, for Quick Replies and STscript.avatar=trueoravatar=false(pictures only) overrides the "use the character avatar" setting.
/spicy-img a lighthouse on a cliff at dusk, wide shot
/spicy-video waves rolling onto a beach at sunrise
/spicy-video image=last slow push-in, hair moving in the windThe wand menu next to the chat input has SpicyAPI picture, SpicyAPI video and SpicyAPI: animate last picture.
Animate
Every picture in the chat has a film icon among its controls, and messages with a picture have the same icon in their ... menu. It turns that picture into a video clip with your image-to-video model and adds the clip to the same message.
Prompts
If you give no prompt, the chat model you are connected to writes one from the current scene. With Let me read and edit the prompt before generating on (the default), a window opens showing the model, the exact price and the prompt as it is written. You can wait for it, type your own, or press Write from the scene again. The extension includes no prompts, presets or styles; the words come from you or from your chat model.
With models that accept a reference picture, you can use the character's avatar so the picture looks like the character.
Let the AI show pictures
Off by default. Turn it on under Let the AI show pictures in the SpicyAPI panel, then choose how the chat model asks for a picture. You can use either way, or both:
| Way | How it works | Needs |
|---|---|---|
| Function tool | The chat model calls a tool named spicyapi_generate_image with a description, the picture is posted, and the model carries on with the story. | Enable function calling in AI Response Configuration (the panel has a button for it) and a chat model with tool support. Every SpicyAPI chat model has it. |
| Reply tag | The chat model ends a reply with <pic prompt="description of the picture">. The extension removes the tag and posts the picture right after that reply. | Any chat API. By default the extension adds a short instruction to normal generations; turn that off to write your own. |
Automatic pictures have their own limits on top of the per-run ones below:
- at most one picture every few replies per chat (3 by default), and a declined or failed request also starts the wait;
- a daily limit for automatic pictures in this browser ($0.50 by default);
- above your confirmation amount, either Ask me first (the default, showing the description and the price) or Skip the picture.
Automatic runs only make pictures, never videos, and the pictures are hidden from the AI like every other result. While the tool is on, its definition is sent with every chat request, which costs a few tokens on your chat API. The full behaviour is in the extension's README.
Prices and limits
Before every run the extension asks SpicyAPI for a quote and shows it in US dollars. Quotes are free.
| Setting | Default | What it does |
|---|---|---|
| Ask before spending more than | $0.10 | Runs above this amount need a confirmation. If the prompt editor already showed the price, pressing Generate for $... counts as the confirmation. Empty means never ask, and 0 asks every time. |
| Never spend more than | $1.00 | Runs that could cost more are refused before anything is charged. Empty means no limit. |
The panel also shows what this browser session has spent. For a hard limit that works everywhere, put a daily spend cap on the key itself. See Authentication.
A run keeps going on SpicyAPI if you press Stop waiting or close the page, and it is charged if it succeeds. Collect it later with /spicy-task <task id>. Failed runs are not charged, except on the few models whose page says refused requests are billed. See Billing.
Where your key and files are stored
- Your key is stored in plain text in SillyTavern's settings file on the machine that runs SillyTavern (
data/<user>/settings.json, underextension_settings.spicyapi). Other SillyTavern extensions can read it. If you use Connect chat, the key is also saved in SillyTavern's secrets file as the Custom endpoint key. This is why a separate key with a spend cap is worth setting up. - Results are downloaded and saved in SillyTavern's image folder (
data/<user>/user/images/<character>/spicyapi_<task id>.pngor.mp4), then attached to the chat. New results are hidden from the AI by default, so the next chat request does not send a picture to a model that cannot read it. Turn on Let the AI see generated pictures and videos to change that. - What leaves your machine: the prompt, the model settings and any reference picture go to
api.spicyapi.ai. When your chat model writes the prompt, the chat context goes to whichever chat API SillyTavern is connected to, as with any other message. - SpicyAPI keeps generated files for a limited time. See Retention.
If you switch chats while something is generating, the result is saved but not added to the chat, and the extension tells you where it is.
Connection route
By default the extension talks to https://api.spicyapi.ai directly from your browser. If your network or browser blocks that, open Connection in the panel and pick Auto (tries directly, then falls back to SillyTavern's CORS proxy) or Through SillyTavern's CORS proxy.
The proxy is off by default. Turn it on by setting enableCorsProxy: true in SillyTavern's config.yaml (or start SillyTavern with --corsProxy) and restart. It cannot be combined with SillyTavern's basic authentication (basicAuthMode), which rejects requests that carry an API key. Use the direct route in that case.
Troubleshooting
| You see | What to do |
|---|---|
Bad Request on a non-streamed message | Turn on Streaming to see the real error message. The most common causes are in the rows below. |
| An empty reply, or a reply that stops after a few words | Raise Response (tokens) to 2000 or more. If the model thinks first, lower its reasoning effort. |
401 or "invalid key" | Paste the key again from the console. Check that it starts with sk-spicy- and has no extra space. |
40202 | The key's spend cap, or your balance, has been reached. Raise the cap or add funds. See Errors. |
40301 | The key's model allowlist does not include this model. Add it in the console. |
An error naming image_url, or every message fails after a picture appeared | The model cannot read images. Turn Send inline media off, or pick a model that reads images. |
An error naming n, logit_bias or logprobs | Switch off Multiple swipes, the Logit Bias preset or token probabilities for this model. |
| An error about message roles or ordering | Set Prompt Post-Processing to Semi-strict or Strict. |
| The model dropdown is long | Chat models come first in the list. Pick one, or type a model id ending in /chat into Enter a Model ID. |
upstream_failed saying the output budget was spent on reasoning | Raise Response (tokens) or lower the reasoning effort. |
| "The browser could not reach api.spicyapi.ai" (extension) | Switch the connection route to Auto and enable SillyTavern's CORS proxy as described above. |
| "SillyTavern's CORS proxy is turned off" (extension) | Set enableCorsProxy: true in config.yaml and restart SillyTavern, or switch back to the direct route. |
| "The result ... is ready, but it could not be downloaded" (extension) | Run /spicy-task <task id> to try again. |
| "The prompt could not be written" (extension) | No chat model is connected, or it returned an error. Type a prompt instead. |
Errors from SpicyAPI end with a request_id or a task ID. Quote it to support and the request can be found exactly. Error codes are explained in Errors.

