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-30m" (~29.2M) or "nori-6m" (~6M base). Omitting model= loads the ~6M base without warning, so pass it explicitly (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 that runs locally or against the hosted API? Use the synthefy client’s SynthefyNoriClient(mode="auto") (see the API section). It runs locally when synthefy-nori is installed and falls back to the hosted endpoint otherwise.

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 either way: mode="remote" sends your rows to the hosted endpoint, mode="local" runs the model on your own machine.

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 a Baseten 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 a usage block (token counts) for API compatibility; it isn’t meaningful for a tabular model, so you can ignore it. (The Python client returns just the predictions list.)
The first request after a scale-to-zero idle triggers a checkpoint download and warmup and can take ~60–90 seconds. Warm requests return in ~1–2 seconds.

Models

Select a model with the model parameter. The friendly names below work in both the Python client (SynthefyNoriClient) and the synthefy-nori package (NoriRegressor). Nori and Nori-30M run locally or on the hosted API; 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 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"/"auto", …) 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-30m" (~29.2M) or "nori-6m" (~6M base). The synthefy client requires it and raises if you omit it; NoriRegressor falls back to the ~6M base silently, so pass it there too. 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).