Custom models are currently available in early access. Reach out to
your Cyberwave contact to enable it for your workspace.
Concepts
A custom model is an AI model you register yourself, instead of picking one from the catalog. There are two kinds:custom-api
Your model already runs somewhere — your own inference server, a
HuggingFace Inference Endpoint, a colleague’s project. Cyberwave calls
it over HTTP whenever the model is used.
custom-hosted
You give Cyberwave a Python function; Cyberwave runs it for you on
demand. No servers to keep online yourself.
MLModel rows once created — they show up in the model catalog, can be selected in a workflow’s Call Model node, and run through the same POST /mlmodels/{uuid}/run endpoint and Playground as any built-in model. Custom models are always scoped to private or workspace visibility (never made public to other workspaces).
Describing inputs and outputs
Every custom model declares its inputs and outputs withmetadata.io_schema — a list of named, typed ports:
text, image, audio, video, json, number, boolean, array. video is a reference to a stored recording (a whole clip), not a single live frame — see Passing a recording as input.
Custom port contracts can also declare data meaning, such as units, coordinate frame and joint order. Two array outputs are not interchangeable merely because their sizes match. Review the mapping when replacing a model; reload its latest configuration if a contract update reports a conflict. Existing untyped models retain their current behavior.
Upload a model hosted behind your API
Use this when the model already runs somewhere reachable over HTTPS.1
Register the model
Create the model with
model_provider_name: "custom-api" and your
endpoint configuration in metadata.payload_template values may use the placeholders {prompt}, {model_id},
and (for video inputs) {video_url} — Cyberwave substitutes them into
the JSON body it sends to endpoint_url. response_key names the
top-level field in your endpoint’s JSON response that holds the result.timeout_seconds defaults to 120 and is a budget for the whole
call, retries included — max_retries never extends it. Values outside
the allowed range are clamped; unparseable values fall back to the
default.A few metadata keys are reserved for the Cyberwave platform and are
rejected on create and update: cloud_node_profile_slug,
cloud_node_result_type, fallback_provider, and fallback_model_id.2
Add authentication (if your endpoint needs it)
Credentials are write-only: once set, Cyberwave never returns the
secret value again — only whether one is configured.
auth_type is one of none, bearer, api_key_header (also set
header_name, e.g. "X-API-Key"), or basic. Remove a credential with
DELETE .../credential.3
Test it
Run one real call against your endpoint to confirm the config:This is a real inference against your endpoint, so it consumes credits
like any other run. It requires
metadata.endpoint_url to be set.4
Use it
The model now behaves like any catalog model — run it directly, from the
Playground, or from a workflow’s Call Model node.
Upload a model and let Cyberwave host it
Use this when you don’t want to run your own server — give Cyberwave a Python function and (optionally) a weights file, and Cyberwave runs it on demand. Your code must define one function:torch, onnxruntime, ultralytics, opencv,
numpy, pillow, and transformers pre-installed — import them directly
from run(). Installing extra packages at run time isn’t supported yet.
All
custom-hosted models run on GPU-backed compute today, even a small
model that would run fine on CPU. You can set metadata.device to
"cpu" or "gpu" now to declare which one your model actually needs —
it’s validated and saved, but not yet used to choose your compute:
every workload still runs on GPU regardless of this value. Setting it
today costs you nothing and means no changes are needed on your side once
CPU-tier compute ships.1
Register the model with your code
Only inline code (
metadata.code, shown above) is supported today —
uploading code as a separate file isn’t wired up yet.metadata.device is optional ("cpu" or "gpu") — see the note above.
It’s only valid on custom-hosted models; setting it on custom-api
is rejected, since your own endpoint decides its own compute.2
Upload weights (optional)
If your Your
run() function needs a checkpoint, upload it as a tar archive
in two steps: request a signed upload URL, then confirm the upload.run() function receives the extracted contents’ directory as
artifacts_dir.3
Run it
Same as any other model — direct call, Playground, or a workflow’s
Call Model node. The first run after registering may take longer
while capacity is provisioned.
Passing a recording as input
A model that analyzes a whole recorded clip (rather than a single live frame) declares avideo-typed input in its io_schema, and the caller
passes the recording’s UUID:
recording_uuid into a temporary signed URL for the
underlying video file before calling your endpoint or run() function.
Whole-clip calls typically take longer than a single-frame call — timeouts
are extended automatically when a model declares a video input.
Endpoint reference
Where to go next
Model catalog
Model visibility, capabilities, and the catalog in general.
Model playground
Try any model — including your own — from an interactive UI.
Model Catalog API
Full request/response reference for the model catalog endpoints.