Skip to Content
This documentation is provided with the HEAT environment and describes this HEAT instance.
DevelopersSession templatesAuthoring session templates

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"] } ] }
FieldRequiredMeaning
NameYesThe template’s identity on the environment. Lowercase letters, digits and hyphens, at most 100 characters.
DescriptionRecommendedWhat the template expects and produces. State the ingest route, for example “CSV upload on csv-input”.
ConfigurationYes, may be emptyTemplate-level settings that apply to every session, for example the retention policy.
Nodes[].NameYesThe node’s name inside this graph. Same character rules as Name.
Nodes[].NodeTemplateNameYesA node template registered on the environment.
Nodes[].DefaultConfigurationYes, may be emptyThe configuration each session’s copy of the node starts with. Keys come from the node template’s configuration schema.
Nodes[].ParentsYes, may be emptyNames of the nodes whose outputs this node reads. An empty list marks a root.
$schema, TemplateVersionOptionalEditor 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 nameUse when
agnostic-inputCapture protobuf, mixed binaries or unknown formats
csv-inputCSV or TSV uploads from an integrator
json-inputJSON 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 Name creates a new template.
  • An existing Name is rejected unless the file carries "updateIfExists": true, and then only when the graph is unchanged. Only the description, Configuration and each node’s DefaultConfiguration may 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 example my-flow-r2.
  • Every NodeTemplateName must 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.

NamePurposeNode chain
system-tabular-dashboard-autodetect-nextUpload 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-discoveryUpload 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-scopedCapture 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-dashboardSample. 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-dashboardSample. 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-referenceReference. 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-sampleSample. 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-nextSystem 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-exportSystem pipeline that streams a full session export into a downloadable ZIP.session-export
heat-system-session-export-retentionSystem pipeline that expires session-export artefacts past their retention and deletes their blobs.session-export-retention
heat-system-node-output-indexSystem 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

GuideCovers
Authoring principlesSmall nodes, sibling branches, slim intermediates, system-utils first
Tabular and JSON pipelinesCSV, TSV and JSON uploads without HEAT Capture
Capture pipelinesProtobuf streams from HEAT Capture, discovery and extraction
Capture identity lanesEntity identity and per-lane extraction in capture templates
DIS pipelinesDIS traffic from the network to a dashboard: recording, PDU decoding, entity tracks and radio audio
Session retentionretentionPolicy in template Configuration
Cross-session analysisTemplates that query many sessions, store a report artefact and run on a schedule
Opens your browser's print dialog. Choose "Save as PDF" as the destination.