nemo-platform-plugin 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1224) hide show
  1. nemo_platform/__init__.py +117 -0
  2. nemo_platform/_base_client.py +2146 -0
  3. nemo_platform/_client.py +1200 -0
  4. nemo_platform/_compat.py +241 -0
  5. nemo_platform/_constants.py +29 -0
  6. nemo_platform/_decoders/jsonl.py +138 -0
  7. nemo_platform/_exceptions.py +123 -0
  8. nemo_platform/_files.py +188 -0
  9. nemo_platform/_models.py +967 -0
  10. nemo_platform/_qs.py +164 -0
  11. nemo_platform/_resource.py +58 -0
  12. nemo_platform/_response.py +872 -0
  13. nemo_platform/_streaming.py +391 -0
  14. nemo_platform/_types.py +288 -0
  15. nemo_platform/_utils/__init__.py +79 -0
  16. nemo_platform/_utils/_compat.py +60 -0
  17. nemo_platform/_utils/_datetime_parse.py +151 -0
  18. nemo_platform/_utils/_json.py +50 -0
  19. nemo_platform/_utils/_logs.py +40 -0
  20. nemo_platform/_utils/_path.py +142 -0
  21. nemo_platform/_utils/_proxy.py +80 -0
  22. nemo_platform/_utils/_reflection.py +57 -0
  23. nemo_platform/_utils/_resources_proxy.py +39 -0
  24. nemo_platform/_utils/_streams.py +27 -0
  25. nemo_platform/_utils/_sync.py +73 -0
  26. nemo_platform/_utils/_transform.py +472 -0
  27. nemo_platform/_utils/_typing.py +171 -0
  28. nemo_platform/_utils/_utils.py +448 -0
  29. nemo_platform/_version.py +21 -0
  30. nemo_platform/auth/__init__.py +15 -0
  31. nemo_platform/auth/device_flow.py +303 -0
  32. nemo_platform/auth/helpers.py +211 -0
  33. nemo_platform/auth/token_provider.py +239 -0
  34. nemo_platform/beta/evaluator/__init__.py +120 -0
  35. nemo_platform/beta/evaluator/agent_inference.py +360 -0
  36. nemo_platform/beta/evaluator/constants.py +4 -0
  37. nemo_platform/beta/evaluator/dataset_schemas/common.py +177 -0
  38. nemo_platform/beta/evaluator/dataset_schemas/compatibility.py +353 -0
  39. nemo_platform/beta/evaluator/dataset_schemas/templates.py +389 -0
  40. nemo_platform/beta/evaluator/datasets/__init__.py +28 -0
  41. nemo_platform/beta/evaluator/datasets/loader.py +415 -0
  42. nemo_platform/beta/evaluator/enums.py +64 -0
  43. nemo_platform/beta/evaluator/execution/_protocols.py +20 -0
  44. nemo_platform/beta/evaluator/execution/backends/base.py +86 -0
  45. nemo_platform/beta/evaluator/execution/backends/local/backend.py +132 -0
  46. nemo_platform/beta/evaluator/execution/benchmark_execution.py +666 -0
  47. nemo_platform/beta/evaluator/execution/config.py +64 -0
  48. nemo_platform/beta/evaluator/execution/evaluator.py +289 -0
  49. nemo_platform/beta/evaluator/execution/job_poll.py +98 -0
  50. nemo_platform/beta/evaluator/execution/metric_execution.py +878 -0
  51. nemo_platform/beta/evaluator/execution/pipeline.py +64 -0
  52. nemo_platform/beta/evaluator/execution/runs.py +143 -0
  53. nemo_platform/beta/evaluator/execution/scoring.py +224 -0
  54. nemo_platform/beta/evaluator/execution/utils.py +116 -0
  55. nemo_platform/beta/evaluator/execution/values.py +53 -0
  56. nemo_platform/beta/evaluator/inference.py +456 -0
  57. nemo_platform/beta/evaluator/metrics/aggregation.py +451 -0
  58. nemo_platform/beta/evaluator/metrics/bleu.py +94 -0
  59. nemo_platform/beta/evaluator/metrics/exact_match.py +52 -0
  60. nemo_platform/beta/evaluator/metrics/f1.py +50 -0
  61. nemo_platform/beta/evaluator/metrics/hooks.py +41 -0
  62. nemo_platform/beta/evaluator/metrics/llm_judge.py +392 -0
  63. nemo_platform/beta/evaluator/metrics/number_check.py +95 -0
  64. nemo_platform/beta/evaluator/metrics/protocol.py +241 -0
  65. nemo_platform/beta/evaluator/metrics/ragas/__init__.py +41 -0
  66. nemo_platform/beta/evaluator/metrics/ragas/base.py +521 -0
  67. nemo_platform/beta/evaluator/metrics/ragas/git_patch.py +36 -0
  68. nemo_platform/beta/evaluator/metrics/ragas/imports.py +192 -0
  69. nemo_platform/beta/evaluator/metrics/ragas/metrics.py +183 -0
  70. nemo_platform/beta/evaluator/metrics/remote.py +250 -0
  71. nemo_platform/beta/evaluator/metrics/rouge.py +71 -0
  72. nemo_platform/beta/evaluator/metrics/string_check.py +69 -0
  73. nemo_platform/beta/evaluator/metrics/template_rendering.py +141 -0
  74. nemo_platform/beta/evaluator/metrics/tool_calling.py +173 -0
  75. nemo_platform/beta/evaluator/metrics/types.py +62 -0
  76. nemo_platform/beta/evaluator/metrics/utils.py +54 -0
  77. nemo_platform/beta/evaluator/resilience/api.py +142 -0
  78. nemo_platform/beta/evaluator/resilience/classifier.py +142 -0
  79. nemo_platform/beta/evaluator/resilience/config.py +69 -0
  80. nemo_platform/beta/evaluator/resilience/errors.py +117 -0
  81. nemo_platform/beta/evaluator/resilience/policy.py +50 -0
  82. nemo_platform/beta/evaluator/resilience/scheduler.py +459 -0
  83. nemo_platform/beta/evaluator/resilience/types.py +93 -0
  84. nemo_platform/beta/evaluator/structured_output.py +184 -0
  85. nemo_platform/beta/evaluator/templates.py +115 -0
  86. nemo_platform/beta/evaluator/values/__init__.py +162 -0
  87. nemo_platform/beta/evaluator/values/agents.py +84 -0
  88. nemo_platform/beta/evaluator/values/common.py +28 -0
  89. nemo_platform/beta/evaluator/values/dataset_schemas.py +112 -0
  90. nemo_platform/beta/evaluator/values/datasets.py +28 -0
  91. nemo_platform/beta/evaluator/values/metrics.py +587 -0
  92. nemo_platform/beta/evaluator/values/models.py +157 -0
  93. nemo_platform/beta/evaluator/values/multi_metric_results.py +359 -0
  94. nemo_platform/beta/evaluator/values/params.py +109 -0
  95. nemo_platform/beta/evaluator/values/results.py +699 -0
  96. nemo_platform/beta/evaluator/values/scores.py +300 -0
  97. nemo_platform/beta/safe_synthesizer/__init__.py +4 -0
  98. nemo_platform/beta/safe_synthesizer/config.py +29 -0
  99. nemo_platform/beta/safe_synthesizer/job.py +309 -0
  100. nemo_platform/beta/safe_synthesizer/job_builder.py +355 -0
  101. nemo_platform/cli/__init__.py +4 -0
  102. nemo_platform/cli/app.py +321 -0
  103. nemo_platform/cli/commands/__init__.py +15 -0
  104. nemo_platform/cli/commands/api/__init__.py +114 -0
  105. nemo_platform/cli/commands/api/adapters.py +384 -0
  106. nemo_platform/cli/commands/api/files/__init__.py +237 -0
  107. nemo_platform/cli/commands/api/files/filesets.py +386 -0
  108. nemo_platform/cli/commands/api/files/otlp/__init__.py +12 -0
  109. nemo_platform/cli/commands/api/files/otlp/logs.py +116 -0
  110. nemo_platform/cli/commands/api/guardrail/__init__.py +270 -0
  111. nemo_platform/cli/commands/api/guardrail/configs.py +311 -0
  112. nemo_platform/cli/commands/api/iam/__init__.py +12 -0
  113. nemo_platform/cli/commands/api/iam/role_bindings.py +264 -0
  114. nemo_platform/cli/commands/api/inference/__init__.py +76 -0
  115. nemo_platform/cli/commands/api/inference/deployment_configs/__init__.py +370 -0
  116. nemo_platform/cli/commands/api/inference/deployment_configs/versions.py +132 -0
  117. nemo_platform/cli/commands/api/inference/deployments/__init__.py +565 -0
  118. nemo_platform/cli/commands/api/inference/deployments/versions.py +141 -0
  119. nemo_platform/cli/commands/api/inference/gateway/__init__.py +14 -0
  120. nemo_platform/cli/commands/api/inference/gateway/model.py +324 -0
  121. nemo_platform/cli/commands/api/inference/gateway/openai/__init__.py +12 -0
  122. nemo_platform/cli/commands/api/inference/gateway/openai/v1/__init__.py +12 -0
  123. nemo_platform/cli/commands/api/inference/gateway/openai/v1/models.py +106 -0
  124. nemo_platform/cli/commands/api/inference/gateway/provider.py +327 -0
  125. nemo_platform/cli/commands/api/inference/models.py +106 -0
  126. nemo_platform/cli/commands/api/inference/providers.py +612 -0
  127. nemo_platform/cli/commands/api/inference/virtual_models.py +412 -0
  128. nemo_platform/cli/commands/api/intake/__init__.py +18 -0
  129. nemo_platform/cli/commands/api/intake/apps/__init__.py +326 -0
  130. nemo_platform/cli/commands/api/intake/apps/tasks.py +340 -0
  131. nemo_platform/cli/commands/api/intake/entries/__init__.py +445 -0
  132. nemo_platform/cli/commands/api/intake/entries/events.py +118 -0
  133. nemo_platform/cli/commands/api/intake/evaluator_results.py +267 -0
  134. nemo_platform/cli/commands/api/intake/exports/__init__.py +63 -0
  135. nemo_platform/cli/commands/api/intake/exports/jobs.py +245 -0
  136. nemo_platform/cli/commands/api/intake/ingest/__init__.py +14 -0
  137. nemo_platform/cli/commands/api/intake/ingest/atif.py +115 -0
  138. nemo_platform/cli/commands/api/intake/ingest/chat_completions.py +125 -0
  139. nemo_platform/cli/commands/api/intake/ingest/otlp/__init__.py +12 -0
  140. nemo_platform/cli/commands/api/intake/ingest/otlp/v1/__init__.py +12 -0
  141. nemo_platform/cli/commands/api/intake/ingest/otlp/v1/traces.py +72 -0
  142. nemo_platform/cli/commands/api/intake/spans/__init__.py +202 -0
  143. nemo_platform/cli/commands/api/intake/spans/evaluator_results.py +65 -0
  144. nemo_platform/cli/commands/api/intake/traces.py +183 -0
  145. nemo_platform/cli/commands/api/jobs/__init__.py +576 -0
  146. nemo_platform/cli/commands/api/jobs/results.py +211 -0
  147. nemo_platform/cli/commands/api/jobs/steps.py +243 -0
  148. nemo_platform/cli/commands/api/jobs/tasks.py +210 -0
  149. nemo_platform/cli/commands/api/members.py +304 -0
  150. nemo_platform/cli/commands/api/models/__init__.py +555 -0
  151. nemo_platform/cli/commands/api/models/adapters.py +261 -0
  152. nemo_platform/cli/commands/api/projects.py +332 -0
  153. nemo_platform/cli/commands/api/safe_synthesizer/__init__.py +12 -0
  154. nemo_platform/cli/commands/api/safe_synthesizer/jobs/__init__.py +417 -0
  155. nemo_platform/cli/commands/api/safe_synthesizer/jobs/results.py +211 -0
  156. nemo_platform/cli/commands/api/secrets/__init__.py +315 -0
  157. nemo_platform/cli/commands/api/secrets/admin.py +44 -0
  158. nemo_platform/cli/commands/api/workspaces.py +339 -0
  159. nemo_platform/cli/commands/auth.py +803 -0
  160. nemo_platform/cli/commands/config.py +308 -0
  161. nemo_platform/cli/commands/docs.py +277 -0
  162. nemo_platform/cli/commands/manifest_registry.py +180 -0
  163. nemo_platform/cli/commands/plugins.py +87 -0
  164. nemo_platform/cli/commands/quickstart/__init__.py +15 -0
  165. nemo_platform/cli/commands/quickstart/cli.py +1178 -0
  166. nemo_platform/cli/commands/services/_process.py +472 -0
  167. nemo_platform/cli/commands/services/cli.py +694 -0
  168. nemo_platform/cli/commands/setup.py +1947 -0
  169. nemo_platform/cli/commands/skills/agents/claude.py +29 -0
  170. nemo_platform/cli/commands/skills/agents/codex.py +32 -0
  171. nemo_platform/cli/commands/skills/agents/cursor.py +18 -0
  172. nemo_platform/cli/commands/skills/agents/opencode.py +20 -0
  173. nemo_platform/cli/commands/skills/base.py +53 -0
  174. nemo_platform/cli/commands/skills/cli.py +313 -0
  175. nemo_platform/cli/commands/skills/installer.py +51 -0
  176. nemo_platform/cli/commands/skills/registry.py +396 -0
  177. nemo_platform/cli/commands/use_cases/__init__.py +15 -0
  178. nemo_platform/cli/commands/use_cases/agent.py +245 -0
  179. nemo_platform/cli/commands/use_cases/chat.py +965 -0
  180. nemo_platform/cli/commands/use_cases/wait.py +151 -0
  181. nemo_platform/cli/core/__init__.py +8 -0
  182. nemo_platform/cli/core/agent_helpers.py +84 -0
  183. nemo_platform/cli/core/api.py +160 -0
  184. nemo_platform/cli/core/autocomplete.py +63 -0
  185. nemo_platform/cli/core/code_generator.py +306 -0
  186. nemo_platform/cli/core/context.py +179 -0
  187. nemo_platform/cli/core/errors.py +349 -0
  188. nemo_platform/cli/core/formatters.py +718 -0
  189. nemo_platform/cli/core/help_formatter.py +868 -0
  190. nemo_platform/cli/core/lazy_load.py +187 -0
  191. nemo_platform/cli/core/logging.py +24 -0
  192. nemo_platform/cli/core/pagination.py +255 -0
  193. nemo_platform/cli/core/stdin_utils.py +233 -0
  194. nemo_platform/cli/core/streaming.py +30 -0
  195. nemo_platform/cli/core/table_config.py +302 -0
  196. nemo_platform/cli/core/timestamp_formatter.py +127 -0
  197. nemo_platform/cli/core/types.py +112 -0
  198. nemo_platform/cli/core/waiters.py +339 -0
  199. nemo_platform/cli/manifest.py +108 -0
  200. nemo_platform/client/__init__.py +15 -0
  201. nemo_platform/client/factory.py +597 -0
  202. nemo_platform/config/README.md +168 -0
  203. nemo_platform/config/__init__.py +23 -0
  204. nemo_platform/config/config.py +538 -0
  205. nemo_platform/config/models.py +377 -0
  206. nemo_platform/config/types.py +7 -0
  207. nemo_platform/filesets/__init__.py +19 -0
  208. nemo_platform/filesets/filesystem/callbacks.py +229 -0
  209. nemo_platform/filesets/filesystem/filesystem.py +940 -0
  210. nemo_platform/filesets/resources.py +1120 -0
  211. nemo_platform/lib/.keep +4 -0
  212. nemo_platform/models/__init__.py +14 -0
  213. nemo_platform/models/resources.py +836 -0
  214. nemo_platform/pagination.py +149 -0
  215. nemo_platform/py.typed +0 -0
  216. nemo_platform/quickstart/__init__.py +99 -0
  217. nemo_platform/quickstart/cluster.py +198 -0
  218. nemo_platform/quickstart/config.py +402 -0
  219. nemo_platform/quickstart/container.py +758 -0
  220. nemo_platform/quickstart/gpu_config.py +111 -0
  221. nemo_platform/quickstart/platform_config.py +82 -0
  222. nemo_platform/quickstart/preflight.py +451 -0
  223. nemo_platform/quickstart/prompts.py +426 -0
  224. nemo_platform/quickstart/storage.py +90 -0
  225. nemo_platform/quickstart/validators.py +268 -0
  226. nemo_platform/resources/__init__.py +16 -0
  227. nemo_platform/resources/adapters/__init__.py +34 -0
  228. nemo_platform/resources/adapters/adapters.py +704 -0
  229. nemo_platform/resources/adapters/api.md +15 -0
  230. nemo_platform/resources/audit/__init__.py +16 -0
  231. nemo_platform/resources/entities/__init__.py +34 -0
  232. nemo_platform/resources/entities/api.md +16 -0
  233. nemo_platform/resources/entities/entities.py +1014 -0
  234. nemo_platform/resources/evaluation/__init__.py +118 -0
  235. nemo_platform/resources/evaluation/api.md +303 -0
  236. nemo_platform/resources/evaluation/benchmark_job_results.py +541 -0
  237. nemo_platform/resources/evaluation/benchmark_jobs/__init__.py +48 -0
  238. nemo_platform/resources/evaluation/benchmark_jobs/benchmark_jobs.py +900 -0
  239. nemo_platform/resources/evaluation/benchmark_jobs/results/__init__.py +76 -0
  240. nemo_platform/resources/evaluation/benchmark_jobs/results/aggregate_scores.py +197 -0
  241. nemo_platform/resources/evaluation/benchmark_jobs/results/artifacts.py +206 -0
  242. nemo_platform/resources/evaluation/benchmark_jobs/results/results.py +516 -0
  243. nemo_platform/resources/evaluation/benchmark_jobs/results/row_scores.py +213 -0
  244. nemo_platform/resources/evaluation/benchmarks.py +690 -0
  245. nemo_platform/resources/evaluation/evaluation.py +277 -0
  246. nemo_platform/resources/evaluation/metric_job_results.py +533 -0
  247. nemo_platform/resources/evaluation/metric_jobs/__init__.py +48 -0
  248. nemo_platform/resources/evaluation/metric_jobs/metric_jobs.py +888 -0
  249. nemo_platform/resources/evaluation/metric_jobs/results/__init__.py +76 -0
  250. nemo_platform/resources/evaluation/metric_jobs/results/aggregate_scores.py +197 -0
  251. nemo_platform/resources/evaluation/metric_jobs/results/artifacts.py +206 -0
  252. nemo_platform/resources/evaluation/metric_jobs/results/results.py +512 -0
  253. nemo_platform/resources/evaluation/metric_jobs/results/row_scores.py +213 -0
  254. nemo_platform/resources/evaluation/metrics.py +3495 -0
  255. nemo_platform/resources/files/__init__.py +62 -0
  256. nemo_platform/resources/files/api.md +65 -0
  257. nemo_platform/resources/files/files.py +683 -0
  258. nemo_platform/resources/files/filesets.py +783 -0
  259. nemo_platform/resources/files/otlp/__init__.py +48 -0
  260. nemo_platform/resources/files/otlp/logs.py +337 -0
  261. nemo_platform/resources/files/otlp/otlp.py +117 -0
  262. nemo_platform/resources/guardrail/__init__.py +48 -0
  263. nemo_platform/resources/guardrail/api.md +116 -0
  264. nemo_platform/resources/guardrail/configs.py +679 -0
  265. nemo_platform/resources/guardrail/guardrail.py +463 -0
  266. nemo_platform/resources/iam/__init__.py +48 -0
  267. nemo_platform/resources/iam/api.md +22 -0
  268. nemo_platform/resources/iam/iam.py +117 -0
  269. nemo_platform/resources/iam/role_bindings.py +537 -0
  270. nemo_platform/resources/inference/__init__.py +118 -0
  271. nemo_platform/resources/inference/api.md +224 -0
  272. nemo_platform/resources/inference/deployment_configs/__init__.py +48 -0
  273. nemo_platform/resources/inference/deployment_configs/deployment_configs.py +756 -0
  274. nemo_platform/resources/inference/deployment_configs/versions.py +418 -0
  275. nemo_platform/resources/inference/deployments/__init__.py +48 -0
  276. nemo_platform/resources/inference/deployments/deployments.py +1017 -0
  277. nemo_platform/resources/inference/deployments/versions.py +434 -0
  278. nemo_platform/resources/inference/gateway/__init__.py +76 -0
  279. nemo_platform/resources/inference/gateway/gateway.py +181 -0
  280. nemo_platform/resources/inference/gateway/model.py +708 -0
  281. nemo_platform/resources/inference/gateway/openai/__init__.py +48 -0
  282. nemo_platform/resources/inference/gateway/openai/openai.py +700 -0
  283. nemo_platform/resources/inference/gateway/openai/v1/__init__.py +48 -0
  284. nemo_platform/resources/inference/gateway/openai/v1/models.py +290 -0
  285. nemo_platform/resources/inference/gateway/openai/v1/v1.py +117 -0
  286. nemo_platform/resources/inference/gateway/provider.py +749 -0
  287. nemo_platform/resources/inference/inference.py +277 -0
  288. nemo_platform/resources/inference/models.py +290 -0
  289. nemo_platform/resources/inference/providers.py +1049 -0
  290. nemo_platform/resources/inference/virtual_models.py +846 -0
  291. nemo_platform/resources/intake/__init__.py +132 -0
  292. nemo_platform/resources/intake/api.md +268 -0
  293. nemo_platform/resources/intake/apps/__init__.py +48 -0
  294. nemo_platform/resources/intake/apps/apps.py +718 -0
  295. nemo_platform/resources/intake/apps/tasks.py +731 -0
  296. nemo_platform/resources/intake/entries/__init__.py +48 -0
  297. nemo_platform/resources/intake/entries/entries.py +855 -0
  298. nemo_platform/resources/intake/entries/events.py +320 -0
  299. nemo_platform/resources/intake/evaluator_results.py +512 -0
  300. nemo_platform/resources/intake/exports/__init__.py +48 -0
  301. nemo_platform/resources/intake/exports/exports.py +229 -0
  302. nemo_platform/resources/intake/exports/jobs.py +464 -0
  303. nemo_platform/resources/intake/ingest/__init__.py +76 -0
  304. nemo_platform/resources/intake/ingest/atif.py +242 -0
  305. nemo_platform/resources/intake/ingest/chat_completions.py +270 -0
  306. nemo_platform/resources/intake/ingest/ingest.py +181 -0
  307. nemo_platform/resources/intake/ingest/otlp/__init__.py +48 -0
  308. nemo_platform/resources/intake/ingest/otlp/otlp.py +117 -0
  309. nemo_platform/resources/intake/ingest/otlp/v1/__init__.py +48 -0
  310. nemo_platform/resources/intake/ingest/otlp/v1/traces.py +183 -0
  311. nemo_platform/resources/intake/ingest/otlp/v1/v1.py +117 -0
  312. nemo_platform/resources/intake/intake.py +309 -0
  313. nemo_platform/resources/intake/spans/__init__.py +48 -0
  314. nemo_platform/resources/intake/spans/evaluator_results.py +197 -0
  315. nemo_platform/resources/intake/spans/spans.py +367 -0
  316. nemo_platform/resources/intake/traces.py +351 -0
  317. nemo_platform/resources/jobs/__init__.py +76 -0
  318. nemo_platform/resources/jobs/api.md +118 -0
  319. nemo_platform/resources/jobs/jobs.py +1300 -0
  320. nemo_platform/resources/jobs/results.py +555 -0
  321. nemo_platform/resources/jobs/steps.py +491 -0
  322. nemo_platform/resources/jobs/tasks.py +470 -0
  323. nemo_platform/resources/members/__init__.py +34 -0
  324. nemo_platform/resources/members/api.md +19 -0
  325. nemo_platform/resources/members/members.py +634 -0
  326. nemo_platform/resources/models/__init__.py +48 -0
  327. nemo_platform/resources/models/adapters.py +514 -0
  328. nemo_platform/resources/models/api.md +44 -0
  329. nemo_platform/resources/models/models.py +981 -0
  330. nemo_platform/resources/projects/__init__.py +34 -0
  331. nemo_platform/resources/projects/api.md +21 -0
  332. nemo_platform/resources/projects/projects.py +736 -0
  333. nemo_platform/resources/safe_synthesizer/__init__.py +48 -0
  334. nemo_platform/resources/safe_synthesizer/api.md +62 -0
  335. nemo_platform/resources/safe_synthesizer/jobs/__init__.py +48 -0
  336. nemo_platform/resources/safe_synthesizer/jobs/jobs.py +895 -0
  337. nemo_platform/resources/safe_synthesizer/jobs/results.py +819 -0
  338. nemo_platform/resources/safe_synthesizer/safe_synthesizer.py +117 -0
  339. nemo_platform/resources/secrets/__init__.py +48 -0
  340. nemo_platform/resources/secrets/admin.py +150 -0
  341. nemo_platform/resources/secrets/api.md +34 -0
  342. nemo_platform/resources/secrets/secrets.py +756 -0
  343. nemo_platform/resources/workspaces/__init__.py +34 -0
  344. nemo_platform/resources/workspaces/api.md +20 -0
  345. nemo_platform/resources/workspaces/workspaces.py +734 -0
  346. nemo_platform/skills/__init__.py +28 -0
  347. nemo_platform/skills/inference/SKILL.md +564 -0
  348. nemo_platform/skills/nemo-build-agent/SKILL.md +221 -0
  349. nemo_platform/skills/nemo-build-agent/references/templates/data-designer-config.py +80 -0
  350. nemo_platform/skills/nemo-evaluator/SKILL.md +140 -0
  351. nemo_platform/skills/nemo-explore/SKILL.md +70 -0
  352. nemo_platform/skills/nemo-files/SKILL.md +81 -0
  353. nemo_platform/skills/nemo-fine-tune/SKILL.md +43 -0
  354. nemo_platform/skills/nemo-guardrails/SKILL.md +519 -0
  355. nemo_platform/skills/nemo-secrets/SKILL.md +60 -0
  356. nemo_platform/skills/nemo-skill-selection/SKILL.md +146 -0
  357. nemo_platform/skills/nemo-spec/SKILL.md +76 -0
  358. nemo_platform/skills/nemo-spec/references/templates/agent-spec.md +68 -0
  359. nemo_platform/skills/nemo-status/SKILL.md +115 -0
  360. nemo_platform/skills/nemo-teardown/SKILL.md +185 -0
  361. nemo_platform/skills/nemo-try-agent/SKILL.md +102 -0
  362. nemo_platform/types/__init__.py +54 -0
  363. nemo_platform/types/adapters/__init__.py +24 -0
  364. nemo_platform/types/adapters/adapter_create_params.py +63 -0
  365. nemo_platform/types/adapters/adapter_entity_filter_param.py +56 -0
  366. nemo_platform/types/adapters/adapter_list_params.py +46 -0
  367. nemo_platform/types/adapters/adapter_patch_params.py +35 -0
  368. nemo_platform/types/adapters/adapters_page.py +37 -0
  369. nemo_platform/types/audit/__init__.py +18 -0
  370. nemo_platform/types/audit/jobs/__init__.py +18 -0
  371. nemo_platform/types/entities/__init__.py +26 -0
  372. nemo_platform/types/entities/entities_page.py +37 -0
  373. nemo_platform/types/entities/entity.py +63 -0
  374. nemo_platform/types/entities/entity_create_params.py +46 -0
  375. nemo_platform/types/entities/entity_delete_entity_by_name_params.py +31 -0
  376. nemo_platform/types/entities/entity_get_entity_by_name_params.py +31 -0
  377. nemo_platform/types/entities/entity_list_params.py +47 -0
  378. nemo_platform/types/entities/entity_update_entity_by_name_params.py +52 -0
  379. nemo_platform/types/evaluation/__init__.py +242 -0
  380. nemo_platform/types/evaluation/agent.py +68 -0
  381. nemo_platform/types/evaluation/agent_goal_accuracy_metric.py +92 -0
  382. nemo_platform/types/evaluation/agent_goal_accuracy_metric_param.py +69 -0
  383. nemo_platform/types/evaluation/agent_goal_accuracy_metric_param_param.py +70 -0
  384. nemo_platform/types/evaluation/agent_goal_accuracy_metric_response.py +88 -0
  385. nemo_platform/types/evaluation/agent_param.py +69 -0
  386. nemo_platform/types/evaluation/aggregate_range_score.py +65 -0
  387. nemo_platform/types/evaluation/aggregate_rubric_score.py +64 -0
  388. nemo_platform/types/evaluation/aggregated_metric_result.py +34 -0
  389. nemo_platform/types/evaluation/answer_accuracy_metric.py +89 -0
  390. nemo_platform/types/evaluation/answer_accuracy_metric_param.py +66 -0
  391. nemo_platform/types/evaluation/answer_accuracy_metric_param_param.py +67 -0
  392. nemo_platform/types/evaluation/answer_accuracy_metric_response.py +85 -0
  393. nemo_platform/types/evaluation/benchmark.py +81 -0
  394. nemo_platform/types/evaluation/benchmark_create_params.py +64 -0
  395. nemo_platform/types/evaluation/benchmark_create_response.py +26 -0
  396. nemo_platform/types/evaluation/benchmark_evaluation_job.py +75 -0
  397. nemo_platform/types/evaluation/benchmark_evaluation_jobs_list_filter_param.py +49 -0
  398. nemo_platform/types/evaluation/benchmark_evaluation_jobs_page.py +37 -0
  399. nemo_platform/types/evaluation/benchmark_evaluation_jobs_sort_field.py +22 -0
  400. nemo_platform/types/evaluation/benchmark_job_create_params.py +58 -0
  401. nemo_platform/types/evaluation/benchmark_job_get_logs_params.py +30 -0
  402. nemo_platform/types/evaluation/benchmark_job_list_params.py +44 -0
  403. nemo_platform/types/evaluation/benchmark_job_result.py +93 -0
  404. nemo_platform/types/evaluation/benchmark_job_result_list_params.py +116 -0
  405. nemo_platform/types/evaluation/benchmark_job_result_retrieve_params.py +50 -0
  406. nemo_platform/types/evaluation/benchmark_job_results_list_response.py +37 -0
  407. nemo_platform/types/evaluation/benchmark_jobs/__init__.py +18 -0
  408. nemo_platform/types/evaluation/benchmark_jobs/results/__init__.py +22 -0
  409. nemo_platform/types/evaluation/benchmark_jobs/results/benchmark_evaluation_result.py +30 -0
  410. nemo_platform/types/evaluation/benchmark_jobs/results/benchmark_metric_result.py +44 -0
  411. nemo_platform/types/evaluation/benchmark_jobs/results/row_score_download_params.py +28 -0
  412. nemo_platform/types/evaluation/benchmark_list_params.py +84 -0
  413. nemo_platform/types/evaluation/benchmark_offline_job.py +43 -0
  414. nemo_platform/types/evaluation/benchmark_offline_job_param.py +44 -0
  415. nemo_platform/types/evaluation/benchmark_online_agent_job.py +71 -0
  416. nemo_platform/types/evaluation/benchmark_online_agent_job_param.py +74 -0
  417. nemo_platform/types/evaluation/benchmark_online_job.py +66 -0
  418. nemo_platform/types/evaluation/benchmark_online_job_param.py +68 -0
  419. nemo_platform/types/evaluation/benchmark_ref.py +22 -0
  420. nemo_platform/types/evaluation/benchmark_retrieve_params.py +29 -0
  421. nemo_platform/types/evaluation/benchmark_retrieve_response.py +27 -0
  422. nemo_platform/types/evaluation/benchmarks_list_response.py +42 -0
  423. nemo_platform/types/evaluation/bleu_metric.py +76 -0
  424. nemo_platform/types/evaluation/bleu_metric_param.py +50 -0
  425. nemo_platform/types/evaluation/bleu_metric_param_param.py +52 -0
  426. nemo_platform/types/evaluation/bleu_metric_response.py +69 -0
  427. nemo_platform/types/evaluation/built_in_dataset.py +46 -0
  428. nemo_platform/types/evaluation/context_entity_recall_metric.py +89 -0
  429. nemo_platform/types/evaluation/context_entity_recall_metric_param.py +66 -0
  430. nemo_platform/types/evaluation/context_entity_recall_metric_param_param.py +67 -0
  431. nemo_platform/types/evaluation/context_entity_recall_metric_response.py +85 -0
  432. nemo_platform/types/evaluation/context_precision_metric.py +89 -0
  433. nemo_platform/types/evaluation/context_precision_metric_param.py +66 -0
  434. nemo_platform/types/evaluation/context_precision_metric_param_param.py +67 -0
  435. nemo_platform/types/evaluation/context_precision_metric_response.py +85 -0
  436. nemo_platform/types/evaluation/context_recall_metric.py +89 -0
  437. nemo_platform/types/evaluation/context_recall_metric_param.py +66 -0
  438. nemo_platform/types/evaluation/context_recall_metric_param_param.py +67 -0
  439. nemo_platform/types/evaluation/context_recall_metric_response.py +85 -0
  440. nemo_platform/types/evaluation/context_relevance_metric.py +89 -0
  441. nemo_platform/types/evaluation/context_relevance_metric_param.py +66 -0
  442. nemo_platform/types/evaluation/context_relevance_metric_param_param.py +67 -0
  443. nemo_platform/types/evaluation/context_relevance_metric_response.py +85 -0
  444. nemo_platform/types/evaluation/dataset_rows.py +35 -0
  445. nemo_platform/types/evaluation/dataset_rows_param.py +36 -0
  446. nemo_platform/types/evaluation/evaluate_dataset_rows_param.py +33 -0
  447. nemo_platform/types/evaluation/exact_match_metric.py +79 -0
  448. nemo_platform/types/evaluation/exact_match_metric_param.py +53 -0
  449. nemo_platform/types/evaluation/exact_match_metric_param_param.py +53 -0
  450. nemo_platform/types/evaluation/exact_match_metric_response.py +72 -0
  451. nemo_platform/types/evaluation/extended_benchmark.py +130 -0
  452. nemo_platform/types/evaluation/f1_metric.py +76 -0
  453. nemo_platform/types/evaluation/f1_metric_param.py +50 -0
  454. nemo_platform/types/evaluation/f1_metric_param_param.py +50 -0
  455. nemo_platform/types/evaluation/f1_metric_response.py +69 -0
  456. nemo_platform/types/evaluation/faithfulness_metric.py +89 -0
  457. nemo_platform/types/evaluation/faithfulness_metric_param.py +66 -0
  458. nemo_platform/types/evaluation/faithfulness_metric_param_param.py +67 -0
  459. nemo_platform/types/evaluation/faithfulness_metric_response.py +85 -0
  460. nemo_platform/types/evaluation/field_mapping.py +56 -0
  461. nemo_platform/types/evaluation/field_mapping_param.py +57 -0
  462. nemo_platform/types/evaluation/fileset.py +48 -0
  463. nemo_platform/types/evaluation/fileset_param.py +49 -0
  464. nemo_platform/types/evaluation/fileset_ref.py +22 -0
  465. nemo_platform/types/evaluation/histogram.py +30 -0
  466. nemo_platform/types/evaluation/histogram_bin.py +33 -0
  467. nemo_platform/types/evaluation/inference_params.py +65 -0
  468. nemo_platform/types/evaluation/inference_params_param.py +53 -0
  469. nemo_platform/types/evaluation/json_score_parser.py +35 -0
  470. nemo_platform/types/evaluation/json_score_parser_param.py +34 -0
  471. nemo_platform/types/evaluation/llm_judge_metric.py +126 -0
  472. nemo_platform/types/evaluation/llm_judge_metric_param.py +103 -0
  473. nemo_platform/types/evaluation/llm_judge_metric_param_param.py +105 -0
  474. nemo_platform/types/evaluation/llm_judge_metric_response.py +120 -0
  475. nemo_platform/types/evaluation/metric_create_params.py +959 -0
  476. nemo_platform/types/evaluation/metric_create_response.py +75 -0
  477. nemo_platform/types/evaluation/metric_evaluate_params.py +111 -0
  478. nemo_platform/types/evaluation/metric_evaluation_job.py +65 -0
  479. nemo_platform/types/evaluation/metric_evaluation_jobs_list_filter_param.py +49 -0
  480. nemo_platform/types/evaluation/metric_evaluation_jobs_page.py +37 -0
  481. nemo_platform/types/evaluation/metric_evaluation_jobs_sort_field.py +22 -0
  482. nemo_platform/types/evaluation/metric_evaluation_response.py +98 -0
  483. nemo_platform/types/evaluation/metric_evaluation_row_score.py +45 -0
  484. nemo_platform/types/evaluation/metric_job_create_params.py +48 -0
  485. nemo_platform/types/evaluation/metric_job_get_logs_params.py +30 -0
  486. nemo_platform/types/evaluation/metric_job_list_params.py +44 -0
  487. nemo_platform/types/evaluation/metric_job_result.py +93 -0
  488. nemo_platform/types/evaluation/metric_job_result_list_params.py +114 -0
  489. nemo_platform/types/evaluation/metric_job_result_retrieve_params.py +50 -0
  490. nemo_platform/types/evaluation/metric_job_results_list_response.py +37 -0
  491. nemo_platform/types/evaluation/metric_jobs/__init__.py +18 -0
  492. nemo_platform/types/evaluation/metric_jobs/results/__init__.py +20 -0
  493. nemo_platform/types/evaluation/metric_jobs/results/row_score_download_params.py +28 -0
  494. nemo_platform/types/evaluation/metric_list_params.py +73 -0
  495. nemo_platform/types/evaluation/metric_offline_job.py +106 -0
  496. nemo_platform/types/evaluation/metric_offline_job_param.py +107 -0
  497. nemo_platform/types/evaluation/metric_online_agent_job.py +133 -0
  498. nemo_platform/types/evaluation/metric_online_agent_job_param.py +135 -0
  499. nemo_platform/types/evaluation/metric_online_job.py +127 -0
  500. nemo_platform/types/evaluation/metric_online_job_param.py +129 -0
  501. nemo_platform/types/evaluation/metric_output.py +30 -0
  502. nemo_platform/types/evaluation/metric_ref.py +22 -0
  503. nemo_platform/types/evaluation/metric_retrieve_response.py +98 -0
  504. nemo_platform/types/evaluation/metric_retriever_job.py +64 -0
  505. nemo_platform/types/evaluation/metric_retriever_job_param.py +65 -0
  506. nemo_platform/types/evaluation/metric_type.py +47 -0
  507. nemo_platform/types/evaluation/metrics_list_response.py +90 -0
  508. nemo_platform/types/evaluation/model.py +44 -0
  509. nemo_platform/types/evaluation/model_param.py +44 -0
  510. nemo_platform/types/evaluation/model_ref.py +22 -0
  511. nemo_platform/types/evaluation/nemo_agent_toolkit_remote_metric.py +87 -0
  512. nemo_platform/types/evaluation/nemo_agent_toolkit_remote_metric_param.py +64 -0
  513. nemo_platform/types/evaluation/nemo_agent_toolkit_remote_metric_param_param.py +65 -0
  514. nemo_platform/types/evaluation/nemo_agent_toolkit_remote_metric_response.py +80 -0
  515. nemo_platform/types/evaluation/noise_sensitivity_metric.py +89 -0
  516. nemo_platform/types/evaluation/noise_sensitivity_metric_param.py +66 -0
  517. nemo_platform/types/evaluation/noise_sensitivity_metric_param_param.py +67 -0
  518. nemo_platform/types/evaluation/noise_sensitivity_metric_response.py +85 -0
  519. nemo_platform/types/evaluation/number_check_metric.py +104 -0
  520. nemo_platform/types/evaluation/number_check_metric_param.py +81 -0
  521. nemo_platform/types/evaluation/number_check_metric_param_param.py +83 -0
  522. nemo_platform/types/evaluation/number_check_metric_response.py +97 -0
  523. nemo_platform/types/evaluation/parameter.py +42 -0
  524. nemo_platform/types/evaluation/parameter_param.py +40 -0
  525. nemo_platform/types/evaluation/percentiles.py +54 -0
  526. nemo_platform/types/evaluation/range_score.py +56 -0
  527. nemo_platform/types/evaluation/range_score_param.py +57 -0
  528. nemo_platform/types/evaluation/reasoning_params.py +41 -0
  529. nemo_platform/types/evaluation/reasoning_params_param.py +41 -0
  530. nemo_platform/types/evaluation/regex_score_parser.py +38 -0
  531. nemo_platform/types/evaluation/regex_score_parser_param.py +37 -0
  532. nemo_platform/types/evaluation/remote_metric.py +91 -0
  533. nemo_platform/types/evaluation/remote_metric_param.py +68 -0
  534. nemo_platform/types/evaluation/remote_metric_param_param.py +69 -0
  535. nemo_platform/types/evaluation/remote_metric_response.py +84 -0
  536. nemo_platform/types/evaluation/remote_score.py +49 -0
  537. nemo_platform/types/evaluation/remote_score_param.py +50 -0
  538. nemo_platform/types/evaluation/response_groundedness_metric.py +89 -0
  539. nemo_platform/types/evaluation/response_groundedness_metric_param.py +66 -0
  540. nemo_platform/types/evaluation/response_groundedness_metric_param_param.py +67 -0
  541. nemo_platform/types/evaluation/response_groundedness_metric_response.py +85 -0
  542. nemo_platform/types/evaluation/response_relevancy_metric.py +95 -0
  543. nemo_platform/types/evaluation/response_relevancy_metric_param.py +74 -0
  544. nemo_platform/types/evaluation/response_relevancy_metric_param_param.py +75 -0
  545. nemo_platform/types/evaluation/response_relevancy_metric_response.py +93 -0
  546. nemo_platform/types/evaluation/retriever_pipeline.py +34 -0
  547. nemo_platform/types/evaluation/retriever_pipeline_param.py +35 -0
  548. nemo_platform/types/evaluation/rouge_metric.py +76 -0
  549. nemo_platform/types/evaluation/rouge_metric_param.py +53 -0
  550. nemo_platform/types/evaluation/rouge_metric_param_param.py +53 -0
  551. nemo_platform/types/evaluation/rouge_metric_response.py +69 -0
  552. nemo_platform/types/evaluation/row_score.py +59 -0
  553. nemo_platform/types/evaluation/rubric.py +40 -0
  554. nemo_platform/types/evaluation/rubric_param.py +40 -0
  555. nemo_platform/types/evaluation/rubric_score.py +54 -0
  556. nemo_platform/types/evaluation/rubric_score_param.py +55 -0
  557. nemo_platform/types/evaluation/rubric_score_stat.py +38 -0
  558. nemo_platform/types/evaluation/run_config.py +39 -0
  559. nemo_platform/types/evaluation/run_config_online.py +51 -0
  560. nemo_platform/types/evaluation/run_config_online_model.py +73 -0
  561. nemo_platform/types/evaluation/run_config_online_model_param.py +75 -0
  562. nemo_platform/types/evaluation/run_config_online_param.py +51 -0
  563. nemo_platform/types/evaluation/run_config_param.py +39 -0
  564. nemo_platform/types/evaluation/string_check_metric.py +82 -0
  565. nemo_platform/types/evaluation/string_check_metric_param.py +59 -0
  566. nemo_platform/types/evaluation/string_check_metric_param_param.py +61 -0
  567. nemo_platform/types/evaluation/string_check_metric_response.py +75 -0
  568. nemo_platform/types/evaluation/system_benchmark.py +71 -0
  569. nemo_platform/types/evaluation/system_benchmark_offline_job.py +58 -0
  570. nemo_platform/types/evaluation/system_benchmark_offline_job_param.py +60 -0
  571. nemo_platform/types/evaluation/system_benchmark_online_job.py +54 -0
  572. nemo_platform/types/evaluation/system_benchmark_online_job_param.py +55 -0
  573. nemo_platform/types/evaluation/system_metric.py +70 -0
  574. nemo_platform/types/evaluation/system_metric_param.py +50 -0
  575. nemo_platform/types/evaluation/system_metric_param_param.py +51 -0
  576. nemo_platform/types/evaluation/system_metric_response.py +66 -0
  577. nemo_platform/types/evaluation/tool_call_accuracy_metric.py +70 -0
  578. nemo_platform/types/evaluation/tool_call_accuracy_metric_param.py +44 -0
  579. nemo_platform/types/evaluation/tool_call_accuracy_metric_param_param.py +44 -0
  580. nemo_platform/types/evaluation/tool_call_accuracy_metric_response.py +63 -0
  581. nemo_platform/types/evaluation/tool_calling_metric.py +70 -0
  582. nemo_platform/types/evaluation/tool_calling_metric_param.py +47 -0
  583. nemo_platform/types/evaluation/tool_calling_metric_param_param.py +47 -0
  584. nemo_platform/types/evaluation/tool_calling_metric_response.py +63 -0
  585. nemo_platform/types/evaluation/topic_adherence_metric.py +92 -0
  586. nemo_platform/types/evaluation/topic_adherence_metric_param.py +69 -0
  587. nemo_platform/types/evaluation/topic_adherence_metric_param_param.py +70 -0
  588. nemo_platform/types/evaluation/topic_adherence_metric_response.py +88 -0
  589. nemo_platform/types/files/__init__.py +45 -0
  590. nemo_platform/types/files/cache_status.py +22 -0
  591. nemo_platform/types/files/dataset_metadata_content.py +46 -0
  592. nemo_platform/types/files/dataset_metadata_content_param.py +45 -0
  593. nemo_platform/types/files/file_list_files_params.py +35 -0
  594. nemo_platform/types/files/file_upload_file_params.py +28 -0
  595. nemo_platform/types/files/fileset.py +62 -0
  596. nemo_platform/types/files/fileset_create_params.py +74 -0
  597. nemo_platform/types/files/fileset_file.py +36 -0
  598. nemo_platform/types/files/fileset_filter_param.py +54 -0
  599. nemo_platform/types/files/fileset_list_params.py +47 -0
  600. nemo_platform/types/files/fileset_metadata_param.py +46 -0
  601. nemo_platform/types/files/fileset_metadata_param_param.py +47 -0
  602. nemo_platform/types/files/fileset_outputs_page.py +37 -0
  603. nemo_platform/types/files/fileset_purpose.py +22 -0
  604. nemo_platform/types/files/fileset_update_params.py +49 -0
  605. nemo_platform/types/files/huggingface_storage_config.py +60 -0
  606. nemo_platform/types/files/huggingface_storage_config_param.py +60 -0
  607. nemo_platform/types/files/list_fileset_files_response.py +27 -0
  608. nemo_platform/types/files/local_storage_config.py +39 -0
  609. nemo_platform/types/files/local_storage_config_param.py +38 -0
  610. nemo_platform/types/files/ngc_storage_config.py +66 -0
  611. nemo_platform/types/files/ngc_storage_config_param.py +66 -0
  612. nemo_platform/types/files/otlp/__init__.py +22 -0
  613. nemo_platform/types/files/otlp/log_query_params.py +36 -0
  614. nemo_platform/types/files/otlp/otel_export_logs_partial_success.py +34 -0
  615. nemo_platform/types/files/otlp/otel_export_logs_service_response.py +35 -0
  616. nemo_platform/types/files/s3_storage_config.py +85 -0
  617. nemo_platform/types/files/s3_storage_config_param.py +85 -0
  618. nemo_platform/types/files/secret_ref.py +22 -0
  619. nemo_platform/types/files/storage_config_type.py +22 -0
  620. nemo_platform/types/guardrail/__init__.py +165 -0
  621. nemo_platform/types/guardrail/action_rails.py +36 -0
  622. nemo_platform/types/guardrail/action_rails_param.py +38 -0
  623. nemo_platform/types/guardrail/activated_rail.py +61 -0
  624. nemo_platform/types/guardrail/ai_defense_rail_config.py +36 -0
  625. nemo_platform/types/guardrail/ai_defense_rail_config_param.py +36 -0
  626. nemo_platform/types/guardrail/auto_align_options.py +29 -0
  627. nemo_platform/types/guardrail/auto_align_options_param.py +30 -0
  628. nemo_platform/types/guardrail/auto_align_rail_config.py +35 -0
  629. nemo_platform/types/guardrail/auto_align_rail_config_param.py +37 -0
  630. nemo_platform/types/guardrail/cache_stats_config.py +32 -0
  631. nemo_platform/types/guardrail/cache_stats_config_param.py +32 -0
  632. nemo_platform/types/guardrail/chat_completion_assistant_message_param.py +45 -0
  633. nemo_platform/types/guardrail/chat_completion_content_part_image_param.py +34 -0
  634. nemo_platform/types/guardrail/chat_completion_content_part_text_param.py +32 -0
  635. nemo_platform/types/guardrail/chat_completion_function_message_param.py +35 -0
  636. nemo_platform/types/guardrail/chat_completion_message_tool_call_param.py +37 -0
  637. nemo_platform/types/guardrail/chat_completion_system_message_param.py +35 -0
  638. nemo_platform/types/guardrail/chat_completion_tool_message_param.py +35 -0
  639. nemo_platform/types/guardrail/chat_completion_user_message_param.py +41 -0
  640. nemo_platform/types/guardrail/clavata_rail_config.py +47 -0
  641. nemo_platform/types/guardrail/clavata_rail_config_param.py +48 -0
  642. nemo_platform/types/guardrail/clavata_rail_options.py +36 -0
  643. nemo_platform/types/guardrail/clavata_rail_options_param.py +38 -0
  644. nemo_platform/types/guardrail/config_create_params.py +36 -0
  645. nemo_platform/types/guardrail/config_list_params.py +47 -0
  646. nemo_platform/types/guardrail/config_update_params.py +33 -0
  647. nemo_platform/types/guardrail/content_safety_config.py +34 -0
  648. nemo_platform/types/guardrail/content_safety_config_param.py +35 -0
  649. nemo_platform/types/guardrail/crowd_strike_aidr_rail_config.py +29 -0
  650. nemo_platform/types/guardrail/crowd_strike_aidr_rail_config_param.py +29 -0
  651. nemo_platform/types/guardrail/dialog_rails.py +34 -0
  652. nemo_platform/types/guardrail/dialog_rails_param.py +35 -0
  653. nemo_platform/types/guardrail/executed_action.py +48 -0
  654. nemo_platform/types/guardrail/fact_checking_rail_config.py +31 -0
  655. nemo_platform/types/guardrail/fact_checking_rail_config_param.py +32 -0
  656. nemo_platform/types/guardrail/fiddler_guardrails.py +35 -0
  657. nemo_platform/types/guardrail/fiddler_guardrails_param.py +35 -0
  658. nemo_platform/types/guardrail/function_call_param.py +35 -0
  659. nemo_platform/types/guardrail/function_param.py +35 -0
  660. nemo_platform/types/guardrail/g_li_ner_detection.py +51 -0
  661. nemo_platform/types/guardrail/g_li_ner_detection_options.py +29 -0
  662. nemo_platform/types/guardrail/g_li_ner_detection_options_param.py +31 -0
  663. nemo_platform/types/guardrail/g_li_ner_detection_param.py +52 -0
  664. nemo_platform/types/guardrail/generation_log.py +44 -0
  665. nemo_platform/types/guardrail/generation_log_options_param.py +50 -0
  666. nemo_platform/types/guardrail/generation_options_param.py +55 -0
  667. nemo_platform/types/guardrail/generation_rails_options_param.py +53 -0
  668. nemo_platform/types/guardrail/generation_stats.py +56 -0
  669. nemo_platform/types/guardrail/guardrail_check_params.py +164 -0
  670. nemo_platform/types/guardrail/guardrail_check_response.py +36 -0
  671. nemo_platform/types/guardrail/guardrail_config.py +59 -0
  672. nemo_platform/types/guardrail/guardrail_config_filter_param.py +49 -0
  673. nemo_platform/types/guardrail/guardrail_configs_page.py +37 -0
  674. nemo_platform/types/guardrail/guardrails_ai_rail_config.py +33 -0
  675. nemo_platform/types/guardrail/guardrails_ai_rail_config_param.py +35 -0
  676. nemo_platform/types/guardrail/guardrails_ai_validator_config.py +44 -0
  677. nemo_platform/types/guardrail/guardrails_ai_validator_config_param.py +45 -0
  678. nemo_platform/types/guardrail/guardrails_data.py +40 -0
  679. nemo_platform/types/guardrail/guardrails_data_param.py +67 -0
  680. nemo_platform/types/guardrail/image_u_rl_param.py +32 -0
  681. nemo_platform/types/guardrail/injection_detection.py +49 -0
  682. nemo_platform/types/guardrail/injection_detection_param.py +52 -0
  683. nemo_platform/types/guardrail/input_rails.py +32 -0
  684. nemo_platform/types/guardrail/input_rails_param.py +34 -0
  685. nemo_platform/types/guardrail/instruction.py +30 -0
  686. nemo_platform/types/guardrail/instruction_param.py +32 -0
  687. nemo_platform/types/guardrail/jailbreak_detection_config.py +52 -0
  688. nemo_platform/types/guardrail/jailbreak_detection_config_param.py +58 -0
  689. nemo_platform/types/guardrail/llm_call_info.py +63 -0
  690. nemo_platform/types/guardrail/log_adapter_config.py +41 -0
  691. nemo_platform/types/guardrail/log_adapter_config_param.py +27 -0
  692. nemo_platform/types/guardrail/message_template.py +30 -0
  693. nemo_platform/types/guardrail/message_template_param.py +32 -0
  694. nemo_platform/types/guardrail/model.py +55 -0
  695. nemo_platform/types/guardrail/model_cache_config.py +36 -0
  696. nemo_platform/types/guardrail/model_cache_config_param.py +37 -0
  697. nemo_platform/types/guardrail/model_param.py +55 -0
  698. nemo_platform/types/guardrail/model_parameters.py +51 -0
  699. nemo_platform/types/guardrail/model_parameters_param.py +38 -0
  700. nemo_platform/types/guardrail/multilingual_config.py +40 -0
  701. nemo_platform/types/guardrail/multilingual_config_param.py +41 -0
  702. nemo_platform/types/guardrail/output_rails.py +44 -0
  703. nemo_platform/types/guardrail/output_rails_param.py +46 -0
  704. nemo_platform/types/guardrail/output_rails_streaming_config.py +44 -0
  705. nemo_platform/types/guardrail/output_rails_streaming_config_param.py +44 -0
  706. nemo_platform/types/guardrail/pangea_rail_config.py +33 -0
  707. nemo_platform/types/guardrail/pangea_rail_config_param.py +34 -0
  708. nemo_platform/types/guardrail/pangea_rail_options.py +31 -0
  709. nemo_platform/types/guardrail/pangea_rail_options_param.py +33 -0
  710. nemo_platform/types/guardrail/patronus_evaluate_api_params.py +38 -0
  711. nemo_platform/types/guardrail/patronus_evaluate_api_params_param.py +40 -0
  712. nemo_platform/types/guardrail/patronus_evaluate_config.py +30 -0
  713. nemo_platform/types/guardrail/patronus_evaluate_config_param.py +31 -0
  714. nemo_platform/types/guardrail/patronus_evaluation_success_strategy.py +22 -0
  715. nemo_platform/types/guardrail/patronus_rail_config.py +33 -0
  716. nemo_platform/types/guardrail/patronus_rail_config_param.py +34 -0
  717. nemo_platform/types/guardrail/private_ai_detection.py +39 -0
  718. nemo_platform/types/guardrail/private_ai_detection_options.py +29 -0
  719. nemo_platform/types/guardrail/private_ai_detection_options_param.py +31 -0
  720. nemo_platform/types/guardrail/private_ai_detection_param.py +40 -0
  721. nemo_platform/types/guardrail/rail_status.py +26 -0
  722. nemo_platform/types/guardrail/rails.py +73 -0
  723. nemo_platform/types/guardrail/rails_config.py +79 -0
  724. nemo_platform/types/guardrail/rails_config_data.py +94 -0
  725. nemo_platform/types/guardrail/rails_config_data_param.py +95 -0
  726. nemo_platform/types/guardrail/rails_config_param.py +81 -0
  727. nemo_platform/types/guardrail/rails_param.py +74 -0
  728. nemo_platform/types/guardrail/reasoning_config.py +32 -0
  729. nemo_platform/types/guardrail/reasoning_config_param.py +32 -0
  730. nemo_platform/types/guardrail/regex_detection.py +36 -0
  731. nemo_platform/types/guardrail/regex_detection_options.py +32 -0
  732. nemo_platform/types/guardrail/regex_detection_options_param.py +34 -0
  733. nemo_platform/types/guardrail/regex_detection_param.py +37 -0
  734. nemo_platform/types/guardrail/retrieval_rails.py +29 -0
  735. nemo_platform/types/guardrail/retrieval_rails_param.py +31 -0
  736. nemo_platform/types/guardrail/sensitive_data_detection.py +43 -0
  737. nemo_platform/types/guardrail/sensitive_data_detection_options.py +37 -0
  738. nemo_platform/types/guardrail/sensitive_data_detection_options_param.py +39 -0
  739. nemo_platform/types/guardrail/sensitive_data_detection_param.py +45 -0
  740. nemo_platform/types/guardrail/single_call_config.py +31 -0
  741. nemo_platform/types/guardrail/single_call_config_param.py +31 -0
  742. nemo_platform/types/guardrail/status_enum.py +22 -0
  743. nemo_platform/types/guardrail/task_prompt.py +63 -0
  744. nemo_platform/types/guardrail/task_prompt_param.py +65 -0
  745. nemo_platform/types/guardrail/tool_input_rails.py +36 -0
  746. nemo_platform/types/guardrail/tool_input_rails_param.py +38 -0
  747. nemo_platform/types/guardrail/tool_output_rails.py +36 -0
  748. nemo_platform/types/guardrail/tool_output_rails_param.py +38 -0
  749. nemo_platform/types/guardrail/tracing_config.py +48 -0
  750. nemo_platform/types/guardrail/tracing_config_param.py +50 -0
  751. nemo_platform/types/guardrail/trend_micro_rail_config.py +51 -0
  752. nemo_platform/types/guardrail/trend_micro_rail_config_param.py +51 -0
  753. nemo_platform/types/guardrail/user_messages_config.py +42 -0
  754. nemo_platform/types/guardrail/user_messages_config_param.py +42 -0
  755. nemo_platform/types/iam/__init__.py +26 -0
  756. nemo_platform/types/iam/date_range_filter_param.py +36 -0
  757. nemo_platform/types/iam/role_binding.py +42 -0
  758. nemo_platform/types/iam/role_binding_create_params.py +39 -0
  759. nemo_platform/types/iam/role_binding_delete_params.py +30 -0
  760. nemo_platform/types/iam/role_binding_filter_param.py +49 -0
  761. nemo_platform/types/iam/role_binding_list_params.py +44 -0
  762. nemo_platform/types/iam/role_bindings_page.py +37 -0
  763. nemo_platform/types/inference/__init__.py +60 -0
  764. nemo_platform/types/inference/deployment_config_create_params.py +47 -0
  765. nemo_platform/types/inference/deployment_config_list_params.py +46 -0
  766. nemo_platform/types/inference/deployment_config_update_params.py +37 -0
  767. nemo_platform/types/inference/deployment_configs/__init__.py +20 -0
  768. nemo_platform/types/inference/deployment_configs/version_list_response.py +25 -0
  769. nemo_platform/types/inference/deployment_create_params.py +45 -0
  770. nemo_platform/types/inference/deployment_list_models_response.py +23 -0
  771. nemo_platform/types/inference/deployment_list_params.py +52 -0
  772. nemo_platform/types/inference/deployment_update_params.py +35 -0
  773. nemo_platform/types/inference/deployment_update_status_params.py +42 -0
  774. nemo_platform/types/inference/deployments/__init__.py +20 -0
  775. nemo_platform/types/inference/deployments/version_list_response.py +25 -0
  776. nemo_platform/types/inference/gateway/__init__.py +38 -0
  777. nemo_platform/types/inference/gateway/model_patch_params.py +31 -0
  778. nemo_platform/types/inference/gateway/model_patch_response.py +23 -0
  779. nemo_platform/types/inference/gateway/model_post_params.py +31 -0
  780. nemo_platform/types/inference/gateway/model_post_response.py +23 -0
  781. nemo_platform/types/inference/gateway/model_put_params.py +31 -0
  782. nemo_platform/types/inference/gateway/model_put_response.py +23 -0
  783. nemo_platform/types/inference/gateway/openai/__init__.py +18 -0
  784. nemo_platform/types/inference/gateway/openai/v1/__init__.py +21 -0
  785. nemo_platform/types/inference/gateway/openai/v1/openai_list_models_resp.py +31 -0
  786. nemo_platform/types/inference/gateway/openai/v1/openai_model_resp.py +34 -0
  787. nemo_platform/types/inference/gateway/openai_patch_params.py +29 -0
  788. nemo_platform/types/inference/gateway/openai_patch_response.py +23 -0
  789. nemo_platform/types/inference/gateway/openai_post_params.py +29 -0
  790. nemo_platform/types/inference/gateway/openai_post_response.py +23 -0
  791. nemo_platform/types/inference/gateway/openai_put_params.py +29 -0
  792. nemo_platform/types/inference/gateway/openai_put_response.py +23 -0
  793. nemo_platform/types/inference/gateway/provider_patch_params.py +31 -0
  794. nemo_platform/types/inference/gateway/provider_patch_response.py +23 -0
  795. nemo_platform/types/inference/gateway/provider_post_params.py +31 -0
  796. nemo_platform/types/inference/gateway/provider_post_response.py +23 -0
  797. nemo_platform/types/inference/gateway/provider_put_params.py +31 -0
  798. nemo_platform/types/inference/gateway/provider_put_response.py +23 -0
  799. nemo_platform/types/inference/gateway/provider_ready_response.py +23 -0
  800. nemo_platform/types/inference/k8s_nim_operator_config.py +57 -0
  801. nemo_platform/types/inference/k8s_nim_operator_config_param.py +58 -0
  802. nemo_platform/types/inference/middleware_call.py +55 -0
  803. nemo_platform/types/inference/middleware_call_param.py +56 -0
  804. nemo_platform/types/inference/model_deployment.py +97 -0
  805. nemo_platform/types/inference/model_deployment_config.py +76 -0
  806. nemo_platform/types/inference/model_deployment_config_filter_param.py +49 -0
  807. nemo_platform/types/inference/model_deployment_configs_page.py +37 -0
  808. nemo_platform/types/inference/model_deployment_filter_param.py +56 -0
  809. nemo_platform/types/inference/model_deployment_status.py +24 -0
  810. nemo_platform/types/inference/model_deployment_status_history_item.py +37 -0
  811. nemo_platform/types/inference/model_deployments_page.py +37 -0
  812. nemo_platform/types/inference/model_provider.py +134 -0
  813. nemo_platform/types/inference/model_provider_filter_param.py +56 -0
  814. nemo_platform/types/inference/model_provider_sort.py +24 -0
  815. nemo_platform/types/inference/model_provider_status.py +24 -0
  816. nemo_platform/types/inference/model_providers_page.py +37 -0
  817. nemo_platform/types/inference/model_type.py +22 -0
  818. nemo_platform/types/inference/nim_deployment.py +96 -0
  819. nemo_platform/types/inference/nim_deployment_param.py +93 -0
  820. nemo_platform/types/inference/provider_create_params.py +94 -0
  821. nemo_platform/types/inference/provider_list_params.py +47 -0
  822. nemo_platform/types/inference/provider_update_params.py +87 -0
  823. nemo_platform/types/inference/provider_update_status_params.py +48 -0
  824. nemo_platform/types/inference/served_model_mapping.py +35 -0
  825. nemo_platform/types/inference/served_model_mapping_param.py +32 -0
  826. nemo_platform/types/inference/virtual_model.py +91 -0
  827. nemo_platform/types/inference/virtual_model_create_params.py +83 -0
  828. nemo_platform/types/inference/virtual_model_inference_config.py +32 -0
  829. nemo_platform/types/inference/virtual_model_inference_config_param.py +34 -0
  830. nemo_platform/types/inference/virtual_model_list_params.py +35 -0
  831. nemo_platform/types/inference/virtual_model_patch_params.py +80 -0
  832. nemo_platform/types/inference/virtual_models_page.py +37 -0
  833. nemo_platform/types/intake/__init__.py +86 -0
  834. nemo_platform/types/intake/app.py +51 -0
  835. nemo_platform/types/intake/app_create_params.py +38 -0
  836. nemo_platform/types/intake/app_filter_param.py +46 -0
  837. nemo_platform/types/intake/app_list_params.py +44 -0
  838. nemo_platform/types/intake/app_patch_params.py +35 -0
  839. nemo_platform/types/intake/app_sort_field.py +22 -0
  840. nemo_platform/types/intake/apps/__init__.py +26 -0
  841. nemo_platform/types/intake/apps/task.py +54 -0
  842. nemo_platform/types/intake/apps/task_create_params.py +40 -0
  843. nemo_platform/types/intake/apps/task_filter_param.py +49 -0
  844. nemo_platform/types/intake/apps/task_list_params.py +44 -0
  845. nemo_platform/types/intake/apps/task_patch_params.py +37 -0
  846. nemo_platform/types/intake/apps/task_sort_field.py +22 -0
  847. nemo_platform/types/intake/apps/tasks_page.py +37 -0
  848. nemo_platform/types/intake/apps_page.py +37 -0
  849. nemo_platform/types/intake/entries/__init__.py +20 -0
  850. nemo_platform/types/intake/entries/event_create_params.py +40 -0
  851. nemo_platform/types/intake/entry.py +98 -0
  852. nemo_platform/types/intake/entry_context.py +79 -0
  853. nemo_platform/types/intake/entry_context_filter_param.py +41 -0
  854. nemo_platform/types/intake/entry_context_param.py +82 -0
  855. nemo_platform/types/intake/entry_create_params.py +85 -0
  856. nemo_platform/types/intake/entry_data.py +48 -0
  857. nemo_platform/types/intake/entry_data_param.py +51 -0
  858. nemo_platform/types/intake/entry_filter_param.py +85 -0
  859. nemo_platform/types/intake/entry_list_params.py +47 -0
  860. nemo_platform/types/intake/entry_patch_params.py +79 -0
  861. nemo_platform/types/intake/entry_sort_field.py +22 -0
  862. nemo_platform/types/intake/entry_user_rating_filter_param.py +31 -0
  863. nemo_platform/types/intake/entrys_page.py +37 -0
  864. nemo_platform/types/intake/evaluation_context_param.py +41 -0
  865. nemo_platform/types/intake/evaluator_result.py +52 -0
  866. nemo_platform/types/intake/evaluator_result_create_params.py +52 -0
  867. nemo_platform/types/intake/evaluator_result_data_type.py +22 -0
  868. nemo_platform/types/intake/evaluator_result_event.py +67 -0
  869. nemo_platform/types/intake/evaluator_result_event_param.py +69 -0
  870. nemo_platform/types/intake/evaluator_result_filter_param.py +49 -0
  871. nemo_platform/types/intake/evaluator_result_list_params.py +43 -0
  872. nemo_platform/types/intake/evaluator_result_sort_field.py +22 -0
  873. nemo_platform/types/intake/evaluator_results_page.py +37 -0
  874. nemo_platform/types/intake/export_config_param.py +44 -0
  875. nemo_platform/types/intake/export_config_param_param.py +45 -0
  876. nemo_platform/types/intake/export_preview_params.py +34 -0
  877. nemo_platform/types/intake/export_preview_response.py +39 -0
  878. nemo_platform/types/intake/exports/__init__.py +28 -0
  879. nemo_platform/types/intake/exports/export_config.py +44 -0
  880. nemo_platform/types/intake/exports/export_job.py +76 -0
  881. nemo_platform/types/intake/exports/export_job_filter_param.py +50 -0
  882. nemo_platform/types/intake/exports/export_job_sort_field.py +22 -0
  883. nemo_platform/types/intake/exports/export_jobs_page.py +37 -0
  884. nemo_platform/types/intake/exports/export_status_details.py +35 -0
  885. nemo_platform/types/intake/exports/job_create_params.py +40 -0
  886. nemo_platform/types/intake/exports/job_list_params.py +46 -0
  887. nemo_platform/types/intake/exports/job_status.py +22 -0
  888. nemo_platform/types/intake/flexible_entry_request.py +63 -0
  889. nemo_platform/types/intake/flexible_entry_request_param.py +51 -0
  890. nemo_platform/types/intake/flexible_entry_response.py +62 -0
  891. nemo_platform/types/intake/flexible_entry_response_param.py +49 -0
  892. nemo_platform/types/intake/flexible_message.py +56 -0
  893. nemo_platform/types/intake/flexible_message_param.py +43 -0
  894. nemo_platform/types/intake/float_filter_param.py +32 -0
  895. nemo_platform/types/intake/ingest/__init__.py +37 -0
  896. nemo_platform/types/intake/ingest/atif_agent_param.py +35 -0
  897. nemo_platform/types/intake/ingest/atif_content_part_image_param.py +30 -0
  898. nemo_platform/types/intake/ingest/atif_content_part_param.py +28 -0
  899. nemo_platform/types/intake/ingest/atif_content_part_text_param.py +28 -0
  900. nemo_platform/types/intake/ingest/atif_create_params.py +52 -0
  901. nemo_platform/types/intake/ingest/atif_final_metrics_param.py +37 -0
  902. nemo_platform/types/intake/ingest/atif_image_source_param.py +28 -0
  903. nemo_platform/types/intake/ingest/atif_metrics_param.py +41 -0
  904. nemo_platform/types/intake/ingest/atif_observation_param.py +29 -0
  905. nemo_platform/types/intake/ingest/atif_observation_result_param.py +36 -0
  906. nemo_platform/types/intake/ingest/atif_step_agent_param.py +58 -0
  907. nemo_platform/types/intake/ingest/atif_step_param.py +29 -0
  908. nemo_platform/types/intake/ingest/atif_step_system_param.py +43 -0
  909. nemo_platform/types/intake/ingest/atif_step_user_param.py +43 -0
  910. nemo_platform/types/intake/ingest/atif_subagent_trajectory_ref_param.py +33 -0
  911. nemo_platform/types/intake/ingest/atif_tool_call_param.py +31 -0
  912. nemo_platform/types/intake/ingest/chat_completion_create_params.py +66 -0
  913. nemo_platform/types/intake/ingest/chat_completions_ingest_response.py +26 -0
  914. nemo_platform/types/intake/ingest/otlp/__init__.py +18 -0
  915. nemo_platform/types/intake/ingest/otlp/v1/__init__.py +20 -0
  916. nemo_platform/types/intake/ingest/otlp/v1/ingest_response.py +26 -0
  917. nemo_platform/types/intake/message_role.py +22 -0
  918. nemo_platform/types/intake/reviewer_annotation_event.py +95 -0
  919. nemo_platform/types/intake/reviewer_annotation_event_param.py +97 -0
  920. nemo_platform/types/intake/span.py +100 -0
  921. nemo_platform/types/intake/span_evaluation_context.py +40 -0
  922. nemo_platform/types/intake/span_filter_param.py +95 -0
  923. nemo_platform/types/intake/span_kind.py +24 -0
  924. nemo_platform/types/intake/span_list_params.py +46 -0
  925. nemo_platform/types/intake/span_sort_field.py +22 -0
  926. nemo_platform/types/intake/span_status.py +22 -0
  927. nemo_platform/types/intake/spans/__init__.py +20 -0
  928. nemo_platform/types/intake/spans/evaluator_result_list_response.py +25 -0
  929. nemo_platform/types/intake/spans_page.py +37 -0
  930. nemo_platform/types/intake/thumb_direction.py +22 -0
  931. nemo_platform/types/intake/trace.py +65 -0
  932. nemo_platform/types/intake/trace_filter_param.py +60 -0
  933. nemo_platform/types/intake/trace_list_params.py +49 -0
  934. nemo_platform/types/intake/trace_retrieve_params.py +32 -0
  935. nemo_platform/types/intake/trace_sort_field.py +22 -0
  936. nemo_platform/types/intake/traces_page.py +37 -0
  937. nemo_platform/types/intake/usage.py +65 -0
  938. nemo_platform/types/intake/usage_param.py +68 -0
  939. nemo_platform/types/intake/user_action_event.py +65 -0
  940. nemo_platform/types/intake/user_action_event_param.py +68 -0
  941. nemo_platform/types/intake/user_feedback_event.py +84 -0
  942. nemo_platform/types/intake/user_feedback_event_param.py +86 -0
  943. nemo_platform/types/intake/user_rating.py +68 -0
  944. nemo_platform/types/intake/user_rating_param.py +70 -0
  945. nemo_platform/types/jobs/__init__.py +95 -0
  946. nemo_platform/types/jobs/compute_resource_spec.py +32 -0
  947. nemo_platform/types/jobs/compute_resource_spec_param.py +32 -0
  948. nemo_platform/types/jobs/compute_resources.py +46 -0
  949. nemo_platform/types/jobs/compute_resources_param.py +47 -0
  950. nemo_platform/types/jobs/container_spec.py +35 -0
  951. nemo_platform/types/jobs/container_spec_param.py +37 -0
  952. nemo_platform/types/jobs/cpu_execution_provider.py +46 -0
  953. nemo_platform/types/jobs/cpu_execution_provider_param.py +46 -0
  954. nemo_platform/types/jobs/distributed_gpu_execution_provider.py +46 -0
  955. nemo_platform/types/jobs/distributed_gpu_execution_provider_param.py +46 -0
  956. nemo_platform/types/jobs/docker_job_execution_profile.py +43 -0
  957. nemo_platform/types/jobs/docker_job_execution_profile_config.py +52 -0
  958. nemo_platform/types/jobs/docker_job_network_config.py +27 -0
  959. nemo_platform/types/jobs/docker_job_storage_config.py +36 -0
  960. nemo_platform/types/jobs/docker_volume_mount.py +47 -0
  961. nemo_platform/types/jobs/e2e_job_execution_profile.py +43 -0
  962. nemo_platform/types/jobs/gpu_execution_provider.py +46 -0
  963. nemo_platform/types/jobs/gpu_execution_provider_param.py +46 -0
  964. nemo_platform/types/jobs/image_pull_secret.py +27 -0
  965. nemo_platform/types/jobs/job_create_params.py +46 -0
  966. nemo_platform/types/jobs/job_execution_profile_config.py +42 -0
  967. nemo_platform/types/jobs/job_get_logs_params.py +41 -0
  968. nemo_platform/types/jobs/job_list_execution_profiles_response.py +37 -0
  969. nemo_platform/types/jobs/job_list_params.py +47 -0
  970. nemo_platform/types/jobs/job_update_status_details_params.py +29 -0
  971. nemo_platform/types/jobs/kubernetes_empty_dir_volume.py +32 -0
  972. nemo_platform/types/jobs/kubernetes_job_execution_profile.py +43 -0
  973. nemo_platform/types/jobs/kubernetes_job_execution_profile_config.py +101 -0
  974. nemo_platform/types/jobs/kubernetes_job_storage_config.py +40 -0
  975. nemo_platform/types/jobs/kubernetes_object_metadata.py +28 -0
  976. nemo_platform/types/jobs/kubernetes_persistent_volume_claim.py +32 -0
  977. nemo_platform/types/jobs/kubernetes_volume.py +37 -0
  978. nemo_platform/types/jobs/kubernetes_volume_mount.py +38 -0
  979. nemo_platform/types/jobs/platform_job_environment_variable.py +36 -0
  980. nemo_platform/types/jobs/platform_job_environment_variable_param.py +37 -0
  981. nemo_platform/types/jobs/platform_job_list_task_response.py +29 -0
  982. nemo_platform/types/jobs/platform_job_response.py +75 -0
  983. nemo_platform/types/jobs/platform_job_responses_page.py +37 -0
  984. nemo_platform/types/jobs/platform_job_secret_environment_variable_ref.py +27 -0
  985. nemo_platform/types/jobs/platform_job_secret_environment_variable_ref_param.py +29 -0
  986. nemo_platform/types/jobs/platform_job_sort_field.py +22 -0
  987. nemo_platform/types/jobs/platform_job_spec.py +30 -0
  988. nemo_platform/types/jobs/platform_job_spec_param.py +32 -0
  989. nemo_platform/types/jobs/platform_job_step.py +75 -0
  990. nemo_platform/types/jobs/platform_job_step_spec.py +63 -0
  991. nemo_platform/types/jobs/platform_job_step_spec_param.py +65 -0
  992. nemo_platform/types/jobs/platform_job_step_with_context.py +67 -0
  993. nemo_platform/types/jobs/platform_job_step_with_contexts_page.py +37 -0
  994. nemo_platform/types/jobs/platform_job_steps_list_filter_param.py +38 -0
  995. nemo_platform/types/jobs/platform_job_task.py +75 -0
  996. nemo_platform/types/jobs/platform_jobs_list_filter_param.py +51 -0
  997. nemo_platform/types/jobs/result_create_params.py +34 -0
  998. nemo_platform/types/jobs/result_list_params.py +34 -0
  999. nemo_platform/types/jobs/step_lifecycle.py +37 -0
  1000. nemo_platform/types/jobs/step_lifecycle_param.py +37 -0
  1001. nemo_platform/types/jobs/step_list_params.py +44 -0
  1002. nemo_platform/types/jobs/step_update_status_params.py +44 -0
  1003. nemo_platform/types/jobs/subprocess_execution_provider.py +33 -0
  1004. nemo_platform/types/jobs/subprocess_execution_provider_param.py +34 -0
  1005. nemo_platform/types/jobs/subprocess_job_execution_profile.py +36 -0
  1006. nemo_platform/types/jobs/subprocess_job_execution_profile_config.py +49 -0
  1007. nemo_platform/types/jobs/task_create_or_update_params.py +46 -0
  1008. nemo_platform/types/jobs/volcano_job_execution_profile.py +39 -0
  1009. nemo_platform/types/jobs/volcano_job_execution_profile_config.py +114 -0
  1010. nemo_platform/types/members/__init__.py +24 -0
  1011. nemo_platform/types/members/member_create_params.py +40 -0
  1012. nemo_platform/types/members/member_delete_params.py +32 -0
  1013. nemo_platform/types/members/member_update_params.py +37 -0
  1014. nemo_platform/types/members/workspace_member.py +39 -0
  1015. nemo_platform/types/members/workspace_member_list_response.py +29 -0
  1016. nemo_platform/types/models/__init__.py +34 -0
  1017. nemo_platform/types/models/adapter.py +73 -0
  1018. nemo_platform/types/models/adapter_create_params.py +54 -0
  1019. nemo_platform/types/models/adapter_update_params.py +37 -0
  1020. nemo_platform/types/models/base_model_filter_param.py +29 -0
  1021. nemo_platform/types/models/finetuning_type_filter_param.py +31 -0
  1022. nemo_platform/types/models/lora.py +30 -0
  1023. nemo_platform/types/models/lora_param.py +30 -0
  1024. nemo_platform/types/models/model_create_params.py +93 -0
  1025. nemo_platform/types/models/model_entity.py +112 -0
  1026. nemo_platform/types/models/model_entity_filter_param.py +72 -0
  1027. nemo_platform/types/models/model_entity_sort_field.py +22 -0
  1028. nemo_platform/types/models/model_entitys_page.py +37 -0
  1029. nemo_platform/types/models/model_list_params.py +50 -0
  1030. nemo_platform/types/models/model_retrieve_params.py +29 -0
  1031. nemo_platform/types/models/model_update_params.py +86 -0
  1032. nemo_platform/types/projects/__init__.py +25 -0
  1033. nemo_platform/types/projects/project.py +45 -0
  1034. nemo_platform/types/projects/project_create_params.py +37 -0
  1035. nemo_platform/types/projects/project_list_params.py +49 -0
  1036. nemo_platform/types/projects/project_sort_field.py +22 -0
  1037. nemo_platform/types/projects/project_update_params.py +29 -0
  1038. nemo_platform/types/projects/projects_page.py +37 -0
  1039. nemo_platform/types/safe_synthesizer/__init__.py +68 -0
  1040. nemo_platform/types/safe_synthesizer/classify_config.py +41 -0
  1041. nemo_platform/types/safe_synthesizer/classify_config_param.py +43 -0
  1042. nemo_platform/types/safe_synthesizer/column.py +46 -0
  1043. nemo_platform/types/safe_synthesizer/column_actions.py +36 -0
  1044. nemo_platform/types/safe_synthesizer/column_actions_param.py +38 -0
  1045. nemo_platform/types/safe_synthesizer/column_param.py +49 -0
  1046. nemo_platform/types/safe_synthesizer/data_parameters.py +69 -0
  1047. nemo_platform/types/safe_synthesizer/data_parameters_param.py +69 -0
  1048. nemo_platform/types/safe_synthesizer/differential_privacy_hyperparams.py +48 -0
  1049. nemo_platform/types/safe_synthesizer/differential_privacy_hyperparams_param.py +48 -0
  1050. nemo_platform/types/safe_synthesizer/evaluation_parameters.py +64 -0
  1051. nemo_platform/types/safe_synthesizer/evaluation_parameters_param.py +66 -0
  1052. nemo_platform/types/safe_synthesizer/generate_parameters.py +104 -0
  1053. nemo_platform/types/safe_synthesizer/generate_parameters_param.py +102 -0
  1054. nemo_platform/types/safe_synthesizer/gliner_config.py +41 -0
  1055. nemo_platform/types/safe_synthesizer/gliner_config_param.py +41 -0
  1056. nemo_platform/types/safe_synthesizer/globals.py +45 -0
  1057. nemo_platform/types/safe_synthesizer/globals_param.py +47 -0
  1058. nemo_platform/types/safe_synthesizer/job_create_params.py +46 -0
  1059. nemo_platform/types/safe_synthesizer/job_get_logs_params.py +30 -0
  1060. nemo_platform/types/safe_synthesizer/job_list_params.py +44 -0
  1061. nemo_platform/types/safe_synthesizer/jobs/__init__.py +21 -0
  1062. nemo_platform/types/safe_synthesizer/jobs/safe_synthesizer_summary.py +95 -0
  1063. nemo_platform/types/safe_synthesizer/jobs/safe_synthesizer_timing.py +41 -0
  1064. nemo_platform/types/safe_synthesizer/ner_config.py +42 -0
  1065. nemo_platform/types/safe_synthesizer/ner_config_param.py +44 -0
  1066. nemo_platform/types/safe_synthesizer/pii_replacer_config.py +40 -0
  1067. nemo_platform/types/safe_synthesizer/pii_replacer_config_param.py +42 -0
  1068. nemo_platform/types/safe_synthesizer/row.py +50 -0
  1069. nemo_platform/types/safe_synthesizer/row_actions.py +33 -0
  1070. nemo_platform/types/safe_synthesizer/row_actions_param.py +35 -0
  1071. nemo_platform/types/safe_synthesizer/row_param.py +53 -0
  1072. nemo_platform/types/safe_synthesizer/safe_synthesizer_job.py +63 -0
  1073. nemo_platform/types/safe_synthesizer/safe_synthesizer_job_config.py +55 -0
  1074. nemo_platform/types/safe_synthesizer/safe_synthesizer_job_config_param.py +56 -0
  1075. nemo_platform/types/safe_synthesizer/safe_synthesizer_jobs_list_filter_param.py +49 -0
  1076. nemo_platform/types/safe_synthesizer/safe_synthesizer_jobs_page.py +37 -0
  1077. nemo_platform/types/safe_synthesizer/safe_synthesizer_jobs_sort_field.py +22 -0
  1078. nemo_platform/types/safe_synthesizer/safe_synthesizer_parameters.py +91 -0
  1079. nemo_platform/types/safe_synthesizer/safe_synthesizer_parameters_param.py +92 -0
  1080. nemo_platform/types/safe_synthesizer/step_definition.py +39 -0
  1081. nemo_platform/types/safe_synthesizer/step_definition_param.py +41 -0
  1082. nemo_platform/types/safe_synthesizer/time_series_parameters.py +73 -0
  1083. nemo_platform/types/safe_synthesizer/time_series_parameters_param.py +74 -0
  1084. nemo_platform/types/safe_synthesizer/training_hyperparams.py +165 -0
  1085. nemo_platform/types/safe_synthesizer/training_hyperparams_param.py +167 -0
  1086. nemo_platform/types/safe_synthesizer/validation_parameters.py +54 -0
  1087. nemo_platform/types/safe_synthesizer/validation_parameters_param.py +54 -0
  1088. nemo_platform/types/secrets/__init__.py +28 -0
  1089. nemo_platform/types/secrets/platform_secret_access_response.py +33 -0
  1090. nemo_platform/types/secrets/platform_secret_admin_rotation_response.py +28 -0
  1091. nemo_platform/types/secrets/platform_secret_response.py +40 -0
  1092. nemo_platform/types/secrets/platform_secret_responses_page.py +37 -0
  1093. nemo_platform/types/secrets/secret_create_params.py +39 -0
  1094. nemo_platform/types/secrets/secret_list_params.py +32 -0
  1095. nemo_platform/types/secrets/secret_update_params.py +32 -0
  1096. nemo_platform/types/shared/__init__.py +50 -0
  1097. nemo_platform/types/shared/api_endpoint_data.py +43 -0
  1098. nemo_platform/types/shared/auth_context.py +48 -0
  1099. nemo_platform/types/shared/auth_discovery_response.py +32 -0
  1100. nemo_platform/types/shared/backend_format.py +22 -0
  1101. nemo_platform/types/shared/datetime_filter.py +33 -0
  1102. nemo_platform/types/shared/delete_response.py +33 -0
  1103. nemo_platform/types/shared/error_response.py +46 -0
  1104. nemo_platform/types/shared/field_error.py +28 -0
  1105. nemo_platform/types/shared/file_storage_type.py +22 -0
  1106. nemo_platform/types/shared/fileset_metadata.py +46 -0
  1107. nemo_platform/types/shared/finetuning_type.py +48 -0
  1108. nemo_platform/types/shared/generic_sort_field.py +22 -0
  1109. nemo_platform/types/shared/http_validation_error.py +27 -0
  1110. nemo_platform/types/shared/linear_layer_spec.py +33 -0
  1111. nemo_platform/types/shared/mamba_config.py +44 -0
  1112. nemo_platform/types/shared/mo_e_config.py +41 -0
  1113. nemo_platform/types/shared/model_metadata_content.py +38 -0
  1114. nemo_platform/types/shared/model_spec.py +111 -0
  1115. nemo_platform/types/shared/oidc_discovery_response.py +42 -0
  1116. nemo_platform/types/shared/pagination_data.py +37 -0
  1117. nemo_platform/types/shared/platform_job_list_result_response.py +27 -0
  1118. nemo_platform/types/shared/platform_job_log.py +34 -0
  1119. nemo_platform/types/shared/platform_job_log_page.py +33 -0
  1120. nemo_platform/types/shared/platform_job_result_response.py +44 -0
  1121. nemo_platform/types/shared/platform_job_status.py +24 -0
  1122. nemo_platform/types/shared/platform_job_status_response.py +48 -0
  1123. nemo_platform/types/shared/platform_job_step_status_response.py +48 -0
  1124. nemo_platform/types/shared/platform_job_task_status_response.py +47 -0
  1125. nemo_platform/types/shared/prompt_data.py +47 -0
  1126. nemo_platform/types/shared/sliding_window_config.py +27 -0
  1127. nemo_platform/types/shared/tool_call_config.py +46 -0
  1128. nemo_platform/types/shared/tool_calling_metadata_content.py +48 -0
  1129. nemo_platform/types/shared/validation_error.py +34 -0
  1130. nemo_platform/types/shared_params/__init__.py +33 -0
  1131. nemo_platform/types/shared_params/api_endpoint_data.py +38 -0
  1132. nemo_platform/types/shared_params/backend_format.py +24 -0
  1133. nemo_platform/types/shared_params/datetime_filter.py +34 -0
  1134. nemo_platform/types/shared_params/file_storage_type.py +24 -0
  1135. nemo_platform/types/shared_params/finetuning_type.py +50 -0
  1136. nemo_platform/types/shared_params/generic_sort_field.py +24 -0
  1137. nemo_platform/types/shared_params/linear_layer_spec.py +35 -0
  1138. nemo_platform/types/shared_params/mamba_config.py +44 -0
  1139. nemo_platform/types/shared_params/mo_e_config.py +41 -0
  1140. nemo_platform/types/shared_params/model_metadata_content.py +39 -0
  1141. nemo_platform/types/shared_params/model_spec.py +113 -0
  1142. nemo_platform/types/shared_params/platform_job_status.py +26 -0
  1143. nemo_platform/types/shared_params/prompt_data.py +48 -0
  1144. nemo_platform/types/shared_params/sliding_window_config.py +29 -0
  1145. nemo_platform/types/shared_params/tool_call_config.py +46 -0
  1146. nemo_platform/types/shared_params/tool_calling_metadata_content.py +48 -0
  1147. nemo_platform/types/workspaces/__init__.py +24 -0
  1148. nemo_platform/types/workspaces/workspace.py +48 -0
  1149. nemo_platform/types/workspaces/workspace_create_params.py +41 -0
  1150. nemo_platform/types/workspaces/workspace_list_params.py +47 -0
  1151. nemo_platform/types/workspaces/workspace_update_params.py +27 -0
  1152. nemo_platform/types/workspaces/workspaces_page.py +37 -0
  1153. nemo_platform/ui/__init__.py +15 -0
  1154. nemo_platform/ui/output.py +109 -0
  1155. nemo_platform/ui/prompts.py +678 -0
  1156. nemo_platform_plugin/.agents/skills/creating-a-plugin/SKILL.md +275 -0
  1157. nemo_platform_plugin/.agents/skills/plugin-config/SKILL.md +168 -0
  1158. nemo_platform_plugin/.agents/skills/plugin-controller/SKILL.md +320 -0
  1159. nemo_platform_plugin/.agents/skills/plugin-entities/SKILL.md +290 -0
  1160. nemo_platform_plugin/.agents/skills/plugin-function/SKILL.md +292 -0
  1161. nemo_platform_plugin/.agents/skills/plugin-inference-middleware/SKILL.md +346 -0
  1162. nemo_platform_plugin/.agents/skills/plugin-job/SKILL.md +247 -0
  1163. nemo_platform_plugin/.agents/skills/plugin-platform-services/SKILL.md +239 -0
  1164. nemo_platform_plugin/.agents/skills/plugin-platform-services/services-reference.md +192 -0
  1165. nemo_platform_plugin/.agents/skills/plugin-service/SKILL.md +181 -0
  1166. nemo_platform_plugin/.agents/skills/plugin-service/crud-example.md +353 -0
  1167. nemo_platform_plugin/.agents/skills/plugin-testing/SKILL.md +206 -0
  1168. nemo_platform_plugin/README.md +43 -0
  1169. nemo_platform_plugin/_base.py +53 -0
  1170. nemo_platform_plugin/_spec_flags.py +573 -0
  1171. nemo_platform_plugin/api/filter.py +189 -0
  1172. nemo_platform_plugin/api/parsed_filter.py +288 -0
  1173. nemo_platform_plugin/api/text_filter.py +291 -0
  1174. nemo_platform_plugin/cli.py +152 -0
  1175. nemo_platform_plugin/cli_errors.py +232 -0
  1176. nemo_platform_plugin/cli_renderer.py +92 -0
  1177. nemo_platform_plugin/commands.py +1433 -0
  1178. nemo_platform_plugin/config.py +844 -0
  1179. nemo_platform_plugin/controller.py +148 -0
  1180. nemo_platform_plugin/dependencies.py +64 -0
  1181. nemo_platform_plugin/discovery.py +484 -0
  1182. nemo_platform_plugin/docs/ARCHITECTURE.md +160 -0
  1183. nemo_platform_plugin/docs/CONFIG.md +151 -0
  1184. nemo_platform_plugin/docs/CONTROLLER.md +209 -0
  1185. nemo_platform_plugin/docs/ENTITY.md +186 -0
  1186. nemo_platform_plugin/docs/INFERENCE_MIDDLEWARE.md +408 -0
  1187. nemo_platform_plugin/docs/JOB.md +237 -0
  1188. nemo_platform_plugin/docs/QUICKSTART.md +306 -0
  1189. nemo_platform_plugin/docs/SERVICE.md +302 -0
  1190. nemo_platform_plugin/entities.py +793 -0
  1191. nemo_platform_plugin/entity.py +79 -0
  1192. nemo_platform_plugin/entity_client.py +54 -0
  1193. nemo_platform_plugin/filter_ops.py +169 -0
  1194. nemo_platform_plugin/function.py +299 -0
  1195. nemo_platform_plugin/function_context.py +61 -0
  1196. nemo_platform_plugin/functions/frames.py +69 -0
  1197. nemo_platform_plugin/functions/routes.py +454 -0
  1198. nemo_platform_plugin/inference_middleware.py +1191 -0
  1199. nemo_platform_plugin/interface.py +28 -0
  1200. nemo_platform_plugin/job.py +370 -0
  1201. nemo_platform_plugin/job_context.py +86 -0
  1202. nemo_platform_plugin/job_results.py +209 -0
  1203. nemo_platform_plugin/jobs/_cli_options.py +204 -0
  1204. nemo_platform_plugin/jobs/api_factory.py +1178 -0
  1205. nemo_platform_plugin/jobs/constants.py +27 -0
  1206. nemo_platform_plugin/jobs/docker.py +76 -0
  1207. nemo_platform_plugin/jobs/exceptions.py +8 -0
  1208. nemo_platform_plugin/jobs/file_manager.py +238 -0
  1209. nemo_platform_plugin/jobs/openapi_utils.py +174 -0
  1210. nemo_platform_plugin/jobs/profile.py +110 -0
  1211. nemo_platform_plugin/jobs/result_manager.py +291 -0
  1212. nemo_platform_plugin/jobs/routes.py +297 -0
  1213. nemo_platform_plugin/jobs/schemas.py +174 -0
  1214. nemo_platform_plugin/refs.py +154 -0
  1215. nemo_platform_plugin/run_dependencies.py +137 -0
  1216. nemo_platform_plugin/scheduler.py +537 -0
  1217. nemo_platform_plugin/schema.py +216 -0
  1218. nemo_platform_plugin/sdk.py +34 -0
  1219. nemo_platform_plugin/seed.py +71 -0
  1220. nemo_platform_plugin/service.py +130 -0
  1221. nemo_platform_plugin/tasks/dispatcher.py +226 -0
  1222. nemo_platform_plugin-0.1.0.dist-info/METADATA +88 -0
  1223. nemo_platform_plugin-0.1.0.dist-info/RECORD +1224 -0
  1224. nemo_platform_plugin-0.1.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,1178 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+
