Skip to content

AI-1 — the gating model

AI-1 is Cytogence’s own gating model. It is not a large language model and it is not the copilot.

It runs entirely on your machine. No account, no API key, no network. Roughly a minute and a half for a million events on a typical laptop.

Using it requires a license.

Eight populations, on human samples, as of v0.1.2:

Population Precision Recall F1
B cells 0.939 0.953 0.946
Lymphocytes 0.906 0.931 0.918
NK cells 0.899 0.937 0.918
NK-T cells 0.890 0.897 0.894
Live lymphocytes 0.820 0.885 0.845
CD8⁺ T cells 0.809 0.865 0.836
CD4⁺ T cells 0.732 0.871 0.793
Monocytes 0.737 0.739 0.738

CD4⁺ and CD8⁺ T cells are identified through a CD3 stage, so a T-cell call depends on CD3 being readable in your panel.

How these were measured, because the protocol is the claim: mean over four random splits, each with its own by-sample train/validation/test partition; thresholds chosen on validation and every number reported on held-out test samples the model never saw; each population scored in the configuration the product actually ships, over all events rather than within an expert’s parent gate.

That last clause is the one that matters. It is easy to publish a better-looking number by measuring a population inside the parent gate an expert already drew — and it describes a product nobody ships. These are end-to-end numbers.

That is the whole list. It is deliberately short, and published rather than implied, because a model whose scope you cannot state is a model you cannot check.

What it refuses to identify, and why that is the point

Section titled “What it refuses to identify, and why that is the point”

AI-1 is built to abstain and say why rather than guess.

Dendritic cells are trained but switched off. They sit just under the bar we require, and the reason is a marker gap rather than a tuning problem: the model’s marker vocabulary does not include CD1c, CD141 or CD303 — the markers that actually define dendritic cell subsets. Asking it to find dendritic cells without dendritic cell markers is not a threshold you can tune your way out of, so the population is withheld until the vocabulary covers them.

Every population must clear a fixed precision and recall bar before it is offered. Populations that clear it are gated; populations that do not are named as gaps. We would rather ship a short list you can trust than a long one you have to check.

Anything outside the list is out of repertoire, and the model says so instead of producing a confident answer.

This is the result that shaped the whole design.

On mouse data, the model’s ranking held up well — it still separated CD3⁺ from CD3⁻ cells about as cleanly as it does in human samples. But its calibration collapsed completely: at the thresholds learned from human data, the resulting gates were worthless.

A model that reported only “confidence” would have looked fine and been useless. That is why competence here is not a single number.

We ran the shipped model, with zero tuning, against a human study it had never seen — a 2013-era Treg study on different instruments with different staining.

Every sample landed far outside the distribution the model was trained on, and the product abstained and withheld the figures on all of them. It was right to: at the shipped thresholds, the numbers it would have produced were poor, and miscalibrated in both directions — the mouse pattern, on human data.

The panel was richly readable — a dozen or more markers the model knows — so this was distribution shift, not a marker gap. Which is the point: the check that caught it was not “do I recognise these markers?” but “does this data look like anything I learned from?”

The competence report answers “should I trust this, on this file?” in three independent parts:

Repertoire coverage. Does your panel contain the markers a population needs? A CD4 call is not possible without CD4 in the panel, and the report says so rather than inferring.

Distribution novelty. Does this data look like anything the model was trained on? The model compares your cells against the distribution it learned. Data far outside it is flagged as unfamiliar — a different instrument, an unusual staining protocol, or a sample type it has not seen.

Calibration provenance. Where did the thresholds come from, and do they apply to your sample? This is the part the mouse result proved you cannot skip.

Name your channels. AI-1 identifies channels by the marker they measure, not by fluorochrome, detector or channel order — that is what lets it read panels it was never trained on. But it can only do that if the marker is actually recorded. A channel called FL4-A with no marker name is invisible to it.

Fix names in the parameter editor before running it. See The interface.

Compensate first. The model sees what you see. Uncompensated data is a different distribution.

Read the report before the gates. If a population was declined, the gates it did produce are still worth having — but you now know which parts of the tree are yours to draw.

A marker-semantic set encoder: each cell is treated as an unordered set of (marker identity, intensity) pairs, read by a small permutation-invariant transformer, with a thin head per population. Because a marker’s representation is keyed on biological identity rather than channel position, the encoder can read panels it never trained on.

It is about 107,000 parameters, implemented directly in Rust — no ML runtime, no GPU requirement, nothing to install.

Trained on publicly available human immunology studies with published expert gating. Patent pending.

AI-1 can learn from gates you correct — opt-in, never opt-out. If you have not opted in, nothing about your gating leaves your machine. See Licensing.

AI-1 is the right tool for the populations on its list. For anything else — an unusual panel, a population it does not cover, or a strategy you want reasoned about in words — use the copilot, which plans in plain language and hands you each step to approve.