Skip to main content
Nori predicts continuous values from tabular data. You give it some labeled rows as examples, and it predicts on new rows. No training, no fine-tuning required. GitHub  ·  🤗 Hugging Face There are two ways to use it:

Run locally

Install the Python package and run inference on your own machine or server.

Call the API

Send a request to our hosted endpoint. No setup, no GPU required.

Local

Install the open-source package:
Model weights download automatically from Hugging Face on first use, and no API key is needed. It uses a GPU when one is available and falls back to CPU. Always name a size — "nori-100m", "nori-30m", or "nori-6m". Omitting model= raises instead of silently selecting a variant (see Models).

Your first prediction

NoriRegressor is a scikit-learn–style estimator: fit stores your labeled rows as context (there is no training step) and predict returns one value per query row in a single forward pass.
Want one code path for local and hosted execution? Use SynthefyNoriClient and choose mode="local" or mode="remote" deliberately. It never switches backends because a package or credential happens to be present. See the Python Client guide.

With a DataFrame

Prediction intervals

Nori returns a full predictive distribution, so you get uncertainty for free. Pass output_type="quantiles":

Handle missing values

You don’t need to fill in missing values beforehand. The model handles them natively.

API

The hosted API runs the same model on our infrastructure, so no installation or GPU is required. Set up your API key in the API key guide. From Python, use the synthefy client. The same call works in either place: mode="remote" sends your rows to the hosted endpoint, while mode="local" runs the model on your machine. The client never selects a mode automatically.

Make a request

Send your labeled rows (X_train, y_train) and the rows you want to predict (X_test) in a single call:
The cURL example posts to the generic, slug-routed inference endpoint and authenticates with your Synthefy Nori API key (Bearer scheme). Request body null/NaN cells are allowed in X_train and X_test and are imputed server-side.

Request size limit

A single request is capped at 64 MiB (about 67 MB). Larger requests are rejected with HTTP 413 Request Entity Too Large, before the model sees them.
The limit applies to the whole request, i.e. all of X_train, y_train, and X_test together. Since size grows with rows × features, you only approach it with very large inputs (on the order of millions of values). If you hit the limit, send fewer example rows, use fewer features, or split X_test into smaller batches. You can reuse the same X_train/y_train across those calls.

Response

The client returns one value per row in X_test as a plain list:
The underlying HTTP endpoint (used by the cURL example) returns the full envelope on a 200 (values illustrative):
Read predictions, one value per X_test row, in order. The response also includes the request dimensions used for metering and billing inside an OpenAI-compatible usage object: prompt_tokens is the number of context rows, and completion_tokens is the number of feature columns. The Python client returns only the predictions list.
The first request after a scale-to-zero idle starts a replica, loads the baked checkpoint, and warms the model; it can take ~60–90 seconds. Warm requests return in ~1–2 seconds.

Models

Select a model with the model parameter. Nori, Nori-30M and Nori-100M run locally or on the hosted API, and their names work in both the Python client (SynthefyNoriClient) and the synthefy-nori package (NoriRegressor). Nori Thinking is hosted-API only.
  • model= name — what you pass to SynthefyNoriClient(model=…) or NoriRegressor(model=…).
  • Hosted-API id — the value in the request body’s model field on the raw HTTP endpoint (what the cURL example sends). The client fills it in for you from the friendly name; local inference doesn’t use it.
  • AvailabilityLocal + API runs on your machine (weights download from Hugging Face on first use) or on the hosted endpoint. API only runs on the hosted endpoint only.
Nori-100M is the largest Nori. Its checkpoint is Synthefy/Nori-100M (42 layers, embed_dim 352, 8 heads). Run it locally with NoriRegressor(model="nori-100m"), which pulls the weights from Hugging Face on first use, or on the hosted API with model="nori-100m". It carries ~3× the parameters of Nori-30M, so expect a larger download and more GPU memory per call — see Large Tables if you run out.
Nori Thinking is hosted-API only. It spends extra test-time compute to lift accuracy, is slower and premium-priced, and has no downloadable checkpoint. Only the medium budget is available today; both "nori-30m-thinking" and "nori-30m-thinking-medium" route to it. Selecting Thinking for local inference (SynthefyNoriClient(mode="local", …) or NoriRegressor(model="nori-30m-thinking-medium")) raises an error pointing you at the hosted API. Use mode="remote".
The current, authoritative list of models your key can call (and their limits) is returned live by GET /forecasting-api/nori/available-models, and shown per model in the console.
Always name a size: "nori-6m", "nori-30m", or — for local inference — "nori-100m". Both the synthefy client and NoriRegressor require model= and raise a ValueError if you omit it — there is no default, so no request silently runs on a size you did not choose. In local mode the selector picks the checkpoint (downloaded from Hugging Face on first use). The raw Hosted-API slug (e.g. synthefy/nori-30m) is also accepted by the client and is what the cURL endpoint expects in the model field.

Next steps

Python Client

Auth, retries, DataFrames and text columns, handled for you.

Examples

End-to-end worked examples on real datasets.

Missing Values & Imputation

Pass NaNs straight through, with no pre-filling required.

Explainability

SHAP values, feature interactions, and partial dependence.

Run it in your cloud

Deploy on Amazon SageMaker, or call Nori from Snowflake SQL.

Product page

Learn more about Synthefy Nori (Tabular).