embedding
Readers and ports

Docs/Readers and ports

Readers and ports

One engine, any frozen reader. What a port is, how to pick a reader, and why the engine bytes are identical behind all of them.


vega-U separates the model that reads from the model that decides. The reader is a frozen, ordinary instruction-tuned language model. The decider is a 14.3M-parameter engine that lives in a shared 1024-dimensional space and never sees a token.

Between them sits the port: one small linear map per tapped layer, carrying that reader's pooled features into the shared space. The engine bytes are identical behind every reader, and the publish step asserts the checksum. Only the port and the per-reader calibration differ.

Changing the base model is naming it#

python
import vegaml

v = vegaml.load()                                 # the root reader, Qwen3.5-0.8B
v = vegaml.load("4b")                             # the Qwen3.5-4B reader
v = vegaml.load("gemma-1b")                       # the Gemma 3 1B reader
v = vegaml.load(backbone="Qwen/Qwen3.5-4B")       # named by its own repo id
v = vegaml.load(backbone="google/gemma-3-1b-it")  # gated: set HF_TOKEN
v = vegaml.load("/path/on/disk")                  # a checkpoint directory

On a universal checkpoint, backbone= names which reader. The last component of the id selects the directory inside the repository that carries that reader's port and calibration; the reader's own weights still come from their original repository. Asking for a reader the checkpoint ships no port for fails with the list of readers it does ship, which is the fastest way to see the lineup.

Tokens belong to the reader, not to vega-U. Qwen readers load with no token; Gemma 3 is gated, so HF_TOKEN must be set and the licence accepted on the Hub.

Which reader to pick#

These are the October 2026 numbers on our own held-out board. The two readers marked attached cold were never part of the engine's training and scored highest anyway, which is the design's claim made measurable.

readerhowheld-out acczero-shot accECEacc @ 50% cov
Qwen3.8-27Battached cold0.8110.6290.0210.976
Qwen3.5-4Battached cold0.7910.5680.0170.965
Qwen3.5-0.8Btrained jointly0.7650.5340.0100.956
gemma-3-1b-ittrained jointly0.7380.5040.0070.927

The gains land where reading matters and nowhere else. From the 0.8B to the 27B: long context to 70k tokens 0.831 to 0.941, ARC 0.647 to 0.922, CommonsenseQA 0.490 to 0.792. Saturated perception tasks stay flat across all four readers (Bitext intents 0.99, Enron-Spam 0.99, phishing 0.99, AG News 0.92 to 0.93), and the ordinal score rail sits near 0.61 for every one of them.

So the rule is simple. Take a bigger reader when the task is reading: long documents, multi-hop questions, anything where a human would have to hold several facts at once. On classification of short text, a bigger reader buys you nothing and costs you an order of magnitude in memory. The Benchmarks page has the full per-source board and the caveats that belong next to it.

What a universal checkpoint contains#

A vega-U directory is an ordinary vega model directory plus two files, named by two keys in vega_config.json:

fileconfig keyholds
port.safetensorsportthis reader's linear maps into the shared space
stats.npzraw_statsthe reader's raw feature statistics from extraction

At load time the runtime sees the port key, standardizes raw perception features with stats.npz, maps them through the port, and runs the shared engine there. decide() and everything downstream are identical to a classic checkpoint, which is why nothing else in these docs has to mention ports again.

In the Hub repository the root is one reader, so the plain repository id loads with no subfolder, and every other reader is a self-contained subfolder. Calibration never transfers between readers, so each directory ships its own.

Note

Your own reader is a package call, not a training run.

Adding a reader the checkpoint ships no port for takes vegaml.attach, a file of your own text, and no labels. The engine is never retrained and the reader is never fine-tuned. See Attach your own reader.

The earlier checkpoints#

Before the universal line, each size was its own checkpoint married to its backbone. They remain fully supported, take the same code path, and load by their repository id:

python
v = vegaml.load("nandakishorm/vega-08b-public-intents")
0.8B4B
backbone, frozenQwen3.5-0.8BQwen3.5-4B
engine, trained14.3M params, 57 MB30.9M params, 124 MB
task adapter0.84M params1.43M params
per decision22 ms28 ms