Skip to main content

What persists between runs

WhatWhereSurvives between runs
ArtifactsEvery 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.
CacheThe 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 ledgerOne entry per rendered idempotency_key.Yes: a key that was sent is never sent twice.
Run historyEach 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 settingsWho 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 (held when 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.json up 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.