SABLE

An open-source prover from MoonMath.ai

Proof that a language model wrote exactly this reply.

Sable produces a cryptographic proof that a reply came from a specific open-weight model, token by token. Anyone can check the proof on one CPU core in under a minute, without the model's GPU and without trusting the server that ran it.

prompt › Question: A shop sells pens at 3 for $2. How much do 12 pens cost? Answer:
12✓  pens✓  is✓  4✓  groups✓  of✓  3✓ ,✓  so✓  4✓  ×✓  $2✓  =✓  $8✓ .✓ stop✓
Proof accepted Illustration · each token and the stop are checked

The problem

You cannot see what model answered you.

When you send a prompt to a hosted model, you get text back and nothing else. The provider could have run a smaller or more heavily compressed model to save money, changed a setting, or edited the reply. Benchmarks and terms of service describe a service in general. A single reply comes with no evidence of how it was made.

Sable gives each reply a proof. The proof says: this model, with these published weights, produced this reply to this prompt. If any token was different, or the reply was cut short or continued past where the model would stop, the proof does not check out.

How it works

Commit, prove, check.

  1. Commit to the model

    The weights are turned into an exact integer model and fingerprinted once. Anyone can recompute the fingerprint from the public checkpoint.

  2. Prove each reply

    The server answers as usual, then runs the prover on one GPU. The proof covers the prompt, every generated token, sampling and the stopping point.

  3. Check anywhere

    The client, or an auditor, checks the proof against the fingerprint on an ordinary CPU. No GPU and no copy of the server's setup is needed.

Why an exact integer model

Language models normally run in floating point, and the result of a long floating-point sum depends on the order in which a GPU adds the numbers. Two runs of the same model can disagree in the last bits, and sometimes in a token. A proof needs one right answer to check against. Sable replaces every step of the model, including normalization, softmax and sampling, with integer arithmetic that has exactly one result on every machine. We call this integer model FO.

The proof itself uses the sumcheck protocol and lookup arguments over a 31-bit prime field, which suits GPU arithmetic, and hashes for its commitments, so it needs no trusted setup. Its soundness error is 2−103.

Measured on one NVIDIA RTX PRO 6000 Blackwell

Minutes to prove, under a minute to check.

85 sto prove 4,096 tokens of Qwen3-30B-A3B
16,384tokens of context in one proof
19–56 sto check a proof on one CPU core
6.4¢GPU cost of a 4,096-token proof of Qwen2.5-32B
Model1 × 4,096 tokens4 × 4,096 tokens1 × 16,384 tokens
Qwen2.5-32B-Instructdense, 64 layers92.5 s253.1 s397.5 s
Qwen3-32Bdense with QK-norm, 64 layers121.8 s485.7 s668.7 s
Qwen3-30B-A3Bmixture of experts, 8 of 128 per token84.7 s181.9 s265.7 s

Proving time is the mean of three runs. Proofs are 106 to 477 MiB. A proof takes about 41 to 50 times as long as generating the same tokens with Sable's own serving engine for the integer model.

Side by side

Sable vs. Anthropic’s FlashProve.

Sable proves full generated sequences, including sampling and stopping, at longer measured contexts. FlashProve provides zero-knowledge proofs with hidden weights and smaller proof files.

Scroll the table horizontally to compare both systems.

MeasureSableFlashProve
Models evaluatedQwen2.5-32B, Qwen3-32B, and Qwen3-30B-A3B; 8-bit weightsLlama 4 Maverick: 400B MoE, ~17B active parameters per token, 4-bit weights
What is provedAll generated tokens, greedy or seeded temperature sampling, and the stopping ruleOne checked output token per request; greedy decoding
Measured context4,096 and 16,384 tokens1,024-token window
Zero-knowledgeNo; intended for open-weight models and auditorsYes; hides weights, intermediate values, and expert choices
GPUOne RTX PRO 6000 Blackwell, 96 GBOne H100, 80 GB
Proving timeQwen2.5-32B: 92.5 s for 1 × 4K; 253.1 s for 4 × 4K; 397.5 s for 1 × 16K223 s for 24 × 1K requests
Time per parameter-token~0.48–0.75 ps for Qwen2.5-32B~0.53 ps using active parameters
Proof size106–477 MiB across the three models and measured workloads18.78 MB per request, plus a one-time commitment download
Verification19–56 s on one CPU core across the measured workloads17 s on 24 threads; 21 s on one thread
Reported proving overhead41–50× versus Sable’s integer serving engine66–94× versus vLLM FP8, per GPU

These are reported results on different models, GPUs, workloads, and proof guarantees. The overhead figures use different inference baselines. Sable’s times are means of three warm runs, excluding model commitment and kernel compilation. The normalized figures are similar, but are not a controlled speed comparison.

Token counts include context processing, not just generated output. FlashProve checks one output token per request. Sable proves the prompt and 16 generated tokens in these benchmarks. Proof sizes retain the sources’ units: MiB for Sable, MB for FlashProve.

Sources: Sable release results and Anthropic’s FlashProve announcement. Comparison updated November 3, 2026. FlashProve’s ~0.53 ps is calculated as 223 seconds ÷ (24 × 1,024 tokens × 17 billion active parameters); Sable’s range uses the Qwen2.5-32B timings above and 32.5 billion parameters.

Accuracy

What exactness costs.

The integer model is close to the original but slightly different from it. We measure that difference on standard benchmarks, against the original 16-bit model.

ModelMMLU, 16-bit / integerGSM8K, 16-bit / integerSame next token
Qwen2.5-32B-Instruct83.2% / 81.8%88.6% / 88.0%86.3%
Qwen3-32B81.8% / 80.4%93.9% / 92.2%82.4%
Qwen3-30B-A3B79.6% / 78.0%92.7% / 91.4%88.7%

MMLU: all 14,042 questions. GSM8K: all 1,319 problems. Same next token: how often the integer model's most likely next token matches the 16-bit model's, over the WikiText-2 test set.

Who it is for today

Built for open models and their auditors.

Sable fits settings where the weights are public and someone wants to hold a provider to them: an auditor sampling a provider's traffic, a company checking a vendor, or a researcher who needs to know which model produced a dataset.

Current limits

  • Proofs reveal parts of the computation. They are meant for open-weight models. Hiding the weights and prompts needs zero-knowledge layers that we have not built yet.
  • Proofs are large, 100 to 500 MiB. That is fine for an auditor and too much to attach to every chat reply. Shrinking them by proving the verifier is the next step.
  • The integer model loses a little accuracy, as the table above shows.
  • One large GPU. The prover runs on a single 96 GB GPU, which bounds the context and batch size.

Get started

Start with a tiny model.

Sable is MIT-licensed. You need Linux, an NVIDIA GPU with CUDA 13 and Python 3.12. The first command proves and checks a tiny two-layer model, so no checkpoint download is needed.

git clone https://github.com/moonmath-ai/Sable
cd Sable
pip install -e .
python -m tests.test_llm

To prove a full model, quantize a checkpoint into the integer model and run the benchmark script. The README walks through it.