openapi: 3.2.0
info:
version: latest
description: '# Introduction
The NVIDIA Run:ai Control-Plane API reference is a guide that provides an easy-to-use programming interface for adding various tasks to your application, including workload submission, resource management, and administrative operations.
NVIDIA Run:ai APIs are accessed using *bearer tokens*. To obtain a token, you need to create a **Service account** through the NVIDIA Run:ai user interface.
To create a service account, in your UI, go to Access → Service Accounts (for organization-level service accounts) or User settings → Access Keys (for user access keys), and create a new one.
After you have created a new service account, you will need to assign it access rules.
To assign access rules to the service account, see [Create access rules](https://run-ai-docs.nvidia.com/saas/infrastructure-setup/authentication/accessrules#create-or-delete-rules).
Make sure you assign the correct rules to your service account. Use the [Roles](https://run-ai-docs.nvidia.com/saas/infrastructure-setup/authentication/roles) to assign the correct access rules.
To get your access token, follow the instructions in [Request a token](https://run-ai-docs.nvidia.com/saas/reference/api/rest-auth/#request-an-api-token).
'
title: NVIDIA Run:ai Access Keys Trainings API
x-logo:
url: https://api.redocly.com/registry/raw/runai-xq8/saas/latest/public/runai-logo-api.png
altText: NVIDIA Run:ai
href: https://run.ai
license:
name: NVIDIA Run:ai
url: https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-software-license-agreement/
servers:
- url: https://app.run.ai
security:
- bearerAuth: []
tags:
- name: Trainings
description: "Trainings are dedicated workloads that are specifically used for training models. \nThey are by design preemptible workloads because they are used in unattended sessions where the \nscientists and researchers do not need to be present. These workloads are allowed to utilize \nresources over the project's quota. \n"
paths:
/api/v1/workloads/trainings:
post:
summary: Create a training.
operationId: create_training1
description: Create a training workload using container related fields.
tags:
- Trainings
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/TrainingCreationRequest'
responses:
'202':
description: Request completed successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Training1'
'400':
$ref: '#/components/responses/400SubmissionErrorV2'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
/api/v1/workloads/trainings/{workloadId}:
delete:
summary: Delete a training.
operationId: delete_training
description: Delete a training using a workload id.
tags:
- Trainings
parameters:
- $ref: '#/components/parameters/WorkloadId'
responses:
'202':
$ref: '#/components/responses/202Accepted'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'404':
$ref: '#/components/responses/404NotFound'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
get:
summary: Get training data.
operationId: get_training
description: Retrieve training details using a workload id.
tags:
- Trainings
parameters:
- $ref: '#/components/parameters/WorkloadId'
responses:
'200':
description: Executed successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Training1'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'404':
$ref: '#/components/responses/404NotFound'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
/api/v1/workloads/trainings/{workloadId}/suspend:
post:
summary: Suspend a training.
operationId: suspend_training
description: Suspend a training from running using a workload id.
tags:
- Trainings
parameters:
- $ref: '#/components/parameters/WorkloadId'
responses:
'202':
$ref: '#/components/responses/202Accepted'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'404':
$ref: '#/components/responses/404NotFound'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
/api/v1/workloads/trainings/{workloadId}/resume:
post:
summary: Resume a training.
operationId: resume_training
description: Resume a training that was suspended using a workload id.
tags:
- Trainings
parameters:
- $ref: '#/components/parameters/WorkloadId'
responses:
'202':
$ref: '#/components/responses/202Accepted'
'401':
$ref: '#/components/responses/401Unauthorized'
'403':
$ref: '#/components/responses/403Forbidden'
'404':
$ref: '#/components/responses/404NotFound'
'500':
$ref: '#/components/responses/500InternalServerError'
'503':
$ref: '#/components/responses/503ServiceUnavailable'
components:
schemas:
PodAffinity:
description: Pod affinity scheduling rules (e.g. co-locate this workload in the same node, zone, etc. as some other workloads).
type:
- object
- 'null'
properties:
type:
$ref: '#/components/schemas/PodAffinityType'
key:
description: The label key to use. (mandatory)
type:
- string
- 'null'
pattern: .*
Capability:
type: string
enum:
- AUDIT_CONTROL
- AUDIT_READ
- AUDIT_WRITE
- BLOCK_SUSPEND
- CHOWN
- DAC_OVERRIDE
- DAC_READ_SEARCH
- FOWNER
- FSETID
- IPC_LOCK
- IPC_OWNER
- KILL
- LEASE
- LINUX_IMMUTABLE
- MAC_ADMIN
- MAC_OVERRIDE
- MKNOD
- NET_ADMIN
- NET_BIND_SERVICE
- NET_BROADCAST
- NET_RAW
- SETGID
- SETFCAP
- SETPCAP
- SETUID
- SYS_ADMIN
- SYS_BOOT
- SYS_CHROOT
- SYS_MODULE
- SYS_NICE
- SYS_PACCT
- SYS_PTRACE
- SYS_RAWIO
- SYS_RESOURCE
- SYS_TIME
- SYS_TTY_CONFIG
- SYSLOG
- WAKE_ALARM
NodeAffinityRequired:
type:
- object
- 'null'
description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node.
properties:
nodeSelectorTerms:
description: A list of node selector terms. The terms are ORed.
type: array
items:
$ref: '#/components/schemas/NodeSelectorTerm'
SupplementalGroups:
description: Comma separated list of groups that the user running the container belongs to, in addition to the group indicated by runAsGid. Use only when the source uid/gid of the environment asset is not `fromTheImage`, and `overrideUidGidInWorkspace` is enabled. Using an empty string implies reverting the supplementary groups of the image.
type:
- string
- 'null'
example: 2,3,5,8
pattern: .*
Tolerations:
description: Set of tolerations to apply to the workload.
type:
- array
- 'null'
items:
$ref: '#/components/schemas/Toleration'
ImagePullPolicy:
description: Image pull policy. Defaults to `Always` if `:latest` tag is specified, otherwise it is `IfNotPresent`.
type:
- string
- 'null'
minLength: 1
enum:
- Always
- Never
- IfNotPresent
UidGidSource:
description: Indicate the way to determine the user and group ids of the container. The options are a. `fromTheImage` - user and group ids are determined by the docker image that the container runs. this is the default option. b. `custom` - user and group ids can be specified in the environment asset and/or the workload creation request. c. `idpToken` - user and group IDs are automatically taken from the identity provider (IdP) token (available only in SSO-enabled installations). For more information, see [User Identity](https://docs.run.ai/latest/admin/runai-setup/config/non-root-containers/).
type:
- string
- 'null'
enum:
- fromTheImage
- fromIdpToken
- custom
TerminationGracePeriod:
description: Duration in seconds the pod needs to terminate gracefully upon probe failure. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Value must be non-negative integer. The value zero indicates stop immediately via the kill signal (no opportunity to shut down).
format: int64
type:
- integer
- 'null'
minimum: 0
example: 20
Label:
description: Label details to be populated into the container.
properties:
name:
description: The name of the label (mandatory)
type:
- string
- 'null'
minLength: 1
maxLength: 63
example: stage
pattern: .*
value:
description: The value of the label.
type:
- string
- 'null'
example: initial-research
pattern: .*
exclude:
description: Use 'true' in case the label is defined in defaults of the policy, and you wish to exclude it from the workload.
type:
- boolean
- 'null'
example: false
type:
- object
- 'null'
ProbeHandler:
description: The action taken to determine the health of the container. (mandatory)
type:
- object
- 'null'
properties:
httpGet:
description: An action based on HTTP Get requests.
type: object
properties:
path:
description: Path to access on the HTTP server, defaults to /.
type:
- string
- 'null'
pattern: ^(\x2F[a-zA-Z0-9\-_.\x2F]*)?$
example: /
port:
description: Number of the port to access on the container.
type:
- integer
- 'null'
format: int32
minimum: 1
maximum: 65535
host:
description: Host name to connect to, defaults to the pod IP.
type:
- string
- 'null'
format: hostname
example: example.com
pattern: .*
scheme:
$ref: '#/components/schemas/ProbeHandlerScheme'
EnvironmentVariablePodFieldReference:
description: Details of the field-reference and key use to populate the environment variable
properties:
path:
description: The field path resource. (mandatory)
type:
- string
- 'null'
minLength: 1
example: metadata.name
pattern: .*
type:
- object
- 'null'
Labels:
description: Set of labels to populate into the container running the workload.
type:
- array
- 'null'
items:
$ref: '#/components/schemas/Label'
ImagePullSecrets:
description: A list of references to Kubernetes secrets in the same namespace used for pulling container images.
type:
- array
- 'null'
items:
$ref: '#/components/schemas/ImagePullSecret'
SecretFieldsNonUpdatable:
properties:
secret:
description: The name of the Secret resource. (mandatory)
type:
- string
- 'null'
minLength: 1
type:
- object
- 'null'
CpuMemoryLimit:
description: Limitations on the CPU memory to allocate for this workload (1G, 20M, .etc). The system guarantees that this workload will not be able to consume more than this amount of memory. The workload will receive an error when trying to allocate more memory than this limit.
type:
- string
- 'null'
pattern: ^([+]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$
example: 30M
GitInstance:
allOf:
- $ref: '#/components/schemas/StorageInstanceName'
- $ref: '#/components/schemas/GitCommon'
- $ref: '#/components/schemas/GitPassword'
- $ref: '#/components/schemas/ExcludeField'
- type:
- object
- 'null'
properties:
secretRef:
$ref: '#/components/schemas/GitSecretRef'
type:
- object
- 'null'
NfsInstance:
allOf:
- $ref: '#/components/schemas/StorageInstanceName'
- $ref: '#/components/schemas/Nfs'
- $ref: '#/components/schemas/ExcludeField'
type:
- object
- 'null'
PortServiceType:
description: The service type of the port (mandatory).
type:
- string
- 'null'
enum:
- LoadBalancer
- NodePort
- ClusterIP
EnvironmentVariableUserCredential:
description: Defines a reference to a user-created credential and a specific key within that credential whose value will populate the environment variable. User credentials can only be accessed by the user who created them.
properties:
name:
description: The name of the user credential. (mandatory)
type:
- string
- 'null'
minLength: 1
example: my_postgres_user_and_password
key:
description: The key in the user credential resource. (mandatory)
type:
- string
- 'null'
minLength: 1
example: POSTGRES_PASSWORD
type:
- object
- 'null'
HostNetwork:
description: Whether to enable host networking. Default to false.
type:
- boolean
- 'null'
example: false
Args:
description: Arguments to the command that the container running the workload executes.
type:
- string
- 'null'
minLength: 1
example: -x my-script.py
pattern: .*
Phase:
type: string
enum:
- Creating
- Initializing
- Resuming
- Pending
- Deleting
- Running
- Updating
- Stopped
- Stopping
- Degraded
- Failed
- Completed
- Terminating
- Unknown
SeccompProfileType:
description: Indicates which kind of seccomp profile will be applied to the container. The options are a. `RuntimeDefault` - the container runtime default profile should be used. b. `Unconfined` - no profile should be applied. c. `Localhost` is not yet supported by Run:ai.
type:
- string
- 'null'
enum:
- RuntimeDefault
- Unconfined
- Localhost
AutoDeletionTimeAfterPreemption:
description: Specifies the duration after which a finished workload (completed or failed) will be automatically deleted. The default is 30 days. Log retention is managed separately.
format: int64
type:
- integer
- 'null'
example: 15
EmptyDir:
properties:
path:
description: Local path within the workload to which the EmptyDir volume will be mapped. (mandatory)
type:
- string
- 'null'
minLength: 1
example: /mnt/emptydir
pattern: .*
medium:
description: The type of storage medium for the volume. Use "Memory" for memory-backed storage, or leave empty for disk-backed storage.
type:
- string
- 'null'
minLength: 1
pattern: .*
sizeLimit:
description: The total amount of local storage or memory required for the emptyDir volume. Specify using Kubernetes quantity format (e.g., 1G, 500Mi).
type:
- string
- 'null'
pattern: ^([+]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$
example: 1G
type:
- object
- 'null'
ComplianceIssuesV2:
properties:
complianceIssues:
type: array
items:
type: object
required:
- details
- field
properties:
field:
type: string
example: compute.gpuDevicesRequest
details:
type: string
example: value must be no less than 3
rule:
$ref: '#/components/schemas/PolicyRuleEnum'
type:
- object
- 'null'
HostPathItems:
description: Set of host paths to use in the workload.
type:
- array
- 'null'
items:
$ref: '#/components/schemas/HostPathInstance'
Annotations:
description: Set of annotations to populate into the container running the workload.
type:
- array
- 'null'
items:
$ref: '#/components/schemas/Annotation'
PodAffinityType:
description: The affinity type, required or preferred. (mandatory)
type:
- string
- 'null'
enum:
- Required
- Preferred
GitPassword:
properties:
passwordSecret:
description: Secret containing the credentials of the repository (needed for non public repository which requires authentication). (deprecated)
type:
- string
- 'null'
minLength: 1
example: my-password-secret
secretKeyOfUser:
description: The key to use for loading the user name from the secret. The default is `User`. (deprecated)
type:
- string
- 'null'
minLength: 1
example: User
secretKeyOfPassword:
description: The key to use for loading the password from the secret. The default is `Password`. (deprecated)
type:
- string
- 'null'
minLength: 1
example: Password
type:
- object
- 'null'
Annotation:
description: Annotation details to be populated into the container.
properties:
name:
description: The name of the annotation (mandatory)
type:
- string
- 'null'
minLength: 1
maxLength: 63
example: billing
pattern: .*
value:
description: The value of the annotation.
type:
- string
- 'null'
example: my-billing-unit
pattern: .*
exclude:
description: Use 'true' in case the annotation is defined in defaults of the policy, and you wish to exclude it from the workload.
type:
- boolean
- 'null'
default: false
example: false
type:
- object
- 'null'
AllowPrivilegeEscalation:
description: Allow the container running the workload and all launched processes to gain additional privileges after the workload starts. For more information consult the User Identity in Container guide at https://docs.run.ai/admin/runai-setup/config/non-root-containers/
type:
- boolean
- 'null'
example: false
DataVolumeInstance:
allOf:
- $ref: '#/components/schemas/DataVolume'
- $ref: '#/components/schemas/ExcludeField'
type:
- object
- 'null'
RunAsUid:
description: The user id to run the entrypoint of the container which executes the workspace. Default to the value specified in the environment asset `runAsUid` field (optional). Use only when the source uid/gid of the environment asset is not `fromTheImage`, and `overrideUidGidInWorkspace` is enabled.
type:
- integer
- 'null'
format: int64
example: 500
ReadOnlyRootFileSystem:
description: If true, mounts the container's root filesystem as read-only.
type:
- boolean
- 'null'
example: false
PvcVolumeMode:
description: Default volume mode for the PVC. Choose between Filesystem (default) or Block.
type:
- string
- 'null'
enum:
- Filesystem
- Block
ConfigMapInstance:
allOf:
- $ref: '#/components/schemas/StorageInstanceName'
- $ref: '#/components/schemas/ConfigMap'
- $ref: '#/components/schemas/ExcludeField'
type:
- object
- 'null'
RelatedUrl:
description: A URL that is related to the workload. For example, a URL to an external server providing statistics or logging about the workload.
properties:
url:
description: The URL for connecting an external service related to the workload. (mandatory)
type:
- string
- 'null'
example: https://my-url.com
pattern: .*
type:
description: The type of service that the url provides. For example, wandb (Weights & Biases). (mandatory)
type:
- string
- 'null'
example: wandb
pattern: .*
name:
description: Unique name to identify the instance. primarily used for policy locked rules.
type:
- string
- 'null'
example: url-instance-a
pattern: .*
exclude:
description: Use 'true' in case the item is defined in defaults of the policy, and you wish to exclude it from the workload.
type:
- boolean
- 'null'
default: false
example: false
type:
- object
- 'null'
BackoffLimit:
description: Specifies the number of retries before marking a workload as failed (not applicable to Inference workloads). The default value is 6.
format: int64
type:
- integer
- 'null'
example: 3
NodePools:
description: A prioritized list of node pools for the scheduler to run the workload on. The scheduler will always try to use the first node pool before moving to the next one if the first is not available.
type:
- array
- 'null'
items:
type: string
pattern: .*
example:
- my-node-pool-a
- my-node-pool-b
PvcClaimSize:
description: 'Requested size for the PVC. Mandatory when existingPvc is false. Recommended sizes: TB/GB/MB/TIB/GIB/MIB'
type:
- string
- 'null'
pattern: ^([+]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$
example: 1G
ExposedUrl:
description: A URL for accessing the workload.
properties:
container:
description: The port that the container running the workload exposes. (mandatory)
type:
- integer
- 'null'
format: int32
example: 8080
url:
description: The URL for connecting to the container port. If not specified, the URL will be auto-generated by the system..
type:
- string
- 'null'
pattern: .*
example: https://my-url.com
authorizationType:
$ref: '#/components/schemas/AuthorizationType'
authorizedUsers:
description: List of users or service accounts that are allowed to access the URL. Note that authorizedUsers and authorizedGroups are mutually exclusive.
type:
- array
- 'null'
items:
type: string
pattern: .*
example:
- user-a
- user-b
authorizedGroups:
description: List of groups that are allowed to access the URL. Note that authorizedUsers and authorizedGroups are mutually exclusive.
type:
- array
- 'null'
items:
type: string
pattern: .*
example:
- group-a
- group-b
toolType:
description: The tool type that runs on this container port.
type:
- string
- 'null'
example: jupyter
pattern: .*
toolName:
description: A name describing the tool that runs on this url.
type:
- string
- 'null'
example: my-pytorch
pattern: .*
name:
description: Unique name to identify the instance. primarily used for policy locked rules.
type:
- string
- 'null'
minLength: 1
example: url-instance-a
pattern: .*
exclude:
description: Use 'true' in case the instance is defined in defaults of the policy, and you wish to exclude it from the workload.
type:
- boolean
- 'null'
example: false
type:
- object
- 'null'
Ports:
description: Set of container ports that the workload exposes.
type:
- array
- 'null'
items:
$ref: '#/components/schemas/Port'
Stdin:
description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF
type:
- boolean
- 'null'
ConfigMapItems:
description: Set of config map volumes to use in the workload
type:
- array
- 'null'
items:
$ref: '#/components/schemas/ConfigMapInstance'
EnvironmentVariables:
description: Set of environment variables to populate into the container running the workload.
type:
- array
- 'null'
items:
$ref: '#/components/schemas/EnvironmentVariable'
WorkingDir:
description: Container's working directory. If not specified, the container runtime default will be used. This may be configured in the container image.
type:
- string
- 'null'
minLength: 1
example: /home/myfolder
pattern: .*
GpuPortionLimit:
description: Limitations on the portion consumed by the workload, per GPU device. The system guarantees The gpuPotionLimit must be no less than the gpuPortionRequest.
type:
- number
- 'null'
format: double
example: 0.5
minimum: 0
Completions:
description: Used with Hyperparameter Optimization. Specifies the number of successful pods the job should reach to be completed. The Job will be marked as successful once the specified amount of pods has been reached (applicable to standard training only).
type:
- integer
- 'null'
format: int32
example: 1
TrainingCreationRequest:
allOf:
- $ref: '#/components/schemas/WorkloadCreationMeta'
- $ref: '#/components/schemas/SubmitWithTemplateId'
- $ref: '#/components/schemas/TrainingSpec'
EnvironmentVariableConfigMap:
description: Details of the configMap and key use to populate the environment variable
properties:
name:
description: The name of the config-map resource. (mandatory)
type:
- string
- 'null'
minLength: 1
example: my-config-map
pattern: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$
key:
description: The key in the config-map resource. (mandatory)
type:
- string
- 'null'
minLength: 1
example: MY_POSTGRES_SCHEMA
pattern: .*
type:
- object
- 'null'
PolicyRuleEnum:
description: Indicates which validation rule (e.g., min, max, step, options, required, canEdit, canAdd) conflicted with policy restrictions, causing the asset or template to be rejected.
type:
- string
- 'null'
enum:
- min
- max
- step
- options
- required
- canEdit
- canAdd
- locked
ConfigMap:
properties:
configMap:
description: The name of the ConfigMap resource. (mandatory)
type:
- string
- 'null'
minLength: 1
pattern: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$
mountPath:
description: Local path within the workload to which the ConfigMap will be mapped to. (mandatory)
type:
- string
- 'null'
minLength: 1
pattern: .*
subPath:
description: Path within the volume from which the container's volume should be mounted.
type:
- string
- 'null'
minLength: 1
pattern: .*
defaultMode:
$ref: '#/components/schemas/DefaultMode'
type:
- object
- 'null'
ExtendedResources:
description: Extended resources and their quantity.
type:
- array
- 'null'
items:
$ref: '#/components/schemas/ExtendedResource'
S3Common:
properties:
bucket:
description: The name of the bucket. (mandatory)
type:
- string
- 'null'
minLength: 1
example: my-bucket
path:
description: Local path within the workload to which the S3 bucket will be mapped. (mandatory)
type:
- string
- 'null'
minLength: 1
example: /container/my-bucket
url:
description: The url of the S3 service provider. The default is the URL of the Amazon AWS S3 service.
type:
- string
- 'null'
minLength: 1
example: https://s3.amazonaws.com
type:
- object
- 'null'
ClusterId:
description: The id of the cluster.
type: string
format: uuid
example: 71f69d83-ba66-4822-adf5-55ce55efd210
WorkloadMeta1:
required:
- name
- requestedName
- workloadId
- projectId
- clusterId
- createdBy
- createdAt
- desiredPhase
properties:
name:
$ref: '#/components/schemas/WorkloadName'
requestedName:
description: The name as was requested for the workload. If useGivenNameAsPrefix, in the creation request, is false, name and requestedName should be identical. Otherwise, name should be composed of requestedName followed by a suffix of random characters.
type: string
workloadId:
$ref: '#/components/schemas/WorkloadId2'
projectId:
$ref: '#/components/schemas/ProjectId'
departmentId:
$ref: '#/components/schemas/DepartmentId2'
clusterId:
$ref: '#/components/schemas/ClusterId'
createdBy:
description: The user who created the workload
type: string
example: test@lab.com
createdAt:
description: The creation time of the workload.
type: string
format: date-time
example: '2022-01-01T03:49:52.531Z'
deletedAt:
description: The deletion time of the workload.
type:
- string
- 'null'
format: date-time
example: '2022-01-01T03:49:52.531Z'
desiredPhase:
$ref: '#/components/schemas/WorkloadDesiredPhase'
actualPhase:
$ref: '#/components/schemas/Phase'
CpuMemoryRequest:
description: The amount of CPU memory to allocate for this workload (1G, 20M, .etc). The workload will receive at least this amount of memory. Note that the workload will not be scheduled unless the system can guarantee this
# --- truncated at 32 KB (76 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/runai/refs/heads/main/openapi/runai-trainings-api-openapi.yml