OptixLog Docs
Python SDKManagement API

Workflow Nodes

List, get, iterate, count, and look up workflow nodes using label, creator, and property filters, with optional includes for related data.

project.workflow_nodes is a WorkflowNodeCollection. Workflow nodes are the vertices in the project's computation graph. Each node has a display name, an optional label (its type), typed properties, file attachments, and parent/child edges.

The default sort order for workflow nodes is created_at descending — newest first.

Basic list

workflow_nodes.py
from optixlog import SDKClient
from optixlog.management import Management

client = SDKClient(base_url="https://optixlog.leidos.com", api_key="sk-opt-...")
mgmt = Management(client)
project = mgmt.project("proj_grating_7f3a")

page = project.workflow_nodes.list()
for node in page.items:
    print(node.id, node.display_name)

Filters

All filters are AND. Filter by:

  • label — label name, e.g. "SimulationRun".
  • created_by — user id of the creator.
  • has_property — dict[str, str] of required property key/value pairs.
# Nodes with label "SimulationRun", solver=="fdtd", created by a specific user
page = project.workflow_nodes.list(
    label="SimulationRun",
    created_by="user-xyz",
    has_property={"solver": "fdtd"},
)

Includes

Without include, related fields (label_ref, properties, attachments, parent_refs, child_refs) are None. Pass the includes you need:

page = project.workflow_nodes.list(
    include=["label", "properties", "attachments", "parents", "children"],
)
node = page.items[0]
print(node.label_ref.name)       # e.g. "SimulationRun"
print(node.properties)           # dict[str, str] | None
print(node.attachments)          # list[FileRef] | None
print(node.parent_refs)          # list[EntityRef] | None
print(node.child_refs)           # list[EntityRef] | None

Get by id

node = project.workflow_nodes.get(
    "node-abc123",
    include=["label", "properties", "attachments"],
)

# Returns None if not found
node = project.workflow_nodes.get_or_none("node-abc123", include=["label"])

Iterate all nodes

for node in project.workflow_nodes.iter(
    label="SimulationRun",
    include=["properties"],
    order_by="created_at",
    order="desc",
):
    print(node.id, node.properties)

Count

sim_count = project.workflow_nodes.count(label="SimulationRun")
fdtd_count = project.workflow_nodes.count(has_property={"solver": "fdtd"})

Unique lookups

# Exactly one node with run_id=="sim-001" — raises if zero or more than one
node = project.workflow_nodes.one(has_property={"run_id": "sim-001"})

# First FDTD simulation node, or None
node = project.workflow_nodes.first(
    label="SimulationRun",
    has_property={"solver": "fdtd"},
)

Ordering

Order by created_at, updated_at, display_name, or label. Default is created_at descending.

page = project.workflow_nodes.list(order_by="display_name", order="asc")

WorkflowNode fields

Prop

Type

FileRef fields

Returned in node.attachments when include=["attachments"] is passed.

Prop

Type

Node labels

Labels (node types) are managed via project.workflow_nodes.labels. See Node Labels.

On this page