Elements reference

Runtime, publish, execute en logs

Deze pagina behandelt alles na het editorwerk: publiceren, versioning, runtime vars/secrets, test execute, execution logs en integratie met datasources.

1. Publish en versions

OnderdeelBeschrijving
PublishValideert draft, bouwt dependencies en maakt een nieuwe version.
latestVersionElementmetadata verwijst na publish naar nieuwste version.
Version statusBevat build/publish uitkomst per versie.
Build metricsWheels count en build duration worden opgeslagen.
Als Git sync Apply een wijziging uit de repo terugschrijft naar een bestaand gepubliceerd Element, wordt alleen de draft bijgewerkt. De huidige gepubliceerde version blijft actief totdat je handmatig opnieuw publiceert. In het Elements-overzicht zie je dat als Updated draft.

Versions tabel

  • Version, Status, Published.
  • Wheels (aantal dependency artifacts).
  • Build (ms).

2. Runtime vars en runtime secrets

Element runtime dialoog screenshot placeholder
Element runtime dialoog
  • Deze dialoog bundelt tijdelijke params, runtime vars, secrets en execute-acties.
  • Gebruik hem om een Element gecontroleerd te testen zonder dashboards of datasources te wijzigen.
  • Documenteer welke variabelen echt runtime-afhankelijk zijn zodat anderen dezelfde testcontext kunnen herhalen.
Runtime testen is de snelste manier om codefouten te scheiden van page- of datasourcefouten.
Tenant runtime store screenshot placeholder
Tenant runtime store
  • De runtime store bevat tenantbrede variabelen en secrets die Elements kunnen hergebruiken.
  • Gebruik deze opslag voor gedeelde configuratie, niet voor gebruikersspecifieke data.
  • Wijzigingen hier kunnen meerdere Elements tegelijk raken.
Beheer runtime store centraal en wijzig waarden bewust, omdat afhankelijkheden verspreid kunnen zijn.
TypeInputGedrag
Runtime varID + JSON valueJSON moet valide zijn; leesbaar met getVar().
Runtime secretID + nieuwe waarde bij opslaanWrite-only opslag; leesbaar met getSecret().
Runtime writebacksetVar() in codeNieuwe waarde wordt direct naar de runtime store geschreven.

3. Test execute

VeldBeschrijving
versionLeeg betekent latest published version.
timeoutSecondsBereik 1-3600, default 3600.
paramsJSON object met inputparameters. Element widget-runs en widget-test-runs voegen params.__dashview.theme.mode toe met light of dark. Interactieve Element widgets sturen acties terug via params.__dashview.interaction en vorige state via params.__dashview.state.
{
  "version": "",
  "timeoutSeconds": 3600,
  "params": {
    "from": "2026-01-01",
    "to": "2026-01-31",
    "country": "NL",
    "__dashview": {
      "theme": {
        "mode": "light",
        "isDark": false,
        "isLight": true
      },
      "widget": {
        "id": "widget_dynamic_html",
        "type": "element"
      }
    }
  }
}

4. HTTP Elements

Endpoints en authenticatie

  • trigger-Elements zijn one-shot handlers via POST /element/{elementId}.
  • Elke request start een normale Element-run en eindigt zodra de entrypoint klaar is.
  • server-Elements publiceren een ASGI/FastAPI-app via dezelfde gateway: /element/{elementId} en /element/{elementId}/{path...}.
  • Server Element-paden kunnen HTTP requests, SSE streaming responses en WebSocket-verbindingen afhandelen. De runtime houdt de child server warm zolang er verkeer is en stopt hem na ongeveer 15 minuten idle; de volgende request start hem opnieuw.
  • Gebruik een Access key als bearer token. De call draait als die gebruiker binnen de actieve tenantcontext en behoudt datasource- en forced-filterrechten.
InputWaar beschikbaarBeschrijving
params.requestrun(params)Request envelope met method, path, query, headers, body/json/form en bodygrootte.
params.__dashview.requestrun(params)Zelfde envelope onder de Dashview namespace.
context.requestrun(context, params)Zelfde envelope voor code die runtime metadata via context leest.
def run(context, params):
    request = context["request"]
    return {
        "statusCode": 200,
        "headers": {"x-element": "trigger"},
        "json": {"ok": True, "payload": params.get("json")},
    }
