Open Text Detector, Oct 10 model, GGUF
Website: opentextdetector.com
GGUF files of the Open Text Detector token classifier, the model that scores every paper on opentextdetector.com. It detects AI-written and AI-edited text in English research papers, at the level of single tokens and sentences.
These files are the LoRA adapters of woog/open-text-detector-qwen36-35b-a3b-oct10 (final-moe, Oct 10, 2026) merged into Qwen/Qwen3.6-35B-A3B (revision 995ad96), converted with llama.cpp (commit 3e390af18d) and quantized.
This is not a chat model. Text generation is not what it was trained for. The GGUF gives the final hidden state of every token; the included token head (token_head.safetensors, one linear layer from 2,048 to 2 outputs) turns each hidden state into a probability that the token is AI-written.
Files
| File |
Type |
Size |
otd-final-moe-oct10-BF16.gguf |
BF16 |
69.4 GB |
otd-final-moe-oct10-Q8_0.gguf |
Q8_0 |
36.9 GB |
otd-final-moe-oct10-Q6_K.gguf |
Q6_K |
28.5 GB |
otd-final-moe-oct10-Q5_K_M.gguf |
Q5_K_M |
24.7 GB |
otd-final-moe-oct10-Q4_K_M.gguf |
Q4_K_M |
21.2 GB |
otd-final-moe-oct10-Q4_K_M-imatrix.gguf |
Q4_K_M with importance matrix |
21.2 GB |
token_head.safetensors |
Token head: weight (2 × 2048) and bias (2), float32 |
16 KB |
otd_score.cpp |
Scoring program built against llama.cpp: reads token windows, returns p(AI) per token |
score_gguf.py |
Scores a text file with otd_score and prints sentence scores |
results.json |
Every number in the tables below, with the evaluation metadata |
How to run it
- Build llama.cpp with CUDA, then build the scorer against it:
g++ -O3 -std=c++17 otd_score.cpp -I llama.cpp/include -I llama.cpp/ggml/include -L llama.cpp/build/bin -lllama -lggml -lggml-base -o otd_score
- Score a text:
python score_gguf.py MODEL.gguf token_head.safetensors paper.txt (needs transformers for the Qwen3.6 tokenizer and safetensors).
The scorer must reproduce how the model was trained, or the scores mean nothing:
- Tokenize with the Qwen3.6 tokenizer, without special tokens.
- Cut the text into windows of 510 tokens every 256 tokens, plus a last window that ends at the final token.
- Feed each window twice, back to back (1,020 tokens, positions 0 to 1,019), and read the hidden states of the second copy only. The model is causal, so the second copy is where every token has seen the whole window.
- p(AI) of a token = softmax(W h + b)[1] with the token head. Where windows overlap, average a token's probabilities.
- A sentence's score is the mean p(AI) of its non-blank tokens.
- Flag a sentence only above a cutoff set on human writing (the site uses the cutoff that flags 1% or 0.1% of sentences in human papers from 2019–2022). A score of 0.5 is not a meaningful cutoff.
Accuracy of each file against the 16-bit model
The first row is the 16-bit model as published on the site (PyTorch, BF16 weights, LoRA not merged). The other rows are the GGUF files, scored through llama.cpp on the same evaluation sets with the same windows and cutoffs. These are the same measures as the "Runs compared" tables on the site's Evaluation page.
All numbers are percentages unless the column says AUROC. Recall is measured at the cutoff that flags 1% of each set's own human sentences.
- Small-edit recall: AI sentences in the insert-one, rewrite-one, rewrite-two and split-one edits of the three held-out sets (heldout-writers, t21-heldout-v2, wide1-heldout; 7,243 sentences), pooled.
- Δ vs 16-bit: difference in small-edit recall from the first row, in percentage points, with a 95% interval from a paired bootstrap over papers (2,000 replicates).
- Spill-over FPR: share of human sentences next to a small edit that get flagged. Lower is better.
- Paragraph edits: AI sentences of the paragraph and section cohorts of t21-heldout-v2 and wide1-heldout.
| Model |
File size |
Small-edit recall |
Δ vs 16-bit [95% CI] |
Spill-over FPR |
Rewrite one |
Split one |
Paragraph edits |
Fable co-write |
| BF16 PyTorch (16-bit baseline) |
– |
74.6 |
— |
1.09 |
64.2 |
62.1 |
94.7 |
26.3 |
| BF16 |
69.4 GB |
74.3 |
-0.3 [-0.4, +0.2] |
1.08 |
63.7 |
61.4 |
94.4 |
26.3 |
| Q8_0 |
36.9 GB |
74.4 |
-0.2 [-0.5, +0.1] |
1.08 |
63.8 |
61.6 |
94.2 |
26.0 |
| Q6_K |
28.5 GB |
74.7 |
+0.0 [-0.4, +0.3] |
1.10 |
64.2 |
61.6 |
94.1 |
25.7 |
| Q5_K_M |
24.7 GB |
74.3 |
-0.4 [-0.7, +0.2] |
1.11 |
64.0 |
61.6 |
94.6 |
25.7 |
| Q4_K_M |
21.2 GB |
74.4 |
-0.2 [-0.7, +0.4] |
1.18 |
63.6 |
62.7 |
95.3 |
26.5 |
| Q4_K_M-imatrix |
21.2 GB |
74.4 |
-0.2 [-0.5, +0.5] |
1.12 |
63.9 |
61.8 |
94.9 |
25.1 |
Standard held-out sets
| Model |
heldout-writers |
t21-heldout-v2 |
wide1-heldout |
Insert one |
Rewrite one |
Rewrite two |
Split one |
| BF16 PyTorch (16-bit baseline) |
65.0 |
80.4 |
69.3 |
92.8 |
64.2 |
74.3 |
62.1 |
| BF16 |
64.7 |
80.3 |
68.5 |
92.8 |
63.7 |
74.0 |
61.4 |
| Q8_0 |
65.1 |
80.2 |
69.0 |
92.6 |
63.8 |
74.3 |
61.6 |
| Q6_K |
64.8 |
80.6 |
69.2 |
92.7 |
64.2 |
74.6 |
61.6 |
| Q5_K_M |
64.7 |
80.2 |
68.4 |
92.0 |
64.0 |
74.1 |
61.6 |
| Q4_K_M |
64.8 |
79.9 |
69.8 |
91.7 |
63.6 |
74.4 |
62.7 |
| Q4_K_M-imatrix |
64.6 |
80.2 |
69.0 |
92.4 |
63.9 |
74.2 |
61.8 |
Other evaluation sets
| Model |
Humanized paragraphs |
Co-writing |
Co-writing AUROC |
Light polish (document AUROC) |
Other kinds of writing |
Screening set small edits, dev |
Screening set small edits, test |
| BF16 PyTorch (16-bit baseline) |
97.0 |
26.3 |
0.729 |
0.814 |
98.5 |
45.5 |
60.0 |
| BF16 |
97.1 |
26.3 |
0.728 |
0.815 |
98.5 |
46.0 |
58.7 |
| Q8_0 |
97.0 |
26.0 |
0.728 |
0.815 |
98.5 |
45.5 |
60.0 |
| Q6_K |
97.0 |
25.7 |
0.728 |
0.817 |
98.5 |
45.0 |
58.0 |
| Q5_K_M |
97.2 |
25.7 |
0.730 |
0.819 |
98.6 |
43.4 |
57.3 |
| Q4_K_M |
96.8 |
26.5 |
0.725 |
0.814 |
97.2 |
45.0 |
56.7 |
| Q4_K_M-imatrix |
97.1 |
25.1 |
0.725 |
0.813 |
98.2 |
47.1 |
58.7 |
Running cost and agreement (one NVIDIA H200; tokens per second counts both copies of each window)
| Model |
Engine |
Peak GPU memory |
Tokens per second |
Mean abs. difference from 16-bit sentence scores |
Δ spill-over FPR [95% CI] |
SHA-256 |
| BF16 |
llama.cpp (LoRA merged) |
65.5 GiB |
3,032 |
0.0017 |
-0.02 [-0.03, +0.03] |
a916a5ee860e132d… |
| Q8_0 |
llama.cpp (LoRA merged) |
39.1 GiB |
6,005 |
0.0020 |
-0.01 [-0.03, +0.03] |
60258a5a9e168aee… |
| Q6_K |
llama.cpp (LoRA merged) |
31.4 GiB |
5,420 |
0.0027 |
+0.01 [-0.03, +0.04] |
34df04e65237066b… |
| Q5_K_M |
llama.cpp (LoRA merged) |
28.0 GiB |
5,626 |
0.0047 |
+0.02 [-0.01, +0.08] |
8f1198ad97aeef71… |
| Q4_K_M |
llama.cpp (LoRA merged) |
24.7 GiB |
5,702 |
0.0073 |
+0.09 [+0.05, +0.15] |
1985f7c3df482bc1… |
| Q4_K_M-imatrix |
llama.cpp (LoRA merged) |
24.7 GiB |
5,654 |
0.0049 |
+0.03 [-0.01, +0.08] |
ee173bd01006beed… |
License
Apache-2.0, the license of the base model and of the LoRA adapters.