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).
| Key | Required | Description |
|---|---|---|
apiVersion | yes | "westwind/v1" |
kind | yes | "Pipeline" |
metadata | yes | |
target | yes | |
data | ||
model | yes | see $defs/model |
placement | see $defs/placement | |
federated | see $defs/federated | |
compute | Where 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. | |
graph | see $defs/graph | |
code | Hand-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.