from fastapi import FastAPI

app = FastAPI()

@app.post("/logs")
async def ingest_logs(payload: dict):
    dataSources.appendRows("chargepoint_logs", [payload])
    return {"ok": True}
Authorization en cookie-achtige headers worden niet aan Element-code doorgegeven. Server Elements draaien in dezelfde Element runtime als normale Elements, dus ingebouwde helpers zoals queryDataSources en dataSources.appendRows zijn beschikbaar vanuit de ASGI-app.

5. Live datasource streaming

Wanneer gebruik je dit?

  • Gebruik dit als een Element tijdens de run al widget-data moet tonen of vervangen.
  • Dit werkt via een datasource met connector type element en Default data format = Live stream, of direct via een gepubliceerd Element van type stream_data.
  • De equivalente raw datasource config is dataFormat: "livestream". Legacy configs met streamMode: "commands" blijven ondersteund.
HelperDoelGedrag in widgets
emitProgress(...)Status/progress doorgevenGeeft progress events door; voegt geen datasource rows toe.
appendRows([...])Nieuwe rows toevoegenWidgets zien extra rows terwijl het Element nog draait.
replaceRows([...])Volledige dataset vervangenWidgets schakelen over naar de nieuwe set rows.
clearRows()Huidige rows leegmakenMaakt de live datasource tabel leeg voordat nieuwe rows volgen.

Belangrijke notities

  • Deze helpers zijn bedoeld voor datasource requests via /data/{id}/livestream, niet voor gewone snapshot/parquet loads.
  • Actieve dashboardfilters worden voor live-stream datasources standaard als params doorgestuurd naar het Element.
  • Zet datasource requestParamsMode op none als je die filterparams juist niet wilt doorgeven.
  • De normale return value van je Element blijft bestaan, maar live widget-updates horen uit deze stream helpers te komen.
  • Gepubliceerde data- en stream_data-Elements zijn direct selecteerbaar als datasource in dashboards; een aparte datasource-doc is daarvoor niet verplicht.
def run(context, params):
    import time

    emitProgress(phase="starting", message="Start live run", progressPercent=0)
    clearRows()

    for step in range(1, 5):
        time.sleep(3)
        appendRows([{
            "step": step,
            "message": f"Tick {step}",
            "value": step * 10,
        }])
        emitProgress(
            phase="running",
            message=f"Step {step} van 4",
            progressPercent=step * 25,
        )

    return {"done": True}

Waar vind ik voorbeelden?

  • element-examples/command_stream_demo.py toont incrementele row updates.
  • element-examples/cloudrunlogs.py toont een langere append-only live tail.

6. Execution logs

KolomBeschrijving
TimeStarttijd van de run.
StatusToegestane waarden: success, error, failed.
SourceHerkomst (admin_test, datasource, flow, etc.).
VersionUitgevoerde version.
DurationRuntime duur in ms.
ErrorKorte foutsamenvatting.
View detailsVolledige payload incl. meta/stdout/stderr/result en vastgelegde logger-berichten.

Server Element requests

  • HTTP/SSE requests via de publieke Element gateway maken execution logs met source=server_http nadat de response body klaar is.
  • WebSocket-sessies maken een execution log met source=server_websocket wanneer de sessie sluit of faalt.
  • Request logs bevatten method, path, query string, request id, status, duur en websocket message counts. Bodies en headers worden niet opgeslagen.

Logger-output tijdens runs

  • Gebruik in Element-code de ingebouwde logger, bijvoorbeeld logger.info("Start refresh") of logger.error("API call mislukt").
  • Deze berichten verschijnen in de uitvoerlogdetails per run, inclusief severity, loggernaam en stacktrace bij logger.exception(...).
  • Gebruik dit voor controlepunten, externe API-fouten en business-validatie, zodat debugging niet alleen via stdout of traceback hoeft.

Integratie met datasources

  • Element connector roept dezelfde runtime aan met elementId, elementVersion, elementEntrypoint.
  • Request params kunnen direct worden doorgestuurd of hernoemd via requestParamMap.
  • Timeouts zijn configureerbaar per datasource via elementTimeoutSeconds.