4
+ """Quickstart CLI commands for managing the NeMo Platform container."""
5
+
6
+ from __future__ import annotations
7
+
8
+ import functools
9
+ import logging
10
+ import re
11
+ import threading
12
+ import time
13
+ from collections import deque
14
+ from pathlib import Path
15
+
16
+ import typer
17
+ from rich import box
18
+ from rich.console import Console, Group
19
+ from rich.live import Live
20
+ from rich.logging import RichHandler
21
+ from rich.panel import Panel
22
+ from rich.spinner import Spinner
23
+ from rich.text import Text
24
+
25
+ from nemo_platform.quickstart.config import QuickstartConfig
26
+ from nemo_platform.quickstart.prompts import RegistryCredentials
27
+
28
+ # Create rich console for formatted output (print to stderr to avoid conflicts with canonical output)
29
+ console = Console(stderr=True)
30
+ # Console for log stream only (stdout so logs can be piped/redirected)
31
+ _console_stdout = Console(stderr=False)
32
+
33
+ # Configure logger with RichHandler to prevent conflicts with progress bars
34
+ logging.basicConfig(
35
+ level=logging.INFO,
36
+ format="%(message)s",
37
+ datefmt="[%X]",
38
+ handlers=[RichHandler(console=console, rich_tracebacks=True)],
39
+ )
40
+ logger = logging.getLogger(__name__)
41
+
42
+ # Suppress noisy HTTP request logs from httpx
43
+ logging.getLogger("httpx").setLevel(logging.WARNING)
44
+
45
+ _DOCKER_REGISTRY_AUTH_STATUS_RE = re.compile(
46
+ r"\b(?:"
47
+ r"(?:http\s+)?(?:status|status\s+code|code)\s*[:=]?\s*(?:401|403)"
48
+ r"|(?:401|403)\s+(?:client|server)\s+error"
49
+ r"|(?:401|403)\s*[:,-]\s*(?:unauthorized|forbidden)"
50
+ r")\b"
51
+ )
52
+
53
+
54
+ def handle_errors(func): # type: ignore[no-untyped-def]
55
+ """Decorator to handle errors in CLI commands."""
56
+
57
+ @functools.wraps(func)
58
+ def wrapper(*args, **kwargs): # type: ignore[no-untyped-def]
59
+ try:
60
+ return func(*args, **kwargs)
61
+ except typer.Exit:
62
+ raise
63
+ except Exception as e:
64
+ console.print(f"[red]Error:[/red] {e}")
65
+ raise typer.Exit(code=1)
66
+
67
+ return wrapper
68
+
69
+
70
+ def _format_bytes(b: int) -> str:
71
+ """Format bytes as human-readable string."""
72
+ if b >= 1_000_000_000:
73
+ return f"{b / 1_000_000_000:.1f}GB"
74
+ if b >= 1_000_000:
75
+ return f"{b / 1_000_000:.0f}MB"
76
+ if b >= 1_000:
77
+ return f"{b / 1_000:.0f}KB"
78
+ return f"{b}B"
79
+
80
+
81
+ def _check_ready_endpoint(port: int, timeout: float = 2.0) -> bool:
82
+ """Check if the service ready endpoint returns 200.
83
+
84
+ Args:
85
+ port: The port the service is running on.
86
+ timeout: Request timeout in seconds.
87
+
88
+ Returns:
89
+ True if the ready endpoint returns HTTP 200, False otherwise.
90
+ """
91
+ import httpx
92
+
93
+ try:
94
+ response = httpx.get(f"http://localhost:{port}/health/ready", timeout=timeout)
95
+ return response.status_code == 200
96
+ except Exception:
97
+ return False
98
+
99
+
100
+ def _preflight_needs_registry_credentials_prompt(results: list[object]) -> bool:
101
+ """Return True when preflight failed because registry credentials are missing or invalid."""
102
+ promptable_messages = {
103
+ "Registry credentials are required",
104
+ "Registry credentials invalid",
105
+ "Registry credentials invalid or image is inaccessible",
106
+ }
107
+ return any(
108
+ getattr(result, "name", None) == "Registry Credentials"
109
+ and getattr(getattr(result, "status", None), "value", None) == "fail"
110
+ and getattr(result, "message", None) in promptable_messages
111
+ for result in results
112
+ )
113
+
114
+
115
+ def _is_docker_desktop_sign_in_required_error(error: Exception) -> bool:
116
+ """Return True for Docker Desktop org sign-in/proxy authorization failures."""
117
+ message = str(error).lower()
118
+ return (
119
+ "sign in to continue using docker desktop" in message
120
+ or ("proxy authentication required" in message and "docker desktop" in message)
121
+ or "registry.json" in message
122
+ )
123
+
124
+
125
+ def _is_docker_registry_auth_error(error: Exception) -> bool:
126
+ """Return True when Docker reports registry authentication or authorization failure."""
127
+ message = str(error).lower()
128
+ if _DOCKER_REGISTRY_AUTH_STATUS_RE.search(message):
129
+ return True
130
+ return any(
131
+ marker in message
132
+ for marker in (
133
+ "access denied",
134
+ "authentication required",
135
+ "denied: requested access",
136
+ "forbidden",
137
+ "no basic auth credentials",
138
+ "pull access denied",
139
+ "unauthorized",
140
+ )
141
+ )
142
+
143
+
144
+ def _should_prompt_for_pull_credentials(error: Exception, config: QuickstartConfig) -> bool:
145
+ """Return True when an image pull failure can be fixed by username/password registry auth."""
146
+ from nemo_platform.quickstart.prompts import detect_registry_auth_type
147
+
148
+ return _is_docker_registry_auth_error(error) and detect_registry_auth_type(config.image) == "user_pass"
149
+
150
+
151
+ def _print_docker_desktop_sign_in_required_error(error: Exception) -> None:
152
+ """Print a targeted recovery hint for Docker Desktop sign-in failures."""
153
+ console.print("\n[red]✗[/red] [red]Docker Desktop sign-in is required to pull this image.[/red]")
154
+ console.print(f" Error: {error}")
155
+ console.print(" Sign in to Docker Desktop with an account in the required organization, then retry.")
156
+
157
+
158
+ def _configure_registry_auth(
159
+ *,
160
+ image: str | None,
161
+ registry: str | None,
162
+ username: str | None,
163
+ token: str | None,
164
+ ) -> None:
165
+ """Prompt for registry credentials when needed and validate them with Docker."""
166
+ from nemo_platform.quickstart import prompt_for_registry_credentials
167
+ from nemo_platform.quickstart.prompts import _registry_host_from_image
168
+
169
+ if token is not None and token != "-":
170
+ raise RuntimeError("For safety, omit --token or use --token - to prompt securely.")
171
+
172
+ config = QuickstartConfig.load()
173
+ target_image = image or config.image or config.resolve_best_image()
174
+ default_registry = _registry_host_from_image(target_image)
175
+ registry_label = (registry or default_registry).strip() or "the image registry"
176
+
177
+ console.print("\n[bold]Quickstart Registry Authentication[/bold]")
178
+ if target_image:
179
+ console.print(f"• Image: {target_image}")
180
+
181
+ credentials = prompt_for_registry_credentials(
182
+ target_image,
183
+ default_registry=default_registry,
184
+ registry=registry,
185
+ username=username,
186
+ password=token,
187
+ message=f"Enter a username and token for {registry_label}.",
188
+ )
189
+ _save_registry_credentials(config, credentials)
190
+ console.print("• Docker credentials and quickstart registry auth updated.")
191
+ console.print("• You can now run [cyan]nemo quickstart up[/cyan].")
192
+
193
+
194
+ def _save_registry_credentials(config: QuickstartConfig, credentials: RegistryCredentials) -> None:
195
+ """Persist validated registry credentials for the quickstart container jobs backend."""
196
+ config.registry_host = credentials.registry
197
+ config.registry_username = credentials.username
198
+ config.registry_password = credentials.password
199
+ config.save()
200
+
201
+
202
+ class StartupDisplay:
203
+ """Manages the Rich Live display during container startup."""
204
+
205
+ def __init__(self) -> None:
206
+ """Initialize startup display."""
207
+ self.status_message = "Initializing..."
208
+ self.log_lines: deque[Text] = deque(maxlen=5)
209
+ self._start_time = time.time()
210
+
211
+ def set_status(self, message: str) -> None:
212
+ """Update the status message."""
213
+ self.status_message = message
214
+
215
+ def add_log_line(self, line: str) -> None:
216
+ """Add a log line (keeps last 5)."""
217
+ clean_line = line.rstrip("\n")
218
+ if clean_line:
219
+ self.log_lines.append(Text.from_ansi(clean_line))
220
+
221
+ def clear_logs(self) -> None:
222
+ """Clear log lines."""
223
+ self.log_lines.clear()
224
+
225
+ def render(self) -> Group:
226
+ """Render the current display state."""
227
+ # Spinner + status
228
+ spinner = Spinner("dots")
229
+ status_text = Text()
230
+ status_text.append_text(spinner.render(time.time()))
231
+ status_text.append(f" {self.status_message}")
232
+
233
+ components: list[Text | Panel] = [status_text]
234
+
235
+ # Add log panel if we have logs
236
+ if self.log_lines:
237
+ # Join Text objects with newlines
238
+ log_content = Text()
239
+ for i, log_line in enumerate(self.log_lines):
240
+ if i > 0:
241
+ log_content.append("\n")
242
+ log_content.append_text(log_line)
243
+ log_panel = Panel(
244
+ log_content,
245
+ title="[dim]Container Logs[/dim]",
246
+ border_style="dim",
247
+ box=box.HORIZONTALS,
248
+ padding=(0, 1),
249
+ )
250
+ components.append(log_panel)
251
+
252
+ return Group(*components)
253
+
254
+
255
+ def _write_quickstart_config(port: int = 8080, *, admin_email: str | None = None) -> None:
256
+ """Write quickstart cluster and context to the NeMo Platform config file.
257
+
258
+ Args:
259
+ port: The port the quickstart cluster is running on.
260
+ admin_email: Admin email for authentication when auth is enabled.
261
+ """
262
+ from nemo_platform.config.config import Config
263
+ from nemo_platform.config.models import ConfigParams
264
+
265
+ quickstart_context_name = "quickstart"
266
+ config_params: ConfigParams = {
267
+ "base_url": f"http://localhost:{port}",
268
+ "current_context": quickstart_context_name,
269
+ "workspace": "default",
270
+ }
271
+ if admin_email:
272
+ from nemo_platform.auth.helpers import generate_unsigned_jwt
273
+
274
+ config_params["access_token"] = generate_unsigned_jwt(
275
+ principal_id=admin_email,
276
+ email=admin_email,
277
+ expires_in_seconds=24 * 60 * 60,
278
+ )
279
+
280
+ Config.write(
281
+ config_params,
282
+ context_name=quickstart_context_name,
283
+ )
284
+
285
+
286
+ cluster_info_app = typer.Typer(help="Show information about the connected platform cluster.", add_completion=False)
287
+ quickstart_app = typer.Typer(help="Quickstart commands for managing the NeMo Platform container.")
288
+
289
+
290
+ @cluster_info_app.callback(invoke_without_command=True)
291
+ def cluster_info(ctx: typer.Context) -> None:
292
+ """Show information about the connected platform cluster."""
293
+ import httpx
294
+ import nemo_platform
295
+
296
+ base_url: str | None = None
297
+ context_name: str | None = None
298
+ if ctx.obj is not None:
299
+ base_url = ctx.obj.get_base_url()
300
+ try:
301
+ sdk_context = ctx.obj.get_sdk_context()
302
+ context_name = sdk_context.context_name
303
+ except Exception:
304
+ pass
305
+
306
+ if not base_url:
307
+ console.print("[red]✗[/red] No cluster configured.")
308
+ console.print(" Run [cyan]nemo auth login --base-url <URL>[/cyan] to connect to a remote cluster.")
309
+ console.print(" Or run [cyan]nemo quickstart up[/cyan] to start a local quickstart cluster.")
310
+ raise typer.Exit(code=1)
311
+
312
+ console.print("\n[bold]Cluster Information[/bold]\n")
313
+ if context_name:
314
+ console.print(f"• Context: {context_name}")
315
+ console.print(f"• URL: {base_url}")
316
+ console.print(f"• CLI Version: {nemo_platform.__version__}")
317
+
318
+ try:
319
+ response = httpx.get(f"{base_url.rstrip('/')}/status", timeout=5.0)
320
+ except Exception as e:
321
+ console.print(f"\n[red]✗[/red] Could not reach cluster: {e}")
322
+ raise typer.Exit(code=1)
323
+
324
+ if response.status_code != 200:
325
+ console.print(f"\n[red]✗[/red] /status returned HTTP {response.status_code}")
326
+ raise typer.Exit(code=1)
327
+
328
+ data = response.json()
329
+ overall = data.get("status", "unknown")
330
+ status_icon = (
331
+ "[green]✓[/green]"
332
+ if overall == "healthy"
333
+ else "[yellow]![/yellow]"
334
+ if overall == "degraded"
335
+ else "[red]✗[/red]"
336
+ )
337
+ console.print(f"{status_icon} Status: {overall}")
338
+
339
+ services = data.get("services", {})
340
+ ready = services.get("ready", [])
341
+ not_ready = services.get("not_ready", [])
342
+
343
+ if ready:
344
+ console.print(f"\n[green]✓[/green] Ready ({len(ready)}): {', '.join(ready)}")
345
+ for svc in not_ready:
346
+ name = svc.get("name", "unknown") if isinstance(svc, dict) else str(svc)
347
+ msg = svc.get("message", "") if isinstance(svc, dict) else ""
348
+ console.print(f"[red]✗[/red] Not ready: {name}" + (f" — {msg}" if msg else ""))
349
+
350
+ controllers = data.get("controllers", {})
351
+ if not controllers.get("healthy", True):
352
+ per_controller = controllers.get("status", {})
353
+ unhealthy = [name for name, ok in per_controller.items() if not ok]
354
+ if unhealthy:
355
+ console.print(f"[red]✗[/red] Unhealthy controllers: {', '.join(unhealthy)}")
356
+
357
+
358
+ @quickstart_app.command()
359
+ @handle_errors
360
+ def status(ctx: typer.Context) -> None:
361
+ """Show quickstart cluster status and configuration."""
362
+ from nemo_platform.quickstart import QuickstartCluster
363
+
364
+ cluster = QuickstartCluster()
365
+ info = cluster.cluster_info()
366
+
367
+ if info["status"] == "docker-unavailable":
368
+ console.print("[red]✗[/red] Docker is not running or unavailable.")
369
+ console.print(" quickstart status shows the local quickstart deployment status, which requires Docker.")
370
+ console.print(
371
+ " Start Docker to check the local quickstart cluster, or run [cyan]nemo quickstart configure[/cyan] to set it up."
372
+ )
373
+ raise typer.Exit(code=1)
374
+
375
+ console.print("\n[bold]Quickstart Cluster Information[/bold]\n")
376
+
377
+ running_icon = "[green]✓[/green]" if info["running"] else "[red]✗[/red]"
378
+ console.print(f"{running_icon} Running: {'Yes' if info['running'] else 'No'}")
379
+ console.print(f"• Status: {info['status']}")
380
+ console.print(f"• Image: {info['config']['image']}")
381
+ console.print(f"• Port: {info['config']['port']}")
382
+ console.print(f"• Storage: {info['config']['storage_path']}")
383
+ console.print(f"• Docker Socket: {info['config']['docker_socket']}")
384
+ storage_size = info.get("storage_size")
385
+ if storage_size and storage_size not in ["0 B", "0.0 B", "0.00 B"]:
386
+ console.print(f"• Storage Size: {storage_size}")
387
+
388
+ if info["running"]:
389
+ health = info.get("health", "unknown")
390
+ health_icon = (
391
+ "[green]✓[/green]"
392
+ if health == "healthy"
393
+ else "[yellow]![/yellow]"
394
+ if health == "starting"
395
+ else "[red]✗[/red]"
396
+ )
397
+ console.print(f"{health_icon} Health: {health}")
398
+ console.print(f"• URL: {info.get('url', 'N/A')}")
399
+
400
+
401
+ @quickstart_app.callback(invoke_without_command=True)
402
+ def quickstart_main(ctx: typer.Context) -> None:
403
+ """Quickstart commands for managing the NeMo Platform container."""
404
+ if ctx.invoked_subcommand is None:
405
+ typer.echo(ctx.get_help())
406
+
407
+
408
+ @quickstart_app.command()
409
+ @handle_errors
410
+ def configure(
411
+ ctx: typer.Context,
412
+ auto: bool = typer.Option(False, "--auto", help="Auto-configure with defaults (requires NGC_API_KEY env var)"),
413
+ ) -> None:
414
+ """Configure quickstart settings interactively."""
415
+ from nemo_platform.quickstart import (
416
+ QuickstartConfig,
417
+ prompt_for_configuration,
418
+ validate_config,
419
+ validate_ngc_credentials,
420
+ )
421
+
422
+ config = QuickstartConfig.load()
423
+
424
+ # Auto mode - use defaults
425
+ if auto:
426
+ console.print("\n")
427
+ console.print(" ╔══════════════════════════════════════════════════════════════╗")
428
+ console.print(" ║ ║")
429
+ console.print(" ║ NeMo Platform Quickstart Auto-Configuration ║")
430
+ console.print(" ║ ║")
431
+ console.print(" ╚══════════════════════════════════════════════════════════════╝\n")
432
+
433
+ if not config.ngc_api_key:
434
+ console.print(" [red]✗[/red] [red]NGC_API_KEY environment variable is not set.[/red]")
435
+ console.print(
436
+ " • Please set NGC_API_KEY or run [cyan]nemo quickstart configure[/cyan] for interactive setup."
437
+ )
438
+ raise typer.Exit(code=1)
439
+
440
+ console.print(" • Validating NGC API Key from environment...")
441
+ validation = validate_ngc_credentials(config.ngc_api_key.get_secret_value())
442
+ if not validation.valid:
443
+ console.print(f" [red]✗[/red] [red]{validation.message}[/red]", highlight=False)
444
+ console.print(
445
+ " • Generate a new key at [cyan]https://org.ngc.nvidia.com/setup/api-key[/cyan] "
446
+ "and update [cyan]NGC_API_KEY[/cyan]."
447
+ )
448
+ raise typer.Exit(code=1)
449
+
450
+ console.print(" [green]✓[/green] NGC API Key validated\n")
451
+ console.print(" [bold]Configuration:[/bold]")
452
+ console.print(f" • Image: {config.image}")
453
+ console.print(f" • Port: {config.host_port}")
454
+ console.print(f" • Storage: {config.storage_path}")
455
+
456
+ config.save()
457
+ console.print(
458
+ f"\n [green]✓[/green] [green]Configuration saved to {config.get_default_config_path()}[/green]\n"
459
+ )
460
+
461
+ # Inform user about authentication when auth is enabled
462
+ if config.auth_enabled and config.admin_email:
463
+ console.print(
464
+ f" [cyan]ℹ[/cyan] Authentication enabled: CLI requests will be authenticated as "
465
+ f"[bold]{config.admin_email}[/bold] (platform admin)."
466
+ )
467
+ console.print(
468
+ " To use a different identity after starting, run: "
469
+ "[cyan]nemo auth login --unsigned-token --email <email>[/cyan]\n"
470
+ )
471
+ return
472
+
473
+ # Interactive mode
474
+ config = prompt_for_configuration(config)
475
+
476
+ # Validate
477
+ console.print()
478
+ console.print("• Validating configuration...")
479
+ console.print()
480
+ results = validate_config(config)
481
+
482
+ all_valid = True
483
+ for result in results:
484
+ if result.valid:
485
+ console.print(f"[green]✓[/green] {result.message}", highlight=False)
486
+ else:
487
+ console.print(f"[red]✗[/red] {result.message}", highlight=False)
488
+ all_valid = False
489
+
490
+ if not all_valid:
491
+ console.print()
492
+ console.print("[red]✗[/red] [red]Configuration validation failed. Please fix the issues above.[/red]")
493
+ raise typer.Exit(1)
494
+
495
+ config.save()
496
+ console.print()
497
+ console.print("[green]✓[/green] [green bold]Configuration saved successfully![/green bold]")
498
+ console.print(f"• {config.get_default_config_path()}", highlight=False)
499
+
500
+ console.print()
501
+ console.print("[bold cyan]Next steps:[/bold cyan]")
502
+ console.print("• Run [cyan]nemo quickstart up[/cyan] to start the cluster")
503
+
504
+
505
+ @quickstart_app.command("auth")
506
+ @handle_errors
507
+ def auth(
508
+ _ctx: typer.Context,
509
+ image: str | None = typer.Option(
510
+ None,
511
+ "--image",
512
+ help="Container image whose registry should be authenticated.",
513
+ ),
514
+ registry: str | None = typer.Option(
515
+ None,
516
+ "--registry",
517
+ help="Registry host to authenticate, for example ghcr.io.",
518
+ ),
519
+ username: str | None = typer.Option(
520
+ None,
521
+ "--username",
522
+ "-u",
523
+ help="Registry username. For nvcr.io, defaults to $oauthtoken.",
524
+ ),
525
+ token: str | None = typer.Option(
526
+ None,
527
+ "--token",
528
+ "--password",
529
+ help="Use '-' or omit this option to prompt securely for the registry password/token. Inline values are rejected.",
530
+ hide_input=True,
531
+ ),
532
+ ) -> None:
533
+ """Configure and validate registry credentials for quickstart image pulls."""
534
+ _configure_registry_auth(image=image, registry=registry, username=username, token=token)
535
+
536
+
537
+ @quickstart_app.command()
538
+ @handle_errors
539
+ def up(
540
+ ctx: typer.Context,
541
+ config_path: Path = typer.Option(
542
+ None,
543
+ "--config",
544
+ "-c",
545
+ help="Path to platform configuration YAML file",
546
+ ),
547
+ image: str | None = typer.Option(
548
+ None,
549
+ "--image",
550
+ help="Container image to use (overrides default image)",
551
+ ),
552
+ skip_preflight: bool = typer.Option(
553
+ False,
554
+ "--skip-preflight",
555
+ help="Skip pre-flight checks",
556
+ ),
557
+ no_pull: bool = typer.Option(
558
+ False,
559
+ "--no-pull",
560
+ help="Don't pull the container image",
561
+ ),
562
+ timeout: int = typer.Option(
563
+ 300,
564
+ "--timeout",
565
+ "-t",
566
+ help="Maximum time to wait for service to become healthy (seconds)",
567
+ ),
568
+ force: bool = typer.Option(
569
+ False,
570
+ "--force",
571
+ "-f",
572
+ help="Restart the service if already running",
573
+ ),
574
+ yes: bool = typer.Option(
575
+ False,
576
+ "--yes",
577
+ "-y",
578
+ help="Accept all prompts with their defaults",
579
+ ),
580
+ ) -> None:
581
+ """Start the quickstart cluster."""
582
+ from nemo_platform.quickstart import (
583
+ CheckStatus,
584
+ QuickstartCluster,
585
+ QuickstartConfig,
586
+ is_interactive,
587
+ prompt_for_registry_credentials,
588
+ )
589
+
590
+ console.print("\n[bold cyan]Starting NeMo Platform Quickstart[/bold cyan]\n")
591
+
592
+ quickstart_config = QuickstartConfig.load()
593
+
594
+ # Require reserved_gpu_device_ids when host-gpu is enabled (no backwards compatibility)
595
+ if quickstart_config.use_gpu:
596
+ gpu_ids = quickstart_config.reserved_gpu_device_ids
597
+ if not gpu_ids or not gpu_ids.strip():
598
+ console.print(
599
+ "[red]GPU mode is enabled but GPU device IDs are not set.[/red]\n"
600
+ "Re-run [cyan]nemo quickstart configure[/cyan] and select host-gpu to detect and set GPU device IDs,"
601
+ "or use advanced options to choose which GPUs to use."
602
+ )
603
+ raise typer.Exit(1)
604
+
605
+ # Override image if provided
606
+ if image:
607
+ quickstart_config.image = image
608
+ else:
609
+ # Auto-detect internal nightly image if the NGC key has access
610
+ resolved = quickstart_config.resolve_best_image()
611
+ if resolved and resolved != quickstart_config.image:
612
+ console.print(f"[dim]Using nightly image: {resolved}[/dim]\n")
613
+ quickstart_config.image = resolved
614
+ elif not quickstart_config.image and not quickstart_config.ngc_api_key:
615
+ console.print("[yellow]! No NGC API key configured — cannot auto-select nightly image.[/yellow]")
616
+ console.print("[yellow] Run 'nemo quickstart init' to configure credentials, or pass --image.[/yellow]\n")
617
+
618
+ cluster = QuickstartCluster(
619
+ config=quickstart_config,
620
+ platform_config_path=config_path,
621
+ )
622
+
623
+ # Run pre-flight checks
624
+ if not skip_preflight:
625
+ console.print("Running pre-flight checks...\n")
626
+ results = cluster.preflight()
627
+
628
+ for result in results:
629
+ icon = {
630
+ CheckStatus.PASS: "[green]✓[/green]",
631
+ CheckStatus.WARN: "[yellow]![/yellow]",
632
+ CheckStatus.FAIL: "[red]✗[/red]",
633
+ }[result.status]
634
+ console.print(f"{icon} {result.name}: {result.message}")
635
+
636
+ if cluster._preflight_checker.has_failures():
637
+ if not yes and is_interactive() and _preflight_needs_registry_credentials_prompt(results):
638
+ console.print("\n[yellow]! Registry credentials are required to access this image.[/yellow]")
639
+ registry_host_default = quickstart_config.get_registry_host()
640
+ credentials = prompt_for_registry_credentials(
641
+ quickstart_config.image,
642
+ default_registry=registry_host_default,
643
+ )
644
+ _save_registry_credentials(quickstart_config, credentials)
645
+
646
+ console.print("\nRe-running pre-flight checks...\n")
647
+ results = cluster.preflight()
648
+ for result in results:
649
+ icon = {
650
+ CheckStatus.PASS: "[green]✓[/green]",
651
+ CheckStatus.WARN: "[yellow]![/yellow]",
652
+ CheckStatus.FAIL: "[red]✗[/red]",
653
+ }[result.status]
654
+ console.print(f"{icon} {result.name}: {result.message}")
655
+
656
+ if cluster._preflight_checker.has_failures():
657
+ console.print("\n[red]✗[/red] [red]Pre-flight checks failed. Fix issues and retry.[/red]")
658
+ raise typer.Exit(1)
659
+
660
+ if cluster._preflight_checker.is_already_running():
661
+ # Force restart if --image is passed or --force is used
662
+ if force or image:
663
+ reason = "with new image" if image else ""
664
+ console.print(f"\n• [yellow]Cluster is already running. Restarting {reason}...[/yellow]")
665
+ cluster.stop()
666
+ console.print("[green]✓[/green] Cluster stopped.\n")
667
+ else:
668
+ console.print("\n[green]✓[/green] [green]NeMo Platform Quickstart is already running![/green]")
669
+ status = cluster.status()
670
+ if url := status.get("url"):
671
+ console.print(f"• URL: {url}")
672
+ return
673
+
674
+ if cluster._preflight_checker.has_warnings():
675
+ console.print("\n[yellow]![/yellow] [yellow]Some checks have warnings. Proceeding anyway...[/yellow]")
676
+
677
+ # Create display manager for progress UI
678
+ display = StartupDisplay()
679
+ final_health = "unknown"
680
+
681
+ try:
682
+ with Live(display.render(), console=console, refresh_per_second=10) as live:
683
+ # Phase 1: Pull image (if needed)
684
+ if not no_pull:
685
+ display.set_status("Pulling image...")
686
+ live.update(display.render())
687
+
688
+ # Track progress per layer for overall percentage
689
+ layer_progress: dict[str, dict[str, int]] = {}
690
+
691
+ def pull_image_with_updates(registry_auth: dict[str, str] | None = None) -> None:
692
+ for progress in cluster._container_manager.pull_image_with_progress(auth_override=registry_auth):
693
+ layer_id = progress.get("layer_id")
694
+ current = progress.get("current")
695
+ total = progress.get("total")
696
+
697
+ # Update layer tracking
698
+ if layer_id and total:
699
+ layer_progress[layer_id] = {"current": current or 0, "total": total}
700
+
701
+ # Calculate overall percentage
702
+ total_bytes = sum(lp["total"] for lp in layer_progress.values())
703
+ current_bytes = sum(lp["current"] for lp in layer_progress.values())
704
+
705
+ if total_bytes > 0:
706
+ percent = int(current_bytes / total_bytes * 100)
707
+ display.set_status(
708
+ f"Pulling image... {percent}% ({_format_bytes(current_bytes)} / {_format_bytes(total_bytes)})"
709
+ )
710
+ else:
711
+ status_text = progress.get("status", "")
712
+ display.set_status(f"Pulling image... {status_text}")
713
+ live.update(display.render())
714
+
715
+ try:
716
+ pull_image_with_updates()
717
+ except Exception as pull_error:
718
+ if _is_docker_desktop_sign_in_required_error(pull_error):
719
+ live.stop()
720
+ _print_docker_desktop_sign_in_required_error(pull_error)
721
+ raise typer.Exit(1)
722
+
723
+ if (
724
+ yes
725
+ or not is_interactive()
726
+ or not _should_prompt_for_pull_credentials(pull_error, quickstart_config)
727
+ ):
728
+ raise
729
+
730
+ live.stop()
731
+ console.print("\n[yellow]!Unable to pull image.[/yellow]")
732
+ console.print(f" Error: {pull_error}")
733
+
734
+ registry_host_default = quickstart_config.get_registry_host()
735
+ credentials = prompt_for_registry_credentials(
736
+ quickstart_config.image,
737
+ default_registry=registry_host_default,
738
+ )
739
+ _save_registry_credentials(quickstart_config, credentials)
740
+ live.start()
741
+ display.set_status("Pulling image...")
742
+ live.update(display.render())
743
+ try:
744
+ pull_image_with_updates(
745
+ {
746
+ "registry": credentials.registry,
747
+ "username": credentials.username,
748
+ "password": credentials.password.get_secret_value(),
749
+ }
750
+ )
751
+ except Exception as retry_pull_error:
752
+ if _is_docker_desktop_sign_in_required_error(retry_pull_error):
753
+ live.stop()
754
+ _print_docker_desktop_sign_in_required_error(retry_pull_error)
755
+ raise typer.Exit(1)
756
+ raise
757
+
758
+ # Phase 2: Start container
759
+ display.set_status("Starting container...")
760
+ display.clear_logs()
761
+ live.update(display.render())
762
+
763
+ cluster._container_manager.start(
764
+ platform_config=cluster.platform_config,
765
+ pull=False, # Already pulled above
766
+ )
767
+
768
+ # Phase 3: Wait for healthy with log streaming
769
+ display.set_status("Waiting for service to become healthy...")
770
+ live.update(display.render())
771
+
772
+ # Start log streaming in background thread
773
+ stop_logs = threading.Event()
774
+
775
+ def stream_logs() -> None:
776
+ try:
777
+ for line in cluster.logs(follow=True, tail=5):
778
+ if stop_logs.is_set():
779
+ break
780
+ display.add_log_line(line)
781
+ live.update(display.render())
782
+ except Exception:
783
+ pass # Container may stop or not exist yet
784
+
785
+ log_thread = threading.Thread(target=stream_logs, daemon=True)
786
+ log_thread.start()
787
+
788
+ # Poll for ready endpoint
789
+ start_time = time.time()
790
+ while time.time() - start_time < timeout:
791
+ # Check if container is still running
792
+ status = cluster.status()
793
+ if not status.get("running"):
794
+ final_health = "stopped"
795
+ stop_logs.set()
796
+ break
797
+
798
+ # Check ready endpoint
799
+ if _check_ready_endpoint(quickstart_config.host_port):
800
+ final_health = "healthy"
801
+ stop_logs.set()
802
+ break
803
+
804
+ display.set_status("Waiting for service to be ready...")
805
+ live.update(display.render())
806
+ time.sleep(2)
807
+ else:
808
+ # Timeout reached
809
+ stop_logs.set()
810
+
811
+ stop_logs.set()
812
+ log_thread.join(timeout=1)
813
+
814
+ # After Live context - display final result
815
+ if final_health == "healthy":
816
+ status = cluster.status()
817
+ console.print(f"\n[green]✓[/green] [green]Quickstart cluster is healthy at {status['url']}[/green]")
818
+
819
+ # Write quickstart context to config file
820
+ try:
821
+ # Pass admin_email for authentication when auth is enabled
822
+ config_admin_email = quickstart_config.admin_email if quickstart_config.auth_enabled else None
823
+ _write_quickstart_config(port=quickstart_config.host_port, admin_email=config_admin_email)
824
+ console.print("[green]✓[/green] Context 'quickstart' added to config")
825
+
826
+ # Inform user about authentication when auth is enabled
827
+ if quickstart_config.auth_enabled and quickstart_config.admin_email:
828
+ console.print()
829
+ console.print(
830
+ f"[cyan]ℹ[/cyan] Authentication enabled: All CLI requests will be authenticated as "
831
+ f"[bold]{quickstart_config.admin_email}[/bold] (platform admin)."
832
+ )
833
+ console.print(
834
+ " To use a different identity, run: "
835
+ "[cyan]nemo auth login --unsigned-token --email <email>[/cyan]"
836
+ )
837
+ except Exception as e:
838
+ console.print(f"[yellow]![/yellow] [yellow]Warning: Could not write config: {e}[/yellow]")
839
+
840
+ elif final_health == "stopped":
841
+ console.print("\n[red]✗[/red] [red]Container stopped unexpectedly![/red]")
842
+ console.print("[red]Error logs:[/red]\n")
843
+ for line in cluster.logs(follow=False, tail=100):
844
+ console.print(Text.from_ansi(line), end="")
845
+ raise typer.Exit(1)
846
+
847
+ else:
848
+ console.print("\n[red]✗[/red] [red]Timeout waiting for service to be ready[/red]")
849
+ console.print("[yellow]Recent logs:[/yellow]\n")
850
+ for line in cluster.logs(follow=False, tail=50):
851
+ console.print(Text.from_ansi(line), end="")
852
+ raise typer.Exit(1)
853
+
854
+ except typer.Exit:
855
+ raise
856
+ except Exception as e:
857
+ console.print(f"\n[red]✗[/red] [red]Failed to start cluster: {e}[/red]")
858
+ # Try to get logs if container exists
859
+ try:
860
+ for line in cluster.logs(follow=False, tail=50):
861
+ console.print(Text.from_ansi(line), end="")
862
+ except Exception:
863
+ pass
864
+ raise typer.Exit(1)
865
+
866
+ console.print()
867
+ console.print("[bold cyan]Next steps:[/bold cyan]")
868
+ console.print("• Run [cyan]nemo quickstart status[/cyan] to check cluster status")
869
+ console.print("• Run [cyan]nemo quickstart logs -f[/cyan] to follow logs")
870
+ if quickstart_config.inference_provider == "nvidia-build":
871
+ console.print("• Chat with Nemotron: [cyan]nemo chat nvidia-llama-3-3-nemotron-super-49b-v1-5[/cyan]")
872
+
873
+
874
+ @quickstart_app.command()
875
+ @handle_errors
876
+ def down(ctx: typer.Context) -> None:
877
+ """Stop the quickstart cluster."""
878
+ from nemo_platform.quickstart import QuickstartCluster
879
+
880
+ cluster = QuickstartCluster()
881
+
882
+ status = cluster.status()
883
+ if not status["running"]:
884
+ console.print("Cluster is not running.")
885
+ return
886
+
887
+ console.print("• Stopping quickstart cluster...")
888
+ cluster.stop()
889
+ console.print("[green]✓[/green] Cluster stopped.")
890
+
891
+
892
+ @quickstart_app.command()
893
+ @handle_errors
894
+ def destroy(
895
+ ctx: typer.Context,
896
+ yes: bool = typer.Option(
897
+ False,
898
+ "--yes",
899
+ "-y",
900
+ "-f",
901
+ help="Skip confirmation prompt",
902
+ ),
903
+ ) -> None:
904
+ """Stop the cluster and remove all data and configuration files."""
905
+ from nemo_platform.quickstart import QuickstartCluster, QuickstartConfig, prompt_confirm
906
+
907
+ cluster = QuickstartCluster()
908
+
909
+ console.print("[yellow]![/yellow] [yellow]This will remove all quickstart data and configuration![/yellow]")
910
+ if not yes and not prompt_confirm("Are you sure?"):
911
+ console.print("• Cancelled.")
912
+ raise typer.Exit(0)
913
+
914
+ console.print("• Destroying quickstart cluster...")
915
+ cluster.destroy()
916
+ console.print("[green]✓[/green] Cluster destroyed and data removed.")
917
+
918
+ console.print("• Removing quickstart configuration...")
919
+ QuickstartConfig.remove()
920
+ console.print("[green]✓[/green] Configuration removed.")
921
+
922
+
923
+ @quickstart_app.command()
924
+ @handle_errors
925
+ def logs(
926
+ ctx: typer.Context,
927
+ follow: bool = typer.Option(False, "--follow", "-f", help="Follow log output"),
928
+ tail: int = typer.Option(100, "--tail", "-n", help="Number of lines to show from the end"),
929
+ all_logs: bool = typer.Option(False, "--all", "-a", help="Show all logs (overrides --tail)"),
930
+ ) -> None:
931
+ """View cluster logs."""
932
+ from nemo_platform.quickstart import QuickstartCluster
933
+
934
+ cluster = QuickstartCluster()
935
+
936
+ status = cluster.status()
937
+ if status["status"] == "not found":
938
+ console.print("[red]✗[/red] No container found. Run [cyan]nemo quickstart up[/cyan] first.")
939
+ raise typer.Exit(1)
940
+
941
+ if not status["running"]:
942
+ console.print(
943
+ f"[yellow]![/yellow] [yellow]Container is {status['status']}. Showing available logs:[/yellow]\n"
944
+ )
945
+ if follow:
946
+ console.print("• [yellow]Note: --follow has no effect on stopped containers.[/yellow]\n")
947
+ follow = False # Can't follow a stopped container
948
+
949
+ effective_tail = None if all_logs else tail
950
+ for line in cluster.logs(follow=follow, tail=effective_tail):
951
+ # Strip trailing newline if present; print to stdout so logs can be piped/redirected
952
+ _console_stdout.print(Text.from_ansi(line.rstrip("\n")))
953
+
954
+
955
+ def _run_job_diagnostic(port: int, registry: str, tag: str, *, admin_email: str | None = None) -> bool:
956
+ """Run a diagnostic job to verify the job system is working correctly.
957
+
958
+ Args:
959
+ port: The port the NeMo Platform service is running on.
960
+ registry: The image registry to use.
961
+ tag: The image tag to use.
962
+ admin_email: Admin email for authentication when auth is enabled.
963
+
964
+ Returns:
965
+ True if the job completed successfully, False otherwise.
966
+ """
967
+ import uuid
968
+
969
+ from nemo_platform import NeMoPlatform
970
+
971
+ # When auth is enabled, use an unsigned JWT for the admin principal.
972
+ default_headers = None
973
+ if admin_email:
974
+ from nemo_platform.auth.helpers import generate_unsigned_jwt
975
+
976
+ default_headers = {
977
+ "Authorization": "Bearer "
978
+ + generate_unsigned_jwt(
979
+ principal_id=admin_email,
980
+ email=admin_email,
981
+ expires_in_seconds=24 * 60 * 60,
982
+ )
983
+ }
984
+
985
+ try:
986
+ client = NeMoPlatform(
987
+ base_url=f"http://localhost:{port}",
988
+ workspace="default",
989
+ default_headers=default_headers,
990
+ )
991
+
992
+ # Construct the CPU task image name from the registry and tag
993
+ cpu_image = f"{registry}/nmp-cpu-tasks:{tag}"
994
+ console.print(f" • Task image: {cpu_image}")
995
+
996
+ # Create a job that runs a simple diagnostic command
997
+ job_name = f"diagnostic-{uuid.uuid4().hex[:8]}"
998
+ console.print(f" • Creating diagnostic job: {job_name}")
999
+
1000
+ job = client.jobs.create(
1001
+ platform_spec={
1002
+ "steps": [
1003
+ {
1004
+ "name": "diagnostic",
1005
+ "executor": {
1006
+ "provider": "cpu",
1007
+ "container": {
1008
+ "image": cpu_image,
1009
+ "entrypoint": [
1010
+ "python",
1011
+ "-c",
1012
+ "import sys; print(f'Python {sys.version}'); print('Job system is working correctly!')",
1013
+ ],
1014
+ },
1015
+ },
1016
+ }
1017
+ ]
1018
+ },
1019
+ source="quickstart-doctor",
1020
+ spec={},
1021
+ name=job_name,
1022
+ )
1023
+
1024
+ console.print(" • Waiting for job to complete...")
1025
+
1026
+ # Poll for job completion (max 60 seconds)
1027
+ max_wait = 60
1028
+ poll_interval = 2
1029
+ elapsed = 0
1030
+ status = "pending"
1031
+ job_status = client.jobs.retrieve(job.name)
1032
+
1033
+ while elapsed < max_wait:
1034
+ job_status = client.jobs.retrieve(job.name)
1035
+ status = job_status.status
1036
+
1037
+ if status in ("completed", "error", "cancelled"):
1038
+ break
1039
+
1040
+ time.sleep(poll_interval)
1041
+ elapsed += poll_interval
1042
+
1043
+ success = False
1044
+ if status == "completed":
1045
+ console.print(" • Diagnostic job completed successfully")
1046
+ success = True
1047
+ elif status == "error":
1048
+ console.print(" • [red]Diagnostic job failed[/red]")
1049
+ # Show error details if available
1050
+ if hasattr(job_status, "error_details") and job_status.error_details:
1051
+ error_msg = job_status.error_details.get("message", str(job_status.error_details))
1052
+ console.print(f" Error: {error_msg}")
1053
+ elif status == "cancelled":
1054
+ console.print(" • [yellow]Diagnostic job was cancelled[/yellow]")
1055
+ else:
1056
+ console.print(f" • [yellow]Job timed out (status: {status})[/yellow]")
1057
+
1058
+ # Fetch and display logs
1059
+ console.print("\n [bold]Job output:[/bold]")
1060
+ try:
1061
+ logs = client.jobs.get_logs(job.name)
1062
+ log_lines = []
1063
+ for log_entry in logs:
1064
+ if hasattr(log_entry, "message"):
1065
+ log_lines.append(log_entry.message)
1066
+
1067
+ if log_lines:
1068
+ for line in log_lines:
1069
+ console.print(f" {line}")
1070
+ else:
1071
+ console.print(" [dim](no logs available)[/dim]")
1072
+ except Exception as e:
1073
+ console.print(f" Could not fetch logs: {e}")
1074
+
1075
+ # Clean up the job (only if successful)
1076
+ if status == "completed":
1077
+ try:
1078
+ client.jobs.delete(job.name)
1079
+ except Exception:
1080
+ pass # Ignore cleanup errors
1081
+ else:
1082
+ console.print(f"\n Job '{job_name}' kept for inspection. Delete with: nemo api jobs delete {job_name}")
1083
+
1084
+ return success
1085
+
1086
+ except Exception as e:
1087
+ console.print(f" • [red]Error running job diagnostic: {e}[/red]")
1088
+ return False
1089
+
1090
+
1091
+ @quickstart_app.command()
1092
+ @handle_errors
1093
+ def doctor(ctx: typer.Context) -> None:
1094
+ """Diagnose quickstart configuration and image settings."""
1095
+ from nemo_platform.quickstart import QuickstartCluster, QuickstartConfig
1096
+
1097
+ console.print("\n[bold cyan]NeMo Platform Quickstart Doctor[/bold cyan]\n")
1098
+
1099
+ # Load and display quickstart config
1100
+ config = QuickstartConfig.load()
1101
+ console.print("[bold]Quickstart Configuration:[/bold]")
1102
+ console.print(f" • Image: {config.image}")
1103
+
1104
+ # Parse and display image components
1105
+ registry, tag = config.parse_image_components()
1106
+ console.print(f" • Parsed Registry: {registry or '(empty)'}")
1107
+ console.print(f" • Parsed Tag: {tag}")
1108
+
1109
+ # Check if container is running
1110
+ cluster = QuickstartCluster(config=config)
1111
+ status = cluster.status()
1112
+
1113
+ if not status["running"]:
1114
+ console.print(
1115
+ "\n[yellow]Container is not running. Start it with 'nemo quickstart up' to see runtime config.[/yellow]"
1116
+ )
1117
+ return
1118
+
1119
+ console.print("\n[bold]Container Environment:[/bold]")
1120
+
1121
+ # Get relevant environment variables from the container
1122
+ container = cluster._container_manager._get_container()
1123
+ if container:
1124
+ # Execute a command inside the container to get the platform config
1125
+ try:
1126
+ # Get the image registry/tag env vars
1127
+ exit_code, output = container.exec_run(
1128
+ [
1129
+ "sh",
1130
+ "-c",
1131
+ "echo NMP_IMAGE_REGISTRY=$NMP_IMAGE_REGISTRY && echo NMP_IMAGE_TAG=$NMP_IMAGE_TAG",
1132
+ ]
1133
+ )
1134
+ if exit_code == 0:
1135
+ for line in output.decode().strip().split("\n"):
1136
+ if "=" in line:
1137
+ key, value = line.split("=", 1)
1138
+ console.print(f" • {key}: {value or '(not set)'}")
1139
+ except Exception as e:
1140
+ console.print(f" • Could not read env vars: {e}")
1141
+
1142
+ # Get resolved platform config from inside the container
1143
+ console.print("\n[bold]Resolved Platform Config:[/bold]")
1144
+ try:
1145
+ exit_code, output = container.exec_run(
1146
+ [
1147
+ "python",
1148
+ "-c",
1149
+ """
1150
+ from nmp.common.config import get_platform_config
1151
+ config = get_platform_config()
1152
+ print(f"image_registry: {config.image_registry}")
1153
+ print(f"image_tag: {config.image_tag}")
1154
+ """,
1155
+ ]
1156
+ )
1157
+ if exit_code == 0:
1158
+ for line in output.decode().strip().split("\n"):
1159
+ console.print(f" • {line}")
1160
+ else:
1161
+ console.print(f" • [red]Error: {output.decode()}[/red]")
1162
+ except Exception as e:
1163
+ console.print(f" • Could not read platform config: {e}")
1164
+
1165
+ # Run a diagnostic job to verify the job system is working
1166
+ console.print("\n[bold]Job System Diagnostics:[/bold]")
1167
+ job_success = False
1168
+ if registry:
1169
+ admin_email = config.admin_email if config.auth_enabled else None
1170
+ job_success = _run_job_diagnostic(config.host_port, registry, tag, admin_email=admin_email)
1171
+ else:
1172
+ console.print(" • [yellow]No registry configured. Job diagnostics skipped.[/yellow]")
1173
+
1174
+ # Final status
1175
+ if job_success:
1176
+ console.print("\n[green]✓[/green] Quickstart diagnostics passed")
1177
+ else:
1178
+ console.print("\n[red]✗[/red] Quickstart diagnostics failed")