nexu-io/open-design · error · ValueError
Unsupported deliveryFormat: {config['deliveryFormat']}
Error message
Unsupported deliveryFormat: {config['deliveryFormat']} What it means
Raised by validate_config when config['deliveryFormat'] is not in ALLOWED_DELIVERY_FORMATS = {"mov","webm","json","remotion","hyperframe","preview"}. Default is 'mov'. The format selects the output artifact: video (mov/webm), a JSON scene spec, a Remotion component, a Hyperframe-ready bundle, or a preview-only render.
Source
Thrown at skills/chat-motion-overlay/scripts/build_chat_overlay_spec.py:131
validate_config(config)
return config
user = json.loads(Path(path).read_text(encoding="utf-8"))
config.update(user)
validate_config(config)
return config
def validate_config(config: dict) -> None:
if config["container"] not in ALLOWED_CONTAINERS:
raise ValueError(f"Unsupported container: {config['container']}")
if config["avatarMode"] not in ALLOWED_AVATAR_MODES:
raise ValueError(f"Unsupported avatarMode: {config['avatarMode']}")
if config["deviceFrame"] not in ALLOWED_DEVICE_FRAMES:
raise ValueError(f"Unsupported deviceFrame: {config['deviceFrame']}")
if config["nicknameMode"] not in ALLOWED_NICKNAME_MODES:
raise ValueError(f"Unsupported nicknameMode: {config['nicknameMode']}")
if config["deliveryFormat"] not in ALLOWED_DELIVERY_FORMATS:
raise ValueError(f"Unsupported deliveryFormat: {config['deliveryFormat']}")
if config["container"] == "none" and config["deviceFrame"] == "iphone-dynamic-island":
raise ValueError("container=none does not support deviceFrame=iphone-dynamic-island; use deviceFrame=none or choose an app container")
for speaker, participant in config.get("participants", {}).items():
side = participant.get("side")
if side and side not in {"left", "right"}:
raise ValueError(f"Unsupported side for participant {speaker}: {side}")
preset_key = participant.get("preset")
if preset_key and preset_key not in PRESET_KEYS:
raise ValueError(f"Unsupported preset for participant {speaker}: {preset_key}")
upload_path = participant.get("uploadPath")
if participant.get("uploadAsset"):
raise ValueError(f"Participant {speaker} config must use uploadPath, not uploadAsset")
if config["avatarMode"] == "preset" and upload_path:
raise ValueError(f"avatarMode=preset does not allow uploadPath for participant {speaker}")
if config["avatarMode"] == "upload" and not upload_path:
raise ValueError(f"avatarMode=upload requires uploadPath for participant {speaker}")
View on GitHub (pinned to 5be4028344)
Solutions
- Set deliveryFormat to one of: mov, webm, json, remotion, hyperframe, preview.
- For an MP4 file, choose 'mov' or 'webm' and remux afterward with ffmpeg if a specific container is required.
- For machine consumption / downstream pipelines, use 'json' or 'remotion'.
- Pre-validate: `assert c['deliveryFormat'] in {'mov','webm','json','remotion','hyperframe','preview'}`.
Example fix
// before
{"deliveryFormat": "mp4"}
# -> ValueError: Unsupported deliveryFormat: mp4
// after
{"deliveryFormat": "mov"}
# then if you truly need mp4: ffmpeg -i out.mov -c copy out.mp4 Defensive patterns
Strategy: validation
Validate before calling
ALLOWED_DELIVERY_FORMATS = {"mov", "webm", "json", "remotion", "hyperframe", "preview"}
if config["deliveryFormat"] not in ALLOWED_DELIVERY_FORMATS:
raise SystemExit(
f"deliveryFormat must be one of {sorted(ALLOWED_DELIVERY_FORMATS)}; "
f"got {config['deliveryFormat']!r}. Use 'mov'/'webm' and remux for mp4."
) Type guard
def is_delivery_format(value) -> bool:
return value in {"mov", "webm", "json", "remotion", "hyperframe", "preview"} Try / catch
try:
validate_config(config)
except ValueError as exc:
raise SystemExit(f"Config error: {exc}") from exc Prevention
- Remember mp4/gif/png are NOT supported; choose mov/webm and post-process.
- For pipelines, prefer 'json' or 'remotion' as the machine-readable artifact.
- Use jsonschema enum validation at config load.
- Document the remux path (ffmpeg) for users who specifically need mp4.
When it happens
Trigger: User sets `"deliveryFormat": "mp4"`, `"deliveryFormat": "avi"`, `"deliveryFormat": "gif"`, `"deliveryFormat": "png"`, or `"deliveryFormat": "html"`. None are recognized.
Common situations: Wanting mp4 (not supported — use mov or webm and remux); wanting a GIF (not supported — generate then convert); wanting static frames (not supported); typo or case mismatch ('MOV').
Related errors
- Unsupported container: {config['container']}
- Unsupported avatarMode: {config['avatarMode']}
- Unsupported deviceFrame: {config['deviceFrame']}
- Unsupported nicknameMode: {config['nicknameMode']}
- container=none does not support deviceFrame=iphone-dynamic-i
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/46b2a9050443049d.
Report an issue: GitHub.