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 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.
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.
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.
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.
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 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

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.