DOCUMENTATION
NoulXP: the open standard for decision models
NoulXP is the open standard for System One models: package a decision model once, prove it answers as its own code does, calibrate it, and run it anywhere over HTTP or MCP.
View as Markdown · for AI agents: llms.txt · skill.md
Every System One model answers the same request: a state, and typed questions with calibrated probabilities, in one pass. What differs is inside: each model ships its own inference code, so running twenty models means installing twenty runtimes, and comparing them means writing twenty harnesses.
NoulXP makes a model a package that any NoulXP engine runs without code
written for it, and gives every application and AI agent one way to ask it. It is to decision models what MCP
is to agent tools. The specification, its schemas, the converters, the
conformance tools and the reference runtime are open source (Apache-2.0):
github.com/systemonemodels/noulxp,
and pip install noulxp.
Packaging your own model? Read Make your model NoulXP compatible, a ten-minute guide from your checkpoint to the badge.
NoulXP was called OpenDXP until version 0.3.1. pip install opendxp now installs
noulxp, and packages made then (an odxp.json manifest) run as they are.
Four parts
- Requests and answers: one format for a state and typed questions (choice, score, noul), and for the calibrated answers.
- Packages: the model as data that any engine runs.
- Conformance: proof that an engine answers as the model's own code does.
- Bindings: how requests travel. Over HTTP (
POST /v1/systemone,GET /v1/models) between an application and any server, and over the Model Context Protocol between an AI agent and a tool.
Two profiles
encoder-markers. A bidirectional encoder scores one marker token per
option: Laya, Julia 1, Von, open-jev, GLiNER2.5-Decide. The package ships an
ONNX graph with fixed inputs and one output (option_logits), plus
template.json: how the question, the options and the state are laid out and
truncated.
causal-letters. A language model reads each option letter's probability
at an answer slot: Decider, AnyJev, Kev, Nimble, JevK5, lev. The package ships a
GGUF build and prompt.json: the prompt pieces, the option labels and the
slot. Since 0.2 a prompt can lay out each question type on its own, inside the
model's chat template, and ask a question once per rotation of its options,
combining them so no option wins by its position. That is how
AnyJev (Nokia) turns an
instruction-tuned model into a decision model without training it.
Both add calibration.json (a temperature per question type, optionally per
number of options) and conformance.jsonl: requests with the probabilities
the model's own code gives for them.
The package
A NoulXP package is a folder with an noulxp.json manifest that names every
file it uses, with its SHA-256. Nothing in it is executed: templates are filled
by placeholder substitution, and the weights run through ONNX Runtime or
llama.cpp. In a model version it sits in an noulxp/ folder, where the engine
finds it by its manifest:
noulxp/noulxp.json the manifest: standard, profile, files, limits
noulxp/model.onnx encoder-markers (its weights can stay in model.safetensors)
noulxp/model.gguf causal-letters
noulxp/tokenizer.json
noulxp/template.json encoder-markers; causal-letters has prompt.json
noulxp/calibration.json
noulxp/conformance.jsonl
Run it anywhere
pip install "noulxp[onnx]" # encoder-markers; "noulxp[gguf]" for causal-letters
noulxp run noulxp/ --request request.json
noulxp serve noulxp/ # POST /v1/systemone on 127.0.0.1:8790
noulxp mcp noulxp/ # a tool for AI agents (Claude, Cursor, ...)
GGUF runs through llama.cpp on CPUs and on NVIDIA, AMD, Apple, Intel and Vulkan GPUs; ONNX runs through ONNX Runtime, whose execution providers also reach NPUs (OpenVINO, Core ML, QNN). The engine picks the device, not the model's author.
Check it and measure it
noulxp check noulxp/ # its conformance file, on this machine
noulxp bench noulxp/ --device cuda --rounds 3 # decisions per second, latency, cost
check replays the package's conformance file on the machine you run it on
and reports whether every decision is the same and every probability within
0.01. GPUs trade precision for speed by default; --precision exact asks
for float32 products, and a check at the precision you serve with says
whether the package is compatible there. bench also measures any server
that speaks the HTTP binding, at several levels of concurrency.
Calibrate it to your data
A package's temperatures are data, so how sure a model says it is can be fitted to the requests you serve, without touching its weights:
noulxp calibrate noulxp/ labelled.jsonl --test held-out.jsonl --out my-calibration.json
noulxp serve noulxp/ --calibration my-calibration.json
Each line of labelled.jsonl is a request with a label per question: an
option, a distribution over the options, or another model's answer. The
command fits one temperature per question type, prints confidence, accuracy,
KL, Brier and ECE before and after, and writes a calibration.json that
records the labels' SHA-256. The package itself is unchanged, so it is still
checked against its model's own answers, and a server answering with a fitted
file names it in /v1/models. On the typed-decisions benchmark, Julia 1
answered with a mean confidence of 96% and was right 72% of the time; fitted
to 50 held-out labelled requests, its confidence came to 72%, with the same
decisions (the measurements).
Compatible
A model is NoulXP compatible when the reference runtime reproduces its conformance file on a CPU: the same decision on every question, and probabilities within 0.01 of the model's own code. NoulXP portable adds a named accelerator backend. The System One Engine checks a package when it serves it, and on its own when a package of up to 2.5 GB is published; the model's page shows the badge, and so does its owner's profile. The badge is earned only this way: by publishing a model whose package passes.
Status
NoulXP 0.3 adds noulxp calibrate and --calibration, noulxp bench,
exact precision on GPUs, and faster batched serving. 0.2 added the HTTP and
MCP bindings and the typed layouts, chat templates and rotations above. Its reference implementation converts Laya,
Julia 1, Decider and AnyJev and checks them against each model's own code:
three Laya checkpoints, Julia 1 (from our export and from its authors' own ONNX
graph) and Decider pass with every decision the same, and AnyJev on Qwen3-1.7B
passes 52 of 52 cases with all 90 decisions the same as Nokia's own code.
Julia 1 also passes on Apple's Core ML. The numbers and how they were measured:
VALIDATION.md.
Questions
What is NoulXP?
NoulXP is an open standard for System One models, the AI decision models that answer typed questions with calibrated probabilities. A model becomes a package (portable weights, its input and calibration as data, and a conformance file of its own answers) that any NoulXP engine runs without code written for it.
Is NoulXP open source?
Yes. The specification, the JSON Schemas, the converters and the reference runtime are Apache-2.0, at github.com/systemonemodels/noulxp. Install it with pip install noulxp.
How is NoulXP different from ONNX or GGUF?
ONNX and GGUF carry weights. They do not say how a request becomes model input, where the answer is read, or how it is calibrated, which is what decides a decision model’s answer. A NoulXP package carries weights in ONNX or GGUF plus all of that as data, and proves with a conformance file that an engine answers as the model’s own code does.
What does NoulXP compatible mean?
The reference runtime replays the model’s own answers from the package’s conformance file on a CPU: every decision the same and every probability within 0.01. Packages that pass show the NoulXP compatible badge on System One Models.
Was NoulXP called OpenDXP?
Yes, until version 0.3.1. pip install opendxp now installs noulxp, and packages made then, with an odxp.json manifest, run as they are.