CaptchaKraken TwilightV2-2B (bf16)

Full-precision weights. Also available: the unmerged adapter CaptchaKraken/TwilightV2-2B-LoRA and CPU builds for llama.cpp in CaptchaKraken/TwilightV2-2B-GGUF.

The Twilight V2 family (2B)

Twilight V2 is the 2B CaptchaKraken v2 pointer model. Every repo below holds the same trained model:

Repo What
CaptchaKraken/TwilightV2-2B merged bf16 weights, for vLLM (GPU) โ€” this repo
CaptchaKraken/TwilightV2-2B-q4 4-bit GPTQ (W4A16) weights, for vLLM (GPU) โ€” not published yet
CaptchaKraken/TwilightV2-2B-LoRA unmerged LoRA adapter + pointer heads, for further training
CaptchaKraken/TwilightV2-2B-GGUF llama.cpp builds (Q4_K_M, BF16, mmproj), for CPU

The other v2 pointer families: Sunlight V2 (0.8B, CaptchaKraken/SunlightV2-0.8B), 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-2B, 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 20261102-qwen-2b-44k: 43,963 boards (about 1.9 passes over 23,343 rows), lr 1e-4 (heads 1e-3), accum 8, gradient checkpointing, half the boards drawn with numbered element marks. Trained on one RTX 5080 (0.65 s/board, 10.8 GiB peak).
  • Prompt: the fixed single prompt ("every captcha is asked the same prompt").

Loading it (read this first)

The heads match client commit ef2ec28 of CaptchaKraken plus client-fixes.patch (in this repo; it changes python/src/captchakraken/pointer/, including the 0.8B card's two serving fixes). The unpatched ef2ec28 client will refuse these heads. Tested with vLLM 0.25.1.

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

On vLLM 0.25.1 the plugin is registered in the calling process only. Set VLLM_ENABLE_V1_MULTIPROCESSING=0, or the engine process will report the architecture as unsupported.

Gate results (Tier 2 gate set, 1,067 hand-labelled real boards, served through vLLM 0.25.1)

Solved rate, plain / marked, compared with SunlightV2-0.8B on the same boards:

2B bf16 0.8B bf16
All 72.6% / 68.2% 53.5% / 51.3%
Click (674) 76.3 / 73.3 60.4 / 58.5
Grid (223) 75.8 / 62.3 31.8 / 26.0
Video (158) 54.4 / 55.1 56.3 / 57.6
Type (12) 50.0 / 62.5 33.3 / 25.0

Of 2,129 answers, the 2B solves 489 that the 0.8B missed and loses 106 that it solved (net +383). Video is the one kind that did not improve. Median latency is 64 ms per answer on an RTX 5080. The 0.8B was trained on an earlier build of the data (2026-10-30), so not all of the gap is model size. Per-board results and the run's validation split are in eval/.

Results across the family

This model is in the 2B column. The bold heading marks this size.

Every v2 pointer size, on the same 1,067 hand-labelled real boards, served through vLLM 0.25.1 on an RTX 5080. Percent of boards solved; higher is better. q4 is 4-bit GPTQ (W4A16); the others are bf16.

Plain (the bare board):

0.8B 0.8B q4 2B 4B 4B q4
All (1,067) 53.5% 53.9% 72.6% 75.4% 75.1%
Click (674) 60.4 61.6 76.3 78.3 77.9
Grid (223) 31.8 29.6 75.8 78.9 78.9
Video (158) 56.3 57.0 54.4 59.5 59.5
Type (12) 33.3 33.3 50.0 50.0 50.0

Marked (the CNN detector's numbered marks drawn on the board), stills only, on the boards all five runs marked:

0.8B 0.8B q4 2B 4B 4B q4
All (904) 50.2% 49.8% 70.5% 71.6% 71.0%
Click (673) 58.5 58.8 73.3 73.7 73.6
Grid (223) 26.0 22.9 62.3 65.5 63.7
Type (8) 25.0 37.5 62.5 62.5 62.5
  • 2B solves about 19 points more than 0.8B on the plain boards, split about evenly between clicks and grids. Grids are the sharpest jump (31.8 to 75.8). 4B adds about 3 more.
  • Video barely follows size: 0.8B is ahead of 2B there, and 4B leads by about 3 points.
  • 4-bit moves the totals by less than a point. Its largest cost is on marked grids (2 to 3 points). A 2B q4 has not been measured or published.

How far to trust the gaps:

  • The 0.8B was trained on an earlier build of the data (2026-10-30), so not all of its gap is model size.
  • Compare sizes on the plain table. Marked scores also depend on the detector, and the 4B card names a different detector checkpoint from the 0.8B and 2B cards.
  • The 4B run did not score marked video, so marked video is left out for every size. That is why these marked totals differ from the ones quoted elsewhere on the cards, which cover different board sets.
  • Type has only 12 boards plain and 8 marked, so treat those rows as rough.
  • MidnightV2-4B's own gate results were run through transformers, so use this table, not those, to compare it with the other sizes.

Per-board results: 0.8B, 0.8B q4, 2B, 4B, 4B q4.

License: LGPL-3.0.

Downloads last month
2
Safetensors
Model size
2B params
Tensor type
BF16
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for CaptchaKraken/TwilightV2-2B

Finetuned
Qwen/Qwen3.5-2B
Finetuned
(674)
this model
Quantizations
1 model

Collection including CaptchaKraken/TwilightV2-2B