Pipeline file

westwind.yaml, validated by schema/westwind.schema.json. Example files are in examples/. The graph section is the on-device mpipe graph; each node type is an entry of catalog/elements.json. Node ui fields are editor layout and are kept on round trips but ignored by the generator.

Top-level keys

From schema/westwind.schema.json (JSON Schema draft 2020-12).

KeyRequiredDescription
apiVersionyes"westwind/v1"
kindyes"Pipeline"
metadatayes
targetyes
data
modelyessee $defs/model
placementsee $defs/placement
federatedsee $defs/federated
computeWhere the host-side work runs: data fetches, training, conversion, firmware builds, westwind serve and the Flower SuperLink. The firmware itself always runs on target.board.
graphsee $defs/graph
codeHand-written sources added to the generated application.
outputs

Example

examples/face-detect-xiao.yaml

apiVersion: westwind/v1
kind: Pipeline
metadata:
  name: face-detect-xiao
  description: MediaPipe BlazeFace on the XIAO ESP32S3 Sense camera, model and activations in PSRAM.
target:
  board: xiao_esp32s3/esp32s3/procpu/sense
  zephyr: main
model:
  name: blazeface
  source: mediapipe
  id: mediapipe/face_detector/blaze_face_short_range
  task: detection
placement:
  mode: device
graph:
  nodes:
    - { id: cam, type: video_src, props: { format: RGB565, width: 160, height: 120, fps: 2 } }
    - { id: pre, type: preprocess, props: { width: 128, height: 128, format: RGB, layout: NHWC, mean: [127.5, 127.5, 127.5], std: [127.5, 127.5, 127.5] } }
    - { id: infer, type: executorch, props: { model: blazeface, method_pool: 2097152 } }
    - { id: post, type: postprocess, props: { kind: blazeface, threshold: 0.6 } }
    - { id: out, type: uart_json }
  links:
    - [cam, pre]
    - [pre, infer]
    - [infer, post]
    - [post, out]
outputs: [elf, bin]

The schema itself is served at /api/catalog/schema, and POST /api/validate checks a file against it and the catalogs.