CaptchaKraken SunlightV2-0.8B (bf16)
Full-precision weights. The 4-bit version is CaptchaKraken/SunlightV2-0.8B-q4.
The Sunlight V2 family (0.8B)
Sunlight V2 is the 0.8B CaptchaKraken v2 pointer model. Every repo below holds the same trained model:
| Repo | What |
|---|---|
CaptchaKraken/SunlightV2-0.8B |
merged bf16 weights, for vLLM (GPU) โ this repo |
CaptchaKraken/SunlightV2-0.8B-q4 |
4-bit GPTQ (W4A16) weights, for vLLM (GPU) |
CaptchaKraken/SunlightV2-0.8B-LoRA |
unmerged LoRA adapter + pointer heads, for further training |
CaptchaKraken/SunlightV2-0.8B-GGUF |
llama.cpp builds (Q4_K_M, BF16, mmproj), for CPU |
The other v2 pointer families: Twilight V2 (2B, CaptchaKraken/TwilightV2-2B), Midnight V2 (4B, CaptchaKraken/MidnightV2-4B). The numbered element marks come from the v2 CNN element detector, CaptchaKraken/CaptchaKrakenV2-CNN-large (CPU-lite build: CaptchaKraken/CaptchaKrakenV2-CNN-lite).
What this is
The generation-3 pointer model: Qwen/Qwen3.5-0.8B, LoRA-trained (rank 16, merged) with
small heads (pointer_heads.safetensors) that read the whole answer (action, points, drags,
text, video moment) from one prefill of the prompt. There is no text generation. vLLM
runs it as a pooling model through the CaptchaPointerForConditionalGeneration plugin.
- Training run
20261030-100636-qwen-0.8b: 43,963 boards, 1 epoch, lr 1e-4 (heads 1e-3), accum 8, half the boards drawn with numbered element marks. - Prompt: the fixed single prompt ("every captcha is asked the same prompt").
Loading it (read this first)
These heads match client commit ef2ec28 of CaptchaKraken exactly. A later client's
heads (the offset/element head changes of 2026-10-30) will refuse them. Apply
client-fixes.patch (in this repo) on top of ef2ec28 before serving with vLLM 0.25.1.
It fixes two serving bugs found on 2026-11-01:
- Every video request failed: the prompt sent a bare
<|video_pad|>, and vLLM expands only the full<|vision_start|><|video_pad|><|vision_end|>. - A prompt vLLM had already cached (e.g. a marked board with nothing detected) came back with hidden states for its uncached tail only, and the heads indexed past the end. Prefix caching is now off.
from captchakraken.pointer.service import PointerService # client ef2ec28 + client-fixes.patch
svc = PointerService("<this repo, downloaded>", detector="detector_r18.v3.pt")
svc.solve(image=pil_image, marked=True) # or frames=[...] for a clipvideo-cut video
Gate results (Tier 2 gate set, 1,067 hand-labelled real boards, served through vLLM 0.25.1)
Solved rate, plain / marked:
| bf16 | GPTQ W4A16 | |
|---|---|---|
| All | 53.5% / 51.3% | 53.9% / 50.8% |
| Click (674) | 60.4 / 58.5 | 61.6 / 58.8 |
| Grid (223) | 31.8 / 26.0 | 29.6 / 22.9 |
| Video (158) | 56.3 / 57.6 | 57.0 / 57.0 |
| Type (12) | 33.3 / 25.0 | 33.3 / 37.5 |
GPTQ keeps 99.9% of bf16's solved boards (31 lost, 30 gained of 2,129 answers; same
action on 2,128; point shift p50 0, p90 0). Grids are where 4-bit costs something (-2 to -3
points). Per-board results are in eval/.
Results across the family
License: LGPL-3.0.
- Downloads last month
- -