Create models

Deploys one inference model for the caller's org, and answers 201 with the model as Kubernetes admitted it.

POST /v1/ml/models

Addresshttps://api.hanzo.ai/v1/ml/models
MethodPOST
Operationpost_ml_models
AuthAuthorization: Bearer $HANZO_API_KEY

Deploys one inference model for the caller's org, and answers 201 with the model as Kubernetes admitted it.

The spec is a kserve InferenceService spec, passed through unchanged — this plane owns the tenancy, the billing and the namespace, and kserve owns what a model IS. An unfunded org is refused BEFORE anything is created, so nobody runs free GPU compute and nobody is charged for a resource that was never made.

Request

4 fields, body application/json (required).

FieldInTypeRequiredDescription
labelsbodyobject—Labels are extra labels to set on the object, merged UNDER the tenancy labels this plane derives from the validated principal — so a label naming another org's scope cannot displace the real one.
labels.*bodystring—
namebodystring—Name is the resource's name: a DNS-1123 label (^a-z0-9?$), lowercased and trimmed.
specbodyany—Spec is the resource's own spec, passed to Kubernetes unchanged.

Response

StatusBodyMeaning
201ml.mlResourcecreated
defaultproblem-detailsrefused

201 body — 6 fields.

FieldInTypeAlwaysDescription
createdAtbodystring—CreatedAt is when Kubernetes admitted the object, RFC 3339 in UTC.
namebodystring—Name is the object's metadata.name, unique within the caller's namespace.
specbodyobject—Spec is the resource spec, verbatim as Kubernetes stores it.
spec.*bodyany—
statusbodyobject—Status is the live status kserve owns, verbatim.
status.*bodyany—

Failure carries the platform error shape — see Errors.

Examples

hanzo ml models create
import { Configuration, MlApi } from 'hanzoai';

const api = new MlApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postMlModels({ labels: {}, name: "<name>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import MlApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = MlApi(client).post_ml_models(labels={}, name="<name>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.MlAPI.PostMlModels(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, ml_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = ml_api::post_ml_models(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.MlApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new MlApi(client).postMlModels();
curl -X POST https://api.hanzo.ai/v1/ml/models \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "labels": {},
       "name": "<name>"
     }'

MCP reaches ml through the ml tool, which names its 4 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "list_ml_models"
         }
       }
     }'

ML API · All Hanzo APIs · Interactive reference

Was this page useful?