7. Technical reference

JSON payload voorbeelden

Test execution payload voor een gepubliceerd Element:

{
  "version": "v_20260605090000_abcd12",
  "timeoutSeconds": 3600,
  "params": {
    "country": "NL",
    "limit": 20
  }
}

Element-backed cached datasource payload:

{
  "id": "orders-from-element",
  "name": "Orders from Element",
  "type": "element",
  "dataFormat": "parquet-remote",
  "elementId": "el_orders",
  "elementVersion": "v_20260605090000_abcd12",
  "elementEntrypoint": "run",
  "includeRequestQueryParams": true
}

Live stream datasource payload:

{
  "id": "orders-live",
  "name": "Orders live",
  "type": "element",
  "elementId": "el_orders_live",
  "elementVersion": "v_20260605090000_abcd12",
  "elementEntrypoint": "run",
  "dataFormat": "livestream",
  "requestParamsMode": "filters"
}

Duurzame datasource writes

Gebruik appendDataSourceRows of dataSources.appendRows wanneer een Element rows blijvend moet opslaan in een uplink/parquet-backed datasource voor latere dashboards, queries of andere Elements.

def run():
    rows = [{
        "createdAt": "2026-06-05T12:00:00Z",
        "status": "ok",
        "value": 123,
    }]
    result = dataSources.appendRows("element_event_store", rows, merge=True)
    return {"inserted": result["inserted"]}
  • Dit is iets anders dan live appendRows(); duurzame writes maken parquet parts via uplink.
  • De helper is alleen beschikbaar wanneer de execution context datasource write capability geeft.
  • Rows zijn append-only JSON-objecten en worden als batch verstuurd.
  • Optionele meta kan uplink auto-create velden bevatten zoals dataSourceName, dataFormat, parquetPartitionColumn en parquetPartitionGranularity.

Runtime builtin function contracts

HelperSignatureReturn shapeCaveat
queryDataSourcesqueryDataSources(sql, sources=None, includeAllDatasources=None, allowAgentsOnly=False, strictSources=None, maxRows=None, timeoutSeconds=None, backendBaseUrl=None)Dict-like result met rows, columns, rowCount, .to_pandas(), .to_dataframe().Gebruik datasource-id's als tabelnamen; geef expliciete sources mee wanneer nodig.
appendDataSourceRowsappendDataSourceRows(dataSourceId, rows=None, merge=None, forcedFilterHash=None, meta=None, timeoutSeconds=None, idempotencyKey=None)Dict-like write result met inserted, parts, uris, createdDataSource en optionele merge.Duurzame uplink/parquet append only; vereist geïnjecteerde datasource write capability.
askDashbotaskDashbot(prompt, responseFormat=None, allowTools=None, maxToolCalls=None, toolScope=None, contextId=None, timeoutSeconds=None, ...)Dict-like Dashbot result met message, text, parsed, usage en warnings.Alleen beschikbaar bij user-authenticated executions. Tools staan standaard uit; zet allowTools=True alleen bewust aan.
getVargetVar(name, default=None)Actuele opgeslagen JSON value of default.Leest de runtime store op het moment van aanroepen; alleen voor niet-secret configuratie.
setVarsetVar(name, value=None)De JSON-serializable value die is opgeslagen.Schrijft direct; alleen gebruiken bij bewuste persistente writeback.
getSecretgetSecret(name, default=None)Secret value of default tijdens runtime.Secret values nooit returnen, loggen of committen.
emitProgressemitProgress(payload=None, **kwargs){"event":"progress","phase":"running",...}Status only; voegt geen datasource rows toe.
appendRowsappendRows(rows=None, **kwargs){"event":"command","op":"append","rows":[...]}Alleen live stream / dataFormat="livestream".
replaceRowsreplaceRows(rows=None, **kwargs){"event":"command","op":"replace","rows":[...]}Rows moeten JSON-serializable zijn.
clearRowsclearRows(payload=None, **kwargs){"event":"command","op":"clear"}Leegt de huidige live datasource rows.
createNotificationcreateNotification(payload=None, **kwargs)Notification side-effect payload in runtime output.Recipient fields kunnen userUid, userIds of recipientUids zijn.
createTaskcreateTask(payload=None, **kwargs)Task side-effect payload in runtime output.Gebruik een title; assignees gaan via user/assignee uid fields.

