Skip to main content
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 ML 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.
Both kinds are ordinary 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 with metadata.io_schema — a list of named, typed ports:
Supported types: 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.
Only upload or point at code and endpoints you trust. Custom models run without additional sandboxing today — treat them the same way you’d treat any other code you run on your own infrastructure.

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:
The base runtime ships with 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.
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.
2

Upload weights (optional)

If your run() function needs a checkpoint, upload it as a tar archive in two steps: request a signed upload URL, then confirm the upload.
Your 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 a video-typed input in its io_schema, and the caller passes the recording’s UUID:
Cyberwave resolves 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

ML Models

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.