DEV Community

UplinkSwitch
UplinkSwitch

Posted on Originally published at uplinkswitch.ai

Abliterated LLMs by API: what changes in your OpenAI SDK code

Set max_tokens=300 on an abliterated GLM build and you can get back an empty reply. The model spent the whole budget thinking before it wrote a word. That is the one real code-level difference between these models and the chat models you already call. The rest of this post is the context around it.

The full model list with live prices is on the uncensored LLM API page. Disclosure: that is our gateway, one OpenAI-compatible base URL for Claude, GPT and open-weight builds.

What abliterated means for your integration

An abliterated model is an open-weight chat model with the direction that makes it refuse removed from its weights. Arditi et al. found that refusal in 13 open chat models, up to 72B parameters, runs through a single direction in the activations (arXiv 2406.11717). Abliteration projects that direction out of the weights. Nothing is retrained. Maxime Labonne's write-up on Hugging Face walks through it in code.

Three things change what a model will answer:

  • Abliteration edits the weights. No training run.
  • An uncensored fine-tune trains the model further on examples that answer.
  • A jailbreak changes only the prompt, so it loses whenever the model's training wins.

From the client side, the first two look the same: same endpoint, same request shape, a different model id. Nothing is added to your prompt.

The thinking-budget gotcha

On 2026-10-18 we sent the request SillyTavern's Custom (OpenAI-compatible) source makes to three builds:

  • roleplay-uncensored replied at once.
  • deepseek-v4-pro-uncensored thought briefly, then answered.
  • glm-5.3-abliterated thought first and needed 1,000 or more max tokens.

Thinking tokens count against max_tokens and bill as output. At a low cap the model can run out before the reply starts. Set the cap high for a thinking build, read finish_reason, and expect the real cost of a call to run above the visible reply length.

from openai import OpenAI

client = OpenAI(
    base_url="https://api.uplinkswitch.com/v1",
    api_key="sk-uplink-live-...",  # from the console
)

resp = client.chat.completions.create(
    model="glm-5.3-abliterated",
    max_tokens=1500,  # it thinks first; at 300 a reply can stop mid-sentence
    messages=[{"role": "user", "content": "Explain how a refusal direction is found."}],
)
choice = resp.choices[0]
print(choice.message.content)
print(choice.finish_reason)  # "length" means the cap ran out; raise max_tokens
Enter fullscreen mode Exit fullscreen mode

Reading an id

The id tells you how a build was made, up to a point. abliterated in the name means classic abliteration: one refusal direction projected out of the weights. uncensored means the model was changed to answer instead of refuse, and the name does not say how. Some of those are the official open weights served without a filter. A few builds are fine-tunes for character chat and story writing, and the names say so. GET /v1/models with your key lists every id it can call, and each id has its own page with its price and its daily check.

The bill is mostly input

A character-chat message is about 4,000 tokens in and 300 out: the card, the persona and recent history go in, one reply comes back. That is roughly 13 tokens in for every token out, so the input rate does most of the work. A model with a low output rate and a high input rate can still cost more per message.

History makes it worse. The same reply with 16,000 tokens of history sends four times the input. Compare models on the input rate first. The current price is on each model page.

Check that an id still serves what it did

A model id is a promise, and a swap behind it is hard to see in one response. Once per UTC day we send every model on the key the same fixed prompt and publish the result at /proof. The input token count works as a tokenizer fingerprint, so a swapped model or hidden added instructions shows up as a changed count.

You can run the same test in your own CI. Send a fixed prompt, store usage.prompt_tokens, alert when it moves.

Use it in a frontend

  • SillyTavern: API Chat Completion, source Custom (OpenAI-compatible), endpoint https://api.uplinkswitch.com/v1, your key, the model id.
  • Janitor AI: Provider, Proxy, New. The proxy URL is the base URL plus /chat/completions, with the key and model id in the same panel.
  • Any OpenAI SDK client: change base_url and api_key. Nothing else moves.

Two rules hold on every build: no minors, and no real person's likeness without consent.

Get a key: prepaid, no subscription, 30-day price lock, at uplinkswitch.ai/console.

Top comments (0)