Versions tabel
Version,Status,Published.Wheels(aantal dependency artifacts).Build (ms).
Elements reference
Deze pagina behandelt alles na het editorwerk: publiceren, versioning, runtime vars/secrets, test execute, execution logs en integratie met datasources.
| Onderdeel | Beschrijving |
|---|---|
| Publish | Valideert draft, bouwt dependencies en maakt een nieuwe version. |
| latestVersion | Elementmetadata verwijst na publish naar nieuwste version. |
| Version status | Bevat build/publish uitkomst per versie. |
| Build metrics | Wheels count en build duration worden opgeslagen. |
Version, Status, Published.Wheels (aantal dependency artifacts).Build (ms).
| Type | Input | Gedrag |
|---|---|---|
| Runtime var | ID + JSON value | JSON moet valide zijn; leesbaar met getVar(). |
| Runtime secret | ID + nieuwe waarde bij opslaan | Write-only opslag; leesbaar met getSecret(). |
| Runtime writeback | setVar() in code | Nieuwe waarde wordt direct naar de runtime store geschreven. |
| Veld | Beschrijving |
|---|---|
version | Leeg betekent latest published version. |
timeoutSeconds | Bereik 1-3600, default 3600. |
params | JSON 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"
}
}
}
}
trigger-Elements zijn one-shot handlers via POST /element/{elementId}.server-Elements publiceren een ASGI/FastAPI-app via dezelfde gateway: /element/{elementId} en /element/{elementId}/{path...}.| Input | Waar beschikbaar | Beschrijving |
|---|---|---|
params.request | run(params) | Request envelope met method, path, query, headers, body/json/form en bodygrootte. |
params.__dashview.request | run(params) | Zelfde envelope onder de Dashview namespace. |
context.request | run(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.
element en Default data format = Live stream, of direct via een gepubliceerd Element van type stream_data.dataFormat: "livestream". Legacy configs met streamMode: "commands" blijven ondersteund.| Helper | Doel | Gedrag in widgets |
|---|---|---|
emitProgress(...) | Status/progress doorgeven | Geeft progress events door; voegt geen datasource rows toe. |
appendRows([...]) | Nieuwe rows toevoegen | Widgets zien extra rows terwijl het Element nog draait. |
replaceRows([...]) | Volledige dataset vervangen | Widgets schakelen over naar de nieuwe set rows. |
clearRows() | Huidige rows leegmaken | Maakt de live datasource tabel leeg voordat nieuwe rows volgen. |
Execution-logsamenvattingen en detailchunks worden in Firestore onder tenants/{tenantId}/runtimeLogs/_tenant/elements/{elementId}/elementExecutionLogs opgeslagen en via Firestore TTL op expireAt bewaard.
/data/{id}/livestream, niet voor gewone snapshot/parquet loads.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}
element-examples/command_stream_demo.py toont incrementele row updates.element-examples/cloudrunlogs.py toont een langere append-only live tail.| Kolom | Beschrijving |
|---|---|
Time | Starttijd van de run. |
Status | Toegestane waarden: success, error, failed. |
Source | Herkomst (admin_test, datasource, flow, etc.). |
Version | Uitgevoerde version. |
Duration | Runtime duur in ms. |
Error | Korte foutsamenvatting. |
View details | Volledige payload incl. meta/stdout/stderr/result en vastgelegde logger-berichten. |
source=server_http nadat de response body klaar is.source=server_websocket wanneer de sessie sluit of faalt.logger, bijvoorbeeld logger.info("Start refresh") of logger.error("API call mislukt").logger.exception(...).stdout of traceback hoeft.elementId, elementVersion, elementEntrypoint.requestParamMap.elementTimeoutSeconds.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"
}
Live stream datasource payload:
{
"id": "orders-live",
"name": "Orders live",
"type": "element",
"elementId": "el_orders_live",
"elementVersion": "v_20260605090000_abcd12",
"elementEntrypoint": "run",
"dataFormat": "livestream"
}
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"]}
appendRows(); duurzame writes maken parquet parts via uplink.meta kan uplink auto-create velden bevatten zoals dataSourceName, dataFormat, parquetPartitionColumn en parquetPartitionGranularity.
Gebruik de gcs-helpers wanneer een Element bestanden moet beheren die langer meegaan dan één request,
bijvoorbeeld exports, rapportbijlagen of tijdelijke bestanden die later opnieuw gelezen moeten worden. De worker
gebruikt de geconfigureerde file artifact/output bucket en forceert elk object onder filestore/{tenantId}/....
Een Element in tenant tenant-1 kan dus schrijven naar gs://dashview-cache/filestore/tenant-1/exports/report.json,
maar niet naar een andere bucket of tenant-filestore-map.
def run():
ref = gcs.upload(
"exports/report.json",
data={"status": "ready"},
format="json",
signedUrl=True,
ttlSeconds=900,
)
text = gcs.download(ref["gcsUri"])
signed = gcs.sign("exports/report.json", ttlSeconds=900)
files = gcs.list("exports")
gcs.delete("exports/old-report.json", ignoreMissing=True)
return {
"gcsUri": ref["gcsUri"],
"rawHttpUrl": ref["rawHttpUrl"],
"signedUrl": signed["signedUrl"],
"fileCount": len(files),
"downloaded": text,
}
Om edits terug te schrijven naar een tenantbestand download je het object naar workspace, laad je het in de
geïnjecteerde DuckDB connection, draai je normale SQL zoals UPDATE, exporteer je een vervangend bestand en upload je dat
terug naar hetzelfde GCS-pad met overwrite=True.
import base64
from pathlib import Path
def run(duckdb, workspace):
object_path = "datasets/orders.parquet"
work = Path(workspace)
input_path = work / "orders.parquet"
output_path = work / "orders.updated.parquet"
downloaded = downloadGcsFile(object_path, asBytes=True)
input_path.write_bytes(base64.b64decode(downloaded["dataBase64"]))
duckdb.execute(
"CREATE TABLE orders AS SELECT * FROM read_parquet(?)",
[str(input_path)]
)
duckdb.execute("""
UPDATE orders
SET status = 'archived'
WHERE status = 'closed'
""")
duckdb.execute(
"COPY orders TO ? (FORMAT PARQUET)",
[str(output_path)]
)
return uploadGcsFile(
object_path,
dataBase64=base64.b64encode(output_path.read_bytes()).decode("ascii"),
contentType="application/vnd.apache.parquet",
overwrite=True,
metadata={"updatedBy": "element"},
)
uploadGcsFile retourne metadata zoals uri, gcsUri, httpUrl, rawHttpUrl, bucket, object, relativePath, contentType en size.httpUrl en rawHttpUrl zijn de ruwe Storage URL. Gebruik signedUrl of downloadUrl wanneer een browser of externe client tijdelijk toegang nodig heeft.gs://-paden zijn toegestaan, maar alleen wanneer ze al naar de geconfigureerde bucket en huidige tenantmap wijzen.
Elke Element-run krijgt een request-local DuckDB database op {workspace}/element.duckdb.
Voeg een named duckdb-parameter toe aan de entrypoint om die connection te ontvangen, en voeg
workspace toe wanneer het Element een schrijfbare scratch directory nodig heeft. Named entrypointparameters kunnen
context/ctx, params/args, duckdb en
workspace zijn; een entrypoint met **kwargs krijgt ze allemaal.
def run(params, duckdb, workspace):
duckdb.execute(
"CREATE TABLE totals AS SELECT 1 AS id, ? AS value",
[params["value"]]
)
return {"table": "totals"}
Gebruik normale DuckDB connection-methods zoals duckdb.execute(...), duckdb.sql(...),
duckdb.register(...) en duckdb.from_df(...). Deze lokale connection ziet alleen tabellen die
het Element zelf maakt en tabellen die helpers laden. Gebruik queryDataSources voor tenant-scoped datasource reads
zodat backend access checks en forced filters afgedwongen blijven.
queryDataSources(..., asTable="orders") houdt het helperresultaat op het parquet/DuckDB pad en laadt het
in de lokale connection als orders. Het resultaat heeft table, rowCount,
columns, metadata, artifact en lege rows.
Helpers die data, Dashbot tools of e-mailbezorging aanroepen gebruiken de access context van de execution: de huidige gebruiker,
een scheduled automation on-behalf-of gebruiker, of tenant-system context voor intern materialisatiewerk.
queryDataSources, askDashbot en sendEmail sturen die context downstream door; services controleren
daarna opnieuw actuele permissies en forced filters. Element-code kan geen bredere context minten.
Tijdens parquetrefresh-materialisatie mag de tenant-system context tenant-datasources lezen zodat Element-datasourcecode dynamische
queryDataSources-calls kan uitvoeren zonder elke dependency vooraf te declareren.
Voor exacte signatures, payloadvelden, return shapes en voorbeeldcode per helper gebruik je de Runtime builtin function contract pages.
| Gebied | Builtin contract pages | Gebruik voor |
|---|---|---|
| Lokale SQL | duckdb | Gebruik Element-local DuckDB tabellen, workspace files en table-shaped output. |
| Datasource access | queryDataSources, appendDataSourceRows | Lees tenant-scoped datasources met forced filters of append duurzame rows naar schrijfbare parquet/uplink datasources. |
| Request artifacts | writeFile, readFile, listFiles | Schrijf, lees en lijst files die aan de huidige Element-request zijn gekoppeld. |
| Tenant GCS files | uploadGcsFile, downloadGcsFile, signGcsFile, listGcsFiles, deleteGcsFile | Beheer duurzame tenant files onder filestore/{tenantId}/.... |
| AI en delivery | askDashbot, sendEmail | Roep Dashbot of notification delivery aan met behoud van de execution access context. |
| Runtime store | getVar, setVar, getSecret | Lees niet-secret configuratie, schrijf bewuste runtime variables en lees secrets alleen binnen runtime. |
| Live streaming | emitProgress, appendRows, replaceRows, clearRows | Emit progress en live row commands voor livestream-style Element executions. |
| Side effects | createNotification, createTask | Return notification- en task-side-effect payloads vanuit Element execution. |
| Diagnostics | timeBlock, logger | Leg timing en gestructureerde execution logs vast zonder debug-blobs aan gebruikers te returnen. |
De helpers hierboven zijn geïnjecteerde globals in de Element-runtime. De dedicated contract pages bevatten optionele import shims, voorbeeldcalls, payloadvoorbeelden, return payloads en security caveats per helper.
type="element", elementId, elementVersion en elementEntrypoint="run".dataFormat="parquet-remote", queue je een parquet refresh en lees je de datasource flow totdat de terminal refresh event zichtbaar is.dataFormat="parquet" op een datasource die door parquetrefresh ververst moet worden. Gebruik parquet-remote of parquet-remote-view.elementVersion.yield gebruikt voor progress. Gebruik emitProgress, appendRows, replaceRows en clearRows.appendRows() gebruiken wanneer duurzame parquet opslag nodig is. Gebruik appendDataSourceRows() of dataSources.appendRows().yield en return <value> mixen in dezelfde entrypoint.get_element_runtime_contract, list_element_builtin_functions, get_element_builtin_function.validate_element, create_element, update_element, publish_element, run_element_test, list_element_execution_logs, read_element_execution_log.list_runtime_variables, set_runtime_variable, delete_runtime_variable, list_runtime_secrets, set_runtime_secret, delete_runtime_secret.validate_datasource, create_datasource, update_datasource, refresh_datasource_parquet, list_datasource_flows, read_datasource_flow, run_datasource_query.search_dashview_docs, resolve_dashview_doc_topic, read_dashview_doc_topic.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.
# 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
)