Authoring session templates
A session template is a JSON document that describes a directed acyclic graph (DAG) of named nodes. Each node names the node template it runs, the default configuration it runs with and the nodes it waits for.
You author a template as a file, import it into a HEAT environment and point an Ingest or an API caller at it. From then on every upload creates a Session from the template and runs the graph. The file is the whole of what you author. There is no code beside it unless a node is an Arbex script.
A session template is not a .heat manifest. A manifest registers runners and node templates as a Feature. A template uses node templates that a manifest has already registered.
The JSON shape
This is the preset system-tabular-dashboard-autodetect-next as shipped, trimmed only in the layout block.
{
"$schema": "https://heatcommon.blob.core.windows.net/schema/session-template/v1.json",
"TemplateVersion": "1.0.0",
"Name": "system-tabular-dashboard-autodetect-next",
"Description": "Upload any CSV on input-node: auto-detect time column and numeric series, build $heat-dataservice, emit suggested Next layout, and open a dashboard dimension.",
"Configuration": {},
"Nodes": [
{
"Name": "tabular-upload",
"NodeTemplateName": "input-node",
"DefaultConfiguration": {},
"Parents": []
},
{
"Name": "tabular-autodetect",
"NodeTemplateName": "system-tabular-to-dataservice",
"DefaultConfiguration": {
"autoDetectTimeColumn": true,
"emitSuggestedLayout": true,
"whenNoOutputs": "complete",
"realmPerFile": false,
"defaultRealm": "default",
"maxAutodetectSampleRows": 200
},
"Parents": ["tabular-upload"]
},
{
"Name": "tabular-dashboard",
"NodeTemplateName": "heat-system-next-dimension",
"DefaultConfiguration": {
"dataSourceName": "HEAT Managed Object Store",
"dashboardName": "CSV autodetect dashboard",
"autoCreateScenarioInstance": true,
"scenarioName": "csv-autodetect",
"layoutFromParentOutput": true,
"layoutConfiguration": {
"version": "1.0.0",
"configuration": { "enableGlobalPlaybackControls": true, "defaultRealm": "default", "showRealmFilterDropdown": false },
"realms": ["default"],
"components": { "rows": [] }
}
},
"Parents": ["tabular-autodetect"]
}
]
}| Field | Required | Meaning |
|---|---|---|
Name | Yes | The template’s identity on the environment. Lowercase letters, digits and hyphens, at most 100 characters. |
Description | Recommended | What the template expects and produces. State the ingest route, for example “CSV upload on csv-input”. |
Configuration | Yes, may be empty | Template-level settings that apply to every session, for example the retention policy. |
Nodes[].Name | Yes | The node’s name inside this graph. Same character rules as Name. |
Nodes[].NodeTemplateName | Yes | A node template registered on the environment. |
Nodes[].DefaultConfiguration | Yes, may be empty | The configuration each session’s copy of the node starts with. Keys come from the node template’s configuration schema. |
Nodes[].Parents | Yes, may be empty | Names of the nodes whose outputs this node reads. An empty list marks a root. |
$schema, TemplateVersion | Optional | Editor support and a version label for your own bookkeeping. |
Key casing follows the presets. Name, NodeTemplateName, DefaultConfiguration and Parents are written in PascalCase at the template level, while the keys inside DefaultConfiguration follow whatever the node template’s schema defines, which is usually camelCase.
Naming rules
Node names must be unique within one template. They are how parents are referenced, how the Control Centre labels the Nodes tab and how ingests pick an input node.
Input nodes follow a convention that tells a reader what the template expects. The convention is described on the input node page.
| Input node name | Use when |
|---|---|
agnostic-input | Capture protobuf, mixed binaries or unknown formats |
csv-input | CSV or TSV uploads from an integrator |
json-input | JSON documents from an integrator |
Name processing nodes after what they do, not after the node template. to-dataservice reads better than node-2, and publish reads better than dashboard-v2.
How a template becomes sessions
A template is a blueprint and does nothing by itself. Two things create sessions from it.
- An Ingest binds a project, a template and one input node to an upload URL. Every post creates a session, or appends to one when the ingest is configured to look sessions up.
- An API caller creates a session through the HEAT v2 API, naming the project and the template, then uploads to a node instance of that session.
When a session is created, every node in the template becomes a node instance carrying a copy of its DefaultConfiguration. When a node instance receives or produces a node output, its children become eligible to run. A Runner claims each unit of work, reads the parent outputs and stores a new output. Outputs are never overwritten, so reprocessing a node appends rather than replaces.
Templates are registered per environment, not per project. Any project can create sessions from any template. The binding to a project happens at the ingest or at session creation.
Import and export
Templates enter an environment as JSON files. HEAT applies the same rules to every import, whichever tool performs it. The full table of outcomes and validation errors is on the Control Centre Templates page. The rules that shape authoring are these.
- A new
Namecreates a new template. - An existing
Nameis rejected unless the file carries"updateIfExists": true, and then only when the graph is unchanged. Only the description,Configurationand each node’sDefaultConfigurationmay change in place. - A graph change (a node added, removed or rewired, or a node template swapped) needs a new
Name. The convention is a revision suffix, for examplemy-flow-r2. - Every
NodeTemplateNamemust be registered and its feature enabled, or the import fails with “unknown node templates”.
Sessions that already ran keep pointing at the template they were created from. That is why a graph change must never overwrite a template in place.
Importing, editing and exporting templates from the Control Centre are not available today. The Templates page lists templates and its create form is disabled. Files are imported by a HEAT engineer or an integrator with import access. Keep your templates in version control alongside the rest of your project so the file, not the environment, is the source of truth.
Shipped presets
The platform ships these templates. Some are meant to be used as they are, some are samples to copy from, and some are system pipelines that back platform dashboards and are not meant for user sessions.
| Name | Purpose | Node chain |
|---|---|---|
system-tabular-dashboard-autodetect-next | Upload any CSV, auto-detect the time column and numeric series, and open a Next dashboard with a suggested layout. | input-node → system-tabular-to-dataservice → heat-system-next-dimension |
heat-capture-discovery | Upload or stream anything into the agnostic input and get a live “what is in this data” dashboard. Stable on any input and processes new data incrementally. | input-node → capture-discovery → heat-system-next-dimension |
heat-capture-mainline-scoped | Capture template with a discovery leaf, an identity registry from EntityState, two entity-index lanes, an unscoped event mainline, Arbex and a dimension. Needs no core-utils. | input-node → capture-discovery → dimension, plus four system-protobuf-extract branches, one feeding system-arbex-js → heat-system-next-dimension |
sample-arbex-composable-dashboard | Sample. Arbitrary upload, system-arbex-js builds the data service payload and a suggested layout, the dimension node takes the layout from its parent. | input-node → system-arbex-js → heat-system-next-dimension |
sample-arbex-legacy-dashboard | Sample. system-arbex-js returns v1 facade JSON and a Legacy dimension is published. Legacy is kept for existing templates. | input-node → system-arbex-js → heat-system-legacy-dimension |
bulk-analytics-ingest-reference | Reference. Discover csv-input outputs across sessions, ingest them into the HEAT Bulk Analytics database and emit a writer catalog. Needs bulk analytics enabled. | node-output-query → system-bulk-tabular-writer → system-bulk-analytics-query |
bulk-analytics-arbex-sample | Sample. The reference chain above followed by an Arbex dashboard built from the SQL results. | node-output-query → system-bulk-tabular-writer → system-bulk-analytics-query → system-arbex-js |
heat-system-resource-monitor-next | System pipeline behind the Resource Monitor system dashboard: cluster snapshot, usage history, per-pod bars, data service envelope, dimension. | cluster-report → cluster-usage-history → heat-workspace-group-count → heat-system-dataservice-envelope → heat-system-next-dimension |
heat-system-session-export | System pipeline that streams a full session export into a downloadable ZIP. | session-export |
heat-system-session-export-retention | System pipeline that expires session-export artefacts past their retention and deletes their blobs. | session-export-retention |
heat-system-node-output-index | System pipeline that lazily indexes node output content in a timeboxed sweep. | node-output-index-sweep |
System pipelines run as system dashboards (called statics in templates and presets) on a schedule. See system dashboards.
Guides
| Guide | Covers |
|---|---|
| Authoring principles | Small nodes, sibling branches, slim intermediates, system-utils first |
| Tabular and JSON pipelines | CSV, TSV and JSON uploads without HEAT Capture |
| Capture pipelines | Protobuf streams from HEAT Capture, discovery and extraction |
| Capture identity lanes | Entity identity and per-lane extraction in capture templates |
| DIS pipelines | DIS traffic from the network to a dashboard: recording, PDU decoding, entity tracks and radio audio |
| Session retention | retentionPolicy in template Configuration |
| Cross-session analysis | Templates that query many sessions, store a report artefact and run on a schedule |
Related
- Build your first data flow
- Node template catalog
- Session template concept
- Templates in the Control Centre