Import shims werken ook: from queryDataSources import queryDataSources, from query_datasources import query_datasources, import dataSources, from appendDataSourceRows import appendDataSourceRows, from askDashbot import askDashbot en import dashbot.

def run(context, params):
    answer = askDashbot(
        "Vat deze status samen in een zin.",
        allowTools=False,
        timeoutSeconds=3600
    )
    return {"summary": answer.text}

Lifecycle workflows

  1. Maak of update de Element draft. Behoud source, dependencies, entrypoint en metadata fields die niet bij de wijziging horen.
  2. Publish het Element en bewaar de teruggegeven version id.
  3. Draai een kleine test execution payload. Bekijk execution logs bij import-, dependency-, timeout-, secret-, variable- of result-shape fouten.
  4. Voor een Element-backed datasource maak of update je de datasource met type="element", elementId, elementVersion en elementEntrypoint="run".
  5. Voor cached parquet zet je dataFormat="parquet-remote", queue je een parquet refresh en lees je de datasource flow totdat de terminal refresh event zichtbaar is.
  6. Query de datasource en bind dashboard tables/filters alleen aan geverifieerde columns.

Veel voorkomende ongeldige payloads

  • dataFormat="parquet" op een datasource die door parquetrefresh ververst moet worden. Gebruik parquet-remote of parquet-remote-view.
  • Element datasource zonder gepubliceerde elementVersion.
  • Draft source die de ingestelde entrypoint niet definieert.
  • Hardcoded API keys, tokens of passwords in Element source. Gebruik runtime secrets.
  • Live update code die yield gebruikt voor progress. Gebruik emitProgress, appendRows, replaceRows en clearRows.
  • Live appendRows() gebruiken wanneer duurzame parquet opslag nodig is. Gebruik appendDataSourceRows() of dataSources.appendRows().
  • yield en return <value> mixen in dezelfde entrypoint.

MCP tool names

  • Runtime reference: get_element_runtime_contract, list_element_builtin_functions, get_element_builtin_function.
  • Element lifecycle: validate_element, create_element, update_element, publish_element, run_element_test, list_element_execution_logs, read_element_execution_log.
  • Runtime store: list_runtime_variables, set_runtime_variable, delete_runtime_variable, list_runtime_secrets, set_runtime_secret, delete_runtime_secret.
  • Datasource verification: validate_datasource, create_datasource, update_datasource, refresh_datasource_parquet, list_datasource_flows, read_datasource_flow, run_datasource_query.
  • Docs discovery: search_dashview_docs, resolve_dashview_doc_topic, read_dashview_doc_topic.

Backend API route references

  • GET /elements, GET /elements/{element_id}, POST /elements, PUT /elements/{element_id}.
  • POST /elements/{element_id}/publish, POST /elements/{element_id}/execute.
  • GET /elements/{element_id}/execution-logs, GET /elements/{element_id}/execution-logs/{log_id}.
  • GET /runtime-store/vars, PUT /runtime-store/vars/{variable_id}, GET /runtime-store/secrets, PUT /runtime-store/secrets/{secret_id}.
  • POST /data-sources/{datasource_id}/parquet-refresh voor cached datasource refresh.

Gebruik de MCP Swagger helpers get_backend_api_summary, search_backend_api_endpoints en get_backend_api_endpoint voor raw backend calls.

LLM-oriented voorbeelden

# Before writing Element source through MCP:
runtime = get_element_runtime_contract()
query_helper = get_element_builtin_function("queryDataSources")
secret_helper = get_element_builtin_function("getSecret")

# Before guessing docs filenames:
doc = read_dashview_doc_topic("element-runtime-builtins")

# Before binding a table/filter:
rows = run_datasource_query(
  "select * from orders_from_element limit 20",
  sources=[{"dataSourceId": "orders_from_element"}],
  strict_sources=True,
  max_rows=20
)