# Code generated by cmd/openapi-gen. DO NOT EDIT. # Regenerate with: make doc-gen components: schemas: ActivityItem: example: action: succeeded actor: li.wei id: act-9f3a2e5c kind: run name: resnet-train-7 phase: Succeeded timestamp: "2026-06-28T09:25:00Z" properties: action: description: What happened (created, started, stopped, succeeded, failed, deleted, ...). type: string actor: description: Username that triggered the activity. type: string id: description: Stable activity entry identifier. type: string kind: description: Subject resource kind (workspace, job, experiment, run, mlservice, trafficpolicy). type: string name: description: Subject resource name. type: string phase: description: Subject's phase at the time of the entry. type: string timestamp: description: Time the activity occurred. format: date-time type: string required: - action - id - kind - name - timestamp type: object ActivityList: example: count: 3 items: - action: succeeded actor: li.wei id: act-9f3a2e5c kind: run name: resnet-train-7 phase: Succeeded timestamp: "2026-06-28T09:25:00Z" - action: started actor: zhang.san id: act-7b4f2a1c kind: mlservice name: llama3-chat phase: Ready timestamp: "2026-06-28T09:30:00Z" - action: created actor: li.wei id: act-3e8f4a1c kind: workspace name: notebook-dev phase: Running timestamp: "2026-06-20T08:00:00Z" properties: count: description: Number of entries in this page. minimum: 0 type: integer items: description: Activity entries, newest first. items: $ref: '#/components/schemas/ActivityItem' type: array required: - count - items type: object ArtifactDefinition: example: annotations: git-commit: 8c1f4e2 createdAt: "2026-06-20T08:00:00Z" description: ResNet-50 image-classification model. displayName: ResNet-50 id: 1f2e3d4c-5b6a-7980-abcd-ef0123456789 kind: model labels: team: vision latestVersion: 1.4.0 latestVersionAt: "2026-06-28T09:30:00Z" name: resnet50 namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 spec: format: safetensors framework: pytorch parameters: 25.6M task: image-classification tenantName: team-vision updatedAt: "2026-06-28T09:30:00Z" versionCount: 3 properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. createdAt: description: Time the definition was created. format: date-time type: string description: description: Free-text definition description. type: string displayName: description: Human-readable definition label. type: string id: description: Stable definition identifier. format: uuid type: string kind: description: Definition kind (model or image). enum: - model - image type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels. latestVersion: description: Version string of the most recent version. type: string latestVersionAt: description: Creation time of the most recent version. format: date-time nullable: true type: string name: description: Definition name (unique within the tenant). type: string namespace: description: Platform tenant namespace the definition belongs to. type: string owner: description: Username of the definition owner. type: string ownerId: description: User ID of the definition owner. format: uuid type: string spec: additionalProperties: {} description: Pass-through definition spec (free-form). type: object tenantName: description: Tenant identifier owning the definition. type: string updatedAt: description: Time the definition was last updated. format: date-time type: string versionCount: description: Number of versions under the definition (roll-up for list cards). type: integer required: - createdAt - id - kind - name - namespace - tenantName - updatedAt type: object ArtifactDefinitionCreateRequest: example: description: ResNet-50 image-classification model. displayName: ResNet-50 labels: team: vision name: resnet50 properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. description: description: Free-text definition description. maxLength: 4096 type: string displayName: description: Human-readable definition label. maxLength: 256 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels. name: description: Artifact definition name (unique within the tenant). maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string spec: additionalProperties: {} description: Pass-through definition spec (free-form). type: object required: - name type: object ArtifactDefinitionList: example: continueToken: "" count: 1 items: - annotations: git-commit: 8c1f4e2 createdAt: "2026-06-20T08:00:00Z" description: ResNet-50 image-classification model. displayName: ResNet-50 id: 1f2e3d4c-5b6a-7980-abcd-ef0123456789 kind: model labels: team: vision latestVersion: 1.4.0 latestVersionAt: "2026-06-28T09:30:00Z" name: resnet50 namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 spec: format: safetensors framework: pytorch parameters: 25.6M task: image-classification tenantName: team-vision updatedAt: "2026-06-28T09:30:00Z" versionCount: 3 partial: false properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of definitions in this page. minimum: 0 type: integer items: description: Artifact definitions in this page. items: $ref: '#/components/schemas/ArtifactDefinition' type: array partial: description: True if the list was truncated by an upstream limit. type: boolean required: - count - items type: object ArtifactDefinitionPatchRequest: example: description: Updated definition description. displayName: ResNet-50 (v2) properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement annotation set. description: description: Updated free-text definition description. maxLength: 4096 type: string displayName: description: Updated human-readable definition label. maxLength: 256 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement label set. spec: additionalProperties: {} description: Replacement definition spec (free-form). type: object type: object ArtifactRef: example: kind: model name: resnet50 version: 1.4.0 properties: kind: description: Artifact kind (model or image). enum: - image - model type: string name: description: Artifact definition name. type: string version: description: Artifact version. type: string required: - kind - name - version type: object ArtifactResolveResponse: example: digest: sha256:9b0d5a2c7f3148e1f4a6c8e3d2b4a6c8e1f9b0d5a2c7f3148e1f4a6c8e3d2b4a expiresAt: "2026-06-28T09:30:00Z" pullCredentials: password: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 username: pull-token storageKind: oci uri: oci://registry.axisml.io/team-vision/resnet50:1.4.0 properties: digest: description: Content digest of the version. type: string expiresAt: description: Expiry time of the pull credentials. format: date-time type: string pullCredentials: additionalProperties: {} description: Short-lived credentials for pulling the content. type: object storageKind: description: Backing store of the download target (oci, s3). enum: - oci - s3 type: string uri: description: Download URI for the version content. type: string required: - storageKind - uri type: object ArtifactSource: description: How an artifact version was added. enum: - webUpload - oras - dockerPush - external type: string ArtifactUpdateRequest: example: description: Updated version description. displayName: ResNet-50 v1.4.0 (calibrated) labels: team: vision properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement annotation set. description: description: Updated free-text description. maxLength: 4096 type: string displayName: description: Updated human-readable label. maxLength: 256 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement label set. type: object Backend: example: engine: pytorchjob name: native properties: config: additionalProperties: {} description: Backend-specific free-form config (e.g. the target GVK for the custom backend). type: object engine: description: Engine within the backend (e.g. job, pytorchjob, deployment). type: string name: description: Compute backend that runs the workload (native, kubeflow-trainer, kserve, custom). enum: - native - kubeflow-trainer - kserve - custom type: string required: - engine - name type: object ClusterMeter: example: resource: gpu total: 48 unit: cards used: 36 properties: resource: description: Resource dimension (gpu, cpu, memory). type: string total: description: Schedulable total capacity. format: double type: number unit: description: Value unit (e.g. cards, cores, GiB). type: string used: description: Amount currently in use. format: double type: number required: - resource - total - used type: object ClusterPoolUsage: example: meters: - resource: gpu total: 32 unit: cards used: 22 - resource: cpu total: 384 unit: cores used: 240 - resource: memory total: 2048 unit: GiB used: 1228.8 pool: gpu-a100 properties: meters: description: Per-resource utilisation meters for the pool. items: $ref: '#/components/schemas/ClusterMeter' type: array pool: description: Resource pool name. type: string required: - meters - pool type: object ClusterUsage: example: pools: - meters: - resource: gpu total: 32 unit: cards used: 22 - resource: cpu total: 384 unit: cores used: 240 - resource: memory total: 2048 unit: GiB used: 1228.8 pool: gpu-a100 - meters: - resource: gpu total: 16 unit: cards used: 14 - resource: cpu total: 256 unit: cores used: 180 - resource: memory total: 2048 unit: GiB used: 1433.6 pool: h100-pool - meters: - resource: gpu total: 0 unit: cards used: 0 - resource: cpu total: 512 unit: cores used: 320 - resource: memory total: 1536 unit: GiB used: 819.2 pool: cpu-pool updatedAt: "2026-06-28T09:30:00Z" properties: partial: description: True when one or more pools could not be sampled and were omitted from the snapshot. type: boolean pools: description: Per-pool utilisation, one entry per pool the tenant has quota in. items: $ref: '#/components/schemas/ClusterPoolUsage' type: array updatedAt: description: Time the snapshot was sampled. format: date-time type: string required: - pools - updatedAt type: object Condition: example: lastTransitionTime: "2026-06-28T09:30:00Z" message: All worker replicas are ready. reason: AllReplicasReady status: "True" type: Ready properties: lastTransitionTime: description: Time the condition last transitioned to this status. format: date-time type: string message: description: Human-readable detail about the last transition. type: string reason: description: Machine-readable reason for the condition's last transition. type: string status: description: Status of the condition (True, False, Unknown). enum: - "True" - "False" - Unknown type: string type: description: Condition type (e.g. Ready, Available). type: string required: - status - type type: object ConfigMapInit: example: name: shared-config sourceConfigMapRef: name: shared-config namespace: axisml-system properties: name: description: Name of the ConfigMap to create in the tenant namespace. type: string sourceConfigMapRef: allOf: - $ref: '#/components/schemas/ConfigMapSourceRef' description: Source ConfigMap to copy the data from. required: - name - sourceConfigMapRef type: object ConfigMapSourceRef: example: name: shared-config namespace: axisml-system properties: name: description: Name of the source ConfigMap. type: string namespace: description: Namespace holding the source ConfigMap. type: string required: - name - namespace type: object DataVolume: example: accessModes: - ReadWriteMany createdAt: "2026-06-20T08:00:00Z" description: Shared raw datasets directory. labels: team: vision name: shared-datasets size: 2Ti status: boundCapacity: 2Ti mounts: - kind: Deployment mountPath: /data/shared running: true workload: ws-jupyter-3 phase: Bound storageClass: nfs-rwx properties: accessModes: description: Access modes (ReadWriteOnce/ReadWriteMany/ReadOnlyMany). Immutable after creation. items: type: string type: array createdAt: description: Volume creation timestamp (RFC3339). format: date-time type: string description: description: Free-text description of the volume. type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels on the volume. name: description: Data volume name, unique within the tenant. type: string size: description: Requested storage size as a Kubernetes quantity (e.g. 200Gi). type: string status: allOf: - $ref: '#/components/schemas/DataVolumeStatus' description: Live status read from the backing PVC and pod scan. nullable: true storageClass: description: StorageClass backing the volume; cluster default when empty. Immutable after creation. type: string required: - name type: object DataVolumeCreateRequest: example: accessModes: - ReadWriteMany description: Shared raw datasets directory. name: shared-datasets size: 2Ti storageClass: nfs-rwx properties: accessModes: description: Access modes; defaults to [ReadWriteOnce] when empty. items: type: string type: array description: description: Free-text description of the volume. maxLength: 1000 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels to set on the volume. name: description: Data volume name, unique within the tenant. maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string size: description: Requested storage size as a Kubernetes quantity (e.g. 200Gi). type: string storageClass: description: StorageClass backing the volume; cluster default when empty. type: string required: - name - size type: object DataVolumeList: example: count: 1 items: - accessModes: - ReadWriteMany createdAt: "2026-06-20T08:00:00Z" description: Shared raw datasets directory. labels: team: vision name: shared-datasets size: 2Ti status: boundCapacity: 2Ti mounts: - kind: Deployment mountPath: /data/shared running: true workload: ws-jupyter-3 phase: Bound storageClass: nfs-rwx properties: count: description: Number of volumes in this page. type: integer items: description: Data volumes in this page. items: $ref: '#/components/schemas/DataVolume' type: array required: - count - items type: object DataVolumeMount: properties: kind: description: Kubernetes controller kind (Deployment/StatefulSet/Job/Pod). type: string mountPath: description: Mount path inside the pod. type: string running: description: Whether the mounting pod is currently running. type: boolean workload: description: Controlling workload (or pod) name. type: string required: - running - workload type: object DataVolumePatchRequest: example: description: Shared raw datasets directory (expanded). size: 4Ti properties: description: description: Replacement free-text description. nullable: true type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement user-defined label set. size: description: New storage size; expand-only (must be >= current). nullable: true type: string type: object DataVolumeStatus: properties: boundCapacity: description: Actually bound capacity once the volume is Bound. type: string mounts: description: Workloads currently mounting this volume (populated on detail get). items: $ref: '#/components/schemas/DataVolumeMount' type: array phase: description: 'PVC phase: Pending, Bound, or Lost.' type: string usedBytes: description: Best-effort used bytes from the monitoring stack; omitted when unavailable. format: int64 type: integer type: object EnvVar: example: name: NCCL_DEBUG value: INFO properties: name: description: Environment variable name. type: string value: description: Literal value for the variable. type: string valueFrom: additionalProperties: {} description: Source the value from a secret/configmap/field (pass-through to the K8s EnvVarSource shape). type: object required: - name type: object Event: example: count: 1 firstTimestamp: "2026-06-28T09:00:00Z" involvedObject: kind: Pod name: resnet-train-7-worker-0 namespace: axisml-team-vision lastTimestamp: "2026-06-28T09:00:00Z" message: Successfully assigned resnet-train-7-worker-0 to gpu-node-03. reason: Scheduled source: default-scheduler type: Normal properties: count: description: Number of times this event has occurred. minimum: 0 type: integer firstTimestamp: description: Time the event was first observed. format: date-time type: string involvedObject: description: Object the event is about. properties: kind: description: Kind of the object the event refers to. type: string name: description: Name of the object the event refers to. type: string namespace: description: Namespace of the object the event refers to. type: string type: object lastTimestamp: description: Time the event was last observed. format: date-time type: string message: description: Human-readable event message. type: string reason: description: Short machine-readable reason for the event. type: string source: description: Component that reported the event. type: string type: description: Event type (Normal, Warning). enum: - Normal - Warning type: string required: - lastTimestamp - message - reason - type type: object EventList: example: count: 1 items: - count: 1 firstTimestamp: "2026-06-28T09:00:00Z" involvedObject: kind: Pod name: resnet-train-7-worker-0 namespace: axisml-team-vision lastTimestamp: "2026-06-28T09:00:00Z" message: Successfully assigned resnet-train-7-worker-0 to gpu-node-03. reason: Scheduled source: default-scheduler type: Normal properties: count: description: Number of events in the list. minimum: 0 type: integer items: description: Events in the list. items: $ref: '#/components/schemas/Event' type: array required: - count - items type: object Experiment: example: annotations: axisml.io/created-by: li.wei createdAt: "2026-06-20T08:00:00Z" description: Training experiment fine-tuning BERT on a Chinese corpus. displayName: BERT fine-tuning experiment id: d4f8a1b2-3c5e-4a7b-9c0d-1e2f3a4b5c6d labels: team: nlp name: bert-finetune namespace: team-nlp owner: zhang.san ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 runSummary: active: 1 count: 5 latestPhase: Succeeded latestRunAt: "2026-06-28T09:25:00Z" recent: - Succeeded - Running - Succeeded - Failed - Succeeded spec: artifacts: - kind: model name: bert-base version: 2.1.0 backend: engine: pytorchjob name: kubeflow-trainer poolName: gpu-a100 quota: team-nlp roles: - name: worker replicas: 2 restartPolicy: OnFailure template: args: - --lr - "0.001" - --epochs - "10" - --batch-size - "64" command: - python - train.py env: - name: WANDB_MODE value: offline image: registry.axisml.io/training/bert:2.1.0 resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 ttlSecondsAfterFinished: 3600 unitName: a100-2x tenantName: team-nlp updatedAt: "2026-06-28T09:30:00Z" properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. createdAt: description: Time the experiment was created. format: date-time type: string description: description: Free-text experiment description. type: string displayName: description: Human-readable experiment label. type: string id: description: Stable experiment identifier. format: uuid type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels. name: description: Experiment definition name (unique within the tenant). type: string namespace: description: Platform tenant namespace the experiment belongs to. type: string owner: description: Username of the experiment owner. type: string ownerId: description: User ID of the experiment owner. format: uuid type: string runSummary: allOf: - $ref: '#/components/schemas/RunSummary' description: Roll-up of the experiment's Runs (count + recent phases on lists, latest phase on detail). nullable: true spec: allOf: - $ref: '#/components/schemas/JobSpec' description: Reusable run template (isomorphic to a Job spec). tenantName: description: Tenant identifier owning the experiment. type: string updatedAt: description: Time the experiment was last updated. format: date-time type: string required: - createdAt - id - name - namespace - owner - spec - tenantName - updatedAt type: object ExperimentCreateRequest: example: description: Training experiment fine-tuning BERT on a Chinese corpus. displayName: BERT fine-tuning experiment labels: team: nlp name: bert-finetune spec: artifacts: - kind: model name: bert-base version: 2.1.0 backend: engine: pytorchjob name: kubeflow-trainer poolName: gpu-a100 quota: team-nlp roles: - name: worker replicas: 2 restartPolicy: OnFailure template: args: - --lr - "0.001" - --epochs - "10" - --batch-size - "64" command: - python - train.py env: - name: WANDB_MODE value: offline image: registry.axisml.io/training/bert:2.1.0 resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 ttlSecondsAfterFinished: 3600 unitName: a100-2x properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. description: description: Free-text experiment description. maxLength: 1000 type: string displayName: description: Human-readable experiment label. maxLength: 100 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels. name: description: Experiment definition name (unique within the tenant). maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string spec: allOf: - $ref: '#/components/schemas/JobSpec' description: Reusable run template. required: - name - spec type: object ExperimentList: example: continueToken: "" count: 1 items: - annotations: axisml.io/created-by: li.wei createdAt: "2026-06-20T08:00:00Z" description: Training experiment fine-tuning BERT on a Chinese corpus. displayName: BERT fine-tuning experiment id: d4f8a1b2-3c5e-4a7b-9c0d-1e2f3a4b5c6d labels: team: nlp name: bert-finetune namespace: team-nlp owner: zhang.san ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 runSummary: active: 1 count: 5 latestPhase: Succeeded latestRunAt: "2026-06-28T09:25:00Z" recent: - Succeeded - Running - Succeeded - Failed - Succeeded spec: artifacts: - kind: model name: bert-base version: 2.1.0 backend: engine: pytorchjob name: kubeflow-trainer poolName: gpu-a100 quota: team-nlp roles: - name: worker replicas: 2 restartPolicy: OnFailure template: args: - --lr - "0.001" - --epochs - "10" - --batch-size - "64" command: - python - train.py env: - name: WANDB_MODE value: offline image: registry.axisml.io/training/bert:2.1.0 resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 ttlSecondsAfterFinished: 3600 unitName: a100-2x tenantName: team-nlp updatedAt: "2026-06-28T09:30:00Z" partial: false properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of experiments in this page. minimum: 0 type: integer items: description: Experiments in this page. items: $ref: '#/components/schemas/Experiment' type: array partial: description: True if the list was truncated by an upstream limit. type: boolean required: - count - items type: object ExperimentPatchRequest: example: description: Updated description. displayName: BERT fine-tuning experiment (v2) properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement annotation set. description: description: Updated free-text experiment description. maxLength: 1000 type: string displayName: description: Updated human-readable experiment label. maxLength: 100 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement label set. spec: allOf: - $ref: '#/components/schemas/JobSpec' description: Replacement run template (affects only Runs triggered afterwards); omit to patch metadata only. nullable: true type: object HealthStatus: example: components: artifact-hub: ok compute-service: ok database: ok status: ok properties: components: additionalProperties: type: string description: Per-dependency health states keyed by component name. type: object status: description: Overall health state (e.g. ok, degraded). enum: - ok - degraded - unavailable type: string required: - status type: object Image: example: createdAt: "2026-06-20T08:00:00Z" description: Training image with PyTorch 2.3 and CUDA 12. digest: sha256:7f3148e1f4a6c8e3d2b4a6c8e1f9b0d5a2c7f3148e1f4a6c8e3d2b4a6c8e1f9b displayName: PyTorch Training 2.3.0 id: a1b2c3d4-5e6f-7081-92a3-b4c5d6e7f809 name: pytorch-train namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 readyAt: "2026-06-28T09:30:00Z" sizeBytes: 5368709120 source: dockerPush spec: baseImage: nvidia/cuda:12.1.0-runtime purpose: training python: "3.11" status: Ready tenantName: team-vision updatedAt: "2026-06-28T09:30:00Z" uri: oci://registry.axisml.io/team-vision/pytorch-train:2.3.0 version: 2.3.0 properties: createdAt: description: Time the version was created. format: date-time type: string description: description: Free-text version description. type: string digest: description: Content digest of the image. type: string displayName: description: Human-readable version label. type: string id: description: Stable image version identifier. format: uuid type: string name: description: Image definition name (unique within the tenant). type: string namespace: description: Platform tenant namespace the image belongs to. type: string owner: description: Username of the version owner. type: string ownerId: description: User ID of the version owner. format: uuid type: string readyAt: description: Time the version became Ready. format: date-time nullable: true type: string sizeBytes: description: Total size of the image content in bytes. format: int64 type: integer source: allOf: - $ref: '#/components/schemas/ArtifactSource' description: How this version was added (webUpload, oras, dockerPush, external). spec: allOf: - $ref: '#/components/schemas/ImageSpec' description: Pass-through artifact-side spec (free-form). status: allOf: - $ref: '#/components/schemas/ImageStatus' description: Version lifecycle status (Uploading, Ready, Failed, Deleting, Deleted). tenantName: description: Tenant identifier owning the image. type: string updatedAt: description: Time the version was last updated. format: date-time type: string uri: description: Artifact registry URI of the version. type: string version: description: Image version (tag). type: string required: - createdAt - id - name - namespace - status - tenantName - version type: object ImageCompleteRequest: example: digest: sha256:7f3148e1f4a6c8e3d2b4a6c8e1f9b0d5a2c7f3148e1f4a6c8e3d2b4a6c8e1f9b properties: digest: description: Content digest of the pushed image (finalizes the version). type: string required: - digest type: object ImageInitiateRequest: example: description: Training image with PyTorch 2.3 and CUDA 12. displayName: PyTorch Training 2.3.0 source: dockerPush spec: purpose: training version: 2.3.0 properties: description: description: Free-text version description. type: string displayName: description: Human-readable version label. type: string source: allOf: - $ref: '#/components/schemas/ArtifactSource' description: Upload method (dockerPush, external); empty defaults to dockerPush. sourceImageRef: description: Remote image reference to sync (required when source=external). type: string spec: allOf: - $ref: '#/components/schemas/ImageSpec' description: Pass-through artifact-side spec (free-form). version: description: Image version (tag) to create. maxLength: 64 minLength: 1 type: string required: - spec - version type: object ImageInitiateResponse: example: expiresAt: "2026-06-28T09:30:00Z" id: a1b2c3d4-5e6f-7081-92a3-b4c5d6e7f809 storageKind: oci uploadCredentials: password: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 username: upload-token uri: oci://registry.axisml.io/team-vision/pytorch-train:2.3.0 properties: expiresAt: description: Expiry time of the upload credentials. format: date-time type: string id: description: Identifier of the newly initiated image version. format: uuid type: string storageKind: description: Backing store of the push target (oci, s3). enum: - oci - s3 type: string uploadCredentials: additionalProperties: {} description: Short-lived credentials for pushing the image. type: object uri: description: Push target URI for the image content. type: string required: - id - uri type: object ImageList: example: continueToken: "" count: 1 items: - createdAt: "2026-06-20T08:00:00Z" description: Training image with PyTorch 2.3 and CUDA 12. digest: sha256:7f3148e1f4a6c8e3d2b4a6c8e1f9b0d5a2c7f3148e1f4a6c8e3d2b4a6c8e1f9b displayName: PyTorch Training 2.3.0 id: a1b2c3d4-5e6f-7081-92a3-b4c5d6e7f809 name: pytorch-train namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 readyAt: "2026-06-28T09:30:00Z" sizeBytes: 5368709120 source: dockerPush spec: baseImage: nvidia/cuda:12.1.0-runtime purpose: training python: "3.11" status: Ready tenantName: team-vision updatedAt: "2026-06-28T09:30:00Z" uri: oci://registry.axisml.io/team-vision/pytorch-train:2.3.0 version: 2.3.0 partial: false properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of image versions in this page. minimum: 0 type: integer items: description: Image versions in this page. items: $ref: '#/components/schemas/Image' type: array partial: description: True if the list was truncated by an upstream limit. type: boolean required: - count - items type: object ImagePullSecretInit: example: name: registry-pull sourceSecretRef: name: registry-pull namespace: axisml-system properties: name: description: Name of the image pull Secret to create in the tenant namespace. type: string sourceSecretRef: allOf: - $ref: '#/components/schemas/SecretSourceRef' description: Source Secret to copy the pull credentials from. required: - name - sourceSecretRef type: object ImagePurpose: description: Image definition intended use (list filter). enum: - training - inference - workspace - custom type: string ImageSpec: additionalProperties: {} description: Artifact-side spec for kind=image; pass-through to artifacts. type: object ImageStatus: description: Mirrors artifacts ArtifactStatus for kind=image. enum: - Uploading - Ready - Failed - Deleting - Deleted type: string InitResources: example: configMaps: - name: shared-config sourceConfigMapRef: name: shared-config namespace: axisml-system imagePullSecrets: - name: registry-pull sourceSecretRef: name: registry-pull namespace: axisml-system secrets: - name: wandb-api-key sourceSecretRef: name: wandb-api-key namespace: axisml-system type: Opaque serviceAccounts: - imagePullSecrets: - registry-pull name: trainer rbac: roleRefs: - kind: ClusterRole name: edit properties: configMaps: description: ConfigMaps to seed in the tenant namespace. items: $ref: '#/components/schemas/ConfigMapInit' type: array imagePullSecrets: description: Image pull Secrets to seed in the tenant namespace. items: $ref: '#/components/schemas/ImagePullSecretInit' type: array secrets: description: Secrets to seed in the tenant namespace. items: $ref: '#/components/schemas/SecretInit' type: array serviceAccounts: description: ServiceAccounts to seed in the tenant namespace. items: $ref: '#/components/schemas/ServiceAccountInit' type: array type: object Job: example: annotations: axisml.io/created-by: li.wei git-commit: 8c1f4e2 createdAt: "2026-06-20T08:00:00Z" description: Distributed ResNet-50 training job on ImageNet. displayName: ResNet-50 Training id: 8c1f4e22-2b7a-4c0e-9b1d-7f3a2e5c9a10 labels: team: vision name: resnet-train namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 runSummary: active: 1 count: 7 latestPhase: Running latestRunAt: "2026-06-28T09:00:00Z" recent: - Succeeded - Failed - Succeeded - Succeeded - Running spec: artifacts: - kind: model name: resnet50 version: 1.4.0 backend: engine: pytorchjob name: native poolName: gpu-a100 quota: team-vision roles: - name: worker replicas: 4 restartPolicy: OnFailure template: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 progressDeadlineSeconds: 600 ttlSecondsAfterFinished: 3600 unitName: a100-2x tenantName: team-vision updatedAt: "2026-06-28T09:30:00Z" properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. createdAt: description: Time the job was created. format: date-time type: string description: description: Free-text job description. type: string displayName: description: Human-readable job label. type: string id: description: Stable job identifier. format: uuid type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels. name: description: Job definition name (unique within the tenant). type: string namespace: description: Platform tenant namespace the job belongs to. type: string owner: description: Username of the job owner. type: string ownerId: description: User ID of the job owner. format: uuid type: string runSummary: allOf: - $ref: '#/components/schemas/RunSummary' description: Roll-up of the job's Runs (count + recent phases on lists, latest phase on detail). nullable: true spec: allOf: - $ref: '#/components/schemas/JobSpec' description: Reusable run template. tenantName: description: Tenant identifier owning the job. type: string updatedAt: description: Time the job was last updated. format: date-time type: string required: - createdAt - id - name - namespace - owner - spec - tenantName - updatedAt type: object JobCreateRequest: example: description: Distributed ResNet-50 training job on ImageNet. displayName: ResNet-50 Training labels: team: vision name: resnet-train spec: artifacts: - kind: model name: resnet50 version: 1.4.0 backend: engine: pytorchjob name: native poolName: gpu-a100 quota: team-vision roles: - name: worker replicas: 4 restartPolicy: OnFailure template: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 progressDeadlineSeconds: 600 ttlSecondsAfterFinished: 3600 unitName: a100-2x properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. description: description: Free-text job description. maxLength: 1000 type: string displayName: description: Human-readable job label. maxLength: 100 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels. name: description: Job definition name (unique within the tenant). maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string spec: allOf: - $ref: '#/components/schemas/JobSpec' description: Reusable run template. required: - name - spec type: object JobList: example: continueToken: "" count: 1 items: - annotations: axisml.io/created-by: li.wei git-commit: 8c1f4e2 createdAt: "2026-06-20T08:00:00Z" description: Distributed ResNet-50 training job on ImageNet. displayName: ResNet-50 Training id: 8c1f4e22-2b7a-4c0e-9b1d-7f3a2e5c9a10 labels: team: vision name: resnet-train namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 runSummary: active: 1 count: 7 latestPhase: Running latestRunAt: "2026-06-28T09:00:00Z" recent: - Succeeded - Failed - Succeeded - Succeeded - Running spec: artifacts: - kind: model name: resnet50 version: 1.4.0 backend: engine: pytorchjob name: native poolName: gpu-a100 quota: team-vision roles: - name: worker replicas: 4 restartPolicy: OnFailure template: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 progressDeadlineSeconds: 600 ttlSecondsAfterFinished: 3600 unitName: a100-2x tenantName: team-vision updatedAt: "2026-06-28T09:30:00Z" partial: false properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of jobs in this page. minimum: 0 type: integer items: description: Jobs in this page. items: $ref: '#/components/schemas/Job' type: array partial: description: True if the list was truncated by an upstream limit. type: boolean required: - count - items type: object JobPatchRequest: example: description: Updated description. displayName: ResNet-50 Training (v2) properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement annotation set. description: description: Updated free-text job description. maxLength: 1000 type: string displayName: description: Updated human-readable job label. maxLength: 100 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement label set. spec: allOf: - $ref: '#/components/schemas/JobSpec' description: Replacement run template; omit to patch metadata only. nullable: true type: object JobSpec: example: artifacts: - kind: model name: resnet50 version: 1.4.0 backend: engine: pytorchjob name: native poolName: gpu-a100 quota: team-vision roles: - name: worker replicas: 4 restartPolicy: OnFailure template: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 progressDeadlineSeconds: 600 ttlSecondsAfterFinished: 3600 unitName: a100-2x properties: artifacts: description: Model/image artifact versions the runs consume. items: $ref: '#/components/schemas/ArtifactRef' type: array backend: allOf: - $ref: '#/components/schemas/Backend' description: Compute backend/engine the runs use. poolName: description: Default resource pool for runs. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string quota: description: Default ElasticQuota for runs. type: string roles: description: Run topology roles (at least one). items: $ref: '#/components/schemas/MLRunRole' minItems: 1 type: array runPolicy: allOf: - $ref: '#/components/schemas/RunPolicy' description: Default run-level execution limits. unitName: description: Default resource unit (shape) within the pool. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string required: - backend - roles type: object LoginRequest: example: password: S3cure-pass username: li.wei properties: password: description: Account password. format: password minLength: 1 type: string username: description: Account username to authenticate. minLength: 1 type: string required: - password - username type: object LoginResponse: example: expiresAt: "2026-06-28T09:25:00Z" jwt: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJsaS53ZWkifQ.sig tenantRoles: - roleName: admin tenantName: team-vision - roleName: member tenantName: team-nlp user: createdAt: "2026-06-20T08:00:00Z" disabled: false displayName: Li Wei email: li.wei@axisml.io id: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 mustChangePassword: false updatedAt: "2026-06-28T09:30:00Z" username: li.wei properties: expiresAt: description: Time the token expires. format: date-time type: string jwt: description: Signed JWT bearer token for subsequent requests. type: string tenantRoles: description: Tenant/role bindings granted to the user. items: $ref: '#/components/schemas/UserTenantRole' type: array user: allOf: - $ref: '#/components/schemas/User' description: Authenticated user account. required: - jwt - tenantRoles - user type: object MLRunRole: example: name: worker replicas: 4 restartPolicy: OnFailure template: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet properties: name: description: Role name within the run topology (e.g. master, worker). type: string replicas: description: Number of pods for this role. minimum: 1 type: integer restartPolicy: description: Pod restart policy for the role. enum: - Never - OnFailure - Always type: string template: allOf: - $ref: '#/components/schemas/RoleTemplate' description: Pod template for the role. required: - name - template type: object MLRunRoleStatus: example: activeReplicas: 4 failedReplicas: 0 name: worker readyReplicas: 4 replicas: 4 restartPolicy: OnFailure succeededReplicas: 0 template: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet properties: activeReplicas: description: Pods currently running. type: integer failedReplicas: description: Pods that terminated in failure. type: integer name: description: Role name. type: string readyReplicas: description: Pods that have passed readiness. type: integer replicas: description: Desired replica count for the role. type: integer restartPolicy: description: Effective restart policy for the role. type: string succeededReplicas: description: Pods that completed successfully. type: integer template: allOf: - $ref: '#/components/schemas/RoleTemplate' description: Resolved pod template for the role. type: object MLRunSpec: example: backend: engine: pytorchjob name: native roles: - name: worker replicas: 4 restartPolicy: OnFailure template: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 progressDeadlineSeconds: 600 ttlSecondsAfterFinished: 3600 scheduling: minMember: 4 priorityClass: high-priority quota: axisml-team-vision-gpu-a100-default properties: backend: allOf: - $ref: '#/components/schemas/Backend' description: Compute backend/engine. roles: description: Run topology roles. items: $ref: '#/components/schemas/MLRunRole' type: array runPolicy: allOf: - $ref: '#/components/schemas/RunPolicy' description: Run-level execution limits. scheduling: additionalProperties: {} description: Scheduling directives (gang, priority, tolerations). type: object type: object MLService: example: accessUrl: https://gateway.axisml.io/v1/models/llama3-8b args: - --model - meta-llama/Llama-3-8b - --max-model-len - "8192" backend: engine: llminference name: kserve command: - python - -m - vllm.entrypoints.openai.api_server computeNamespace: axisml-team-nlp createdAt: "2026-06-20T08:00:00Z" description: Llama3-8B online inference service. desiredState: Running displayName: Llama3 chat service env: - name: MAX_TOKENS value: "4096" id: 5d2c9b41-3e8f-4a1c-9d7e-6b4f2a1c8e90 image: registry.axisml.io/serving/vllm:0.6.0 message: All replicas ready. modelName: llama3-8b modelVersion: 1.2.0 name: llama3-chat namespace: team-nlp owner: zhang.san ownerId: 9f8e7d6c-5b4a-3210-fedc-ba9876543210 phase: Ready poolName: gpu-a100 ports: - name: http port: 8080 quota: team-nlp readyReplicas: 3 replicas: 3 resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "1" route: enabled: true path: /v1/models/llama3-8b tenantDisplayName: Vision Team tenantName: team-nlp unitName: a100-1x updatedAt: "2026-06-28T09:30:00Z" properties: accessUrl: description: Resolved URL clients use to reach the service. type: string args: description: Container args override. items: type: string type: array backend: allOf: - $ref: '#/components/schemas/Backend' description: Compute backend/engine serving the model. command: description: Container entrypoint override. items: type: string type: array computeNamespace: description: Underlying compute (Kubernetes) namespace running the service. type: string createdAt: description: Time the service was created. format: date-time type: string description: description: Free-text service description. type: string desiredState: allOf: - $ref: '#/components/schemas/MLServiceDesiredState' description: User-requested run state (Running, Stopped); drives the Start/Stop control without inferring from phase. displayName: description: Human-readable service label. type: string env: description: Environment variables injected into the serving pods. items: $ref: '#/components/schemas/EnvVar' type: array id: description: Stable service identifier. format: uuid type: string image: description: Serving container image reference. type: string message: description: Human-readable status detail for the current phase. type: string modelName: description: Model artifact definition name being served. type: string modelVersion: description: Model artifact version being served. type: string name: description: Service name (unique within the tenant). type: string namespace: description: Platform tenant namespace the service belongs to. type: string owner: description: Username of the service owner. type: string ownerId: description: User ID of the service owner. format: uuid type: string phase: allOf: - $ref: '#/components/schemas/MLServicePhase' description: Current service lifecycle phase. poolName: description: Resource pool the service is scheduled onto. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string ports: description: Container ports exposed by the service. items: $ref: '#/components/schemas/ServicePort' type: array quota: description: ElasticQuota the service draws from. type: string readyReplicas: description: Replicas that have passed readiness. minimum: 0 type: integer replicas: description: Desired replica count. minimum: 0 type: integer resources: allOf: - $ref: '#/components/schemas/ResourceMap' description: Per-replica resource requests/limits. route: allOf: - $ref: '#/components/schemas/MLServiceRoute' description: Gateway exposure settings for the service. tenantDisplayName: description: Human-readable tenant name. type: string tenantName: description: Tenant identifier owning the service. type: string unitName: description: Resource unit (shape) within the pool. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string updatedAt: description: Time the service was last updated. format: date-time type: string required: - createdAt - id - name - namespace - owner - tenantName - updatedAt type: object MLServiceCreateRequest: example: backend: engine: llminference name: kserve description: Llama3-8B online inference service. displayName: Llama3 chat service env: - name: MAX_TOKENS value: "4096" image: registry.axisml.io/serving/vllm:0.6.0 modelName: llama3-8b modelVersion: 1.2.0 name: llama3-chat poolName: gpu-a100 ports: - name: http port: 8080 quota: team-nlp replicas: 3 route: enabled: true path: /v1/models/llama3-8b unitName: a100-1x properties: args: description: Container args override. items: type: string type: array backend: allOf: - $ref: '#/components/schemas/Backend' description: Compute backend/engine (defaults from the model/image when omitted). command: description: Container entrypoint override. items: type: string type: array description: description: Free-text service description. maxLength: 1000 type: string displayName: description: Human-readable service label. maxLength: 100 type: string env: description: Environment variables injected into the serving pods. items: $ref: '#/components/schemas/EnvVar' type: array image: description: Serving container image reference. type: string modelName: description: Model artifact definition name to serve. type: string modelVersion: description: Model artifact version to serve. type: string name: description: Service name (unique within the tenant). maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string poolName: description: Resource pool to schedule the service onto. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string ports: description: Container ports exposed by the service (at least one). items: $ref: '#/components/schemas/ServicePort' minItems: 1 type: array quota: description: ElasticQuota the service draws from. type: string replicas: description: Desired replica count. minimum: 0 type: integer route: allOf: - $ref: '#/components/schemas/MLServiceRoute' description: Gateway exposure settings for the service. unitName: description: Resource unit (shape) within the pool. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string required: - image - modelName - modelVersion - name - poolName - ports - replicas - unitName type: object MLServiceDesiredState: enum: - Running - Stopped type: string MLServiceList: example: continueToken: "" count: 1 items: - accessUrl: https://gateway.axisml.io/v1/models/llama3-8b args: - --model - meta-llama/Llama-3-8b - --max-model-len - "8192" backend: engine: llminference name: kserve command: - python - -m - vllm.entrypoints.openai.api_server computeNamespace: axisml-team-nlp createdAt: "2026-06-20T08:00:00Z" description: Llama3-8B online inference service. desiredState: Running displayName: Llama3 chat service env: - name: MAX_TOKENS value: "4096" id: 5d2c9b41-3e8f-4a1c-9d7e-6b4f2a1c8e90 image: registry.axisml.io/serving/vllm:0.6.0 message: All replicas ready. modelName: llama3-8b modelVersion: 1.2.0 name: llama3-chat namespace: team-nlp owner: zhang.san ownerId: 9f8e7d6c-5b4a-3210-fedc-ba9876543210 phase: Ready poolName: gpu-a100 ports: - name: http port: 8080 quota: team-nlp readyReplicas: 3 replicas: 3 resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "1" route: enabled: true path: /v1/models/llama3-8b tenantDisplayName: Vision Team tenantName: team-nlp unitName: a100-1x updatedAt: "2026-06-28T09:30:00Z" partial: false properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of services in this page. minimum: 0 type: integer items: description: Services in this page. items: $ref: '#/components/schemas/MLService' type: array partial: description: True if the list was truncated by an upstream limit. type: boolean required: - count - items type: object MLServiceMetricName: enum: - request_rate - latency - error_rate - cpu_util - mem_util - gpu_util type: string MLServicePatchRequest: example: description: Updated description. displayName: Llama3 chat service (v2) properties: description: description: Updated free-text service description. maxLength: 1000 type: string displayName: description: Updated human-readable service label. maxLength: 100 type: string type: object MLServicePhase: enum: - Creating - Pending - Ready - Degraded - Failed - Stopped - Deleting - Deleted type: string MLServiceRoute: example: enabled: true path: /v1/models/llama3-8b properties: enabled: description: Whether the service is exposed through the gateway. type: boolean path: description: Gateway route path the service is served under. type: string type: object MLServiceScaleRequest: example: replicas: 5 properties: replicas: description: Target replica count to scale the service to. minimum: 0 type: integer required: - replicas type: object MeResponse: example: isSystemAdmin: false permissions: - job:read - job:write - run:read - run:trigger tenantRoles: - roleName: admin tenantName: team-vision - roleName: member tenantName: team-nlp user: createdAt: "2026-06-20T08:00:00Z" disabled: false displayName: Li Wei email: li.wei@axisml.io id: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 mustChangePassword: false updatedAt: "2026-06-28T09:30:00Z" username: li.wei properties: isSystemAdmin: description: True if the caller holds the system administrator role. type: boolean permissions: description: Flattened permission strings resolved from the caller's roles. items: type: string type: array tenantRoles: description: The caller's tenant/role bindings. items: $ref: '#/components/schemas/UserTenantRole' type: array user: allOf: - $ref: '#/components/schemas/User' description: The caller's user account. required: - isSystemAdmin - permissions - tenantRoles - user type: object Member: example: addedAt: "2026-06-20T08:00:00Z" displayName: Li Wei email: li.wei@example.com roleName: tenant-admin userId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 username: li.wei properties: addedAt: description: Time the member was added to the tenant. format: date-time type: string displayName: description: Human-readable name of the member. type: string email: description: Email address of the member. format: email type: string roleName: allOf: - $ref: '#/components/schemas/RoleName' description: Role granted to the member within the tenant. userId: description: User ID of the member. format: uuid type: string username: description: Username of the member. type: string required: - addedAt - roleName - userId - username type: object MemberCreateRequest: example: account: zhang.san@example.com roleName: user properties: account: description: Email or username of the existing platform user to add. type: string roleName: description: Role to grant the member (tenant-admin or user). enum: - tenant-admin - user type: string required: - account - roleName type: object MemberList: example: continueToken: "" count: 1 items: - addedAt: "2026-06-20T08:00:00Z" displayName: Li Wei email: li.wei@example.com roleName: tenant-admin userId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 username: li.wei properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of members in this page. minimum: 0 type: integer items: description: Members in this page. items: $ref: '#/components/schemas/Member' type: array required: - count - items type: object MemberPatchRequest: example: roleName: tenant-admin properties: roleName: description: New role for the member (tenant-admin or user). enum: - tenant-admin - user type: string required: - roleName type: object MetricPoint: example: timestamp: "2026-06-28T09:00:00Z" value: 12.5 properties: timestamp: description: Sample timestamp. format: date-time type: string value: description: Sample value. format: double type: number required: - timestamp - value type: object MetricSeries: example: metric: qps percentile: p95 range: 1h series: - timestamp: "2026-06-28T09:00:00Z" value: 12.5 - timestamp: "2026-06-28T09:30:00Z" value: 18.3 - timestamp: "2026-06-28T09:25:00Z" value: 15.1 step: 1m unit: req/s properties: metric: description: Metric name (e.g. qps, latency). type: string percentile: description: Percentile the series represents (e.g. p95). type: string range: description: Query time range (e.g. 1h). type: string series: description: Ordered (timestamp, value) samples. items: $ref: '#/components/schemas/MetricPoint' type: array step: description: Sampling step between points (e.g. 1m). type: string unit: description: Value unit (e.g. ms, req/s). type: string required: - metric - range - series type: object Model: example: createdAt: "2026-06-20T08:00:00Z" description: ResNet-50 weights fine-tuned on ImageNet. digest: sha256:9b0d5a2c7f3148e1f4a6c8e3d2b4a6c8e1f9b0d5a2c7f3148e1f4a6c8e3d2b4a displayName: ResNet-50 v1.4.0 id: c4a7f1e9-3d2b-4a6c-8e1f-9b0d5a2c7f31 name: resnet50 namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 readyAt: "2026-06-28T09:30:00Z" sizeBytes: 102457600 source: webUpload spec: format: safetensors framework: pytorch parameters: 25.6M task: image-classification status: Ready tenantName: team-vision updatedAt: "2026-06-28T09:30:00Z" uri: oci://registry.axisml.io/team-vision/resnet50:1.4.0 version: 1.4.0 properties: createdAt: description: Time the version was created. format: date-time type: string description: description: Free-text version description. type: string digest: description: Content digest of the uploaded artifact. type: string displayName: description: Human-readable version label. type: string id: description: Stable model version identifier. format: uuid type: string name: description: Model definition name (unique within the tenant). type: string namespace: description: Platform tenant namespace the model belongs to. type: string owner: description: Username of the version owner. type: string ownerId: description: User ID of the version owner. format: uuid type: string readyAt: description: Time the version became Ready. format: date-time nullable: true type: string sizeBytes: description: Total size of the version content in bytes. format: int64 type: integer source: allOf: - $ref: '#/components/schemas/ArtifactSource' description: How this version was added (webUpload, oras, dockerPush, external). spec: allOf: - $ref: '#/components/schemas/ModelSpec' description: Pass-through artifact-side spec (free-form). status: allOf: - $ref: '#/components/schemas/ModelStatus' description: Version lifecycle status (Uploading, Ready, Failed, Deleting, Deleted). tenantName: description: Tenant identifier owning the model. type: string updatedAt: description: Time the version was last updated. format: date-time type: string uri: description: Artifact registry URI of the version. type: string version: description: Model version label. type: string required: - createdAt - id - name - namespace - status - tenantName - version type: object ModelCompleteRequest: example: digest: sha256:9b0d5a2c7f3148e1f4a6c8e3d2b4a6c8e1f9b0d5a2c7f3148e1f4a6c8e3d2b4a properties: digest: description: Content digest of the uploaded artifact (finalizes the version). type: string required: - digest type: object ModelInitiateRequest: example: description: ResNet-50 weights fine-tuned on ImageNet. displayName: ResNet-50 v1.4.0 source: webUpload version: 1.4.0 properties: description: description: Free-text version description. type: string displayName: description: Human-readable version label. type: string remoteSourceKind: allOf: - $ref: '#/components/schemas/RemoteSourceKind' description: Backing store of the remote URI (s3, oci, http, hf, custom); required when source=external. remoteUri: description: Remote artifact URI to register (required when source=external). type: string source: allOf: - $ref: '#/components/schemas/ArtifactSource' description: Upload method (webUpload, oras, external); empty defaults to webUpload. spec: allOf: - $ref: '#/components/schemas/ModelSpec' description: Pass-through artifact-side spec (free-form). version: description: Model version label to create. maxLength: 64 minLength: 1 type: string required: - version type: object ModelInitiateResponse: example: expiresAt: "2026-06-28T09:30:00Z" id: c4a7f1e9-3d2b-4a6c-8e1f-9b0d5a2c7f31 storageKind: oci uploadCredentials: password: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 username: upload-token uri: oci://registry.axisml.io/team-vision/resnet50:1.4.0 properties: expiresAt: description: Expiry time of the upload credentials. format: date-time type: string id: description: Identifier of the newly initiated model version. format: uuid type: string storageKind: description: Backing store of the upload target (oci, s3). enum: - oci - s3 type: string uploadCredentials: additionalProperties: {} description: Short-lived credentials for pushing the content. type: object uri: description: Upload target URI for the version content. type: string required: - id - uri type: object ModelList: example: continueToken: "" count: 1 items: - createdAt: "2026-06-20T08:00:00Z" description: ResNet-50 weights fine-tuned on ImageNet. digest: sha256:9b0d5a2c7f3148e1f4a6c8e3d2b4a6c8e1f9b0d5a2c7f3148e1f4a6c8e3d2b4a displayName: ResNet-50 v1.4.0 id: c4a7f1e9-3d2b-4a6c-8e1f-9b0d5a2c7f31 name: resnet50 namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 readyAt: "2026-06-28T09:30:00Z" sizeBytes: 102457600 source: webUpload spec: format: safetensors framework: pytorch parameters: 25.6M task: image-classification status: Ready tenantName: team-vision updatedAt: "2026-06-28T09:30:00Z" uri: oci://registry.axisml.io/team-vision/resnet50:1.4.0 version: 1.4.0 partial: false properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of model versions in this page. minimum: 0 type: integer items: description: Model versions in this page. items: $ref: '#/components/schemas/Model' type: array partial: description: True if the list was truncated by an upstream limit. type: boolean required: - count - items type: object ModelSpec: additionalProperties: {} description: Artifact-side spec for kind=model; pass-through to artifacts. type: object ModelStatus: description: Mirrors artifacts ArtifactStatus for kind=model. enum: - Uploading - Ready - Failed - Deleting - Deleted type: string Pod: example: name: resnet-train-7-worker-0 nodeName: gpu-node-03 phase: Running replicaIndex: 0 restartCount: 0 role: worker startedAt: "2026-06-28T09:00:00Z" properties: exitCode: description: Exit code of the container's main process. nullable: true type: integer finishedAt: description: Time the pod terminated. format: date-time nullable: true type: string message: description: Human-readable status detail for the pod. type: string name: description: Pod name. type: string nodeName: description: Node the pod is scheduled on. type: string phase: description: Pod lifecycle phase (Pending, Running, Succeeded, Failed, Unknown). enum: - Pending - Running - Succeeded - Failed - Unknown type: string replicaIndex: description: Zero-based replica index within the role. minimum: 0 type: integer restartCount: description: Number of times the pod's container has restarted. minimum: 0 type: integer role: description: Topology role the pod belongs to (e.g. master, worker). type: string startedAt: description: Time the pod started running. format: date-time nullable: true type: string required: - name - phase type: object PodList: example: count: 1 items: - name: resnet-train-7-worker-0 nodeName: gpu-node-03 phase: Running replicaIndex: 0 restartCount: 0 role: worker startedAt: "2026-06-28T09:00:00Z" properties: count: description: Number of pods in the list. minimum: 0 type: integer items: description: Pods in the list. items: $ref: '#/components/schemas/Pod' type: array required: - count - items type: object Problem: example: code: JOB_NOT_FOUND detail: Job "resnet-train" was not found in tenant "team-vision". instance: /api/v1/jobs/resnet-train status: 404 title: Not Found type: https://docs.axisml.io/errors/not-found properties: code: description: Stable machine-readable error code. type: string detail: description: Human-readable explanation specific to this occurrence. type: string errors: description: Field-level validation errors, when applicable. items: $ref: '#/components/schemas/ProblemFieldError' type: array instance: description: URI reference identifying the specific occurrence of the problem. type: string status: description: HTTP status code for this occurrence of the problem. maximum: 599 minimum: 100 type: integer title: description: Short, human-readable summary of the problem type. type: string type: description: URI reference identifying the problem type. format: uri type: string type: object ProblemFieldError: example: field: spec.roles message: must contain at least one role properties: field: description: Name of the field that failed validation. type: string message: description: Human-readable description of the validation failure. type: string required: - field - message type: object Quota: example: pool: gpu-a100 units: - quantity: 4 unitName: a100-2x properties: pool: description: Resource pool the quota allocates from. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string quota: allOf: - $ref: '#/components/schemas/QuotaResources' description: Direct min/max resources for the pool. Mutually exclusive with units. nullable: true units: description: Per-unit allocations within the pool. Mutually exclusive with quota. items: $ref: '#/components/schemas/QuotaUnit' type: array required: - pool type: object QuotaCreateRequest: example: pool: gpu-a100 units: - quantity: 4 unitName: a100-2x properties: pool: description: Resource pool to set quota for. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string quota: allOf: - $ref: '#/components/schemas/QuotaResources' description: Direct min/max resources for the pool. Mutually exclusive with units. nullable: true units: description: Per-unit allocations to grant in the pool. Mutually exclusive with quota. items: $ref: '#/components/schemas/QuotaUnit' type: array required: - pool type: object QuotaList: example: count: 1 items: - pool: gpu-a100 units: - quantity: 4 unitName: a100-2x statuses: - pool: gpu-a100 units: - quantity: 4 unitName: a100-2x used: 3 properties: count: description: Number of pool quotas in this list. minimum: 0 type: integer items: description: Per-pool quota allocations for the tenant. items: $ref: '#/components/schemas/Quota' type: array statuses: description: Live per-pool usage matching the items. items: $ref: '#/components/schemas/QuotaStatus' type: array required: - count - items type: object QuotaPatchRequest: example: units: - quantity: 6 unitName: a100-2x properties: quota: allOf: - $ref: '#/components/schemas/QuotaResources' description: Replacement direct min/max resources for the pool. Mutually exclusive with units. nullable: true units: description: Replacement per-unit allocations for the pool. Mutually exclusive with quota. items: $ref: '#/components/schemas/QuotaUnit' type: array type: object QuotaResources: properties: max: additionalProperties: type: string description: ElasticQuota maximum resources (resource.Quantity strings). type: object min: additionalProperties: type: string description: ElasticQuota minimum resources (resource.Quantity strings). type: object required: - max type: object QuotaStatus: example: pool: gpu-a100 units: - quantity: 4 unitName: a100-2x used: 3 properties: pool: description: Resource pool the status refers to. type: string units: description: Live per-unit usage within the pool. items: $ref: '#/components/schemas/QuotaUnitStatus' type: array required: - pool type: object QuotaUnit: example: quantity: 4 unitName: a100-2x properties: quantity: description: Number of units of this shape allocated to the tenant. minimum: 0 type: integer unitName: description: Resource unit (shape) name within the pool. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string required: - quantity - unitName type: object QuotaUnitStatus: example: quantity: 4 unitName: a100-2x used: 3 properties: quantity: description: Number of units allocated to the tenant. type: integer unitName: description: Resource unit (shape) name. type: string used: description: Number of units currently in use. type: integer required: - quantity - unitName type: object RefreshResponse: example: expiresAt: "2026-06-28T09:25:00Z" jwt: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJsaS53ZWkifQ.sig2 properties: expiresAt: description: Time the new token expires. format: date-time type: string jwt: description: Newly issued JWT bearer token. type: string required: - jwt type: object RemoteSourceKind: description: Backing store of an externally-registered model version. enum: - s3 - oci - http - hf - custom type: string ResourceMap: additionalProperties: type: string description: 'Kubernetes-style resource quantity map (e.g., {"cpu": "100", "memory": "1Ti", "nvidia.com/gpu": "8"}).' type: object ResourcePool: example: annotations: axisml.io/cost-center: ml-platform axisml.io/created-by: admin createdAt: "2026-06-20T08:00:00Z" description: A100 GPU resource pool. labels: tier: gpu name: gpu-a100 nodeCount: 8 nodeSelector: axisml.io/gpu: a100 resourceVersion: "184321" tolerations: - effect: NoSchedule key: nvidia.com/gpu operator: Exists units: - annotations: axisml.io/cost-center: ml-platform axisml.io/created-by: admin description: 2x A100 GPU compute unit. limits: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" name: a100-2x nodeSelector: arch: amd64 gpu.product: A100 requests: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" tolerations: - effect: NoSchedule key: nvidia.com/gpu operator: Exists updatedAt: "2026-06-28T09:30:00Z" properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. createdAt: description: Time the pool was created. format: date-time type: string description: description: Free-text pool description. type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels. name: description: Cluster-scoped resource pool name (unique across the cluster). type: string nodeCount: description: Number of nodes currently matched by the pool's node selector (read-only). type: integer nodeSelector: allOf: - $ref: '#/components/schemas/StringMap' description: Node labels selecting the nodes that back this pool. resourceVersion: description: Kubernetes resourceVersion for optimistic concurrency. type: string tolerations: description: Pod tolerations applied to workloads scheduled onto the pool. items: $ref: '#/components/schemas/Toleration' type: array units: description: Resource unit shapes embedded in the pool's spec.units[]. items: $ref: '#/components/schemas/ResourceUnit' type: array updatedAt: description: Time the pool was last updated. format: date-time type: string required: - createdAt - name type: object ResourcePoolCreateRequest: example: description: A100 GPU resource pool. labels: tier: gpu name: gpu-a100 nodeSelector: axisml.io/gpu: a100 units: - description: 2x A100 GPU compute unit. limits: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" name: a100-2x requests: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. description: description: Free-text pool description. maxLength: 1000 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels. name: description: Cluster-scoped resource pool name (unique across the cluster). maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string nodeSelector: allOf: - $ref: '#/components/schemas/StringMap' description: Node labels selecting the nodes that back this pool. tolerations: description: Pod tolerations applied to workloads scheduled onto the pool. items: $ref: '#/components/schemas/Toleration' type: array units: description: Resource unit shapes to embed in the pool. items: $ref: '#/components/schemas/ResourceUnitCreateRequest' type: array required: - name type: object ResourcePoolList: example: continueToken: "" count: 1 items: - annotations: axisml.io/cost-center: ml-platform axisml.io/created-by: admin createdAt: "2026-06-20T08:00:00Z" description: A100 GPU resource pool. labels: tier: gpu name: gpu-a100 nodeCount: 8 nodeSelector: axisml.io/gpu: a100 resourceVersion: "184321" tolerations: - effect: NoSchedule key: nvidia.com/gpu operator: Exists units: - annotations: axisml.io/cost-center: ml-platform axisml.io/created-by: admin description: 2x A100 GPU compute unit. limits: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" name: a100-2x nodeSelector: arch: amd64 gpu.product: A100 requests: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" tolerations: - effect: NoSchedule key: nvidia.com/gpu operator: Exists updatedAt: "2026-06-28T09:30:00Z" properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of pools in this page. minimum: 0 type: integer items: description: Resource pools in this page. items: $ref: '#/components/schemas/ResourcePool' type: array required: - count - items type: object ResourcePoolPatchRequest: example: description: Updated A100 GPU resource pool. nodeSelector: axisml.io/gpu: a100 axisml.io/zone: cn-east-1 properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement annotation set. description: description: Updated free-text pool description. maxLength: 1000 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement label set. nodeSelector: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement node selector. tolerations: description: Replacement toleration set. items: $ref: '#/components/schemas/Toleration' type: array type: object ResourceUnit: example: annotations: axisml.io/cost-center: ml-platform axisml.io/created-by: admin description: 2x A100 GPU compute unit. limits: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" name: a100-2x nodeSelector: arch: amd64 gpu.product: A100 requests: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" tolerations: - effect: NoSchedule key: nvidia.com/gpu operator: Exists properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. description: description: Free-text unit description. type: string limits: allOf: - $ref: '#/components/schemas/ResourceMap' description: Resource limits for the unit shape. name: description: Resource unit (shape) name, unique within the pool. type: string nodeSelector: allOf: - $ref: '#/components/schemas/StringMap' description: Additional node labels narrowing placement for this unit. requests: allOf: - $ref: '#/components/schemas/ResourceMap' description: Resource requests defining the unit shape (e.g. cpu, memory, nvidia.com/gpu). tolerations: description: Additional pod tolerations for this unit. items: $ref: '#/components/schemas/Toleration' type: array required: - limits - name - requests type: object ResourceUnitCreateRequest: example: description: 2x A100 GPU compute unit. limits: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" name: a100-2x requests: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. description: description: Free-text unit description. maxLength: 1000 type: string limits: allOf: - $ref: '#/components/schemas/ResourceMap' description: Resource limits for the unit shape. name: description: Resource unit (shape) name, unique within the pool. maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string nodeSelector: allOf: - $ref: '#/components/schemas/StringMap' description: Additional node labels narrowing placement for this unit. requests: allOf: - $ref: '#/components/schemas/ResourceMap' description: Resource requests defining the unit shape (e.g. cpu, memory, nvidia.com/gpu). tolerations: description: Additional pod tolerations for this unit. items: $ref: '#/components/schemas/Toleration' type: array required: - limits - name - requests type: object ResourceUnitList: example: continueToken: "" count: 1 items: - annotations: axisml.io/cost-center: ml-platform axisml.io/created-by: admin description: 2x A100 GPU compute unit. limits: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" name: a100-2x nodeSelector: arch: amd64 gpu.product: A100 requests: cpu: "16" memory: 128Gi nvidia.com/gpu: "2" tolerations: - effect: NoSchedule key: nvidia.com/gpu operator: Exists properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of units in this page. minimum: 0 type: integer items: description: Resource units in this page. items: $ref: '#/components/schemas/ResourceUnit' type: array required: - count - items type: object ResourceUnitPatchRequest: example: description: Updated 2x A100 GPU compute unit. limits: cpu: "24" memory: 192Gi nvidia.com/gpu: "2" properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement annotation set. description: description: Updated free-text unit description. maxLength: 1000 type: string limits: allOf: - $ref: '#/components/schemas/ResourceMap' description: Replacement resource limits. nodeSelector: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement node selector. requests: allOf: - $ref: '#/components/schemas/ResourceMap' description: Replacement resource requests. tolerations: description: Replacement toleration set. items: $ref: '#/components/schemas/Toleration' type: array type: object RoleName: enum: - system-admin - tenant-admin - user type: string RoleTemplate: example: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet properties: args: description: Container args override. items: type: string type: array command: description: Container entrypoint override. items: type: string type: array env: description: Environment variables injected into the role's pods. items: $ref: '#/components/schemas/EnvVar' type: array image: description: Container image reference for this role's pods. type: string ports: description: Container ports (pass-through to the K8s container ports shape). items: additionalProperties: {} type: object type: array resources: allOf: - $ref: '#/components/schemas/ResourceMap' description: Per-replica resource requests/limits. volumeMounts: description: Container volume mounts (pass-through to the K8s shape). items: additionalProperties: {} type: object type: array volumes: description: Pod volumes (pass-through to the K8s PodSpec volumes shape). items: additionalProperties: {} type: object type: array type: object Run: example: backend: engine: pytorchjob name: native computeNamespace: axisml-team-vision createdAt: "2026-06-28T09:00:00Z" description: Distributed ResNet-50 training run on ImageNet. displayName: 'ResNet-50 Training #7' id: b7d9e3f1-1a2b-3c4d-5e6f-708192a3b4c5 jobName: resnet-train message: All worker replicas ready. name: resnet-train-7 namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 phase: Running poolName: gpu-a100 quota: team-vision resources: cpu: "32" memory: 256Gi nvidia.com/gpu: "8" roles: - activeReplicas: 4 failedReplicas: 0 name: worker readyReplicas: 4 replicas: 4 restartPolicy: OnFailure succeededReplicas: 0 template: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet runNumber: 7 runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 progressDeadlineSeconds: 600 ttlSecondsAfterFinished: 3600 scheduledAt: "2026-06-28T09:00:00Z" spec: backend: engine: pytorchjob name: native roles: - name: worker replicas: 4 restartPolicy: OnFailure template: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 progressDeadlineSeconds: 600 ttlSecondsAfterFinished: 3600 scheduling: minMember: 4 priorityClass: high-priority quota: axisml-team-vision-gpu-a100-default startedAt: "2026-06-28T09:00:00Z" tenantDisplayName: Vision Team tenantName: team-vision unitName: a100-2x updatedAt: "2026-06-28T09:30:00Z" properties: backend: allOf: - $ref: '#/components/schemas/Backend' description: Compute backend/engine executing the run. computeNamespace: description: Underlying compute (Kubernetes) namespace executing the run. type: string createdAt: description: Time the run was created. format: date-time type: string description: description: Free-text run description. type: string displayName: description: Human-readable run label. type: string finishedAt: description: Time the run reached a terminal phase. format: date-time nullable: true type: string id: description: Stable run identifier. format: uuid type: string jobName: description: Name of the Job definition that produced this run. type: string message: description: Human-readable status detail for the current phase. type: string name: description: Run name (-). type: string namespace: description: Platform tenant namespace the run belongs to. type: string owner: description: Username of the run owner. type: string ownerId: description: User ID of the run owner. format: uuid type: string phase: allOf: - $ref: '#/components/schemas/RunPhase' description: Current run lifecycle phase. poolName: description: Resource pool the run is scheduled onto. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string quota: description: ElasticQuota the run draws from. type: string resources: allOf: - $ref: '#/components/schemas/ResourceMap' description: Aggregate resources reserved by the run. roles: description: Live per-role status. items: $ref: '#/components/schemas/MLRunRoleStatus' type: array runNumber: description: Monotonic per-job run sequence number. type: integer runPolicy: allOf: - $ref: '#/components/schemas/RunPolicy' description: Effective run-level execution limits. scheduledAt: description: Time the run was admitted by the scheduler (left Pending). format: date-time nullable: true type: string spec: allOf: - $ref: '#/components/schemas/MLRunSpec' description: Full resolved run spec (for the YAML view). startedAt: description: Time the run started executing. format: date-time nullable: true type: string tenantDisplayName: description: Human-readable tenant name. type: string tenantName: description: Tenant identifier owning the run. type: string unitName: description: Resource unit (shape) within the pool. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string updatedAt: description: Time the run was last updated. format: date-time type: string required: - backend - createdAt - name - namespace - owner - tenantName - updatedAt type: object RunList: example: continueToken: "" count: 1 items: - backend: engine: pytorchjob name: native computeNamespace: axisml-team-vision createdAt: "2026-06-28T09:00:00Z" description: Distributed ResNet-50 training run on ImageNet. displayName: 'ResNet-50 Training #7' id: b7d9e3f1-1a2b-3c4d-5e6f-708192a3b4c5 jobName: resnet-train message: All worker replicas ready. name: resnet-train-7 namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 phase: Running poolName: gpu-a100 quota: team-vision resources: cpu: "32" memory: 256Gi nvidia.com/gpu: "8" roles: - activeReplicas: 4 failedReplicas: 0 name: worker readyReplicas: 4 replicas: 4 restartPolicy: OnFailure succeededReplicas: 0 template: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet runNumber: 7 runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 progressDeadlineSeconds: 600 ttlSecondsAfterFinished: 3600 scheduledAt: "2026-06-28T09:00:00Z" spec: backend: engine: pytorchjob name: native roles: - name: worker replicas: 4 restartPolicy: OnFailure template: args: - --epochs - "90" - --batch-size - "256" command: - python - train.py env: - name: NCCL_DEBUG value: INFO image: registry.axisml.io/training/resnet:1.4.0 ports: - containerPort: 8080 name: http protocol: TCP resources: cpu: "8" memory: 64Gi nvidia.com/gpu: "2" volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: resnet-imagenet runPolicy: activeDeadlineSeconds: 86400 backoffLimit: 2 progressDeadlineSeconds: 600 ttlSecondsAfterFinished: 3600 scheduling: minMember: 4 priorityClass: high-priority quota: axisml-team-vision-gpu-a100-default startedAt: "2026-06-28T09:00:00Z" tenantDisplayName: Vision Team tenantName: team-vision unitName: a100-2x updatedAt: "2026-06-28T09:30:00Z" partial: false properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of runs in this page. minimum: 0 type: integer items: description: Runs in this page. items: $ref: '#/components/schemas/Run' type: array partial: description: True if the list was truncated by an upstream limit. type: boolean required: - count - items type: object RunPhase: description: Run (compute MLRun) phase. The active (non-terminal) phases — Creating / Pending / Running / Canceling — block Job-definition deletion. enum: - Creating - Pending - Running - Succeeded - Failed - Canceling - Cancelled - Deleting - Deleted type: string RunPolicy: example: activeDeadlineSeconds: 86400 backoffLimit: 2 progressDeadlineSeconds: 600 ttlSecondsAfterFinished: 3600 properties: activeDeadlineSeconds: description: Hard wall-clock limit (seconds) before the run is terminated. minimum: 1 type: integer backoffLimit: description: Number of retries before the run is marked failed. minimum: 0 type: integer progressDeadlineSeconds: description: Seconds without progress before the run is considered stalled. minimum: 1 type: integer ttlSecondsAfterFinished: description: Seconds to retain a finished run before garbage collection. minimum: 0 type: integer type: object RunSummary: example: active: 1 count: 7 latestPhase: Running latestRunAt: "2026-06-28T09:00:00Z" recent: - Succeeded - Failed - Succeeded - Succeeded - Running properties: active: description: Runs currently in a non-terminal phase. type: integer count: description: Total number of Runs of the definition. minimum: 0 type: integer latestPhase: allOf: - $ref: '#/components/schemas/RunPhase' description: Phase of the most recent Run. latestRunAt: description: Creation time of the most recent Run. format: date-time nullable: true type: string recent: description: Most-recent Run phases, oldest-to-newest, for the status strip. items: $ref: '#/components/schemas/RunPhase' type: array required: - count type: object RunTriggerRequest: example: displayName: 'ResNet-50 Training #8' poolName: gpu-a100 quota: team-vision roles: - args: - --epochs - "120" name: worker unitName: a100-2x properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: Annotations for the triggered run. artifacts: description: Override artifact versions for this run. items: $ref: '#/components/schemas/ArtifactRef' type: array displayName: description: Display name for the triggered run. maxLength: 100 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: Labels for the triggered run. poolName: description: Override resource pool for this run. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string quota: description: Override ElasticQuota for this run. type: string resources: allOf: - $ref: '#/components/schemas/ResourceMap' description: Override aggregate resources for this run. roles: description: Per-role trigger-time overrides. items: properties: args: description: Override container args for the role. items: type: string type: array env: description: Override environment variables for the role. items: $ref: '#/components/schemas/EnvVar' type: array name: description: Role name to override. type: string required: - name type: object type: array unitName: description: Override resource unit (shape) for this run. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string type: object SecretInit: example: name: wandb-api-key sourceSecretRef: name: wandb-api-key namespace: axisml-system type: Opaque properties: name: description: Name of the Secret to create in the tenant namespace. type: string sourceSecretRef: allOf: - $ref: '#/components/schemas/SecretSourceRef' description: Source Secret to copy the data from. type: description: Kubernetes Secret type (e.g. Opaque). type: string required: - name - sourceSecretRef type: object SecretSourceRef: example: name: registry-pull namespace: axisml-system properties: name: description: Name of the source Secret. type: string namespace: description: Namespace holding the source Secret. type: string required: - name - namespace type: object ServiceAccountInit: example: imagePullSecrets: - registry-pull name: trainer rbac: roleRefs: - kind: ClusterRole name: edit properties: imagePullSecrets: description: Image pull Secret names attached to the ServiceAccount. items: type: string type: array name: description: Name of the ServiceAccount to create in the tenant namespace. type: string rbac: additionalProperties: {} description: RBAC rules to bind to the ServiceAccount. type: object required: - name type: object ServicePort: example: name: http port: 8080 properties: name: description: Port name (unique within the service). maxLength: 15 type: string port: description: Container port number the service listens on. maximum: 65535 minimum: 1 type: integer required: - name - port type: object SetPasswordRequest: example: currentPassword: S3cure-pass newPassword: S3cure-pass2 properties: currentPassword: description: Existing password, required when a user changes their own password. format: password type: string newPassword: description: New password to set. format: password minLength: 8 type: string required: - newPassword type: object StorageClass: example: allowVolumeExpansion: true default: false name: nfs-rwx provisioner: nfs.csi.k8s.io properties: allowVolumeExpansion: description: Whether volumes on this class can be expanded. type: boolean default: description: Whether this is the cluster default StorageClass. type: boolean name: description: StorageClass name. type: string provisioner: description: Provisioner backing the class. type: string required: - allowVolumeExpansion - default - name type: object StorageClassList: example: count: 1 items: - allowVolumeExpansion: true default: false name: nfs-rwx provisioner: nfs.csi.k8s.io properties: count: description: Number of storage classes. type: integer items: description: Available storage classes. items: $ref: '#/components/schemas/StorageClass' type: array required: - count - items type: object StringMap: additionalProperties: type: string type: object Tenant: example: activeExperimentRuns: 2 activeJobRuns: 3 annotations: axisml.io/created-by: system-admin createdAt: "2026-06-20T08:00:00Z" description: Computer-vision model training and inference team. displayName: Vision Team identifier: team-vision initResources: configMaps: - name: shared-config sourceConfigMapRef: name: shared-config namespace: axisml-system imagePullSecrets: - name: registry-pull sourceSecretRef: name: registry-pull namespace: axisml-system secrets: - name: wandb-api-key sourceSecretRef: name: wandb-api-key namespace: axisml-system type: Opaque serviceAccounts: - imagePullSecrets: - registry-pull name: trainer rbac: roleRefs: - kind: ClusterRole name: edit kubernetesNamespace: axisml-team-vision labels: team: vision memberCount: 8 onlineServices: 1 owner: li.wei phase: Active quotas: - pool: gpu-a100 units: - quantity: 4 unitName: a100-2x status: conditions: - lastTransitionTime: "2026-06-28T09:30:00Z" message: Namespace and quota provisioned. reason: Provisioned status: "True" type: Ready message: Tenant is active. quotas: - pool: gpu-a100 units: - quantity: 4 unitName: a100-2x used: 3 suspended: false updatedAt: "2026-06-28T09:30:00Z" properties: activeExperimentRuns: description: Number of active experiment runs in the tenant. type: integer activeJobRuns: description: Number of active job runs in the tenant. type: integer annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. createdAt: description: Time the tenant was created. format: date-time type: string description: description: Free-text tenant description. type: string displayName: description: Human-readable tenant name. type: string identifier: description: Stable logical tenant scope used across Platform, compute and artifacts. type: string initResources: allOf: - $ref: '#/components/schemas/InitResources' description: Bootstrap objects seeded into the tenant namespace. kubernetesNamespace: description: Physical Kubernetes namespace backing the tenant (may be shared). type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels. memberCount: description: Number of members bound to the tenant. type: integer onlineServices: description: Number of online ML services in the tenant. type: integer owner: description: Username of the tenant owner. type: string phase: allOf: - $ref: '#/components/schemas/TenantPhase' description: Current tenant lifecycle phase (read live from cluster-manager). quotas: description: Per-pool resource quota allocations. items: $ref: '#/components/schemas/Quota' type: array status: allOf: - $ref: '#/components/schemas/TenantStatus' description: Live tenant status detail. suspended: description: Whether new workloads are blocked (Platform-enforced). type: boolean updatedAt: description: Time the tenant was last updated. format: date-time type: string required: - activeExperimentRuns - activeJobRuns - createdAt - displayName - identifier - kubernetesNamespace - memberCount - onlineServices - phase - suspended - updatedAt type: object TenantCreateRequest: example: description: Computer-vision model training and inference team. displayName: Vision Team identifier: team-vision initialAdmin: li.wei@example.com kubernetesNamespace: axisml-team-vision labels: team: vision quotas: - pool: gpu-a100 units: - quantity: 4 unitName: a100-2x properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined annotations. description: description: Free-text tenant description. maxLength: 1000 type: string displayName: description: Human-readable tenant name. maxLength: 100 minLength: 1 type: string identifier: description: Stable logical tenant scope (becomes the Tenant CR name). maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string initResources: allOf: - $ref: '#/components/schemas/InitResources' description: Bootstrap objects to seed into the tenant namespace. initialAdmin: description: Email or username of the first tenant-admin member. type: string kubernetesNamespace: description: Physical Kubernetes namespace to back the tenant (may be shared). maxLength: 63 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: User-defined labels. quotas: description: Initial per-pool resource quota allocations. items: $ref: '#/components/schemas/Quota' type: array required: - displayName - identifier - initialAdmin - kubernetesNamespace type: object TenantList: example: continueToken: "" count: 1 items: - activeExperimentRuns: 2 activeJobRuns: 3 annotations: axisml.io/created-by: system-admin createdAt: "2026-06-20T08:00:00Z" description: Computer-vision model training and inference team. displayName: Vision Team identifier: team-vision initResources: configMaps: - name: shared-config sourceConfigMapRef: name: shared-config namespace: axisml-system imagePullSecrets: - name: registry-pull sourceSecretRef: name: registry-pull namespace: axisml-system secrets: - name: wandb-api-key sourceSecretRef: name: wandb-api-key namespace: axisml-system type: Opaque serviceAccounts: - imagePullSecrets: - registry-pull name: trainer rbac: roleRefs: - kind: ClusterRole name: edit kubernetesNamespace: axisml-team-vision labels: team: vision memberCount: 8 onlineServices: 1 owner: li.wei phase: Active quotas: - pool: gpu-a100 units: - quantity: 4 unitName: a100-2x status: conditions: - lastTransitionTime: "2026-06-28T09:30:00Z" message: Namespace and quota provisioned. reason: Provisioned status: "True" type: Ready message: Tenant is active. quotas: - pool: gpu-a100 units: - quantity: 4 unitName: a100-2x used: 3 suspended: false updatedAt: "2026-06-28T09:30:00Z" partial: false properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of tenants in this page. minimum: 0 type: integer items: description: Tenants in this page. items: $ref: '#/components/schemas/Tenant' type: array partial: description: True if some rows could not be enriched with live status. type: boolean required: - count - items type: object TenantPatchRequest: example: description: Updated team description. displayName: Vision Team (core) properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement annotation set. description: description: Updated free-text tenant description. maxLength: 1000 type: string displayName: description: Updated human-readable tenant name. maxLength: 100 minLength: 1 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement label set. type: object TenantPhase: enum: - Creating - Active - Suspended - Failed type: string TenantStatus: example: conditions: - lastTransitionTime: "2026-06-28T09:30:00Z" message: Namespace and quota provisioned. reason: Provisioned status: "True" type: Ready message: Tenant is active. quotas: - pool: gpu-a100 units: - quantity: 4 unitName: a100-2x used: 3 properties: conditions: description: Live status conditions reported by cluster-manager. items: $ref: '#/components/schemas/Condition' type: array message: description: Human-readable status detail for the tenant. type: string quotas: description: Live per-pool quota usage. items: $ref: '#/components/schemas/QuotaStatus' type: array type: object TensorBoard: example: createdAt: "2026-06-20T08:00:00Z" message: TensorBoard is serving. name: bert-finetune-tb phase: Running url: https://tb.axisml.io/team-nlp/bert-finetune properties: createdAt: description: Time the TensorBoard was created. format: date-time type: string message: description: Human-readable status detail for the current phase. type: string name: description: TensorBoard instance name. type: string phase: allOf: - $ref: '#/components/schemas/TensorBoardPhase' description: Current TensorBoard lifecycle phase. url: description: Endpoint URL for the TensorBoard UI once running. type: string required: - createdAt - name type: object TensorBoardPhase: enum: - Pending - Ready - Failed - Stopped type: string TensorBoardRequest: example: runs: - bert-finetune-3 - bert-finetune-5 properties: runs: description: Run names to scope the TensorBoard to; empty aggregates every Run of the experiment. items: type: string type: array type: object Toleration: additionalProperties: {} description: Mirrors a Kubernetes corev1.Toleration. type: object TrafficPolicy: example: accessUrl: https://infer.axisml.io/services/team-vision/resnet-serving/ backends: - actualPct: 90 ready: true role: stable serviceName: resnet-serving-v1 weight: 90 - actualPct: 10 ready: true role: canary serviceName: resnet-serving-v2 weight: 10 canaryPercent: 10 createdAt: "2026-06-20T08:00:00Z" description: Canary traffic split for the ResNet-50 online inference service. displayName: ResNet inference traffic endpoint: hostname: infer.axisml.io path: /services/team-vision/resnet-serving/ id: d4e5f6a7-8b9c-0d1e-2f3a-4b5c6d7e8f90 message: Routing 90/10 between stable and canary. mode: canary name: resnet-serving namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 phase: Ready tenantDisplayName: Vision Team tenantName: team-vision updatedAt: "2026-06-28T09:30:00Z" properties: accessUrl: description: Resolved external URL clients call (read-only). type: string backends: description: Member online services and their weights. items: $ref: '#/components/schemas/TrafficPolicyBackend' type: array canaryPercent: description: For canary mode, percent of traffic on the canary backend (stable = 100−p). type: integer createdAt: description: Time the policy was created. format: date-time type: string description: description: Free-text policy description. type: string displayName: description: Human-readable policy label. type: string endpoint: allOf: - $ref: '#/components/schemas/TrafficPolicyEndpoint' description: Stable external entry the traffic is fanned out from. id: description: Stable traffic policy identifier. format: uuid type: string message: description: Human-readable status detail for the current phase. type: string mode: allOf: - $ref: '#/components/schemas/TrafficPolicyMode' description: Routing mode (weighted, canary). Immutable after creation. name: description: Traffic policy name (unique within the tenant). type: string namespace: description: Platform tenant namespace the policy belongs to. type: string owner: description: Username of the policy owner. type: string ownerId: description: User ID of the policy owner. format: uuid type: string phase: allOf: - $ref: '#/components/schemas/TrafficPolicyPhase' description: Current policy lifecycle phase. tenantDisplayName: description: Human-readable tenant name. type: string tenantName: description: Tenant identifier owning the policy. type: string updatedAt: description: Time the policy was last updated. format: date-time type: string required: - backends - createdAt - id - mode - name - namespace - owner - tenantName - updatedAt type: object TrafficPolicyBackend: example: actualPct: 90 ready: true role: stable serviceName: resnet-serving-v1 weight: 90 properties: actualPct: description: Live percentage of traffic actually routed to this backend (read-only). type: integer ready: description: Whether the backend service is ready to serve (read-only). type: boolean role: allOf: - $ref: '#/components/schemas/TrafficPolicyBackendRole' description: Backend role within the policy (stable, canary, member). serviceName: description: Name of the member online service receiving a share of traffic. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string weight: description: Configured traffic weight (0-100); weights across backends sum to 100. maximum: 100 minimum: 0 type: integer required: - serviceName - weight type: object TrafficPolicyBackendRole: enum: - stable - canary - member type: string TrafficPolicyBackendSpec: example: role: canary serviceName: resnet-serving-v2 weight: 10 properties: role: allOf: - $ref: '#/components/schemas/TrafficPolicyBackendRole' description: Backend role within the policy (stable, canary, member). serviceName: description: Name of the member online service to route traffic to. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string weight: description: Traffic weight (0-100); weights across backends sum to 100 for weighted mode. maximum: 100 minimum: 0 type: integer required: - serviceName type: object TrafficPolicyCreateRequest: example: backends: - role: stable serviceName: resnet-serving-v1 weight: 90 - role: canary serviceName: resnet-serving-v2 weight: 10 canaryPercent: 10 description: Canary traffic split for the ResNet-50 online inference service. displayName: ResNet inference traffic endpoint: hostname: infer.axisml.io path: /services/team-vision/resnet-serving/ mode: canary name: resnet-serving properties: backends: description: Member online services and their weights (≥1). items: $ref: '#/components/schemas/TrafficPolicyBackendSpec' minItems: 1 type: array canaryPercent: description: Initial canary traffic percent for canary mode. maximum: 100 minimum: 0 type: integer description: description: Free-text policy description. maxLength: 1000 type: string displayName: description: Human-readable policy label. maxLength: 100 type: string endpoint: allOf: - $ref: '#/components/schemas/TrafficPolicyEndpoint' description: Stable external entry; empty path auto-generates one. mode: allOf: - $ref: '#/components/schemas/TrafficPolicyMode' description: Routing mode (weighted, canary). Immutable after creation. name: description: Traffic policy name (unique within the tenant). maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string required: - backends - mode - name type: object TrafficPolicyEndpoint: example: hostname: infer.axisml.io path: /services/team-vision/resnet-serving/ properties: hostname: description: Optional external hostname for the entry. Immutable after creation. type: string path: description: External URL path; empty auto-generates /services///. Immutable after creation. type: string type: object TrafficPolicyList: example: continueToken: "" count: 1 items: - accessUrl: https://infer.axisml.io/services/team-vision/resnet-serving/ backends: - actualPct: 90 ready: true role: stable serviceName: resnet-serving-v1 weight: 90 - actualPct: 10 ready: true role: canary serviceName: resnet-serving-v2 weight: 10 canaryPercent: 10 createdAt: "2026-06-20T08:00:00Z" description: Canary traffic split for the ResNet-50 online inference service. displayName: ResNet inference traffic endpoint: hostname: infer.axisml.io path: /services/team-vision/resnet-serving/ id: d4e5f6a7-8b9c-0d1e-2f3a-4b5c6d7e8f90 message: Routing 90/10 between stable and canary. mode: canary name: resnet-serving namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 phase: Ready tenantDisplayName: Vision Team tenantName: team-vision updatedAt: "2026-06-28T09:30:00Z" partial: false properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of policies in this page. minimum: 0 type: integer items: description: Traffic policies in this page. items: $ref: '#/components/schemas/TrafficPolicy' type: array partial: description: True if the list was truncated by an upstream limit. type: boolean required: - count - items type: object TrafficPolicyMode: enum: - weighted - canary type: string TrafficPolicyPatchRequest: example: description: Updated description. displayName: ResNet inference traffic (v2) properties: annotations: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement annotation set. description: description: Updated free-text policy description. maxLength: 1000 type: string displayName: description: Updated human-readable policy label. maxLength: 100 type: string labels: allOf: - $ref: '#/components/schemas/StringMap' description: Replacement label set. type: object TrafficPolicyPhase: enum: - Creating - Pending - Ready - Degraded - Failed - Deleting - Deleted type: string TrafficPolicySplitRequest: example: backends: - role: stable serviceName: resnet-serving-v1 weight: 75 - role: canary serviceName: resnet-serving-v2 weight: 25 canaryPercent: 25 properties: backends: description: Updated backend weights for weighted mode (weights sum to 100). items: $ref: '#/components/schemas/TrafficPolicyBackendSpec' type: array canaryPercent: description: Updated canary traffic percent for canary mode (stable = 100−p). maximum: 100 minimum: 0 nullable: true type: integer type: object User: example: createdAt: "2026-06-20T08:00:00Z" disabled: false displayName: Li Wei email: li.wei@axisml.io id: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 mustChangePassword: false updatedAt: "2026-06-28T09:30:00Z" username: li.wei properties: createdAt: description: Time the account was created. format: date-time type: string disabled: description: True if the account is disabled and cannot sign in. type: boolean displayName: description: Human-readable display name. type: string email: description: Account email address. format: email type: string id: description: Stable user identifier. format: uuid type: string mustChangePassword: description: True if the user must change their password before continuing. type: boolean updatedAt: description: Time the account was last updated. format: date-time type: string username: description: Unique account username. type: string required: - createdAt - id - updatedAt - username type: object UserCreateRequest: example: displayName: Li Wei email: li.wei@axisml.io password: S3cure-pass username: li.wei properties: displayName: description: Human-readable display name. maxLength: 100 type: string email: description: Account email address. format: email type: string password: description: Initial account password. format: password minLength: 8 type: string username: description: Unique account username. maxLength: 64 minLength: 1 type: string required: - password - username type: object UserPatchRequest: example: disabled: false displayName: Li Wei (Vision Lead) email: li.wei@axisml.io properties: disabled: description: Set true to disable or false to enable the account; omit to leave unchanged. nullable: true type: boolean displayName: description: Updated human-readable display name. maxLength: 100 type: string email: description: Updated account email address. format: email type: string type: object UserSummary: example: displayName: Li Wei email: li.wei@axisml.io id: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 username: li.wei properties: displayName: description: Human-readable display name. type: string email: description: Account email address. format: email type: string id: description: Stable user identifier. format: uuid type: string username: description: Unique account username. type: string required: - id - username type: object UserSummaryList: example: continueToken: "" count: 1 items: - displayName: Li Wei email: li.wei@axisml.io id: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 username: li.wei properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of users in this page. minimum: 0 type: integer items: description: Users in this page. items: $ref: '#/components/schemas/UserSummary' type: array required: - count - items type: object UserTenantRole: example: roleName: admin tenantName: team-vision properties: roleName: allOf: - $ref: '#/components/schemas/RoleName' description: Role granted to the user in the tenant. tenantName: description: Tenant the role applies within. type: string required: - roleName - tenantName type: object WorkloadMetricName: description: Run / workload resource metric. enum: - cpu_util - mem_util - gpu_util type: string Workspace: example: args: - --NotebookApp.token= command: - start-notebook.sh computeNamespace: axisml-team-vision containerPort: 8888 createdAt: "2026-06-20T08:00:00Z" description: JupyterLab interactive development environment. desiredState: Running displayName: Vision team dev environment endpoint: accessUrl: https://axisml.example.com/ws/team-vision/notebook-dev/ internalDns: notebook-dev.axisml-team-vision.svc.cluster.local tools: - label: JupyterLab name: jupyter url: https://axisml.example.com/ws/team-vision/notebook-dev/lab - label: VS Code name: vscode url: https://axisml.example.com/ws/team-vision/notebook-dev/vscode/ - label: Terminal name: terminal url: https://axisml.example.com/ws/team-vision/notebook-dev/terminals/1 env: - name: JUPYTER_ENABLE_LAB value: "yes" id: f1e2d3c4-5b6a-4798-8c0d-1e2f3a4b5c6d image: registry.axisml.io/dev/jupyter:3.0.0 lastStartedAt: "2026-06-28T09:00:00Z" lifecycle: idleTimeoutSeconds: 3600 message: Workspace is ready. name: notebook-dev namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 phase: Running poolName: gpu-a100 quota: team-vision readyReplicas: 1 replicas: 1 resources: cpu: "4" memory: 32Gi nvidia.com/gpu: "1" tenantDisplayName: Vision Team tenantName: team-vision unitName: a100-1x updatedAt: "2026-06-28T09:30:00Z" volumes: - mountPath: /home/jovyan/work name: notebook-data size: 50Gi storageClass: standard used: 12Gi properties: args: description: Container args override. items: type: string type: array command: description: Container entrypoint override. items: type: string type: array computeNamespace: description: Underlying compute (Kubernetes) namespace hosting the workspace. type: string containerPort: description: Port the dev server listens on inside the container. maximum: 65535 minimum: 1 type: integer createdAt: description: Time the workspace was created. format: date-time type: string description: description: Free-text workspace description. type: string desiredState: allOf: - $ref: '#/components/schemas/WorkspaceDesiredState' description: User-requested run state (Running, Stopped). displayName: description: Human-readable workspace label. type: string endpoint: allOf: - $ref: '#/components/schemas/WorkspaceEndpoint' description: Reachable URLs for the workspace. env: description: Environment variables injected into the container. items: $ref: '#/components/schemas/EnvVar' type: array id: description: Stable workspace identifier. format: uuid type: string image: description: Container image for the dev environment (e.g. jupyter, code-server). type: string lastStartedAt: description: Time the workspace was last started. format: date-time nullable: true type: string lastStoppedAt: description: Time the workspace was last stopped. format: date-time nullable: true type: string lifecycle: allOf: - $ref: '#/components/schemas/WorkspaceLifecycle' description: Lifecycle policy (e.g. idle auto-stop). message: description: Human-readable status detail for the current phase. type: string name: description: Workspace name (unique within the tenant). type: string namespace: description: Platform tenant namespace the workspace belongs to. type: string owner: description: Username of the workspace owner. type: string ownerId: description: User ID of the workspace owner. format: uuid type: string phase: allOf: - $ref: '#/components/schemas/WorkspacePhase' description: Current workspace lifecycle phase. poolName: description: Resource pool the workspace is scheduled onto. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string quota: description: ElasticQuota the workspace draws from. type: string readyReplicas: description: Pods that have passed readiness. minimum: 0 type: integer replicas: description: Desired pod count (0 when stopped). minimum: 0 type: integer resources: allOf: - $ref: '#/components/schemas/ResourceMap' description: Resources reserved by the workspace. tenantDisplayName: description: Human-readable tenant name. type: string tenantName: description: Tenant identifier owning the workspace. type: string unitName: description: Resource unit (shape) within the pool. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string updatedAt: description: Time the workspace was last updated. format: date-time type: string volumes: description: Data volumes mounted into the workspace. items: $ref: '#/components/schemas/WorkspaceVolume' type: array required: - containerPort - createdAt - id - image - name - namespace - owner - tenantName - updatedAt type: object WorkspaceCreateRequest: example: containerPort: 8888 description: JupyterLab interactive development environment. displayName: Vision team dev environment image: registry.axisml.io/dev/jupyter:3.0.0 lifecycle: idleTimeoutSeconds: 3600 name: notebook-dev poolName: gpu-a100 quota: team-vision unitName: a100-1x volumes: - mountPath: /home/jovyan/work name: notebook-data size: 50Gi storageClass: standard used: 12Gi properties: args: description: Container args override. items: type: string type: array command: description: Container entrypoint override. items: type: string type: array containerPort: description: Port the dev server listens on; defaults from the image when omitted. maximum: 65535 minimum: 1 type: integer description: description: Free-text workspace description. maxLength: 1000 type: string displayName: description: Human-readable workspace label. maxLength: 100 type: string env: description: Environment variables injected into the container. items: $ref: '#/components/schemas/EnvVar' type: array image: description: Container image for the dev environment. type: string lifecycle: allOf: - $ref: '#/components/schemas/WorkspaceLifecycle' description: Lifecycle policy (e.g. idle auto-stop). name: description: Workspace name (unique within the tenant). maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string poolName: description: Resource pool to schedule the workspace onto. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string quota: description: ElasticQuota the workspace draws from. type: string unitName: description: Resource unit (shape) within the pool. maxLength: 40 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string volumes: description: Data volumes to mount into the workspace. items: $ref: '#/components/schemas/WorkspaceVolume' type: array required: - image - name - poolName - unitName type: object WorkspaceDeleteRequest: example: deletePvc: false properties: deletePvc: description: When true, also delete the workspace's persistent volumes. type: boolean type: object WorkspaceDesiredState: enum: - Running - Stopped type: string WorkspaceEndpoint: example: accessUrl: https://axisml.example.com/ws/team-vision/notebook-dev/ internalDns: notebook-dev.axisml-team-vision.svc.cluster.local tools: - label: JupyterLab name: jupyter url: https://axisml.example.com/ws/team-vision/notebook-dev/lab - label: VS Code name: vscode url: https://axisml.example.com/ws/team-vision/notebook-dev/vscode/ - label: Terminal name: terminal url: https://axisml.example.com/ws/team-vision/notebook-dev/terminals/1 properties: accessUrl: description: Primary external URL for reaching the workspace UI. type: string internalDns: description: In-cluster DNS name for the workspace service. type: string tools: description: Per-tool launch URLs (Jupyter, VS Code, terminal, ...); the UI renders one launch button each. items: $ref: '#/components/schemas/WorkspaceTool' type: array type: object WorkspaceImage: example: defaultPort: 8888 description: JupyterLab data-science environment (public). displayName: JupyterLab kind: jupyter public: true ref: registry.axisml.io/dev/jupyter:3.0.0 properties: defaultPort: description: Default container port the dev server listens on. type: integer description: description: Short description of the environment. type: string displayName: description: Human-readable image label. type: string kind: description: Environment kind (jupyter, vscode, terminal, custom). type: string public: description: Whether the image is a public/shared base image. type: boolean ref: description: Container image reference. type: string required: - displayName - ref type: object WorkspaceImageList: example: count: 3 items: - defaultPort: 8888 description: JupyterLab data-science environment (public). displayName: JupyterLab kind: jupyter public: true ref: registry.axisml.io/dev/jupyter:3.0.0 - defaultPort: 8888 description: CUDA 12.1 + PyTorch 2.3 training image. displayName: PyTorch kind: jupyter public: true ref: registry.axisml.io/dev/pytorch:2.3.0 - defaultPort: 8080 description: VS Code (code-server) development environment (public). displayName: VS Code kind: vscode public: true ref: registry.axisml.io/dev/code-server:4.22 properties: count: description: Number of images in the catalog. minimum: 0 type: integer items: description: Selectable base images. items: $ref: '#/components/schemas/WorkspaceImage' type: array required: - count - items type: object WorkspaceLifecycle: example: idleTimeoutSeconds: 3600 properties: idleTimeoutSeconds: description: Idle duration (seconds) after which the workspace is auto-stopped; 0 disables auto-stop. minimum: 0 type: integer type: object WorkspaceList: example: continueToken: "" count: 1 items: - args: - --NotebookApp.token= command: - start-notebook.sh computeNamespace: axisml-team-vision containerPort: 8888 createdAt: "2026-06-20T08:00:00Z" description: JupyterLab interactive development environment. desiredState: Running displayName: Vision team dev environment endpoint: accessUrl: https://axisml.example.com/ws/team-vision/notebook-dev/ internalDns: notebook-dev.axisml-team-vision.svc.cluster.local tools: - label: JupyterLab name: jupyter url: https://axisml.example.com/ws/team-vision/notebook-dev/lab - label: VS Code name: vscode url: https://axisml.example.com/ws/team-vision/notebook-dev/vscode/ - label: Terminal name: terminal url: https://axisml.example.com/ws/team-vision/notebook-dev/terminals/1 env: - name: JUPYTER_ENABLE_LAB value: "yes" id: f1e2d3c4-5b6a-4798-8c0d-1e2f3a4b5c6d image: registry.axisml.io/dev/jupyter:3.0.0 lastStartedAt: "2026-06-28T09:00:00Z" lifecycle: idleTimeoutSeconds: 3600 message: Workspace is ready. name: notebook-dev namespace: team-vision owner: li.wei ownerId: 3a2b1c0d-4e5f-6789-abcd-ef0123456789 phase: Running poolName: gpu-a100 quota: team-vision readyReplicas: 1 replicas: 1 resources: cpu: "4" memory: 32Gi nvidia.com/gpu: "1" tenantDisplayName: Vision Team tenantName: team-vision unitName: a100-1x updatedAt: "2026-06-28T09:30:00Z" volumes: - mountPath: /home/jovyan/work name: notebook-data size: 50Gi storageClass: standard used: 12Gi partial: false properties: continueToken: description: Opaque token to fetch the next page. type: string count: description: Number of workspaces in this page. minimum: 0 type: integer items: description: Workspaces in this page. items: $ref: '#/components/schemas/Workspace' type: array partial: description: True if the list was truncated by an upstream limit. type: boolean required: - count - items type: object WorkspacePatchRequest: example: description: Updated description. displayName: Vision team dev environment (v2) lifecycle: idleTimeoutSeconds: 7200 properties: description: description: Updated free-text workspace description. maxLength: 1000 type: string displayName: description: Updated human-readable workspace label. maxLength: 100 type: string lifecycle: allOf: - $ref: '#/components/schemas/WorkspaceLifecycle' description: Replacement lifecycle policy. type: object WorkspacePhase: description: Derived from compute service phase + replicas. Hoisted to the top of Workspace for B-tree filtering. enum: - Creating - Starting - Running - Degraded - Failed - Stopped - Deleting - Deleted - Pending type: string WorkspaceTool: example: label: JupyterLab name: jupyter url: https://axisml.example.com/ws/team-vision/notebook-dev/lab properties: label: description: Human-readable tool label. type: string name: description: Tool identifier (jupyter, vscode, terminal, ...). type: string url: description: Launch URL for the tool. type: string required: - name - url type: object WorkspaceVolume: example: mountPath: /home/jovyan/work name: notebook-data size: 50Gi storageClass: standard used: 12Gi properties: mountPath: description: Path the volume is mounted at inside the container. type: string name: description: Volume name; empty requests a new volume, set mounts an existing one. type: string size: description: Requested capacity for a new volume (e.g. 50Gi). type: string storageClass: description: StorageClass backing a new volume. type: string used: description: Live consumed capacity of the volume (read-only). type: string required: - mountPath type: object info: description: 'User-facing entrypoint to AxisML. Aggregates the internal services (cluster-manager / compute / artifacts) and adds platform-native features: identity, RBAC, workspace/job/experiment/service/traffic orchestration, the model/image artifact registry. All endpoints except POST /api/v1/auth/login require a bearer JWT issued by Platform; per-endpoint role requirements are noted in each operation. Errors use RFC 7807 application/problem+json bodies.' title: AxisML Platform API version: 0.1.0 openapi: 3.0.3 paths: /api/v1/auth/login: post: operationId: login requestBody: content: application/json: schema: $ref: '#/components/schemas/LoginRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/LoginResponse' description: Login succeeded; returns JWT and current user. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Exchange username + password for a bearer JWT tags: - Auth /api/v1/auth/logout: post: operationId: logout responses: "204": description: Session revoked. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Revoke the current bearer JWT tags: - Auth /api/v1/auth/me: get: operationId: getCurrentUser responses: "200": content: application/json: schema: $ref: '#/components/schemas/MeResponse' description: Current user view. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get the current user, tenant role bindings, and permissions tags: - Auth /api/v1/auth/refresh: post: operationId: refreshToken responses: "200": content: application/json: schema: $ref: '#/components/schemas/RefreshResponse' description: New JWT issued. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Refresh the current bearer JWT tags: - Auth /api/v1/dashboard/activity: get: operationId: listActivity parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer responses: "200": content: application/json: schema: $ref: '#/components/schemas/ActivityList' description: A page of activity entries. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Recent-activity feed for the active tenant tags: - Dashboard /api/v1/dashboard/cluster-metrics: get: operationId: getClusterMetrics parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Metric to query. in: query name: metric required: true schema: enum: - gpu_util - gpu_quota - cpu_util - mem_util type: string - description: ISO 8601 duration (1h, 24h, 7d). in: query name: range required: true schema: type: string - description: Sampling step between points. in: query name: step schema: type: string - description: Resource pool to query (the series is per (tenant, pool)). in: query name: pool required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/MetricSeries' description: Metric series. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. "502": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Upstream service (cluster-manager / compute / artifacts / Prometheus) failed. summary: Per-pool cluster resource-utilisation time series for the active tenant tags: - Dashboard /api/v1/dashboard/cluster-usage: get: operationId: getClusterUsage parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Restrict to a single resource pool; omit for every pool the tenant has quota in. in: query name: pool schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ClusterUsage' description: Cluster usage snapshot. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. "502": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Upstream service (cluster-manager / compute / artifacts / Prometheus) failed. summary: Per-pool cluster resource-usage snapshot for the active tenant tags: - Dashboard /api/v1/datavolumes: get: operationId: listDataVolumes parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/DataVolumeList' description: A page of data volumes. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List data volumes tags: - DataVolumes post: operationId: createDataVolume parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/DataVolumeCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/DataVolume' description: Data volume created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Create a data volume tags: - DataVolumes /api/v1/datavolumes/{name}: delete: operationId: deleteDataVolume parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Delete even when mounted by running workloads. in: query name: force schema: type: boolean responses: "204": description: Data volume deleted. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a data volume tags: - DataVolumes get: operationId: getDataVolume parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/DataVolume' description: Data volume detail (with mount occupancy). "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a data volume tags: - DataVolumes patch: operationId: updateDataVolume parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/DataVolumePatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/DataVolume' description: Updated data volume. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Expand or relabel a data volume tags: - DataVolumes /api/v1/experiments: get: operationId: listExperiments parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Admin-only owner filter. in: query name: owner schema: type: string - description: Fuzzy keyword. in: query name: q schema: type: string - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ExperimentList' description: A page of experiments. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List experiments tags: - Experiments post: operationId: createExperiment parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ExperimentCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/Experiment' description: Experiment created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Create an experiment (training template) tags: - Experiments /api/v1/experiments/{name}: delete: operationId: deleteExperiment parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "204": description: Experiment (and its terminal Runs) deleted. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete an experiment (cascade) tags: - Experiments get: operationId: getExperiment parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Experiment' description: Experiment detail. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get an experiment tags: - Experiments patch: operationId: updateExperiment parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ExperimentPatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/Experiment' description: Experiment updated. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Edit an experiment template / metadata tags: - Experiments /api/v1/experiments/{name}/runs: get: operationId: listExperimentRuns parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: query name: phase schema: $ref: '#/components/schemas/RunPhase' - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/RunList' description: A page of Runs. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List Runs of an experiment (live) tags: - Experiments post: operationId: triggerExperimentRun parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/RunTriggerRequest' responses: "201": content: application/json: schema: $ref: '#/components/schemas/Run' description: Run triggered. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Trigger a Run from an experiment tags: - Experiments /api/v1/experiments/{name}/runs/{run}: delete: operationId: deleteExperimentRun parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "204": description: Run deleted. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a Run tags: - Experiments get: operationId: getExperimentRun parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Run' description: Run detail. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a Run tags: - Experiments /api/v1/experiments/{name}/runs/{run}/cancel: post: operationId: cancelExperimentRun parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Run' description: Cancel request accepted. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Cancel a running Run tags: - Experiments /api/v1/experiments/{name}/runs/{run}/events: get: operationId: listExperimentRunEvents parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/EventList' description: Run-level event list. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List Run-level Kubernetes events tags: - Experiments /api/v1/experiments/{name}/runs/{run}/metrics: get: operationId: getExperimentRunMetrics parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: query name: metric required: true schema: $ref: '#/components/schemas/WorkloadMetricName' - description: ISO 8601 duration (5m, 1h, 24h). in: query name: range required: true schema: type: string - in: query name: step schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/MetricSeries' description: Metric series. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. "502": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Upstream service (cluster-manager / compute / artifacts / Prometheus) failed. summary: Query resource metrics for a Run tags: - Experiments /api/v1/experiments/{name}/runs/{run}/pods: get: operationId: listExperimentRunPods parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/PodList' description: Pod list. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List Pods belonging to a Run tags: - Experiments /api/v1/experiments/{name}/runs/{run}/pods/{pod}/events: get: operationId: listExperimentRunPodEvents parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: pod required: true schema: maxLength: 253 minLength: 1 type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/EventList' description: Pod-scoped events. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List K8s events for one pod of a Run tags: - Experiments /api/v1/experiments/{name}/runs/{run}/pods/{pod}/logs: get: operationId: getExperimentRunPodLogs parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: pod required: true schema: maxLength: 253 minLength: 1 type: string - in: query name: container schema: type: string - in: query name: tailLines schema: minimum: 1 type: integer - description: Stream logs as SSE. in: query name: follow schema: type: boolean - description: Read logs from the previous (crashed) container instance. in: query name: previous schema: type: boolean responses: "200": content: text/event-stream: schema: type: string text/plain: schema: type: string description: Log stream. text/plain for follow=false; text/event-stream for follow=true. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "410": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Target resource (e.g., a Pod log) is no longer retained. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Fetch or stream a Run pod's logs tags: - Experiments /api/v1/experiments/{name}/tensorboard: delete: operationId: stopTensorBoard parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "204": description: TensorBoard stopped. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Stop the experiment's TensorBoard tags: - Experiments get: operationId: getTensorBoard parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/TensorBoard' description: TensorBoard handle. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get the experiment's TensorBoard instance tags: - Experiments post: operationId: startTensorBoard parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/TensorBoardRequest' responses: "200": content: application/json: schema: $ref: '#/components/schemas/TensorBoard' description: TensorBoard started. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Start (or reuse) a TensorBoard for the experiment tags: - Experiments /api/v1/images: get: operationId: listImageDefinitions parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Fuzzy keyword. in: query name: q schema: type: string - description: Filter by definition spec.purpose. in: query name: purpose schema: $ref: '#/components/schemas/ImagePurpose' - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinitionList' description: A page of image definitions. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List image definitions tags: - Images /api/v1/images/{tenant}/{name}: delete: operationId: deleteImageDefinition parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string responses: "204": description: Image definition and its versions deleted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a image definition (cascade) tags: - Images get: operationId: getImageDefinition parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinition' description: Image definition detail. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a image definition tags: - Images patch: operationId: updateImageDefinition parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinitionPatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinition' description: Image definition updated. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Edit image definition metadata tags: - Images post: operationId: createImageDefinition parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinitionCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinition' description: Image definition created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Create a image definition tags: - Images /api/v1/images/{tenant}/{name}/versions: get: operationId: listImageVersions parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: query name: status schema: $ref: '#/components/schemas/ImageStatus' - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ImageList' description: A page of image versions. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List versions of a image definition (live) tags: - Images post: operationId: initiateImage parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ImageInitiateRequest' required: true responses: "202": content: application/json: schema: $ref: '#/components/schemas/ImageInitiateResponse' description: Upload initiated; returns credentials and a image handle. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Initiate a image version upload tags: - Images /api/v1/images/{tenant}/{name}/versions/{version}: delete: operationId: deleteImage parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: path name: version required: true schema: maxLength: 128 minLength: 1 pattern: ^[A-Za-z0-9_.-]{1,128}$ type: string responses: "204": description: Image deleted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Soft-delete a image artifact tags: - Images get: operationId: getImage parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: path name: version required: true schema: maxLength: 128 minLength: 1 pattern: ^[A-Za-z0-9_.-]{1,128}$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Image' description: Image detail. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "410": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Artifact has been soft-deleted; the tuple is permanently gone. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a image artifact tags: - Images patch: operationId: updateImage parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: path name: version required: true schema: maxLength: 128 minLength: 1 pattern: ^[A-Za-z0-9_.-]{1,128}$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ArtifactUpdateRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/Image' description: Image updated. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Update mutable image metadata tags: - Images /api/v1/images/{tenant}/{name}/versions/{version}/complete: post: operationId: completeImage parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: path name: version required: true schema: maxLength: 128 minLength: 1 pattern: ^[A-Za-z0-9_.-]{1,128}$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ImageCompleteRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/Image' description: Image finalized. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Mark a image upload complete tags: - Images /api/v1/images/{tenant}/{name}/versions/{version}/resolve: get: operationId: resolveImage parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: path name: version required: true schema: maxLength: 128 minLength: 1 pattern: ^[A-Za-z0-9_.-]{1,128}$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ArtifactResolveResponse' description: Resolved download target. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "410": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Target resource (e.g., a Pod log) is no longer retained. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Resolve download credentials for a image version tags: - Images /api/v1/jobs: get: operationId: listJobs parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Admin-only owner filter. in: query name: owner schema: type: string - description: Fuzzy keyword. in: query name: q schema: type: string - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/JobList' description: A page of Jobs. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List Jobs tags: - Jobs post: operationId: createJob parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/JobCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/Job' description: Job created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Create a Job (reusable template) tags: - Jobs /api/v1/jobs/{name}: delete: operationId: deleteJob parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "204": description: Job (and its terminal Runs) deleted. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a Job (cascade) tags: - Jobs get: operationId: getJob parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Job' description: Job detail. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a Job tags: - Jobs patch: operationId: updateJob parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/JobPatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/Job' description: Job updated. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Edit a Job template / metadata tags: - Jobs /api/v1/jobs/{name}/runs: get: operationId: listRuns parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: query name: phase schema: $ref: '#/components/schemas/RunPhase' - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/RunList' description: A page of Runs. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List Runs of a Job (live) tags: - Jobs post: operationId: triggerRun parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/RunTriggerRequest' responses: "201": content: application/json: schema: $ref: '#/components/schemas/Run' description: Run triggered. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Trigger a Run from a Job tags: - Jobs /api/v1/jobs/{name}/runs/{run}: delete: operationId: deleteRun parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "204": description: Run deleted. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a Run tags: - Jobs get: operationId: getRun parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Run' description: Run detail. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a Run tags: - Jobs /api/v1/jobs/{name}/runs/{run}/cancel: post: operationId: cancelRun parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Run' description: Cancel request accepted. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Cancel a running Run tags: - Jobs /api/v1/jobs/{name}/runs/{run}/events: get: operationId: listRunEvents parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/EventList' description: Job-level event list. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List Run-level Kubernetes events tags: - Jobs /api/v1/jobs/{name}/runs/{run}/metrics: get: operationId: getRunMetrics parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: query name: metric required: true schema: $ref: '#/components/schemas/WorkloadMetricName' - description: ISO 8601 duration (5m, 1h, 24h). in: query name: range required: true schema: type: string - in: query name: step schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/MetricSeries' description: Metric series. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. "502": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Upstream service (cluster-manager / compute / artifacts / Prometheus) failed. summary: Query resource metrics for a Run tags: - Jobs /api/v1/jobs/{name}/runs/{run}/pods: get: operationId: listRunPods parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/PodList' description: Pod list. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List Pods belonging to a Run tags: - Jobs /api/v1/jobs/{name}/runs/{run}/pods/{pod}/events: get: operationId: listRunPodEvents parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: pod required: true schema: maxLength: 253 minLength: 1 type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/EventList' description: Pod-scoped events. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List K8s events for one pod of a Run tags: - Jobs /api/v1/jobs/{name}/runs/{run}/pods/{pod}/logs: get: operationId: getRunPodLogs parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: run required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: pod required: true schema: maxLength: 253 minLength: 1 type: string - in: query name: container schema: type: string - in: query name: tailLines schema: minimum: 1 type: integer - description: Stream logs as SSE. in: query name: follow schema: type: boolean - description: Read logs from the previous (crashed) container instance. in: query name: previous schema: type: boolean responses: "200": content: text/event-stream: schema: type: string text/plain: schema: type: string description: Log stream. text/plain for follow=false; text/event-stream for follow=true. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "410": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Target resource (e.g., a Pod log) is no longer retained. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Fetch or stream a Run pod's logs tags: - Jobs /api/v1/mlservices: get: operationId: listMLServices parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Admin-only owner filter. in: query name: owner schema: type: string - in: query name: phase schema: $ref: '#/components/schemas/MLServicePhase' - description: Fuzzy keyword. in: query name: q schema: type: string - description: Filter by resource pool. in: query name: poolName schema: type: string - description: Only Ready services not bound to an active traffic policy (drives traffic-policy backend pickers). in: query name: eligibleForTraffic schema: type: boolean - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/MLServiceList' description: A page of services. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List services tags: - MLServices post: operationId: createMLService parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/MLServiceCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/MLService' description: Service created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Deploy a new online inference service tags: - MLServices /api/v1/mlservices/{name}: delete: operationId: deleteMLService parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "204": description: Service deleted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a service tags: - MLServices get: operationId: getMLService parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/MLService' description: Service detail. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a service tags: - MLServices patch: operationId: updateMLService parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/MLServicePatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/MLService' description: Updated service. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Update service display metadata tags: - MLServices /api/v1/mlservices/{name}/events: get: operationId: getMLServiceEvents parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/EventList' description: Service-level event list. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List service-level Kubernetes events tags: - MLServices /api/v1/mlservices/{name}/metrics: get: operationId: getMLServiceMetrics parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: query name: metric required: true schema: $ref: '#/components/schemas/MLServiceMetricName' - description: ISO 8601 duration (5m, 15m, 1h, 6h, 24h). in: query name: range required: true schema: type: string - in: query name: step schema: type: string - description: Only for metric=latency. in: query name: percentile schema: enum: - p50 - p95 - p99 type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/MetricSeries' description: Metric series. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. "502": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Upstream service (cluster-manager / compute / artifacts / Prometheus) failed. summary: Query Prometheus for service-level metrics tags: - MLServices /api/v1/mlservices/{name}/pods: get: operationId: listMLServicePods parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/PodList' description: Pod list. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List Pods backing a service tags: - MLServices /api/v1/mlservices/{name}/pods/{pod}/events: get: operationId: listMLServicePodEvents parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: pod required: true schema: maxLength: 253 minLength: 1 type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/EventList' description: Pod-scoped events. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List K8s events for one pod of a service tags: - MLServices /api/v1/mlservices/{name}/pods/{pod}/logs: get: operationId: getMLServicePodLogs parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: pod required: true schema: maxLength: 253 minLength: 1 type: string - in: query name: container schema: type: string - in: query name: tailLines schema: minimum: 1 type: integer - description: Stream logs as SSE. in: query name: follow schema: type: boolean - description: Read logs from the previous (crashed) container instance. in: query name: previous schema: type: boolean responses: "200": content: text/event-stream: schema: type: string text/plain: schema: type: string description: Log stream. text/plain for follow=false; text/event-stream for follow=true. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "410": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Target resource (e.g., a Pod log) is no longer retained. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Fetch or stream a service pod's logs tags: - MLServices /api/v1/mlservices/{name}/scale: post: operationId: scaleMLService parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/MLServiceScaleRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/MLService' description: Scale request accepted. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Set the replica count for a service tags: - MLServices /api/v1/mlservices/{name}/start: post: operationId: startMLService parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/MLService' description: Start request accepted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Start a stopped service tags: - MLServices /api/v1/mlservices/{name}/stop: post: operationId: stopMLService parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/MLService' description: Stop request accepted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Stop a service (scale to 0) tags: - MLServices /api/v1/models: get: operationId: listModelDefinitions parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Fuzzy keyword. in: query name: q schema: type: string - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinitionList' description: A page of model definitions. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List model definitions tags: - Models /api/v1/models/{tenant}/{name}: delete: operationId: deleteModelDefinition parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string responses: "204": description: Model definition and its versions deleted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a model definition (cascade) tags: - Models get: operationId: getModelDefinition parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinition' description: Model definition detail. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a model definition tags: - Models patch: operationId: updateModelDefinition parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinitionPatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinition' description: Model definition updated. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Edit model definition metadata tags: - Models post: operationId: createModelDefinition parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinitionCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/ArtifactDefinition' description: Model definition created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Create a model definition tags: - Models /api/v1/models/{tenant}/{name}/versions: get: operationId: listModelVersions parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: query name: status schema: $ref: '#/components/schemas/ModelStatus' - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ModelList' description: A page of model versions. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List versions of a model definition (live) tags: - Models post: operationId: initiateModel parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ModelInitiateRequest' required: true responses: "202": content: application/json: schema: $ref: '#/components/schemas/ModelInitiateResponse' description: Upload initiated; returns credentials and a model handle. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Initiate a model version upload tags: - Models /api/v1/models/{tenant}/{name}/versions/{version}: delete: operationId: deleteModel parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: path name: version required: true schema: maxLength: 128 minLength: 1 pattern: ^[A-Za-z0-9_.-]{1,128}$ type: string responses: "204": description: Model deleted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Soft-delete a model artifact tags: - Models get: operationId: getModel parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: path name: version required: true schema: maxLength: 128 minLength: 1 pattern: ^[A-Za-z0-9_.-]{1,128}$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Model' description: Model detail. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "410": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Artifact has been soft-deleted; the tuple is permanently gone. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a model artifact tags: - Models patch: operationId: updateModel parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: path name: version required: true schema: maxLength: 128 minLength: 1 pattern: ^[A-Za-z0-9_.-]{1,128}$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ArtifactUpdateRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/Model' description: Model updated. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Update mutable model metadata tags: - Models /api/v1/models/{tenant}/{name}/versions/{version}/complete: post: operationId: completeModel parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: path name: version required: true schema: maxLength: 128 minLength: 1 pattern: ^[A-Za-z0-9_.-]{1,128}$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ModelCompleteRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/Model' description: Model finalized. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Mark a model upload complete tags: - Models /api/v1/models/{tenant}/{name}/versions/{version}/resolve: get: operationId: resolveModel parameters: - in: path name: tenant required: true schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: name required: true schema: maxLength: 128 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9._]*[a-z0-9])?$ type: string - in: path name: version required: true schema: maxLength: 128 minLength: 1 pattern: ^[A-Za-z0-9_.-]{1,128}$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ArtifactResolveResponse' description: Resolved download target. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "410": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Target resource (e.g., a Pod log) is no longer retained. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Resolve download credentials for a model version tags: - Models /api/v1/resourcepools: get: operationId: listResourcePools parameters: - description: Fuzzy keyword. in: query name: q schema: type: string - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ResourcePoolList' description: A page of pools. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List resource pools tags: - ResourcePools post: operationId: createResourcePool requestBody: content: application/json: schema: $ref: '#/components/schemas/ResourcePoolCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/ResourcePool' description: Resource pool created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Create a resource pool tags: - ResourcePools /api/v1/resourcepools/{pool}: delete: operationId: deleteResourcePool parameters: - in: path name: pool required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "204": description: Pool deleted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a resource pool tags: - ResourcePools get: operationId: getResourcePool parameters: - in: path name: pool required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ResourcePool' description: Pool detail. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a resource pool tags: - ResourcePools patch: operationId: updateResourcePool parameters: - in: path name: pool required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ResourcePoolPatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ResourcePool' description: Updated pool. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Update a resource pool tags: - ResourcePools /api/v1/resourcepools/{pool}/units: get: operationId: listResourceUnits parameters: - in: path name: pool required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ResourceUnitList' description: A page of resource units. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List resource units in a pool tags: - ResourceUnits post: operationId: createResourceUnit parameters: - in: path name: pool required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ResourceUnitCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/ResourceUnit' description: Resource unit created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Create a resource unit in a pool tags: - ResourceUnits /api/v1/resourcepools/{pool}/units/{unit}: delete: operationId: deleteResourceUnit parameters: - in: path name: pool required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: unit required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "204": description: Resource unit deleted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a resource unit tags: - ResourceUnits get: operationId: getResourceUnit parameters: - in: path name: pool required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: unit required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ResourceUnit' description: Resource unit detail. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a resource unit tags: - ResourceUnits patch: operationId: updateResourceUnit parameters: - in: path name: pool required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: unit required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ResourceUnitPatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ResourceUnit' description: Updated resource unit. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Update a resource unit tags: - ResourceUnits /api/v1/storageclasses: get: operationId: listStorageClasses responses: "200": content: application/json: schema: $ref: '#/components/schemas/StorageClassList' description: Available storage classes for new volumes. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List storage classes tags: - DataVolumes /api/v1/tenants: get: operationId: listTenants parameters: - description: Fuzzy keyword on name / displayName. in: query name: q schema: type: string - description: Filter by tenant status.phase. in: query name: phase schema: $ref: '#/components/schemas/TenantPhase' - description: Enrich each row with live workload roll-ups (member / active-run / online-service counts). Costs one compute-service call pair per tenant; omit for the cheap name-only listing. in: query name: stats schema: type: boolean - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/TenantList' description: A page of visible tenants. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List visible tenants tags: - Tenants post: operationId: createTenant requestBody: content: application/json: schema: $ref: '#/components/schemas/TenantCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/Tenant' description: Tenant created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Create a tenant tags: - Tenants /api/v1/tenants/{name}: delete: operationId: deleteTenant parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "204": description: Tenant deleted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a tenant tags: - Tenants get: operationId: getTenant parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Tenant' description: Tenant detail. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a tenant tags: - Tenants patch: operationId: updateTenant parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/TenantPatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/Tenant' description: Updated tenant. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Update tenant display metadata tags: - Tenants /api/v1/tenants/{name}/members: get: operationId: listTenantMembers parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/MemberList' description: Member list. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List members of a tenant tags: - Members post: operationId: addTenantMember parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/MemberCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/Member' description: Member added. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Add a member to a tenant tags: - Members /api/v1/tenants/{name}/members/{userId}: delete: operationId: removeTenantMember parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: userId required: true schema: format: uuid type: string responses: "204": description: Member removed. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Remove a member from a tenant tags: - Members patch: operationId: updateTenantMember parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: userId required: true schema: format: uuid type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/MemberPatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/Member' description: Member updated. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Change a member's role tags: - Members /api/v1/tenants/{name}/quotas: get: operationId: listTenantQuotas parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/QuotaList' description: Quota list. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List per-pool quotas for a tenant tags: - Quotas post: operationId: createTenantQuota parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotaCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/Tenant' description: Quota set. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Set a pool's quota (system-admin only) tags: - Quotas /api/v1/tenants/{name}/quotas/{pool}: delete: operationId: deleteTenantQuota parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: pool required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "204": description: Quota removed. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Remove a pool quota (system-admin only) tags: - Quotas patch: operationId: updateTenantQuota parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: pool required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/QuotaPatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/Tenant' description: Quota updated; returns the updated tenant. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Update a pool quota (system-admin only) tags: - Quotas /api/v1/tenants/{name}/resume: post: operationId: resumeTenant parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Tenant' description: Tenant resumed. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Resume a suspended tenant tags: - Tenants /api/v1/tenants/{name}/suspend: post: operationId: suspendTenant parameters: - in: path name: name required: true schema: format: Tenant identifier and logical tenant scope; not a Kubernetes Namespace. maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Tenant' description: Tenant suspended. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Suspend a tenant (gates new-workload creation) tags: - Tenants /api/v1/trafficpolicies: get: operationId: listTrafficPolicies parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Admin-only owner filter. in: query name: owner schema: type: string - description: Fuzzy keyword. in: query name: q schema: type: string - in: query name: mode schema: $ref: '#/components/schemas/TrafficPolicyMode' - in: query name: phase schema: $ref: '#/components/schemas/TrafficPolicyPhase' - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/TrafficPolicyList' description: A page of traffic policies. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List traffic policies tags: - TrafficPolicy post: operationId: createTrafficPolicy parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/TrafficPolicyCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/TrafficPolicy' description: Traffic policy created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Create a traffic policy tags: - TrafficPolicy /api/v1/trafficpolicies/{name}: delete: operationId: deleteTrafficPolicy parameters: - in: path name: name required: true schema: maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "204": description: Traffic policy deleted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a traffic policy tags: - TrafficPolicy get: operationId: getTrafficPolicy parameters: - in: path name: name required: true schema: maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/TrafficPolicy' description: Traffic policy detail. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a traffic policy tags: - TrafficPolicy patch: operationId: updateTrafficPolicy parameters: - in: path name: name required: true schema: maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/TrafficPolicyPatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/TrafficPolicy' description: Updated traffic policy. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Update display metadata tags: - TrafficPolicy /api/v1/trafficpolicies/{name}/events: get: operationId: getTrafficPolicyEvents parameters: - in: path name: name required: true schema: maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/EventList' description: Event list. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List traffic-policy events tags: - TrafficPolicy /api/v1/trafficpolicies/{name}/metrics: get: operationId: getTrafficPolicyMetrics parameters: - in: path name: name required: true schema: maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: query name: metric required: true schema: $ref: '#/components/schemas/MLServiceMetricName' - description: ISO 8601 duration (5m, 1h, 24h). in: query name: range required: true schema: type: string - in: query name: step schema: type: string - description: Scope to one member backend (service name). in: query name: backend schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/MetricSeries' description: Metric series. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. "502": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Upstream service (cluster-manager / compute / artifacts / Prometheus) failed. summary: Query per-backend metrics (grouped by backend) tags: - TrafficPolicy /api/v1/trafficpolicies/{name}/promote: post: operationId: promoteTrafficPolicy parameters: - in: path name: name required: true schema: maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/TrafficPolicy' description: Promoted. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Promote the canary backend to stable (canary only) tags: - TrafficPolicy /api/v1/trafficpolicies/{name}/rollback: post: operationId: rollbackTrafficPolicy parameters: - in: path name: name required: true schema: maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/TrafficPolicy' description: Rolled back. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Roll the canary back to the stable backend (canary only) tags: - TrafficPolicy /api/v1/trafficpolicies/{name}/split: post: operationId: splitTrafficPolicy parameters: - in: path name: name required: true schema: maxLength: 40 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/TrafficPolicySplitRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/TrafficPolicy' description: Split applied. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Adjust traffic distribution (weights / canary percent) tags: - TrafficPolicy /api/v1/users: get: operationId: listUsers parameters: - description: Fuzzy keyword. in: query name: q schema: type: string - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/UserSummaryList' description: A page of user summaries. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Search Platform users (system-admin only) tags: - Users post: operationId: createUser requestBody: content: application/json: schema: $ref: '#/components/schemas/UserCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/User' description: User created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Create a Platform user tags: - Users /api/v1/users/{id}: delete: operationId: deleteUser parameters: - in: path name: id required: true schema: format: uuid type: string responses: "204": description: User deleted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete (or disable) a user tags: - Users get: operationId: getUser parameters: - in: path name: id required: true schema: format: uuid type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/User' description: User detail. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a user by id (system-admin only) tags: - Users patch: operationId: updateUser parameters: - in: path name: id required: true schema: format: uuid type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/UserPatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/User' description: Updated user. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Update a user's profile or disabled flag tags: - Users /api/v1/users/{id}/password: post: operationId: setUserPassword parameters: - in: path name: id required: true schema: format: uuid type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/SetPasswordRequest' required: true responses: "204": description: Password updated. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Set a user's password tags: - Users /api/v1/workspace-images: get: operationId: listWorkspaceImages responses: "200": content: application/json: schema: $ref: '#/components/schemas/WorkspaceImageList' description: Workspace base-image catalog. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List selectable workspace base images (dev-environment catalog) tags: - Workspaces /api/v1/workspaces: get: operationId: listWorkspaces parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - description: Admin-only owner filter. in: query name: owner schema: type: string - in: query name: phase schema: $ref: '#/components/schemas/WorkspacePhase' - description: Keyword (matches displayName / image). in: query name: q schema: type: string - description: Page size (default 50, max 200). in: query name: limit schema: maximum: 200 minimum: 1 type: integer - description: Opaque continue token from the previous response. in: query name: continue schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/WorkspaceList' description: A page of workspaces. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List workspaces tags: - Workspaces post: operationId: createWorkspace parameters: - description: Active tenant for the request (fallback for the axisml.tenant cookie). in: header name: X-Axisml-Tenant schema: maxLength: 40 minLength: 3 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/WorkspaceCreateRequest' required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/Workspace' description: Workspace created. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Create a workspace tags: - Workspaces /api/v1/workspaces/{name}: delete: operationId: deleteWorkspace parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/WorkspaceDeleteRequest' responses: "204": description: Workspace deleted. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Delete a workspace tags: - Workspaces get: operationId: getWorkspace parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Workspace' description: Workspace detail. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Get a workspace tags: - Workspaces patch: operationId: updateWorkspace parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/WorkspacePatchRequest' required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/Workspace' description: Updated workspace. "400": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Malformed request (invalid syntax, missing required fields, immutable field, etc.). "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "422": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Semantically invalid request (e.g., cross-field violations). "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Update workspace display metadata tags: - Workspaces /api/v1/workspaces/{name}/events: get: operationId: getWorkspaceEvents parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/EventList' description: Service-level event list. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List service-level Kubernetes events for the workspace tags: - Workspaces /api/v1/workspaces/{name}/pods: get: operationId: listWorkspacePods parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/PodList' description: Pod list. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List Pods backing the workspace tags: - Workspaces /api/v1/workspaces/{name}/pods/{pod}/events: get: operationId: listWorkspacePodEvents parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: pod required: true schema: maxLength: 253 minLength: 1 type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/EventList' description: Pod-scoped events. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: List K8s events for one pod of the workspace tags: - Workspaces /api/v1/workspaces/{name}/pods/{pod}/logs: get: operationId: getWorkspacePodLogs parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - in: path name: pod required: true schema: maxLength: 253 minLength: 1 type: string - in: query name: container schema: type: string - in: query name: tailLines schema: minimum: 1 type: integer - description: Stream logs as SSE. in: query name: follow schema: type: boolean - description: Read logs from the previous (crashed) container instance. in: query name: previous schema: type: boolean responses: "200": content: text/event-stream: schema: type: string text/plain: schema: type: string description: Log stream. text/plain for follow=false; text/event-stream for follow=true. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "410": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Target resource (e.g., a Pod log) is no longer retained. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Fetch or stream a workspace pod's logs tags: - Workspaces /api/v1/workspaces/{name}/start: post: operationId: startWorkspace parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Workspace' description: Workspace started. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Start a workspace (scale to 1 replica) tags: - Workspaces /api/v1/workspaces/{name}/stop: post: operationId: stopWorkspace parameters: - in: path name: name required: true schema: maxLength: 63 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/Workspace' description: Workspace stopped. "401": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Missing or invalid bearer JWT. "403": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Authenticated but insufficient role for the requested operation. "404": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Resource not found, OR the caller cannot see it. Platform deliberately conflates these for non-admins to avoid information leak. "409": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: 'Conflicts with a precondition: duplicate name, last-tenant-admin protection, in-use blocker, immutable transition, etc.' "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Stop a workspace (scale to 0 replicas) tags: - Workspaces /healthz: get: operationId: getHealthz responses: "200": content: application/json: schema: $ref: '#/components/schemas/HealthStatus' description: Process is alive. "500": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: Unexpected server error. summary: Liveness probe tags: - Health /readyz: get: operationId: getReadyz responses: "200": content: application/json: schema: $ref: '#/components/schemas/HealthStatus' description: Service is ready to accept traffic. "503": content: application/problem+json: schema: $ref: '#/components/schemas/Problem' description: One or more dependencies are unavailable. summary: Readiness probe tags: - Health servers: - description: Same-origin (behind the AxisML Infra Envoy Gateway) url: / tags: - description: Login, logout, session refresh, and "who am I" endpoints. name: Auth - description: Platform user accounts (the identities used for login). name: Users - description: Tenant lifecycle. Proxies cluster-manager with RBAC. name: Tenants - description: ElasticQuota sub-resources of a Tenant (per-pool, per-quota). name: Quotas - description: Per-tenant user ↔ role bindings. name: Members - description: Long-running interactive dev containers (jupyter / code-server / ...). name: Workspaces - description: Training-experiment templates (Platform-owned) and their Runs; isomorphic to Jobs, plus on-demand TensorBoard. name: Experiments - description: Reusable Job templates (Platform-owned definitions) and their Runs (compute MLRuns named -). name: Jobs - description: Long-running online inference services. name: MLServices - description: Traffic policies fanning one stable entry across member online services (weighted / canary). name: TrafficPolicy - description: Model definitions (Platform-owned); versions proxy artifacts (kind=model). name: Models - description: Image definitions (Platform-owned); versions proxy artifacts (kind=image). name: Images - description: Cluster-scoped resource pools (admin-only writes; read by all). name: ResourcePools - description: Per-pool resource unit specs (admin-only writes; read by all). name: ResourceUnits - description: Tenant-scoped durable data volumes (system-admin only); CRUD + expand + mount-occupancy. name: DataVolumes - description: 'Landing-page aggregates: cluster resource usage, utilisation trends, and the recent-activity feed.' name: Dashboard - description: Liveness and readiness probes. name: Health