GLiNER2.5 · ONNX WebGPU

Span-free NER in the browser. Models: small · base · multi. Nothing leaves the page except the Hugging Face download.

GLiNER2 vs 2.5, and what this page can run

GLiNER2 enumerates candidate spans up to a fixed width (about twelve words). Anything longer is invisible. GLiNER2.5 scores start and end boundaries instead, so a forty-word clause costs the same as a two-word name.

Python classify_text is one forward pass (trained max_len 4096 words). That is Fastino’s long-context classification on CUDA/CPU. This page is WebGPU. One-shot classify_text on small finished 4096 words here. base and multi died between 3500 and 3600 words (12-head attention vs Chrome’s ~1 GiB buffer). The Long contract chip calls classify_text_long: 384-word windows, overlap 64. A 4096-word file is 13 GPU runs of 384 words, not one 4096-word encode. Same split as Python classify_text_long.

Fastino's 2.5 blog also adds JointIE knowledge graphs, constrained classification, and span attributes. This page runs the boundary entity path, the v3 classifier, and (when heads.onnx is loaded) typed JointIE edges. Record-mode JSON is host assignment of repeated fields, not the neural RecordHead.

CrossNER is the one public NER number we can check. Fastino reports macro F1 on 2.5-base 58.30 / 2.5-multi 54.85. Our JS ONNX domain-macro (same five test splits, threshold 0.5) is 55.8 / 52.2. JS matches Python AutoExtractor on those splits; the remaining ~2.5 points is protocol (token-level vs char-span, not the export).

CrossNERblog 2.5 baseour JS baseblog 2.5 multiour JS multi
AI50.6948.645.6043.2
Literature54.5653.151.5250.3
Music68.9665.065.8062.9
Politics56.4157.555.2655.9
Science60.8554.756.0848.7
domain-macro58.3055.854.8552.2
Named entities · Apple / Cook
WebGPU: checking…

Entities will appear here.

Raw entities (JSON)