Skip to main content

Horopter

Title page of Opticae thesaurus (Basel, 1572)

Horopter: the set of points that both eyes see as one.

Code: MIT (LICENSE). Weights, data recipe and docs: CC BY-NC-SA 4.0 (research, non-commercial). Weights: horopter-0.4B, horopter-1B (first release, 2026-10-20).

Horopter is an encoder-only decision model. Give it a state (a document, a record or a JSON object) and typed questions about it (yes/no, choose one, score on a scale). It answers them in one pass, and for every answer it also returns:

  • evidence: whole-word spans in the state that support or refute each option;
  • relation: whether the state bears on the question at all, and with what stance (support / refute / undetermined);
  • abstention: a calibrated probability that the answer is wrong, with a reason (unrelated, model_uncertainty).

The state is encoded once, without seeing any question, and cached. Each question reads that cached state, so:

  • adding a question never changes the answers to the others;
  • asking many questions about one state costs about one encoding.

Built on Ettin encoders (400M and 1B), from Fight Fire with Fire Robotics.

Status

First release, 2026-10-20: horopter-0.4B (horopter-0.4b-20261020) and horopter-1B (horopter-1b-20261020). Router + adapters, one pass:

Horopter 1B Horopter 0.4B mbnli-3 beta 1B (internal) best 4–9B decoder we tested
grounding (LLM-AggreFact balanced accuracy) 75.7 74.8 75.7 77.2
4-way relation (macro-F1) 78.6 76.6 78.6 75.3
multi-step policy decisions (JevBench hard) 40.5 36.0 44.1 64.0
generated policies, one pass (prose) 97.7 95.0 53.6

The full tables and limits are in the model cards. Grounding and relation are level with 4–9B decoders. Multi-step policy decisions on real text trail them by about 20 points. This release has rule-application data with always-determined answers, so it rarely says "more information needed" on real rule text.

Layout

horopter/     model, packing, losses, runtime (adapters), evidence, abstention, fields (typed extraction), api + server (wire format)
horopter/fast/  fast path: state cache, CUDA graphs, block-sparse state attention, all adapters in one pass
training/     joint trainer, adapter / evidence trainers, abstention head fit, data builders, recipes/beta2.md
eval/         benchmark scorers (E37 bench, E40 rule evals) and the HTTP client
scripts/      export_hf.py: training checkpoint -> HF layout
tests/        parity against the research code; fast path against the release path
docs/         release plan, porting notes (docs/PORTING.md), fast path (docs/FAST_PATH.md)
assets/       theme art (public domain)
install what you get
pip install horopter the HTTP client (horopter.connect), standard library only: no model, no torch
pip install "horopter[client]" the client with httpx (connection pooling)
pip install "horopter[torch]" the model in your process (horopter.local, horopter.load)
pip install "horopter[server]" the model plus the HTTP server (python -m horopter.server)

The same code runs against a server or a model in your own process, and gets the same answers:

import horopter
h = horopter.connect("http://127.0.0.1:8420")     # a running server; or:
h = horopter.local("jmccardle/horopter-0.4B")      # the model in this process (first use downloads ~0.8 GB)
r = h.decide("Refunds within 30 days. The lamp was bought 12 days ago.",
             questions={"refund": {"type": "noul", "instructions": "Is a refund allowed?"}},
             fields={"days": {"type": "duration", "unit": "days", "instructions": "How long ago it was bought"}},
             evidence="chosen")
r["answers"]["refund"]["noul"], r["answers"]["days"]["value"]

Server: python -m horopter.server --model jmccardle/horopter-0.4B --port 8420 --fast (add --device cpu on a machine without a GPU). It speaks Jev's System One format (/v1/systemone: typed questions) and Cloudflare's Clairic format (/v1/clairic: typed field extraction), with both in one request at /v1/horopter. Walkthrough: docs/API.md; spec: docs/openapi.json.

--fast serves the same answers (up to bf16 rounding) 3–19× faster on a GPU, and caches states on a CPU: a state asked about again costs only its question tokens. Measurements, settings and memory are in docs/FAST_PATH.md.

Credits

Title page of Opticae thesaurus (Friedrich Risner ed., Basel 1572), Bayerische Staatsbibliothek; public domain (Wikimedia Commons, Thesaurus_opticus_Titelblatt.jpg).

Metadata

Release files for horopter 0.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for horopter 0.0.2
File Size Uploaded Provenance
horopter-0.0.2.tar.gz 77.4 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for horopter 0.0.2
File Interpreter ABI Platform
horopter-0.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 152.6 kB

Release files / horopter-0.0.2.tar.gz

Download URL horopter-0.0.2.tar.gz
Size 77.4 kB
Tags Source
SHA-256 checksum
How to use checksums
f80afc0e51f500a39139a61f585b0d3cb73ce1ea04b4095c16764e8b8e0b1430
BLAKE2b-256 checksum
How to use checksums
9db1116a7ecb325c54dddd4d32450330f72698542ca19d578beb958962210e85
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / horopter-0.0.2-py3-none-any.whl

Download URL horopter-0.0.2-py3-none-any.whl
Size 75.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f9c8893695f4ae0188bc9638f83dbeb406a62bb654dfb601aab4fb64d675168d
BLAKE2b-256 checksum
How to use checksums
4133258d231f83caf374a74b9e5390edc31953fd54af8f48c8b037b4490746d8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Security for horopter 0.0.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for horopter-0.0.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.0.2 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page