Qwen3.8-Flash-Next Abliteration (refusal direction)
One refusal direction for Qwen3.8-Flash-Next, published as a Strata control vector. Load it and the model
stops refusing. We wrote it for Strata. The vllm/patches/ folder
carries the runtime patch of the same direction for vLLM.
CAUTION: This removes a safety behaviour. With the vector on, the model follows requests the stock model
declines. You are responsible for what the model writes with it on.
The direction works with any model of the Qwen3.8-Flash-Next family: the base model, instruction-tuned
models, quantized models, and finetunes of the same architecture. The vector has 2,560 values, so the model
must have a residual stream of 2,560.
We tested the direction with these releases:
- unsloth/Qwen3.8-Flash-Next-GGUF
- ukisai/Swift-1.5-Qwen3.8-Flash-Next-GGUF
- ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-GGUF
The list covers quantizations of the base model and a finetune (Swift 1.5).
Use it in Strata
Get the file
Put orcarouter.gguf in your own Strata folder, i.e. ~/Strata-data/abliteration/:
hf download Goghor/Strata-Qwen3.8-Flash-Next-Abliteration orcarouter.gguf --local-dir ~/Strata-data/abliteration
Set the engine flags
Put these three flags in the args array of strata-<model>.json:
"--control-vector-scaled", "~/Strata-data/abliteration/orcarouter.gguf:1.0",
"--cvec-mode", "project",
"--cvec-dir", "per-layer"
Switch it off for one request
A loaded vector is on for every request. Send "experimental_speed_projection": false in the sampling
object. The server passes cvec=0 to the engine, and the Chat settings write the same switch. The switch
drops the conversation cache once. Switched off, the answer is the stock model's answer, token for token. An
engine with no loaded vector ignores the key.
Flags you can change
--cvec-mode projectis required. Additive mode adds the direction to the stream. That is not
abliteration.--cvec-dir per-layeris the form of this file. The 47 layers carry the same vector, sosingle:1
gives the same result.--control-vector-layer-range A Bselects the layers. Without it the engine steers layers 1 to 47.
Strata's own refusal package for this model uses 4 to 44.- The scale in
FILE:SCALEis 1.0. A scale less than 1.0 is a partial projection.
Use it with vLLM
vllm/patches/ holds two git am patches for vLLM v0.30.0, commitced6857afa0ea7b2e3f0846a62e1394e90f15607. They add a runtime projection at five points. The points are the
token embeddings, the MTP embeddings, attn_out, mlp_out, and the PLE value after the kv_proj split.
| Patch | Size | What it does |
|---|---|---|
0001-qwen4_exp-add… |
9,120 B | Adds vllm/models/qwen4_exp/nvidia/abliteration.py and calls abliteration.project_ at the five points named above. |
0002-qwen4_exp-abliteration-always… |
2,764 B | Registers _abliteration_r always, with zeros when the switch is off. ON and OFF then share one AOT compile cache. |
The pair sits at the end of the 106-patch series of the source repository, so it needs that series. On
31 October 2026 we tested the pair alone on a stock v0.30.0 tree. git apply --check failed atmodel.py:554 and at mtp.py:60. --ignore-whitespace failed the same way. On top of the other 104 patches
of that repository, both files passed git apply --check and applied with git am.
Build the tree in this order:
git init vllm && cd vllm
git fetch --depth 1 https://github.com/vllm-project/vllm.git refs/tags/v0.30.0:refs/heads/v0300
git checkout v0300
git am --keep-non-patch /path/to/qwen38-flash-next-2x3090/patches/*.patch
That series already includes these two files. Add the two files here only to a tree of the other 104 patches:
git am --keep-non-patch /path/to/vllm/patches/0001-*.patch /path/to/vllm/patches/0002-*.patch
Before you build, test the fit with git apply --check on the two files.
Set the direction with the env var, then build vLLM from the patched tree:
export QWEN38_ABLITERATION=/path/to/orcarouter.json
The variable takes a JSON file, a safetensors file, or a bare name. The JSON file needs arefusal_direction list, and the safetensors file needs a refusal_direction tensor. A bare name resolves
to/opt/qwen38/abliteration/<name>.json. The vector must have 2,560 values, and the load normalises it. An
empty value, 0, or an unset variable leaves the model stock. The switch is global. It has no per-request
form.
The source project measured the switch on 2x RTX 3090. The verify-step time with it off equals the time with
it on: 24.1-27.0 ms. Eight mild prompts went from 7 refusals to 0 refusals. See benchmarks/2026-10-02/ in
that repository.
Files
| File | Size | What it is |
|---|---|---|
orcarouter.gguf |
483,520 B | The direction as a control-vector GGUF: 47 tensors direction.1 .. direction.47, 2,560 F32 values each. Load this file in Strata. |
orcarouter.json |
44,246 B | The same direction in JSON: one unit vector, its source, and the checks of the recovery. Input for the Strata tool. |
config/strata-cvec-flags.json |
781 B | The engine flags with notes. |
examples/check.txt |
2,013 B | Transcript of the reproduce run, with the measure commands and their output. |
vllm/patches/0001-*.patch |
9,120 B | The vLLM runtime patch: QWEN38_ABLITERATION, five projection points. |
vllm/patches/0002-*.patch |
2,764 B | Registers the direction buffer always, so ON and OFF share one compile cache. |
LICENSE.md |
3,089 B | License and attribution. |
Reproduce the GGUF
python ~/Strata/tools/json_to_cvec_gguf.py orcarouter.json -o ~/Strata-data/abliteration/orcarouter.gguf
A regenerated file is not byte-identical to the shipped one. The normalisation rounds in float32, and the
rounding depends on the numpy build. examples/check.txt measures cos 1.0 and a max element diff of 3e-08
against the shipped file. All 47 tensors of the shipped file are byte-identical to each other.
The method
This file holds the refusal direction of Qwen3.8-Flash-Next: 2,560 values, unit length. Strata applies it as
a projection after the FFN write of each steered layer, on every hyper-connection stream:
h <- h - (h . v) v with v = the unit direction
The sign of the vector does not matter. The projection removes the component on the line, in both
directions.
Where this direction comes from
The recovery is a weight diff, not an activation probe. The release
orcarouter/Qwen3.8-Flash-Next-Uncensored,
revision e096800036ec20da7e2442dcd4044a004d4e99fa, edits 149 tensors.scripts/extract_refusal_direction.py in the
qwen38-flash-next-2x3090 repository reads about
83 MB of it by HTTP range requests. It takes the top left singular vector of W - W' for four edited
matrices, with one untouched tensor as control. The release is gated, so your Hugging Face account must
accept the terms of OrcaRouter first.
The JSON records the checks of that recovery:
| Check | Result |
|---|---|
Untouched control tensor layers.3.self_attn.k_proj |
byte-identical to the base checkpoint |
Each edit W - W' is rank-1 |
second singular value 0.88-0.98% of the first |
| One direction for all four tensors | abs cos 0.999993-0.999999 |
Re-apply W - r(r^T W) to the base weights |
87.6-92.9% of elements bit-identical to the release |
What it costs
The engine adds one dot product and one rank-1 update per token, per steered layer. Strata measures
0.2-0.4% per token for its own control vector of this model
(docs/DETAILS.md, "Experimental speed projection"). We have no speed measure and no quality measure for
this vector in Strata.
The change is narrower than a weight edit. Strata projects the residual stream after the FFN write. It does
not project the token embeddings or the PLE value. The published release edits those weights too.
Our GGUF and Strata's speed projection vector
(data/experimental-speed-projection/Qwen3.8-Flash-Next-experimental-speed-projection.gguf) are different
vectors: cos 0.141. That package reports a refusal rate of 1 of 50 against 50 of 50 on its own test set. On
2,557 teacher-forced tokens its mean KL from the stock model is 0.063 nats.
License
- The direction, the JSON and the GGUF: Qwen Community License 1.0. The direction derives from the model
weights and from the activations of the model. SeeLICENSE.md. - The converter
tools/json_to_cvec_gguf.pyand the control-vector hooks are MIT work of the
Strata project, Copyright (c) 2026 Niko1221 and the Strata
contributors.
Source
- Recovery method, runtime idea and the JSON file:
qwen38-flash-next-2x3090, commit939905b0dab8c6eb3852ff35cbbd42d098af2451, "Add opt-in uncensored mode: runtime refusal removal". - The edited release: orcarouter/Qwen3.8-Flash-Next-Uncensored.
- Paper: Refusal in Language Models Is Mediated by a Single Direction,
Arditi, Obeso, Syed, Paleka, Panickssery, Gurnee, Nanda, 2024. - Engine side:
docs/DETAILS.md, "Experimental speed projection", anddata/experimental-speed-projection/README.mdin the Strata repository.
@article{arditi2024refusal,
title = {Refusal in Language Models Is Mediated by a Single Direction},
author = {Arditi, Alessandro and Obeso, Juan Stam and Syed, Ailidh and Paleka, Daniel and
Panickssery, Afonso and Gurnee, Wes and Nanda, Neel},
journal = {arXiv preprint arXiv:2406.11717},
year = {2024}
}