What persists between runs
| What | Where | Survives between runs |
|---|---|---|
| Artifacts | Every step output is a version. A production run that passes its checks moves the "serving" pointer to the new version; retention.keep_versions defaults to 5. | Yes. On the workflow's page under Data it produces; over REST GET /api/studio/v1/workflows/<id>/artifacts, .../artifacts/<name>/versions/<version> for the rows, .../blob for a screenshot's PNG. |
| Cache | The fingerprint of a step's inputs, config, files and pinned references. query always runs (what depends on it is cached if the answer did not change); sql, llm, function, classify are cache hits when the fingerprint matches, at no cost; snapshot and action never cache. | Yes. |
| Workflow files (blobs) | Files a function writes at the workflow's own address. Declare them in blobs; the function asks for blob.read / blob.write on those names. | Yes, until overwritten. Files are not versioned for you: put the version in the name (model-2026-09-26.skops) and keep a small pointer file (model-latest.json). |
| Send ledger | One entry per rendered idempotency_key. | Yes: a key that was sent is never sent twice. |
| Run history | Each run is a root run with a child per step, and a function step's own run under its child, with the trace. | Yes. Runs page; REST GET /api/studio/v1/invocations/<id>, .../events, .../trace. |
| Record settings | Who may call it, outcome notifications, time zone, paused triggers. | Yes, with no new revision. |
What does not survive
- A function's memory, temp files and globals: each call is a fresh sandbox.
- Try-run outputs: they never serve.
- A failed version: the last good one keeps serving (
heldwhen a check fails). - Anything a step returns but no output slot keeps.
Declaring files for a trained model
"blobs": [
{ "name": "model-*", "kind": "binary", "max_bytes": 20971520, "purpose": "one trained model per logical date" },
{ "name": "model-latest.json", "kind": "json", "max_bytes": 65536, "purpose": "which model is current" }
]
The training function declares blob.write on model-* and model-latest.json (and blob.read on the pointer, to reuse a recent model); the prediction function declares blob.read on both. Save models with skops and load them with an explicit list of trusted types, never with pickle; check the file's sha256 against the pointer before loading. Worked example: Train a model weekly, predict daily.
Sizes
workflow.jsonup to 256 KiB; a bundle file up to 1 MiB; a JSON artifact up to 1 MiB.- A workflow file (blob) up to 100 MiB; at most 32 declared.
- A call's inline output data up to 1 MiB in total (the rest is read by version id); at most 32 targets.