{
  "components": {
    "schemas": {
      "BlockingReason": {
        "additionalProperties": false,
        "description": "BlockingReason says why a create would fail now.",
        "properties": {
          "code": {
            "description": "Code is the error code the create would return, for example InsufficientCredits.",
            "type": "string"
          },
          "fix": {
            "description": "Fix says what to do.",
            "type": "string"
          },
          "message": {
            "description": "Message states the reason with the amounts involved.",
            "type": "string"
          }
        },
        "required": [
          "code"
        ],
        "type": "object"
      },
      "BucketInput": {
        "additionalProperties": false,
        "description": "BucketInput is an object in customer storage.",
        "properties": {
          "connection": {
            "description": "Connection is an S3 Connection that can read it.",
            "type": "string"
          },
          "sha256": {
            "description": "SHA256 is checked at end of stream when set.",
            "type": "string"
          },
          "uri": {
            "description": "URI is s3://bucket/key.",
            "type": "string"
          }
        },
        "required": [
          "uri",
          "connection"
        ],
        "type": "object"
      },
      "CheckpointPolicy": {
        "additionalProperties": false,
        "description": "CheckpointPolicy configures checkpoints.",
        "properties": {
          "format": {
            "description": "Format is Snapshot, or Dcp for torch.distributed.checkpoint (the default for distributed Jobs).",
            "type": "string"
          },
          "integration": {
            "description": "Integration is Auto, None or HFTrainer.",
            "type": "string"
          },
          "interval": {
            "description": "Interval is auto or a duration from 1m to 6h.",
            "type": "string"
          },
          "maxSize": {
            "description": "MaxSize is checked before upload (default 1Ti, at most 2Ti).",
            "type": "string"
          },
          "paths": {
            "description": "Paths are saved together in one checkpoint (at most 64; default /nodus/state).",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "retainAfterFinish": {
            "description": "RetainAfterFinish keeps checkpoints this long after the Job finishes (default 168h).",
            "type": "string"
          }
        },
        "type": "object"
      },
      "Comparison": {
        "additionalProperties": false,
        "description": "Comparison is the comparability gate: like-for-like tasks, at least minComparisonTasks, not all 0 % or all 100 %, and no missing events.",
        "properties": {
          "changePP": {
            "description": "ChangePP is the pass-rate change in percentage points, as a decimal string.",
            "type": "string"
          },
          "comparable": {
            "description": "Comparable is true when baseline and evaluation scored the same tasks and no events are missing.",
            "type": "boolean"
          },
          "measurable": {
            "description": "Measurable is true when the tasks can show a change (comparable and not all failed or all passed).",
            "type": "boolean"
          },
          "note": {
            "description": "Note explains Reason in one sentence.",
            "type": "string"
          },
          "reason": {
            "description": "Reason is Comparable, SmallestStep, TooFewTasks, DifferentTasks, NonePassed, AllPassed or IncompleteEvents.",
            "type": "string"
          },
          "resolutionPP": {
            "description": "ResolutionPP is the smallest change the task set can show (100 / tasks), as a decimal string.",
            "type": "string"
          }
        },
        "required": [
          "comparable",
          "measurable",
          "reason"
        ],
        "type": "object"
      },
      "Condition": {
        "additionalProperties": false,
        "properties": {
          "lastTransitionTime": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "observedGeneration": {
            "format": "int64",
            "type": "integer"
          },
          "reason": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "required": [
          "type",
          "status",
          "lastTransitionTime",
          "reason",
          "message"
        ],
        "type": "object"
      },
      "Cost": {
        "additionalProperties": false,
        "description": "Cost is status.cost on every kind that spends money. It is a display copy of the ledger: amounts are decimal USD strings, and nothing is charged from these fields.",
        "properties": {
          "bySegment": {
            "$ref": "#/components/schemas/CostSegments"
          },
          "final": {
            "description": "Final is true once the final charge has posted.",
            "type": "boolean"
          },
          "fundedUntilTime": {
            "description": "FundedUntilTime is when the current holds stop paying for the object.",
            "type": "string"
          },
          "heldUSD": {
            "description": "HeldUSD is what is currently held for it.",
            "type": "string"
          },
          "limitUSD": {
            "description": "LimitUSD is the object's maxCostUSD, if it has one.",
            "type": "string"
          },
          "rateUSDPerHour": {
            "description": "RateUSDPerHour is the sum of the hourly rates of its capacity that is still billing.",
            "type": "string"
          },
          "totalUSD": {
            "description": "TotalUSD is what has been charged for this object so far.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "CostSegments": {
        "additionalProperties": false,
        "description": "CostSegments splits a charge by billing segment.",
        "properties": {
          "bootUSD": {
            "description": "BootUSD is the charge from the start of billing until the program started.",
            "type": "string"
          },
          "coveredByNodus": {
            "description": "CoveredByNodus lists the segments (Boot, Running, Restore, Teardown) with time Nodus paid for instead of charging it, such as the start and teardown of a run that failed because of Nodus.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "restoreUSD": {
            "description": "RestoreUSD is the charge for bringing a replacement up after capacity was lost.",
            "type": "string"
          },
          "runningUSD": {
            "description": "RunningUSD is the charge while the program ran.",
            "type": "string"
          },
          "teardownUSD": {
            "description": "TeardownUSD is the charge from stop until deletion was confirmed, with the billing increment.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "Distributed": {
        "additionalProperties": false,
        "description": "Distributed runs the Job as a gang of nodes that start together and restart together (Beta).",
        "properties": {
          "gpusPerNode": {
            "description": "GPUsPerNode is 1, 2, 4 or 8 and equals resources.gpu.count when both are set.",
            "format": "int32",
            "type": "integer"
          },
          "launcher": {
            "description": "Launcher is Plain (env contract only), Torchrun, Ray, Verl, Accelerate or Deepspeed.",
            "type": "string"
          },
          "maxAssemblyRetries": {
            "description": "MaxAssemblyRetries is how many times a timed-out assembly is re-placed (0–5, default 2).",
            "format": "int32",
            "type": "integer"
          },
          "network": {
            "description": "Network is Colocated (one provider and region), Regional (one region class) or Global.",
            "type": "string"
          },
          "nodes": {
            "description": "Nodes is the gang size (2–16; the beta caps it at 8). Exactly one of nodes and totalGPUs.",
            "format": "int32",
            "type": "integer"
          },
          "startupTimeout": {
            "description": "StartupTimeout is the gang assembly budget (5m–60m, default 15m).",
            "type": "string"
          },
          "totalGPUs": {
            "description": "TotalGPUs is resolved into status.topology at admission (2–64).",
            "format": "int32",
            "type": "integer"
          },
          "transport": {
            "description": "Transport is Direct (private or direct paths only) or Auto (relayed paths allowed).",
            "type": "string"
          }
        },
        "type": "object"
      },
      "DurationBand": {
        "additionalProperties": false,
        "description": "DurationBand is a median and a 90th-percentile duration, as Go duration strings.",
        "properties": {
          "p50": {
            "description": "P50 is the median duration.",
            "type": "string"
          },
          "p90": {
            "description": "P90 is the 90th-percentile duration.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "Egress": {
        "additionalProperties": false,
        "description": "Egress is the outbound network policy.",
        "properties": {
          "allow": {
            "description": "Allow lists DNS names or *.suffix patterns (AllowList only; at most 128).",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "policy": {
            "description": "Policy is Deny, AllowList or Open.",
            "type": "string"
          },
          "presets": {
            "description": "Presets add curated host lists such as python-packages or huggingface.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "type": "object"
      },
      "EnvVar": {
        "additionalProperties": false,
        "description": "EnvVar is one environment variable: a literal value or a Secret key.",
        "properties": {
          "name": {
            "description": "Name matches ^[A-Za-z_][A-Za-z0-9_]*$.",
            "type": "string"
          },
          "value": {
            "description": "Value is the literal value.",
            "type": "string"
          },
          "valueFrom": {
            "$ref": "#/components/schemas/EnvVarSource"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "EnvVarSource": {
        "additionalProperties": false,
        "description": "EnvVarSource names where an env value comes from.",
        "properties": {
          "secretKeyRef": {
            "$ref": "#/components/schemas/SecretKeySelector"
          }
        },
        "type": "object"
      },
      "EnvironmentBinding": {
        "additionalProperties": false,
        "description": "EnvironmentBinding selects an Environment and its task counts.",
        "properties": {
          "heldOutTasks": {
            "description": "HeldOutTasks is the number of held-out tasks evaluated before and after training.",
            "format": "int32",
            "type": "integer"
          },
          "name": {
            "description": "Name is nodus/\u003cname\u003e@\u003cversion\u003e or \u003cname\u003e@\u003cversion\u003e in this project.",
            "type": "string"
          },
          "seed": {
            "description": "Seed selects the tasks deterministically (default 0).",
            "format": "int64",
            "type": "integer"
          },
          "trainTasks": {
            "description": "TrainTasks is the number of training tasks.",
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "Estimate": {
        "additionalProperties": false,
        "description": "Estimate is returned in status.estimate by a dry-run (`?dryRun=All`) and on create for every compute kind (ADR-031). Amounts are decimal USD strings; the ETag of the dry-run response binds a later create to it.",
        "properties": {
          "assemblyBoundUSD": {
            "description": "AssemblyBoundUSD is the most a multi-node Job can cost if its members never assemble.",
            "type": "string"
          },
          "blockingReasons": {
            "description": "BlockingReasons say why a real create would fail now, with the amounts and a fix.",
            "items": {
              "$ref": "#/components/schemas/BlockingReason"
            },
            "nullable": true,
            "type": "array"
          },
          "concurrentHoldUSD": {
            "description": "ConcurrentHoldUSD is the total of the holds for every slot that starts at once.",
            "type": "string"
          },
          "costUSD": {
            "$ref": "#/components/schemas/USDBand"
          },
          "gangHoldUSD": {
            "description": "GangHoldUSD is the total of the member holds of a multi-node Job.",
            "type": "string"
          },
          "holdUSD": {
            "description": "HoldUSD is the first hold that must fit your balance, every matching Budget and the object's own cap.",
            "type": "string"
          },
          "minimumChargeUSD": {
            "description": "MinimumChargeUSD is the billing increment rounding charged once per allocation.",
            "type": "string"
          },
          "overheadUSD": {
            "$ref": "#/components/schemas/USDBand"
          },
          "placementPreview": {
            "$ref": "#/components/schemas/PlacementPreview"
          },
          "pricebookVersion": {
            "description": "PricebookVersion is the price book the estimate used.",
            "type": "string"
          },
          "rateUSDPerHour": {
            "description": "RateUSDPerHour is the hourly rate of the chosen capacity.",
            "type": "string"
          },
          "startup": {
            "$ref": "#/components/schemas/StartupEstimate"
          },
          "topology": {
            "description": "Topology is the resolved multi-node topology of a gang Job."
          },
          "validUntil": {
            "description": "ValidUntil is when the prices this estimate used stop being current. A create bound by If-Match is admitted after it too, and never placed above rateUSDPerHour plus 10 %.",
            "type": "string"
          },
          "warnings": {
            "description": "Warnings are non-blocking notes, for example ColdStart or InterruptibleSelected.",
            "items": {
              "$ref": "#/components/schemas/EstimateWarning"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "type": "object"
      },
      "EstimateWarning": {
        "additionalProperties": false,
        "description": "EstimateWarning is a non-blocking note on an estimate.",
        "properties": {
          "code": {
            "description": "Code is the CamelCase warning code.",
            "type": "string"
          },
          "message": {
            "description": "Message explains the warning.",
            "type": "string"
          }
        },
        "required": [
          "code"
        ],
        "type": "object"
      },
      "Evaluation": {
        "additionalProperties": false,
        "description": "Evaluation controls the baseline and final evaluation.",
        "properties": {
          "baseline": {
            "description": "Baseline evaluates the model before training (default true).",
            "type": "boolean"
          },
          "final": {
            "description": "Final evaluates the model after training (default true).",
            "type": "boolean"
          },
          "minComparisonTasks": {
            "description": "MinComparisonTasks is the smallest held-out set a comparison is reported on (default and minimum 16).",
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "ExportTarget": {
        "additionalProperties": false,
        "description": "ExportTarget is a Volume the outputs are also written to.",
        "properties": {
          "volume": {
            "description": "Volume is the Volume.",
            "type": "string"
          }
        },
        "required": [
          "volume"
        ],
        "type": "object"
      },
      "GPURequest": {
        "additionalProperties": false,
        "description": "GPURequest asks for accelerators. A family (H100) matches any of its variants and never another family.",
        "properties": {
          "count": {
            "description": "Count is the GPUs per node: 1, 2, 4 or 8.",
            "format": "int32",
            "type": "integer"
          },
          "exact": {
            "description": "Exact pins the exact variant instead of matching the family.",
            "type": "boolean"
          },
          "interconnect": {
            "description": "Interconnect is Any or NVLink.",
            "type": "string"
          },
          "minMemory": {
            "description": "MinMemory is the per-GPU memory floor.",
            "type": "string"
          },
          "type": {
            "description": "Type lists 1–8 accelerator ids or families from the catalog.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "type": "object"
      },
      "GitSource": {
        "additionalProperties": false,
        "description": "GitSource is a repository checkout.",
        "properties": {
          "path": {
            "description": "Path is the checkout path (default workingDir).",
            "type": "string"
          },
          "ref": {
            "description": "Ref is a branch, tag or commit.",
            "type": "string"
          },
          "repo": {
            "description": "Repo is owner/name or an https:// URL.",
            "type": "string"
          }
        },
        "required": [
          "repo"
        ],
        "type": "object"
      },
      "GradingPolicy": {
        "additionalProperties": false,
        "description": "GradingPolicy bounds grading.",
        "properties": {
          "maxParallel": {
            "description": "MaxParallel is the most grading Sandboxes at once (default 4, at most 32).",
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "InitCommand": {
        "additionalProperties": false,
        "description": "InitCommand is a preflight run before the command.",
        "properties": {
          "command": {
            "description": "Command is the argv.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "timeout": {
            "description": "Timeout is at most 30m.",
            "type": "string"
          }
        },
        "required": [
          "command"
        ],
        "type": "object"
      },
      "JobInput": {
        "additionalProperties": false,
        "description": "JobInput is one input: exactly one of volume, output, bucket, url and fromWorkspace. It is mounted at /nodus/inputs/\u003cname\u003e, with the path in NODUS_INPUT_\u003cNAME\u003e, and materialized inside the billed time.",
        "properties": {
          "bucket": {
            "$ref": "#/components/schemas/BucketInput"
          },
          "fromStage": {
            "$ref": "#/components/schemas/StageInput"
          },
          "fromWorkspace": {
            "$ref": "#/components/schemas/WorkspaceInput"
          },
          "name": {
            "description": "Name matches ^[A-Za-z][A-Za-z0-9_]{0,63}$ and is unique among inputs.",
            "type": "string"
          },
          "output": {
            "$ref": "#/components/schemas/OutputInput"
          },
          "url": {
            "$ref": "#/components/schemas/URLInput"
          },
          "volume": {
            "$ref": "#/components/schemas/VolumeInput"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "JobOutput": {
        "additionalProperties": false,
        "description": "JobOutput is a declared output.",
        "properties": {
          "fromRanks": {
            "description": "FromRanks is Zero (rank 0 only) or All (every rank under rank-\u003cn\u003e/) for gang Jobs.",
            "type": "string"
          },
          "name": {
            "description": "Name matches ^[a-z0-9._-]{1,64}$; the nodus. prefix is reserved.",
            "type": "string"
          },
          "path": {
            "description": "Path is an absolute file or directory path; directories are archived as tar.zst.",
            "type": "string"
          },
          "sink": {
            "$ref": "#/components/schemas/OutputSink"
          }
        },
        "required": [
          "name",
          "path"
        ],
        "type": "object"
      },
      "JobSpec": {
        "additionalProperties": false,
        "description": "JobSpec describes a Job. Everything is immutable after create except parallelism, backoffLimit, timeout, maxCostUSD (raise only), recovery.maxAttempts, recovery.checkpoint.interval and retainAfterFinish, ttlSecondsAfterFinished and state.",
        "properties": {
          "activeDeadlineSeconds": {
            "description": "ActiveDeadlineSeconds is accepted as an alias of timeout on write and folded into it.",
            "format": "int64",
            "type": "integer"
          },
          "args": {
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "backoffLimit": {
            "description": "BackoffLimit is how many customer failures (non-zero exits, OOM) across all indexes are retried before the Job fails (0–100).",
            "format": "int32",
            "type": "integer"
          },
          "command": {
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "completeByTime": {
            "description": "CompleteByTime is a finish-by hint for placement and checkpoint cadence. It never stops the Job.",
            "type": "string"
          },
          "completions": {
            "description": "Completions is how many indexes must succeed (1–10000). Each index gets NODUS_INDEX and JOB_COMPLETION_INDEX.",
            "format": "int32",
            "type": "integer"
          },
          "connections": {
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "distributed": {
            "$ref": "#/components/schemas/Distributed"
          },
          "env": {
            "items": {
              "$ref": "#/components/schemas/EnvVar"
            },
            "nullable": true,
            "type": "array"
          },
          "expectedDuration": {
            "description": "ExpectedDuration is the declared runtime the estimate uses first.",
            "type": "string"
          },
          "image": {
            "type": "string"
          },
          "imagePullSecrets": {
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "imageRef": {
            "type": "string"
          },
          "initCommand": {
            "$ref": "#/components/schemas/InitCommand"
          },
          "inputs": {
            "description": "Inputs are materialized read-only under /nodus/inputs/\u003cname\u003e before the command starts (at most 8).",
            "items": {
              "$ref": "#/components/schemas/JobInput"
            },
            "nullable": true,
            "type": "array"
          },
          "maxCostUSD": {
            "description": "MaxCostUSD caps what the Job may spend. Reaching it suspends the Job; it can only be raised.",
            "type": "string"
          },
          "network": {
            "$ref": "#/components/schemas/Network"
          },
          "outputs": {
            "description": "Outputs are files or directories collected when an index succeeds (at most 32). Everything under /nodus/outputs is also collected as the output named \"outputs\".",
            "items": {
              "$ref": "#/components/schemas/JobOutput"
            },
            "nullable": true,
            "type": "array"
          },
          "parallelism": {
            "description": "Parallelism is how many indexes run at once (1 to min(completions, 256)).",
            "format": "int32",
            "type": "integer"
          },
          "placement": {
            "$ref": "#/components/schemas/Placement"
          },
          "recovery": {
            "$ref": "#/components/schemas/Recovery"
          },
          "resources": {
            "$ref": "#/components/schemas/Resources"
          },
          "scaledownWindow": {
            "description": "ScaledownWindow keeps the capacity warm for reuse this long after the Job ends (0s–20m).",
            "type": "string"
          },
          "secrets": {
            "items": {
              "$ref": "#/components/schemas/SecretMount"
            },
            "nullable": true,
            "type": "array"
          },
          "serviceAccountName": {
            "type": "string"
          },
          "sidecars": {
            "items": {
              "$ref": "#/components/schemas/Sidecar"
            },
            "nullable": true,
            "type": "array"
          },
          "source": {
            "$ref": "#/components/schemas/Source"
          },
          "state": {
            "description": "State is the desired state: Running (the default), Suspended, or the cancel state that stops the Job for good.",
            "type": "string"
          },
          "timeout": {
            "description": "Timeout is the wall-clock limit counted from the first Provisioning, excluding time spent Suspended. The Job then fails with DeadlineExceeded.",
            "type": "string"
          },
          "ttlSecondsAfterFinished": {
            "description": "TTLSecondsAfterFinished deletes the Job, its outputs and checkpoints this long after it finishes.",
            "format": "int32",
            "type": "integer"
          },
          "volumes": {
            "items": {
              "$ref": "#/components/schemas/VolumeMount"
            },
            "nullable": true,
            "type": "array"
          },
          "workingDir": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "ListMeta": {
        "additionalProperties": false,
        "properties": {
          "continue": {
            "type": "string"
          },
          "remainingItemCount": {
            "format": "int64",
            "type": "integer"
          },
          "resourceVersion": {
            "type": "string"
          },
          "selfLink": {
            "type": "string"
          },
          "shardInfo": {
            "$ref": "#/components/schemas/ShardInfo"
          }
        },
        "type": "object"
      },
      "MLflowTracking": {
        "additionalProperties": false,
        "description": "MLflowTracking is an MLflow server.",
        "properties": {
          "experiment": {
            "description": "Experiment is the experiment name.",
            "type": "string"
          },
          "secret": {
            "description": "Secret holds MLFLOW_TRACKING_TOKEN or username and password.",
            "type": "string"
          },
          "uri": {
            "description": "URI is the tracking server (https://).",
            "type": "string"
          }
        },
        "required": [
          "uri"
        ],
        "type": "object"
      },
      "ManagedFieldsEntry": {
        "additionalProperties": false,
        "properties": {
          "apiVersion": {
            "type": "string"
          },
          "fieldsType": {
            "type": "string"
          },
          "fieldsV1": {
            "additionalProperties": {},
            "type": "object"
          },
          "manager": {
            "type": "string"
          },
          "operation": {
            "type": "string"
          },
          "subresource": {
            "type": "string"
          },
          "time": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "ModelSource": {
        "additionalProperties": false,
        "description": "ModelSource is exactly one of uri and volume.",
        "properties": {
          "secret": {
            "description": "Secret names a Secret with HF_TOKEN for gated models.",
            "type": "string"
          },
          "uri": {
            "description": "URI is hf://\u003crepo\u003e[@\u003crevision\u003e]; admission pins it to a 40-hex commit, cached once per organization as a read-only Volume.",
            "type": "string"
          },
          "volume": {
            "$ref": "#/components/schemas/ModelVolume"
          }
        },
        "type": "object"
      },
      "ModelVolume": {
        "additionalProperties": false,
        "description": "ModelVolume names a Volume revision.",
        "properties": {
          "name": {
            "description": "Name is the Volume.",
            "type": "string"
          },
          "revision": {
            "description": "Revision pins a revision (latest Ready at admission when unset).",
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "Network": {
        "additionalProperties": false,
        "description": "Network sets egress for the container.",
        "properties": {
          "egress": {
            "$ref": "#/components/schemas/Egress"
          }
        },
        "type": "object"
      },
      "ObjectMeta": {
        "additionalProperties": false,
        "properties": {
          "annotations": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object"
          },
          "creationTimestamp": {
            "type": "string"
          },
          "deletionGracePeriodSeconds": {
            "format": "int64",
            "type": "integer"
          },
          "deletionTimestamp": {
            "type": "string"
          },
          "finalizers": {
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "generateName": {
            "type": "string"
          },
          "generation": {
            "format": "int64",
            "type": "integer"
          },
          "labels": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object"
          },
          "managedFields": {
            "items": {
              "$ref": "#/components/schemas/ManagedFieldsEntry"
            },
            "nullable": true,
            "type": "array"
          },
          "name": {
            "type": "string"
          },
          "namespace": {
            "type": "string"
          },
          "ownerReferences": {
            "items": {
              "$ref": "#/components/schemas/OwnerReference"
            },
            "nullable": true,
            "type": "array"
          },
          "resourceVersion": {
            "type": "string"
          },
          "selfLink": {
            "type": "string"
          },
          "uid": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "OutputInput": {
        "additionalProperties": false,
        "description": "OutputInput names a committed output of another Job.",
        "properties": {
          "index": {
            "description": "Index selects an index of an Indexed Job (default 0).",
            "format": "int32",
            "type": "integer"
          },
          "job": {
            "description": "Job is the producing Job.",
            "type": "string"
          },
          "name": {
            "description": "Name is the output.",
            "type": "string"
          }
        },
        "required": [
          "job",
          "name"
        ],
        "type": "object"
      },
      "OutputSink": {
        "additionalProperties": false,
        "description": "OutputSink loads an output into a customer database table.",
        "properties": {
          "connection": {
            "description": "Connection is a Postgres, Neon or Supabase Connection.",
            "type": "string"
          },
          "mode": {
            "description": "Mode is Append (default) or Replace.",
            "type": "string"
          },
          "table": {
            "description": "Table is the destination table.",
            "type": "string"
          }
        },
        "required": [
          "connection",
          "table"
        ],
        "type": "object"
      },
      "OwnerReference": {
        "additionalProperties": false,
        "properties": {
          "apiVersion": {
            "type": "string"
          },
          "blockOwnerDeletion": {
            "type": "boolean"
          },
          "controller": {
            "type": "boolean"
          },
          "kind": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "uid": {
            "type": "string"
          }
        },
        "required": [
          "apiVersion",
          "kind",
          "name",
          "uid"
        ],
        "type": "object"
      },
      "PhaseSummary": {
        "additionalProperties": false,
        "description": "PhaseSummary counts one phase's latest report per task attempt.",
        "properties": {
          "errors": {
            "description": "Errors counts attempts that ended in an infrastructure or grading error; they never count as failed.",
            "format": "int32",
            "type": "integer"
          },
          "inProgress": {
            "description": "InProgress counts started attempts with no completion yet.",
            "format": "int32",
            "type": "integer"
          },
          "meanReward": {
            "description": "MeanReward is the mean finite reward, as a decimal string.",
            "type": "string"
          },
          "passRate": {
            "description": "PassRate is passed divided by tasks, as a decimal string.",
            "type": "string"
          },
          "passed": {
            "description": "Passed is how many passed.",
            "format": "int32",
            "type": "integer"
          },
          "tasks": {
            "description": "Tasks is the number of completed, scored task attempts.",
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "tasks",
          "passed",
          "errors",
          "inProgress"
        ],
        "type": "object"
      },
      "Placement": {
        "additionalProperties": false,
        "description": "Placement constrains where work may run.",
        "properties": {
          "dedicated": {
            "description": "Dedicated is reserved; only true is accepted.",
            "type": "boolean"
          },
          "interruptible": {
            "description": "Interruptible is Never, Allow (the scheduler decides by expected cost) or Prefer.",
            "type": "string"
          },
          "maxRateUSDPerHour": {
            "description": "MaxRateUSDPerHour filters out offerings above this customer rate.",
            "type": "string"
          },
          "offerings": {
            "description": "Offerings restricts placement to these Offerings.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "pool": {
            "description": "Pool is a BYOC Pool in the project.",
            "type": "string"
          },
          "profile": {
            "description": "Profile is Balanced, Cost or Speed.",
            "type": "string"
          },
          "queueTimeout": {
            "description": "QueueTimeout is how long the Job may wait for capacity before failing with CapacityUnavailable (default 24h; 0s waits forever).",
            "type": "string"
          },
          "regions": {
            "description": "Regions are region classes (us, eu, …); empty means any.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "type": "object"
      },
      "PlacementPreview": {
        "additionalProperties": false,
        "description": "PlacementPreview is the customer-safe description of the capacity a create would use.",
        "properties": {
          "explain": {
            "description": "Explain is the scheduler's explanation, the same shape as Attempt status.placement.explain."
          },
          "interruptible": {
            "description": "Interruptible reports whether the capacity can be reclaimed.",
            "type": "boolean"
          },
          "offering": {
            "description": "Offering is the offering id, for example h100-sxm-80g-x8-us.",
            "type": "string"
          },
          "regionClass": {
            "description": "RegionClass is the region class of the offering.",
            "type": "string"
          },
          "warmReuse": {
            "description": "WarmReuse reports whether warm capacity would be reused.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "Provenance": {
        "additionalProperties": false,
        "description": "Provenance identifies exactly what ran.",
        "properties": {
          "environmentDigest": {
            "description": "EnvironmentDigest is the environment image digest.",
            "type": "string"
          },
          "managed": {
            "description": "Managed is true when a catalog runtime ran without image or command overrides.",
            "type": "boolean"
          },
          "modelRevision": {
            "description": "ModelRevision is the pinned model revision.",
            "type": "string"
          },
          "parametersSHA256": {
            "description": "ParametersSHA256 hashes the canonical merged parameters.",
            "type": "string"
          },
          "runtimeDigest": {
            "description": "RuntimeDigest is the runtime image digest.",
            "type": "string"
          }
        },
        "required": [
          "managed"
        ],
        "type": "object"
      },
      "Recovery": {
        "additionalProperties": false,
        "description": "Recovery says how progress survives lost capacity.",
        "properties": {
          "checkpoint": {
            "$ref": "#/components/schemas/CheckpointPolicy"
          },
          "continuity": {
            "description": "Continuity is Checkpointed (restore the latest checkpoint), Restartable (progress cursor) or Ephemeral.",
            "type": "string"
          },
          "maxAttempts": {
            "description": "MaxAttempts is how many infrastructure replacements each index may use (1–32; gangs count restarts).",
            "format": "int32",
            "type": "integer"
          },
          "minProgressDuration": {
            "description": "MinProgressDuration is the run time that counts as progress (default 2m).",
            "type": "string"
          },
          "onInterruption": {
            "description": "OnInterruption is Resume, or Fail to fail instead of recovering or suspending.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "Resources": {
        "additionalProperties": false,
        "description": "Resources are capacity floors. For GPU work the offering's host shape applies if larger.",
        "properties": {
          "cpu": {
            "description": "CPU is the vCPU floor.",
            "type": "string"
          },
          "disk": {
            "description": "Disk is the ephemeral disk floor.",
            "type": "string"
          },
          "gpu": {
            "$ref": "#/components/schemas/GPURequest"
          },
          "memory": {
            "description": "Memory is the host memory floor.",
            "type": "string"
          },
          "nodes": {
            "description": "Nodes above 1 is shorthand for spec.distributed.nodes and is stored in that form.",
            "format": "int32",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "RuntimeCheckpointing": {
        "additionalProperties": false,
        "description": "RuntimeCheckpointing configures recovery state.",
        "properties": {
          "path": {
            "description": "Path is the state directory (default /nodus/state).",
            "type": "string"
          },
          "strategy": {
            "description": "Strategy is HFTrainer (default) or Custom.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "RuntimeDefaults": {
        "additionalProperties": false,
        "description": "RuntimeDefaults apply when a TrainingJob leaves the field unset.",
        "properties": {
          "initCommand": {
            "$ref": "#/components/schemas/InitCommand"
          },
          "parameters": {
            "description": "Parameters are merged under the TrainingJob's parameters."
          },
          "resources": {
            "$ref": "#/components/schemas/Resources"
          },
          "sidecars": {
            "description": "Sidecars start before the trainer (for example a vLLM rollout server) and stop after it.",
            "items": {
              "$ref": "#/components/schemas/Sidecar"
            },
            "nullable": true,
            "type": "array"
          }
        },
        "type": "object"
      },
      "RuntimeEstimate": {
        "additionalProperties": false,
        "description": "RuntimeEstimate is measured by the nightly runs. Keys are accelerator classes such as h100-80g or rtx-4090.",
        "properties": {
          "secondsPerStep": {
            "additionalProperties": {
              "format": "double",
              "type": "number"
            },
            "description": "SecondsPerStep is used by training runtimes: expected duration is steps × seconds per step, scaled by how much more batchSize, gradientAccumulation and maxCompletionLength a TrainingJob sets than the defaults.",
            "type": "object"
          },
          "secondsPerTask": {
            "additionalProperties": {
              "format": "double",
              "type": "number"
            },
            "description": "SecondsPerTask is used by evaluation runtimes: expected duration is tasks × seconds per task.",
            "type": "object"
          }
        },
        "type": "object"
      },
      "RuntimeOutput": {
        "additionalProperties": false,
        "description": "RuntimeOutput is one downloadable result.",
        "properties": {
          "name": {
            "description": "Name is the output name.",
            "type": "string"
          },
          "path": {
            "description": "Path is where the trainer writes it.",
            "type": "string"
          }
        },
        "required": [
          "name",
          "path"
        ],
        "type": "object"
      },
      "RuntimePreset": {
        "additionalProperties": false,
        "description": "RuntimePreset is the resources measured for one model, method and quantization.",
        "properties": {
          "method": {
            "description": "Method is Full, LoRA or QLoRA.",
            "type": "string"
          },
          "model": {
            "description": "Model is a Hugging Face repository, for example Qwen/Qwen3-0.6B.",
            "type": "string"
          },
          "quantization": {
            "description": "Quantization is empty or a scheme such as nf4.",
            "type": "string"
          },
          "resources": {
            "$ref": "#/components/schemas/Resources"
          }
        },
        "required": [
          "model",
          "method",
          "resources"
        ],
        "type": "object"
      },
      "RuntimeRequirements": {
        "additionalProperties": false,
        "description": "RuntimeRequirements say which inputs a TrainingJob must set.",
        "properties": {
          "data": {
            "description": "Data requires spec.data.",
            "type": "boolean"
          },
          "environment": {
            "description": "Environment requires spec.environment.",
            "type": "boolean"
          },
          "model": {
            "description": "Model requires spec.model (default true).",
            "type": "boolean"
          },
          "teacher": {
            "description": "Teacher requires spec.teacher.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "SecretKeySelector": {
        "additionalProperties": false,
        "description": "SecretKeySelector selects one key of a Secret.",
        "properties": {
          "key": {
            "description": "Key is the key within it.",
            "type": "string"
          },
          "name": {
            "description": "Name is the Secret.",
            "type": "string"
          }
        },
        "required": [
          "name",
          "key"
        ],
        "type": "object"
      },
      "SecretMount": {
        "additionalProperties": false,
        "description": "SecretMount mounts one Secret, optionally pinned to a version. The bare name is accepted on write.",
        "properties": {
          "name": {
            "description": "Name is the Secret.",
            "type": "string"
          },
          "version": {
            "description": "Version pins a version; unset pins the latest at admission.",
            "format": "int32",
            "type": "integer"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "ShardInfo": {
        "additionalProperties": false,
        "properties": {
          "selector": {
            "type": "string"
          }
        },
        "required": [
          "selector"
        ],
        "type": "object"
      },
      "Sidecar": {
        "additionalProperties": false,
        "description": "Sidecar is a helper container with native-sidecar semantics.",
        "properties": {
          "command": {
            "description": "Command is the sidecar's argv.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "env": {
            "description": "Env adds environment variables.",
            "items": {
              "$ref": "#/components/schemas/EnvVar"
            },
            "nullable": true,
            "type": "array"
          },
          "image": {
            "description": "Image defaults to the Job's image.",
            "type": "string"
          },
          "name": {
            "description": "Name is unique within the Job.",
            "type": "string"
          },
          "startupTimeout": {
            "description": "StartupTimeout bounds how long the sidecar may take to become ready.",
            "type": "string"
          }
        },
        "required": [
          "name",
          "command"
        ],
        "type": "object"
      },
      "Source": {
        "additionalProperties": false,
        "description": "Source is the code for the container: exactly one of git and blob.",
        "properties": {
          "blob": {
            "description": "Blob is sha256:\u003chex\u003e of an archive uploaded through /blobs/v1.",
            "type": "string"
          },
          "git": {
            "$ref": "#/components/schemas/GitSource"
          }
        },
        "type": "object"
      },
      "StageInput": {
        "additionalProperties": false,
        "description": "StageInput names an output of a Pipeline stage.",
        "properties": {
          "output": {
            "description": "Output is the output name.",
            "type": "string"
          },
          "stage": {
            "description": "Stage is the producing stage.",
            "type": "string"
          }
        },
        "required": [
          "stage",
          "output"
        ],
        "type": "object"
      },
      "StartupEstimate": {
        "additionalProperties": false,
        "description": "StartupEstimate is the expected time to start.",
        "properties": {
          "cold": {
            "$ref": "#/components/schemas/DurationBand"
          },
          "warm": {
            "$ref": "#/components/schemas/DurationBand"
          }
        },
        "type": "object"
      },
      "Status": {
        "additionalProperties": false,
        "description": "Status is the error body of every API response: a Kubernetes metav1.Status (so kubectl and client-go understand it) plus three top-level extensions that those clients ignore (ADR-028).",
        "properties": {
          "apiVersion": {
            "type": "string"
          },
          "code": {
            "format": "int32",
            "type": "integer"
          },
          "details": {
            "$ref": "#/components/schemas/StatusDetails"
          },
          "docs": {
            "description": "Docs is the URL of the code's docs page.",
            "type": "string"
          },
          "fix": {
            "description": "Fix says what to do next, for example a CLI command or the field to change.",
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "metadata": {
            "$ref": "#/components/schemas/ListMeta"
          },
          "reason": {
            "type": "string",
            "x-extensible-enum": [
              "AdmissionsPaused",
              "AgentGroupClosed",
              "AgentGroupFull",
              "AgentRunFinished",
              "AgentStopped",
              "AlreadyExists",
              "ArrearsOutstanding",
              "BadRequest",
              "BudgetExceeded",
              "CapacityUnavailable",
              "CloudAccountNotVerified",
              "Conflict",
              "ConnectionNotReady",
              "EncryptionFailed",
              "EnrollmentTokenInvalid",
              "Expired",
              "FieldImmutable",
              "FileTooLarge",
              "Forbidden",
              "FunctionCallBatchTooLarge",
              "FunctionNotFound",
              "IdempotencyKeyReused",
              "ImageBuildUnavailable",
              "ImageNotFound",
              "ImageNotReady",
              "ImagePullFailed",
              "InsufficientCredits",
              "InternalError",
              "Invalid",
              "MethodNotAllowed",
              "NoSSHKey",
              "NotFound",
              "OutputIndexRequired",
              "OutputNotFound",
              "PaymentDisputed",
              "PaymentMethodRequired",
              "PaymentVerificationUnavailable",
              "PaymentsNotConfigured",
              "PoolActPaused",
              "PoolActionNotPending",
              "PoolActionNotReversible",
              "PoolInUse",
              "PreconditionFailed",
              "PriceConsentRequired",
              "PromoCodeExpired",
              "PromoCodeUsed",
              "QuotaExceeded",
              "RequestEntityTooLarge",
              "RequestInProgress",
              "SHA256Mismatch",
              "SandboxFailed",
              "SandboxNotRunning",
              "SandboxStarting",
              "SecretValueInEnv",
              "StdinBackpressure",
              "TooManyRequests",
              "TopUpLimitReached",
              "Unauthorized",
              "Unavailable",
              "Unsupported",
              "UnsupportedMediaType",
              "VolumeBusy",
              "WorkerNotAllowed",
              "WorkspaceStarting",
              "WorkspaceToolUnavailable"
            ]
          },
          "requestId": {
            "description": "RequestID identifies the request in logs and support tickets.",
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "StatusCause": {
        "additionalProperties": false,
        "properties": {
          "field": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "StatusDetails": {
        "additionalProperties": false,
        "properties": {
          "causes": {
            "items": {
              "$ref": "#/components/schemas/StatusCause"
            },
            "nullable": true,
            "type": "array"
          },
          "group": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "retryAfterSeconds": {
            "format": "int32",
            "type": "integer"
          },
          "uid": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "Tracking": {
        "additionalProperties": false,
        "description": "Tracking names customer-owned trackers; they are never the source of truth for comparisons.",
        "properties": {
          "mlflow": {
            "$ref": "#/components/schemas/MLflowTracking"
          },
          "wandb": {
            "$ref": "#/components/schemas/WandBTracking"
          }
        },
        "type": "object"
      },
      "TrainingData": {
        "additionalProperties": false,
        "description": "TrainingData is a dataset in a Volume.",
        "properties": {
          "columns": {
            "additionalProperties": {
              "type": "string"
            },
            "description": "Columns maps the runtime's column roles (prompt, completion, chosen, rejected, text) to dataset columns.",
            "type": "object"
          },
          "format": {
            "description": "Format is Auto (default), JSONL, JSON or CSV.",
            "type": "string"
          },
          "path": {
            "description": "Path is a file or directory inside the Volume.",
            "type": "string"
          },
          "revision": {
            "description": "Revision pins a revision.",
            "format": "int64",
            "type": "integer"
          },
          "validationFraction": {
            "description": "ValidationFraction is the share held out for validation, as a decimal string (default \"0.05\").",
            "type": "string"
          },
          "volume": {
            "description": "Volume is the Volume holding the data.",
            "type": "string"
          }
        },
        "required": [
          "volume"
        ],
        "type": "object"
      },
      "TrainingDiagnostics": {
        "additionalProperties": false,
        "description": "TrainingDiagnostics interpret training.",
        "properties": {
          "rewardSignal": {
            "description": "RewardSignal is ContrastObserved, NoRewardContrast or InsufficientEvidence.",
            "type": "string"
          },
          "weightsChanged": {
            "description": "WeightsChanged reports whether the trainer reported changed weights.",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "TrainingJob": {
        "additionalProperties": false,
        "description": "TrainingJob is pre-training, fine-tuning, post-training or an RL run on a TrainingRuntime (Beta). It compiles to one Job, a multi-node gang when it asks for more than one node, and mirrors that Job's phase.",
        "properties": {
          "apiVersion": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "metadata": {
            "$ref": "#/components/schemas/ObjectMeta"
          },
          "spec": {
            "$ref": "#/components/schemas/TrainingJobSpec"
          },
          "status": {
            "$ref": "#/components/schemas/TrainingJobStatus"
          }
        },
        "required": [
          "spec"
        ],
        "type": "object",
        "x-kubernetes-group-version-kind": [
          {
            "group": "nodus.dev",
            "kind": "TrainingJob",
            "version": "v1beta1"
          }
        ],
        "x-nodus-mcp": {
          "ExecTarget": false,
          "FilesTarget": false,
          "Requests": null,
          "States": [
            "Suspended",
            "Running"
          ],
          "Tools": null
        }
      },
      "TrainingJobList": {
        "properties": {
          "apiVersion": {
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/TrainingJob"
            },
            "type": "array"
          },
          "kind": {
            "type": "string"
          },
          "metadata": {
            "$ref": "#/components/schemas/ListMeta"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "TrainingJobSpec": {
        "additionalProperties": false,
        "description": "TrainingJobSpec describes one training run.",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TrainingData"
          },
          "distributed": {
            "$ref": "#/components/schemas/Distributed"
          },
          "environment": {
            "$ref": "#/components/schemas/EnvironmentBinding"
          },
          "evaluation": {
            "$ref": "#/components/schemas/Evaluation"
          },
          "expectedDuration": {
            "description": "ExpectedDuration overrides the runtime estimate of steps × seconds per step.",
            "type": "string"
          },
          "exportTo": {
            "$ref": "#/components/schemas/ExportTarget"
          },
          "grading": {
            "$ref": "#/components/schemas/GradingPolicy"
          },
          "maxCostUSD": {
            "description": "MaxCostUSD caps the run, its compiled Job and its grading Sandboxes together; it can only be raised.",
            "type": "string"
          },
          "mode": {
            "description": "Mode is Train (default) or Evaluate, and must be one of the runtime's modes.",
            "type": "string"
          },
          "model": {
            "$ref": "#/components/schemas/ModelSource"
          },
          "parameters": {
            "description": "Parameters are validated against the runtime's JSON Schema (at most 64 KiB) over the runtime defaults."
          },
          "placement": {
            "$ref": "#/components/schemas/Placement"
          },
          "resources": {
            "$ref": "#/components/schemas/Resources"
          },
          "runtime": {
            "description": "Runtime is a Ready TrainingRuntime: nodus/\u003cname\u003e for the catalog or \u003cname\u003e in this project.",
            "type": "string"
          },
          "state": {
            "description": "State is the desired state: Running (default), Suspended, or the terminal stop state.",
            "type": "string"
          },
          "task": {
            "description": "Task overrides the runtime's task; Pretrain on sft trains on raw text with packing.",
            "type": "string"
          },
          "teacher": {
            "$ref": "#/components/schemas/ModelSource"
          },
          "tracking": {
            "$ref": "#/components/schemas/Tracking"
          }
        },
        "required": [
          "runtime"
        ],
        "type": "object"
      },
      "TrainingJobStatus": {
        "additionalProperties": false,
        "description": "TrainingJobStatus is written by the TrainingJob controller.",
        "properties": {
          "compiledJob": {
            "$ref": "#/components/schemas/JobSpec"
          },
          "conditions": {
            "description": "Conditions are the latest observations.",
            "items": {
              "$ref": "#/components/schemas/Condition"
            },
            "nullable": true,
            "type": "array"
          },
          "cost": {
            "$ref": "#/components/schemas/Cost"
          },
          "diagnostics": {
            "$ref": "#/components/schemas/TrainingDiagnostics"
          },
          "estimate": {
            "$ref": "#/components/schemas/Estimate"
          },
          "job": {
            "description": "Job is the compiled Job's name (label nodus.dev/trainingjob).",
            "type": "string"
          },
          "message": {
            "description": "Message explains Reason.",
            "type": "string"
          },
          "metrics": {
            "$ref": "#/components/schemas/TrainingMetrics"
          },
          "observedGeneration": {
            "description": "ObservedGeneration is the generation the status describes.",
            "format": "int64",
            "type": "integer"
          },
          "outputs": {
            "description": "Outputs are the committed results, such as results.json and the adapter.",
            "items": {
              "$ref": "#/components/schemas/TrainingOutput"
            },
            "nullable": true,
            "type": "array"
          },
          "phase": {
            "description": "Phase mirrors the compiled Job in the run-to-completion vocabulary.",
            "type": "string"
          },
          "progress": {
            "$ref": "#/components/schemas/TrainingProgress"
          },
          "provenance": {
            "$ref": "#/components/schemas/Provenance"
          },
          "reason": {
            "description": "Reason says why the run failed, stopped or is suspended.",
            "type": "string"
          },
          "summary": {
            "$ref": "#/components/schemas/TrainingSummary"
          }
        },
        "type": "object"
      },
      "TrainingMetrics": {
        "additionalProperties": false,
        "description": "TrainingMetrics are the latest metrics the trainer reported.",
        "properties": {
          "gpuMemoryBytes": {
            "description": "GPUMemoryBytes is the peak GPU memory.",
            "format": "int64",
            "type": "integer"
          },
          "loss": {
            "description": "Loss is the latest training loss, as a decimal string.",
            "type": "string"
          },
          "step": {
            "description": "Step is the current optimizer step.",
            "format": "int64",
            "type": "integer"
          },
          "tokensPerSecond": {
            "description": "TokensPerSecond is the latest throughput, as a decimal string.",
            "type": "string"
          },
          "totalSteps": {
            "description": "TotalSteps is the planned number of steps.",
            "format": "int64",
            "type": "integer"
          }
        },
        "type": "object"
      },
      "TrainingOutput": {
        "additionalProperties": false,
        "description": "TrainingOutput is one committed result of the compiled Job.",
        "properties": {
          "name": {
            "description": "Name is the output name.",
            "type": "string"
          },
          "sizeBytes": {
            "description": "SizeBytes is the committed size.",
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "TrainingProgress": {
        "additionalProperties": false,
        "description": "TrainingProgress is the current stage.",
        "properties": {
          "stage": {
            "description": "Stage is Baseline, Training, Evaluating or Exporting.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "TrainingRuntime": {
        "additionalProperties": false,
        "description": "TrainingRuntime is a signed trainer image plus the contract TrainingJobs compile against: the launcher, the parameter JSON Schema, the defaults, the resource presets and the measured step times (Beta).",
        "properties": {
          "apiVersion": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "metadata": {
            "$ref": "#/components/schemas/ObjectMeta"
          },
          "spec": {
            "$ref": "#/components/schemas/TrainingRuntimeSpec"
          },
          "status": {
            "$ref": "#/components/schemas/TrainingRuntimeStatus"
          }
        },
        "required": [
          "spec"
        ],
        "type": "object",
        "x-kubernetes-group-version-kind": [
          {
            "group": "nodus.dev",
            "kind": "TrainingRuntime",
            "version": "v1beta1"
          }
        ],
        "x-nodus-mcp": {
          "ExecTarget": false,
          "FilesTarget": false,
          "Requests": null,
          "States": null,
          "Tools": null
        }
      },
      "TrainingRuntimeList": {
        "properties": {
          "apiVersion": {
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/TrainingRuntime"
            },
            "type": "array"
          },
          "kind": {
            "type": "string"
          },
          "metadata": {
            "$ref": "#/components/schemas/ListMeta"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "TrainingRuntimeSpec": {
        "additionalProperties": false,
        "description": "TrainingRuntimeSpec is the contract a TrainingJob compiles against.",
        "properties": {
          "checkpointing": {
            "$ref": "#/components/schemas/RuntimeCheckpointing"
          },
          "command": {
            "description": "Command is the trainer entrypoint.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "defaults": {
            "$ref": "#/components/schemas/RuntimeDefaults"
          },
          "environmentTasks": {
            "description": "EnvironmentTasks is AttemptAPI when this exact image fetches public manifests through the live attempt. Empty means the runtime is incompatible with GPU-host environment execution.",
            "type": "string"
          },
          "estimate": {
            "$ref": "#/components/schemas/RuntimeEstimate"
          },
          "image": {
            "description": "Image is the digest-pinned trainer image; managed runtimes are cosign-verified at release and seed.",
            "type": "string"
          },
          "launcher": {
            "description": "Launcher is Plain (default), Torchrun, Accelerate or Deepspeed. Multi-node runs use it as the gang launcher.",
            "type": "string"
          },
          "modes": {
            "description": "Modes lists Train (default) and Evaluate.",
            "items": {
              "type": "string"
            },
            "nullable": true,
            "type": "array"
          },
          "outputs": {
            "description": "Outputs are the downloadable results the runtime writes.",
            "items": {
              "$ref": "#/components/schemas/RuntimeOutput"
            },
            "nullable": true,
            "type": "array"
          },
          "parameters": {
            "description": "Parameters is the JSON Schema of spec.parameters on a TrainingJob (at most 64 KiB)."
          },
          "presets": {
            "description": "Presets choose resources for a model, method and quantization.",
            "items": {
              "$ref": "#/components/schemas/RuntimePreset"
            },
            "nullable": true,
            "type": "array"
          },
          "requires": {
            "$ref": "#/components/schemas/RuntimeRequirements"
          },
          "task": {
            "description": "Task is what the runtime trains: SFT, Pretrain, DPO, ORPO, KTO, Reward, GRPO, Distill, Evaluate or Custom.",
            "type": "string"
          }
        },
        "required": [
          "image"
        ],
        "type": "object"
      },
      "TrainingRuntimeStatus": {
        "additionalProperties": false,
        "description": "TrainingRuntimeStatus is written by the TrainingRuntime controller.",
        "properties": {
          "conditions": {
            "description": "Conditions include Verified (SignatureVerified for managed runtimes).",
            "items": {
              "$ref": "#/components/schemas/Condition"
            },
            "nullable": true,
            "type": "array"
          },
          "imageDigest": {
            "description": "ImageDigest is the verified image digest.",
            "type": "string"
          },
          "imageUser": {
            "description": "ImageUser is the user the verified image's config runs its process as (root when it names none).",
            "type": "string"
          },
          "managed": {
            "description": "Managed is true for catalog runtimes in project nodus; it is derived, never set by a client.",
            "type": "boolean"
          },
          "observedGeneration": {
            "description": "ObservedGeneration is the generation the status describes.",
            "format": "int64",
            "type": "integer"
          },
          "phase": {
            "description": "Phase is Pending until the image digest is verified, then Ready, or Failed.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "TrainingSummary": {
        "additionalProperties": false,
        "description": "TrainingSummary is folded incrementally from task events.",
        "properties": {
          "baseline": {
            "$ref": "#/components/schemas/PhaseSummary"
          },
          "comparison": {
            "$ref": "#/components/schemas/Comparison"
          },
          "evaluation": {
            "$ref": "#/components/schemas/PhaseSummary"
          }
        },
        "type": "object"
      },
      "URLInput": {
        "additionalProperties": false,
        "description": "URLInput is a file downloaded over HTTPS.",
        "properties": {
          "sha256": {
            "description": "SHA256 is the expected digest.",
            "type": "string"
          },
          "url": {
            "description": "URL is https:// only.",
            "type": "string"
          }
        },
        "required": [
          "url",
          "sha256"
        ],
        "type": "object"
      },
      "USDBand": {
        "additionalProperties": false,
        "description": "USDBand is a median and a 90th-percentile amount in USD.",
        "properties": {
          "p50": {
            "description": "P50 is the median amount.",
            "type": "string"
          },
          "p90": {
            "description": "P90 is the 90th-percentile amount.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "VolumeInput": {
        "additionalProperties": false,
        "description": "VolumeInput names a Volume revision.",
        "properties": {
          "name": {
            "description": "Name is the Volume.",
            "type": "string"
          },
          "revision": {
            "description": "Revision pins a revision.",
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "VolumeMount": {
        "additionalProperties": false,
        "description": "VolumeMount mounts a Volume.",
        "properties": {
          "mountPath": {
            "description": "MountPath is the absolute mount point; system paths are refused.",
            "type": "string"
          },
          "readOnly": {
            "description": "ReadOnly mounts it read-only.",
            "type": "boolean"
          },
          "revision": {
            "description": "Revision pins a revision; only with readOnly.",
            "format": "int64",
            "type": "integer"
          },
          "volume": {
            "description": "Volume names the Volume.",
            "type": "string"
          }
        },
        "required": [
          "volume",
          "mountPath"
        ],
        "type": "object"
      },
      "WandBTracking": {
        "additionalProperties": false,
        "description": "WandBTracking is a Weights \u0026 Biases project.",
        "properties": {
          "connection": {
            "description": "Connection is a WandB Connection.",
            "type": "string"
          }
        },
        "required": [
          "connection"
        ],
        "type": "object"
      },
      "WorkspaceInput": {
        "additionalProperties": false,
        "description": "WorkspaceInput mounts a Workspace home.",
        "properties": {
          "name": {
            "description": "Name is the Workspace.",
            "type": "string"
          },
          "path": {
            "description": "Path is a subdirectory of the home.",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      }
    }
  },
  "info": {
    "title": "Nodus API",
    "version": "nodus.dev/v1beta1"
  },
  "openapi": "3.0.3",
  "paths": {
    "/apis/nodus.dev/v1beta1/namespaces/{namespace}/trainingjobs": {
      "get": {
        "operationId": "listV1beta1TrainingJob",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "labelSelector",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldSelector",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "continue",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "watch",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "resourceVersion",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "allowWatchBookmarks",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "timeoutSeconds",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingJobList"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "List or watch trainingjobs",
        "tags": [
          "trainingjobs"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingJob",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": false,
          "kind": "TrainingJob",
          "openWorldHint": false,
          "readOnlyHint": true,
          "scope": "trainingjobs:read",
          "tool": "get"
        },
        "x-nodus-scope": "trainingjobs:read"
      },
      "post": {
        "operationId": "createV1beta1TrainingJob",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "dryRun",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldValidation",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldManager",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "If-Match",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrainingJob"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingJob"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Create a TrainingJob",
        "tags": [
          "trainingjobs"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingJob",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": true,
          "kind": "TrainingJob",
          "openWorldHint": false,
          "readOnlyHint": false,
          "scope": "trainingjobs:write",
          "tool": "apply"
        },
        "x-nodus-scope": "trainingjobs:write"
      }
    },
    "/apis/nodus.dev/v1beta1/namespaces/{namespace}/trainingjobs/{name}": {
      "delete": {
        "operationId": "deleteV1beta1TrainingJob",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The object's name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "dryRun",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldValidation",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldManager",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "If-Match",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "propagationPolicy",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingJob"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Delete a TrainingJob",
        "tags": [
          "trainingjobs"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingJob",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": true,
          "idempotentHint": true,
          "kind": "TrainingJob",
          "openWorldHint": false,
          "readOnlyHint": false,
          "scope": "trainingjobs:write",
          "tool": "delete"
        },
        "x-nodus-scope": "trainingjobs:write"
      },
      "get": {
        "operationId": "readV1beta1TrainingJob",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The object's name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingJob"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Read a TrainingJob",
        "tags": [
          "trainingjobs"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingJob",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": false,
          "kind": "TrainingJob",
          "openWorldHint": false,
          "readOnlyHint": true,
          "scope": "trainingjobs:read",
          "tool": "get"
        },
        "x-nodus-scope": "trainingjobs:read"
      },
      "patch": {
        "operationId": "patchV1beta1TrainingJob",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The object's name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "dryRun",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldValidation",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldManager",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "If-Match",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/merge-patch+json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingJob"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Patch a TrainingJob",
        "tags": [
          "trainingjobs"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingJob",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": true,
          "kind": "TrainingJob",
          "openWorldHint": false,
          "readOnlyHint": false,
          "scope": "trainingjobs:write",
          "tool": "apply"
        },
        "x-nodus-scope": "trainingjobs:write"
      },
      "put": {
        "operationId": "replaceV1beta1TrainingJob",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The object's name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "dryRun",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldValidation",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldManager",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "If-Match",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrainingJob"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingJob"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Replace a TrainingJob",
        "tags": [
          "trainingjobs"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingJob",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": true,
          "kind": "TrainingJob",
          "openWorldHint": false,
          "readOnlyHint": false,
          "scope": "trainingjobs:write",
          "tool": "apply"
        },
        "x-nodus-scope": "trainingjobs:write"
      }
    },
    "/apis/nodus.dev/v1beta1/namespaces/{namespace}/trainingjobs/{name}/status": {
      "get": {
        "operationId": "readStatusV1beta1TrainingJob",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The object's name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingJob"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Read the status of a TrainingJob",
        "tags": [
          "trainingjobs"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingJob",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": false,
          "kind": "TrainingJob",
          "openWorldHint": false,
          "readOnlyHint": true,
          "scope": "trainingjobs:read",
          "tool": "get"
        },
        "x-nodus-scope": "trainingjobs:read"
      }
    },
    "/apis/nodus.dev/v1beta1/namespaces/{namespace}/trainingruntimes": {
      "get": {
        "operationId": "listV1beta1TrainingRuntime",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "labelSelector",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldSelector",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "continue",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "watch",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "resourceVersion",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "allowWatchBookmarks",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "timeoutSeconds",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingRuntimeList"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "List or watch trainingruntimes",
        "tags": [
          "trainingruntimes"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingRuntime",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": false,
          "kind": "TrainingRuntime",
          "openWorldHint": false,
          "readOnlyHint": true,
          "scope": "trainingruntimes:read",
          "tool": "get"
        },
        "x-nodus-scope": "trainingruntimes:read"
      },
      "post": {
        "operationId": "createV1beta1TrainingRuntime",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "dryRun",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldValidation",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldManager",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "If-Match",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrainingRuntime"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingRuntime"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Create a TrainingRuntime",
        "tags": [
          "trainingruntimes"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingRuntime",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": true,
          "kind": "TrainingRuntime",
          "openWorldHint": false,
          "readOnlyHint": false,
          "scope": "trainingruntimes:write",
          "tool": "apply"
        },
        "x-nodus-scope": "trainingruntimes:write"
      }
    },
    "/apis/nodus.dev/v1beta1/namespaces/{namespace}/trainingruntimes/{name}": {
      "delete": {
        "operationId": "deleteV1beta1TrainingRuntime",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The object's name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "dryRun",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldValidation",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldManager",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "If-Match",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "propagationPolicy",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingRuntime"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Delete a TrainingRuntime",
        "tags": [
          "trainingruntimes"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingRuntime",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": true,
          "idempotentHint": true,
          "kind": "TrainingRuntime",
          "openWorldHint": false,
          "readOnlyHint": false,
          "scope": "trainingruntimes:write",
          "tool": "delete"
        },
        "x-nodus-scope": "trainingruntimes:write"
      },
      "get": {
        "operationId": "readV1beta1TrainingRuntime",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The object's name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingRuntime"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Read a TrainingRuntime",
        "tags": [
          "trainingruntimes"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingRuntime",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": false,
          "kind": "TrainingRuntime",
          "openWorldHint": false,
          "readOnlyHint": true,
          "scope": "trainingruntimes:read",
          "tool": "get"
        },
        "x-nodus-scope": "trainingruntimes:read"
      },
      "patch": {
        "operationId": "patchV1beta1TrainingRuntime",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The object's name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "dryRun",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldValidation",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldManager",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "If-Match",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/merge-patch+json": {
              "schema": {
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingRuntime"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Patch a TrainingRuntime",
        "tags": [
          "trainingruntimes"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingRuntime",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": true,
          "kind": "TrainingRuntime",
          "openWorldHint": false,
          "readOnlyHint": false,
          "scope": "trainingruntimes:write",
          "tool": "apply"
        },
        "x-nodus-scope": "trainingruntimes:write"
      },
      "put": {
        "operationId": "replaceV1beta1TrainingRuntime",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The object's name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "dryRun",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldValidation",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldManager",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "If-Match",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrainingRuntime"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingRuntime"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Replace a TrainingRuntime",
        "tags": [
          "trainingruntimes"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingRuntime",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": true,
          "kind": "TrainingRuntime",
          "openWorldHint": false,
          "readOnlyHint": false,
          "scope": "trainingruntimes:write",
          "tool": "apply"
        },
        "x-nodus-scope": "trainingruntimes:write"
      }
    },
    "/apis/nodus.dev/v1beta1/namespaces/{namespace}/trainingruntimes/{name}/status": {
      "get": {
        "operationId": "readStatusV1beta1TrainingRuntime",
        "parameters": [
          {
            "description": "The project.",
            "in": "path",
            "name": "namespace",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "description": "The object's name.",
            "in": "path",
            "name": "name",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingRuntime"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "Read the status of a TrainingRuntime",
        "tags": [
          "trainingruntimes"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingRuntime",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": false,
          "kind": "TrainingRuntime",
          "openWorldHint": false,
          "readOnlyHint": true,
          "scope": "trainingruntimes:read",
          "tool": "get"
        },
        "x-nodus-scope": "trainingruntimes:read"
      }
    },
    "/apis/nodus.dev/v1beta1/trainingjobs": {
      "get": {
        "operationId": "listAllProjectsV1beta1TrainingJob",
        "parameters": [
          {
            "in": "query",
            "name": "labelSelector",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldSelector",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "continue",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "watch",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "resourceVersion",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "allowWatchBookmarks",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "timeoutSeconds",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingJobList"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "List or watch trainingjobs in every project",
        "tags": [
          "trainingjobs"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingJob",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": false,
          "kind": "TrainingJob",
          "openWorldHint": false,
          "readOnlyHint": true,
          "scope": "trainingjobs:read",
          "tool": "get"
        },
        "x-nodus-scope": "trainingjobs:read"
      }
    },
    "/apis/nodus.dev/v1beta1/trainingruntimes": {
      "get": {
        "operationId": "listAllProjectsV1beta1TrainingRuntime",
        "parameters": [
          {
            "in": "query",
            "name": "labelSelector",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "fieldSelector",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "continue",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "watch",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "resourceVersion",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "allowWatchBookmarks",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "timeoutSeconds",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrainingRuntimeList"
                }
              }
            },
            "description": "OK"
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Status"
                }
              }
            },
            "description": "An error: a metav1.Status whose reason is a registered code."
          }
        },
        "summary": "List or watch trainingruntimes in every project",
        "tags": [
          "trainingruntimes"
        ],
        "x-kubernetes-group-version-kind": {
          "group": "nodus.dev",
          "kind": "TrainingRuntime",
          "version": "v1beta1"
        },
        "x-mcp": {
          "destructiveHint": false,
          "idempotentHint": false,
          "kind": "TrainingRuntime",
          "openWorldHint": false,
          "readOnlyHint": true,
          "scope": "trainingruntimes:read",
          "tool": "get"
        },
        "x-nodus-scope": "trainingruntimes:read"
      }
    }
  }
}
