Roleplay apps (RisuAI, Agnai, Chub, KoboldAI Lite, Janitor AI)
Connect SpicyAPI's text models to RisuAI, Agnai, Chub, KoboldAI Lite and Janitor AI. Exact fields for each app, which models suit roleplay, how to handle reasoning models, and how to cap spending.
Roleplay apps let you chat with characters, and most of them let you bring your own AI model through an OpenAI-compatible connection. SpicyAPI speaks that protocol, so you can point these apps at it, pick any SpicyAPI text model, and pay from your SpicyAPI balance.
This page covers five web and desktop apps: RisuAI, Agnai, Chub, KoboldAI Lite and Janitor AI. For SillyTavern, see SillyTavern. The apps are made by other people and change their screens; the field names below come from each app's published source code and help pages, and each section says what was checked and what was not.
The short version
- Create a separate API key for the app at spicyapi.ai/console/keys and give it a daily spend cap.
- In the app, choose its OpenAI-compatible or "reverse proxy" connection. Enter
https://api.spicyapi.ai/v1as the address (Janitor AI wants the longerhttps://api.spicyapi.ai/v1/chat/completions), paste your key, and set the model to a chat id ending in/chat, copied from the live catalog. - Set Max tokens to at least 1,000 for reasoning models, then send a message.
What you need
- A SpicyAPI account with a balance. See Account setup and Billing.
- An API key that starts with
sk-spicy-. See Authentication. - A model id. Text models are named
<maker>/<model>/chat, written here asMODEL_ID_FROM_CATALOG.MODEL_ID_FROM_CATALOGstands for a chat model id you copy from the live catalog; never type the placeholder itself. The id has to be typed exactly, including the/chatat the end. The full list is at spicyapi.ai/models; with your key,GET https://api.spicyapi.ai/v1/modelsreturns it too, and chat ids are the ones ending in/chat. See Models.
Which app fills in which field
| App | Address to enter | Where the key goes | Model | Who sends the request |
|---|---|---|---|---|
| RisuAI | https://api.spicyapi.ai/v1 (the full .../v1/chat/completions also works) | Key/Password | Request Model, typed in | RisuAI's server on the website, your computer on the desktop app |
| Agnai | https://api.spicyapi.ai/v1 (not the full path) | API Key | Chosen in a preset, from a list fetched from SpicyAPI | Agnai's server |
| Chub | https://api.spicyapi.ai/v1 (not the full path) | Reverse Proxy Key | Dropdown fetched from SpicyAPI | Your browser |
| KoboldAI Lite | https://api.spicyapi.ai/v1 | API key field of its OpenAI connection | Dropdown fetched from SpicyAPI | Your browser |
| Janitor AI | https://api.spicyapi.ai/v1/chat/completions (the full path) | API Key | Model Name, typed in | Not verified, see the Janitor AI section |
The difference between the short address and the full one matters. Apps that add /chat/completions themselves break if you include it, and Janitor AI needs it written out.
Choose a model
Roleplay needs a model that stays in character, writes long replies and does not refuse ordinary story requests. The roleplay and LLM leaderboard ranks SpicyAPI's text models on those things and shows current prices. Check it rather than relying on a list written here, because models and rankings change.
Each model page also shows a content policy label (for example unrestricted, borderline or filtered). That label says how freely the model answers; pick a model whose label suits the stories you want to write.
DeepSeek V4.1 Flash is a good first model to try: it ranks near the top of the board and is one of the cheapest. Copy its id (it ends in /chat) from the live catalog at spicyapi.ai/models rather than typing it from memory.
Two limits to know about:
- Some models accept at most 256 messages per request. In a very long chat, an app that sends the whole history can go over that. Look for the app's setting for how much history to send, or its context size, and lower it. The model's page lists its limits.
- Image input only works with models that read images. Ordinary roleplay chat does not need it.
Sampling settings
Roleplay apps send a pile of sampling settings with every message: temperature, top-p, top-k, min-p, top-a, frequency, presence and repetition penalty. Models differ in which of these they accept.
SpicyAPI ignores the ones a model does not use instead of refusing the message. It also ignores n: 1, an empty stop list, and stop strings on a model that has none. When it ignores something, the response carries an X-Spicy-Ignored-Params header naming the settings it dropped, so you can see exactly what had no effect.
When a model takes a setting but not the value you sent, SpicyAPI uses the nearest value it accepts: a temperature above the model's maximum becomes the maximum, and a list of stop strings longer than the model allows keeps its first entries. These changes are listed in an X-Spicy-Adjusted-Params header, for example temperature=1, stop=kept 1 of 3. That means you can leave your usual presets as they are.
Fields that are not sampling settings are different: if an app sends something the model does not know at all, SpicyAPI still answers with a 400 error that names the field.
Reasoning models and Max tokens
Some models think before they answer. The thinking uses tokens, and those tokens count toward Max tokens (also shown as Max output, Response length or max_new_tokens, depending on the app).
- Set Max tokens generously. If it is very small, say 20 or 200, a reasoning model can spend the whole budget thinking and return no text. You get an
upstream_failederror saying the output budget was spent on reasoning. Start at 1,000 or more and raise it if replies cut off. - Thinking costs money and time. You pay for reasoning tokens like any other output, and the first word arrives later. Some models can be told to think less with a
reasoning_effortsetting. The levels differ per model; a level the model does not offer is changed to the nearest one it does, and OpenRouter-style reasoning settings (Agnai sends these) are translated toreasoning_effort. Apps that have an Additional Parameters or custom-parameters box can pass it, for examplereasoning_effortwith a lower value; most of the apps below do not send it on their own. - Some apps print the thinking in the chat. Janitor AI wraps it in
<think>tags. Chub does not show it at all.
Keep spending under control
Roleplay chats are long, and apps resend the whole conversation with each message, so the cost per message grows as the chat grows.
For each app, create its own key in the console. Open Advanced while creating it and set a daily spend cap (and a monthly one if you like). If the app misbehaves, loops, or the key leaks, the damage stops at the cap, and you can revoke that one key without touching anything else. A key can also be limited to specific models. See Authentication.
These apps store your key on their own servers or in your browser. RisuAI's website, Agnai and Janitor AI send your key and your chat through their servers; Chub and KoboldAI Lite send requests straight from your browser. A separate, capped key is the right precaution in every case.
RisuAI
RisuAI runs at risuai.xyz, as a desktop app, or on your own server. Checked against the RisuAI source code (version 2026.8.250).
Pick the Custom API model
In the bot settings, open the model dropdown and choose Custom API.
Fill in the three fields
- URL (shown as "Reverse Proxy"):
https://api.spicyapi.ai/v1. RisuAI adds/chat/completionsitself when the address ends in/v1, and the fullhttps://api.spicyapi.ai/v1/chat/completionsworks too. - Key/Password: your
sk-spicy-key. It is sent as a bearer token. - Request Model: the model id,
MODEL_ID_FROM_CATALOG. RisuAI has no model list for custom addresses, so type it.
Set the Format dropdown to OpenAI Compatible.
Set Max tokens and send a message
Raise the max response length if you picked a reasoning model (see above), then chat.
Where requests come from. On risuai.xyz, RisuAI normally relays requests through its own server, so your key and chat pass through it. The desktop app and a self-hosted server send requests directly from your machine. Only the website's "Force Plain Fetch" option, hidden under unrecommended settings, sends requests from the browser; SpicyAPI accepts those too.
Sampling. RisuAI's default Custom API settings send frequency, presence and repetition penalty, min-p and top-a. SpicyAPI ignores the ones the model does not use, so the defaults work.
Agnai
Agnai is at agnai.chat. Checked against the Agnai source code (dev branch, 2026-10-06). SpicyAPI is not in Agnai's built-in provider list, so you add it as a custom OpenAI-compatible connection.
Add a provider
In Settings, open the provider management page and add a provider of type OpenAI Compat (or Remotely Hosted, then Other (Generic OpenAI)). Give it any label.
Fill in the address and key
- URL:
https://api.spicyapi.ai/v1(orhttps://api.spicyapi.ai; Agnai adds/v1if it is missing). Do not enter the full.../chat/completionspath, or Agnai doubles it. - API Key: your
sk-spicy-key.
Choose the model in a preset
In the preset you chat with, pick the model from the list. Agnai fills the list from SpicyAPI's model list. Choose an id ending in /chat.
Where requests come from. With a provider added this way, Agnai's server sends the request, so your key is stored with Agnai.
Sampling. Agnai always sends temperature and top-p, which some models do not take. SpicyAPI ignores them for those models, so models such as DeepSeek V4 and Kimi K3 work.
Not recommended: browser-direct modes. Agnai also has a Self-Host connection type and a Use Local Requests switch on older presets, which make your browser call the address directly. From the source, these modes add a field called think that SpicyAPI does not accept, and SpicyAPI answers 400 for fields it does not know. This was not tested against SpicyAPI. If you hit a 400 there, switch back to the provider setup above.
Chub
Chub (chub.ai) sends requests straight from your browser to the address you give it. Checked against Chub's published front-end code (build dated 2026-06-28); Chub's own screens may have changed since. The browser connection works because SpicyAPI allows requests from web pages.
Add the reverse proxy in Secrets
Open Secrets, find the OpenAI block, and choose Reverse Proxy instead of My Own API Key.
Fill in the address and key
- Open AI Reverse Proxy:
https://api.spicyapi.ai/v1. Chub adds/chat/completionsitself, so do not include it. - Reverse Proxy Key: your
sk-spicy-key.
Press Check Proxy. A successful check also loads the model list.
Select OpenAI / Proxy and a model
Under Configuration > Prompt Structure, set the API to OpenAI / Proxy and choose a model from the dropdown (an id ending in /chat).
Chub warns on its own settings page that your IP and chat log might be logged when you use a reverse proxy. That is Chub's note, not SpicyAPI's.
Things the source shows that can surprise you:
- Chub stops reading a streamed reply after 120 seconds. A reasoning model that thinks for a long time can be cut off; lower its reasoning effort or choose a model that answers faster.
- Chub does not display a model's thinking, only its answer.
KoboldAI Lite
KoboldAI Lite is a single web page at lite.koboldai.net. Checked against its published index.html. It calls the address directly from your browser, which works because SpicyAPI allows requests from web pages.
Choose the OpenAI connection
Open Settings, pick the OpenAI API (custom endpoint) connection.
Enter the address and key
Put https://api.spicyapi.ai/v1 as the address and your sk-spicy- key in the key field. The app strips a trailing /chat/completions if you paste one.
Fetch the model list
Use the app's model fetch button, pick an id ending in /chat, and set the output length in the generation settings.
Leave "CORS Proxy" off. KoboldAI Lite has an option to route requests through a proxy run by its author. You do not need it for SpicyAPI, and turning it on sends your key through someone else's server.
Sampling. Its repetition setting is sent to the API as a presence penalty. SpicyAPI ignores it for models that do not use it.
Janitor AI
Not verified
We could not confirm that Janitor AI works with SpicyAPI. Janitor AI is closed source, and an account is needed to test it, so nobody has tried a real chat. What follows is how its proxy settings are described in Janitor's help center and in its published page code. Treat it as something to try, not as a promise.
Janitor AI's "proxy" feature sends your chat to an address you choose. In Janitor's help center, the fields are in the chat page's gear icon, under API Settings, then Add Configuration.
Add a configuration
Fill in:
- Config Name: anything, such as
SpicyAPI. - Model Name: the model id, typed in:
MODEL_ID_FROM_CATALOG. - Proxy URL: the full address,
https://api.spicyapi.ai/v1/chat/completions. Janitor has an "Add /chat/completions" button that does this for you after you enterhttps://api.spicyapi.ai/v1. - API Key: your
sk-spicy-key.
Save, then send a message
Janitor's own Check Key/Model button is described by Janitor's help center as unreliable, so test with a real message instead.
If Janitor shows a network or connection error such as "A network error occurred", Janitor's page is probably blocking requests to addresses other than OpenAI's. Janitor's web page has a security policy that allows direct requests to only one third-party AI address, OpenAI's. When Janitor sends the request from your browser, the browser refuses before SpicyAPI sees anything, and SpicyAPI cannot change that. If your key shows no usage in the console while this error appears, that is the cause.
If you hit it, use SillyTavern or RisuAI instead.
Other facts from Janitor's help center and page code:
- Some Janitor bots have proxies switched off by their authors, so a bot may refuse to chat through a proxy no matter what you enter.
- Janitor shows a model's thinking wrapped in
<think>tags. Use a larger Max tokens or a lower reasoning effort to keep it short. - Janitor limits the length of a single message you type.
Troubleshooting
| You see | What to do |
|---|---|
401 or "invalid API key" | Copy the key again from the console. A revoked key stops working at once, and the key must be the sk-spicy- one, not an account password. |
402 or "insufficient balance" | Add funds in the console, or check that the key's daily spend cap has not been reached. See Billing. |
404 or "model not found" | The model id is wrong. It must end in /chat and be spelled as in https://api.spicyapi.ai/v1/models. |
404 on the address itself, with a doubled path like /chat/completions/chat/completions | The app adds the path itself. Use https://api.spicyapi.ai/v1 (RisuAI, Agnai, Chub, KoboldAI Lite). Only Janitor AI needs the full path. |
400 that names a field | The app sent something the model does not accept and that is not a sampling setting. Remove or turn off the named field. |
400 about the number of messages | The chat history is longer than the model's message limit. Lower the history or context size in the app. |
upstream_failed, "the output budget was spent on reasoning" | Raise Max tokens, or lower the model's reasoning effort. See Reasoning models and Max tokens. |
| Reply stops mid-sentence | Max tokens is too low, or (in Chub) the 120-second limit was reached. |
| "Network error" or "Failed to fetch" in the app, and no request in your console logs | The request never reached SpicyAPI. On Janitor AI this is the page blocking the address; elsewhere check the address for typos and that the site is reachable. |
429 | Too many requests at once. Wait a few seconds; shared apps can send many users' requests from one address. |
Error codes are explained in Errors. Every error ends with a request_id; quote it to support and the request can be found exactly. Your requests also appear under Logs in the console, which is the quickest way to tell whether a request reached SpicyAPI at all.

