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.
- nemo_platform/__init__.py +117 -0
- nemo_platform/_base_client.py +2146 -0
- nemo_platform/_client.py +1200 -0
- nemo_platform/_compat.py +241 -0
- nemo_platform/_constants.py +29 -0
- nemo_platform/_decoders/jsonl.py +138 -0
- nemo_platform/_exceptions.py +123 -0
- nemo_platform/_files.py +188 -0
- nemo_platform/_models.py +967 -0
- nemo_platform/_qs.py +164 -0
- nemo_platform/_resource.py +58 -0
- nemo_platform/_response.py +872 -0
- nemo_platform/_streaming.py +391 -0
- nemo_platform/_types.py +288 -0
- nemo_platform/_utils/__init__.py +79 -0
- nemo_platform/_utils/_compat.py +60 -0
- nemo_platform/_utils/_datetime_parse.py +151 -0
- nemo_platform/_utils/_json.py +50 -0
- nemo_platform/_utils/_logs.py +40 -0
- nemo_platform/_utils/_path.py +142 -0
- nemo_platform/_utils/_proxy.py +80 -0
- nemo_platform/_utils/_reflection.py +57 -0
- nemo_platform/_utils/_resources_proxy.py +39 -0
- nemo_platform/_utils/_streams.py +27 -0
- nemo_platform/_utils/_sync.py +73 -0
- nemo_platform/_utils/_transform.py +472 -0
- nemo_platform/_utils/_typing.py +171 -0
- nemo_platform/_utils/_utils.py +448 -0
- nemo_platform/_version.py +21 -0
- nemo_platform/auth/__init__.py +15 -0
- nemo_platform/auth/device_flow.py +303 -0
- nemo_platform/auth/helpers.py +211 -0
- nemo_platform/auth/token_provider.py +239 -0
- nemo_platform/beta/evaluator/__init__.py +120 -0
- nemo_platform/beta/evaluator/agent_inference.py +360 -0
- nemo_platform/beta/evaluator/constants.py +4 -0
- nemo_platform/beta/evaluator/dataset_schemas/common.py +177 -0
- nemo_platform/beta/evaluator/dataset_schemas/compatibility.py +353 -0
- nemo_platform/beta/evaluator/dataset_schemas/templates.py +389 -0
- nemo_platform/beta/evaluator/datasets/__init__.py +28 -0
- nemo_platform/beta/evaluator/datasets/loader.py +415 -0
- nemo_platform/beta/evaluator/enums.py +64 -0
- nemo_platform/beta/evaluator/execution/_protocols.py +20 -0
- nemo_platform/beta/evaluator/execution/backends/base.py +86 -0
- nemo_platform/beta/evaluator/execution/backends/local/backend.py +132 -0
- nemo_platform/beta/evaluator/execution/benchmark_execution.py +666 -0
- nemo_platform/beta/evaluator/execution/config.py +64 -0
- nemo_platform/beta/evaluator/execution/evaluator.py +289 -0
- nemo_platform/beta/evaluator/execution/job_poll.py +98 -0
- nemo_platform/beta/evaluator/execution/metric_execution.py +878 -0
- nemo_platform/beta/evaluator/execution/pipeline.py +64 -0
- nemo_platform/beta/evaluator/execution/runs.py +143 -0
- nemo_platform/beta/evaluator/execution/scoring.py +224 -0
- nemo_platform/beta/evaluator/execution/utils.py +116 -0
- nemo_platform/beta/evaluator/execution/values.py +53 -0
- nemo_platform/beta/evaluator/inference.py +456 -0
- nemo_platform/beta/evaluator/metrics/aggregation.py +451 -0
- nemo_platform/beta/evaluator/metrics/bleu.py +94 -0
- nemo_platform/beta/evaluator/metrics/exact_match.py +52 -0
- nemo_platform/beta/evaluator/metrics/f1.py +50 -0
- nemo_platform/beta/evaluator/metrics/hooks.py +41 -0
- nemo_platform/beta/evaluator/metrics/llm_judge.py +392 -0
- nemo_platform/beta/evaluator/metrics/number_check.py +95 -0
- nemo_platform/beta/evaluator/metrics/protocol.py +241 -0
- nemo_platform/beta/evaluator/metrics/ragas/__init__.py +41 -0
- nemo_platform/beta/evaluator/metrics/ragas/base.py +521 -0
- nemo_platform/beta/evaluator/metrics/ragas/git_patch.py +36 -0
- nemo_platform/beta/evaluator/metrics/ragas/imports.py +192 -0
- nemo_platform/beta/evaluator/metrics/ragas/metrics.py +183 -0
- nemo_platform/beta/evaluator/metrics/remote.py +250 -0
- nemo_platform/beta/evaluator/metrics/rouge.py +71 -0
- nemo_platform/beta/evaluator/metrics/string_check.py +69 -0
- nemo_platform/beta/evaluator/metrics/template_rendering.py +141 -0
- nemo_platform/beta/evaluator/metrics/tool_calling.py +173 -0
- nemo_platform/beta/evaluator/metrics/types.py +62 -0
- nemo_platform/beta/evaluator/metrics/utils.py +54 -0
- nemo_platform/beta/evaluator/resilience/api.py +142 -0
- nemo_platform/beta/evaluator/resilience/classifier.py +142 -0
- nemo_platform/beta/evaluator/resilience/config.py +69 -0
- nemo_platform/beta/evaluator/resilience/errors.py +117 -0
- nemo_platform/beta/evaluator/resilience/policy.py +50 -0
- nemo_platform/beta/evaluator/resilience/scheduler.py +459 -0
- nemo_platform/beta/evaluator/resilience/types.py +93 -0
- nemo_platform/beta/evaluator/structured_output.py +184 -0
- nemo_platform/beta/evaluator/templates.py +115 -0
- nemo_platform/beta/evaluator/values/__init__.py +162 -0
- nemo_platform/beta/evaluator/values/agents.py +84 -0
- nemo_platform/beta/evaluator/values/common.py +28 -0
- nemo_platform/beta/evaluator/values/dataset_schemas.py +112 -0
- nemo_platform/beta/evaluator/values/datasets.py +28 -0
- nemo_platform/beta/evaluator/values/metrics.py +587 -0
- nemo_platform/beta/evaluator/values/models.py +157 -0
- nemo_platform/beta/evaluator/values/multi_metric_results.py +359 -0
- nemo_platform/beta/evaluator/values/params.py +109 -0
- nemo_platform/beta/evaluator/values/results.py +699 -0
- nemo_platform/beta/evaluator/values/scores.py +300 -0
- nemo_platform/beta/safe_synthesizer/__init__.py +4 -0
- nemo_platform/beta/safe_synthesizer/config.py +29 -0
- nemo_platform/beta/safe_synthesizer/job.py +309 -0
- nemo_platform/beta/safe_synthesizer/job_builder.py +355 -0
- nemo_platform/cli/__init__.py +4 -0
- nemo_platform/cli/app.py +321 -0
- nemo_platform/cli/commands/__init__.py +15 -0
- nemo_platform/cli/commands/api/__init__.py +114 -0
- nemo_platform/cli/commands/api/adapters.py +384 -0
- nemo_platform/cli/commands/api/files/__init__.py +237 -0
- nemo_platform/cli/commands/api/files/filesets.py +386 -0
- nemo_platform/cli/commands/api/files/otlp/__init__.py +12 -0
- nemo_platform/cli/commands/api/files/otlp/logs.py +116 -0
- nemo_platform/cli/commands/api/guardrail/__init__.py +270 -0
- nemo_platform/cli/commands/api/guardrail/configs.py +311 -0
- nemo_platform/cli/commands/api/iam/__init__.py +12 -0
- nemo_platform/cli/commands/api/iam/role_bindings.py +264 -0
- nemo_platform/cli/commands/api/inference/__init__.py +76 -0
- nemo_platform/cli/commands/api/inference/deployment_configs/__init__.py +370 -0
- nemo_platform/cli/commands/api/inference/deployment_configs/versions.py +132 -0
- nemo_platform/cli/commands/api/inference/deployments/__init__.py +565 -0
- nemo_platform/cli/commands/api/inference/deployments/versions.py +141 -0
- nemo_platform/cli/commands/api/inference/gateway/__init__.py +14 -0
- nemo_platform/cli/commands/api/inference/gateway/model.py +324 -0
- nemo_platform/cli/commands/api/inference/gateway/openai/__init__.py +12 -0
- nemo_platform/cli/commands/api/inference/gateway/openai/v1/__init__.py +12 -0
- nemo_platform/cli/commands/api/inference/gateway/openai/v1/models.py +106 -0
- nemo_platform/cli/commands/api/inference/gateway/provider.py +327 -0
- nemo_platform/cli/commands/api/inference/models.py +106 -0
- nemo_platform/cli/commands/api/inference/providers.py +612 -0
- nemo_platform/cli/commands/api/inference/virtual_models.py +412 -0
- nemo_platform/cli/commands/api/intake/__init__.py +18 -0
- nemo_platform/cli/commands/api/intake/apps/__init__.py +326 -0
- nemo_platform/cli/commands/api/intake/apps/tasks.py +340 -0
- nemo_platform/cli/commands/api/intake/entries/__init__.py +445 -0
- nemo_platform/cli/commands/api/intake/entries/events.py +118 -0
- nemo_platform/cli/commands/api/intake/evaluator_results.py +267 -0
- nemo_platform/cli/commands/api/intake/exports/__init__.py +63 -0
- nemo_platform/cli/commands/api/intake/exports/jobs.py +245 -0
- nemo_platform/cli/commands/api/intake/ingest/__init__.py +14 -0
- nemo_platform/cli/commands/api/intake/ingest/atif.py +115 -0
- nemo_platform/cli/commands/api/intake/ingest/chat_completions.py +125 -0
- nemo_platform/cli/commands/api/intake/ingest/otlp/__init__.py +12 -0
- nemo_platform/cli/commands/api/intake/ingest/otlp/v1/__init__.py +12 -0
- nemo_platform/cli/commands/api/intake/ingest/otlp/v1/traces.py +72 -0
- nemo_platform/cli/commands/api/intake/spans/__init__.py +202 -0
- nemo_platform/cli/commands/api/intake/spans/evaluator_results.py +65 -0
- nemo_platform/cli/commands/api/intake/traces.py +183 -0
- nemo_platform/cli/commands/api/jobs/__init__.py +576 -0
- nemo_platform/cli/commands/api/jobs/results.py +211 -0
- nemo_platform/cli/commands/api/jobs/steps.py +243 -0
- nemo_platform/cli/commands/api/jobs/tasks.py +210 -0
- nemo_platform/cli/commands/api/members.py +304 -0
- nemo_platform/cli/commands/api/models/__init__.py +555 -0
- nemo_platform/cli/commands/api/models/adapters.py +261 -0
- nemo_platform/cli/commands/api/projects.py +332 -0
- nemo_platform/cli/commands/api/safe_synthesizer/__init__.py +12 -0
- nemo_platform/cli/commands/api/safe_synthesizer/jobs/__init__.py +417 -0
- nemo_platform/cli/commands/api/safe_synthesizer/jobs/results.py +211 -0
- nemo_platform/cli/commands/api/secrets/__init__.py +315 -0
- nemo_platform/cli/commands/api/secrets/admin.py +44 -0
- nemo_platform/cli/commands/api/workspaces.py +339 -0
- nemo_platform/cli/commands/auth.py +803 -0
- nemo_platform/cli/commands/config.py +308 -0
- nemo_platform/cli/commands/docs.py +277 -0
- nemo_platform/cli/commands/manifest_registry.py +180 -0
- nemo_platform/cli/commands/plugins.py +87 -0
- nemo_platform/cli/commands/quickstart/__init__.py +15 -0
- nemo_platform/cli/commands/quickstart/cli.py +1178 -0
- nemo_platform/cli/commands/services/_process.py +472 -0
- nemo_platform/cli/commands/services/cli.py +694 -0
- nemo_platform/cli/commands/setup.py +1947 -0
- nemo_platform/cli/commands/skills/agents/claude.py +29 -0
- nemo_platform/cli/commands/skills/agents/codex.py +32 -0
- nemo_platform/cli/commands/skills/agents/cursor.py +18 -0
- nemo_platform/cli/commands/skills/agents/opencode.py +20 -0
- nemo_platform/cli/commands/skills/base.py +53 -0
- nemo_platform/cli/commands/skills/cli.py +313 -0
- nemo_platform/cli/commands/skills/installer.py +51 -0
- nemo_platform/cli/commands/skills/registry.py +396 -0
- nemo_platform/cli/commands/use_cases/__init__.py +15 -0
- nemo_platform/cli/commands/use_cases/agent.py +245 -0
- nemo_platform/cli/commands/use_cases/chat.py +965 -0
- nemo_platform/cli/commands/use_cases/wait.py +151 -0
- nemo_platform/cli/core/__init__.py +8 -0
- nemo_platform/cli/core/agent_helpers.py +84 -0
- nemo_platform/cli/core/api.py +160 -0
- nemo_platform/cli/core/autocomplete.py +63 -0
- nemo_platform/cli/core/code_generator.py +306 -0
- nemo_platform/cli/core/context.py +179 -0
- nemo_platform/cli/core/errors.py +349 -0
- nemo_platform/cli/core/formatters.py +718 -0
- nemo_platform/cli/core/help_formatter.py +868 -0
- nemo_platform/cli/core/lazy_load.py +187 -0
- nemo_platform/cli/core/logging.py +24 -0
- nemo_platform/cli/core/pagination.py +255 -0
- nemo_platform/cli/core/stdin_utils.py +233 -0
- nemo_platform/cli/core/streaming.py +30 -0
- nemo_platform/cli/core/table_config.py +302 -0
- nemo_platform/cli/core/timestamp_formatter.py +127 -0
- nemo_platform/cli/core/types.py +112 -0
- nemo_platform/cli/core/waiters.py +339 -0
- nemo_platform/cli/manifest.py +108 -0
- nemo_platform/client/__init__.py +15 -0
- nemo_platform/client/factory.py +597 -0
- nemo_platform/config/README.md +168 -0
- nemo_platform/config/__init__.py +23 -0
- nemo_platform/config/config.py +538 -0
- nemo_platform/config/models.py +377 -0
- nemo_platform/config/types.py +7 -0
- nemo_platform/filesets/__init__.py +19 -0
- nemo_platform/filesets/filesystem/callbacks.py +229 -0
- nemo_platform/filesets/filesystem/filesystem.py +940 -0
- nemo_platform/filesets/resources.py +1120 -0
- nemo_platform/lib/.keep +4 -0
- nemo_platform/models/__init__.py +14 -0
- nemo_platform/models/resources.py +836 -0
- nemo_platform/pagination.py +149 -0
- nemo_platform/py.typed +0 -0
- nemo_platform/quickstart/__init__.py +99 -0
- nemo_platform/quickstart/cluster.py +198 -0
- nemo_platform/quickstart/config.py +402 -0
- nemo_platform/quickstart/container.py +758 -0
- nemo_platform/quickstart/gpu_config.py +111 -0
- nemo_platform/quickstart/platform_config.py +82 -0
- nemo_platform/quickstart/preflight.py +451 -0
- nemo_platform/quickstart/prompts.py +426 -0
- nemo_platform/quickstart/storage.py +90 -0
- nemo_platform/quickstart/validators.py +268 -0
- nemo_platform/resources/__init__.py +16 -0
- nemo_platform/resources/adapters/__init__.py +34 -0
- nemo_platform/resources/adapters/adapters.py +704 -0
- nemo_platform/resources/adapters/api.md +15 -0
- nemo_platform/resources/audit/__init__.py +16 -0
- nemo_platform/resources/entities/__init__.py +34 -0
- nemo_platform/resources/entities/api.md +16 -0
- nemo_platform/resources/entities/entities.py +1014 -0
- nemo_platform/resources/evaluation/__init__.py +118 -0
- nemo_platform/resources/evaluation/api.md +303 -0
- nemo_platform/resources/evaluation/benchmark_job_results.py +541 -0
- nemo_platform/resources/evaluation/benchmark_jobs/__init__.py +48 -0
- nemo_platform/resources/evaluation/benchmark_jobs/benchmark_jobs.py +900 -0
- nemo_platform/resources/evaluation/benchmark_jobs/results/__init__.py +76 -0
- nemo_platform/resources/evaluation/benchmark_jobs/results/aggregate_scores.py +197 -0
- nemo_platform/resources/evaluation/benchmark_jobs/results/artifacts.py +206 -0
- nemo_platform/resources/evaluation/benchmark_jobs/results/results.py +516 -0
- nemo_platform/resources/evaluation/benchmark_jobs/results/row_scores.py +213 -0
- nemo_platform/resources/evaluation/benchmarks.py +690 -0
- nemo_platform/resources/evaluation/evaluation.py +277 -0
- nemo_platform/resources/evaluation/metric_job_results.py +533 -0
- nemo_platform/resources/evaluation/metric_jobs/__init__.py +48 -0
- nemo_platform/resources/evaluation/metric_jobs/metric_jobs.py +888 -0
- nemo_platform/resources/evaluation/metric_jobs/results/__init__.py +76 -0
- nemo_platform/resources/evaluation/metric_jobs/results/aggregate_scores.py +197 -0
- nemo_platform/resources/evaluation/metric_jobs/results/artifacts.py +206 -0
- nemo_platform/resources/evaluation/metric_jobs/results/results.py +512 -0
- nemo_platform/resources/evaluation/metric_jobs/results/row_scores.py +213 -0
- nemo_platform/resources/evaluation/metrics.py +3495 -0
- nemo_platform/resources/files/__init__.py +62 -0
- nemo_platform/resources/files/api.md +65 -0
- nemo_platform/resources/files/files.py +683 -0
- nemo_platform/resources/files/filesets.py +783 -0
- nemo_platform/resources/files/otlp/__init__.py +48 -0
- nemo_platform/resources/files/otlp/logs.py +337 -0
- nemo_platform/resources/files/otlp/otlp.py +117 -0
- nemo_platform/resources/guardrail/__init__.py +48 -0
- nemo_platform/resources/guardrail/api.md +116 -0
- nemo_platform/resources/guardrail/configs.py +679 -0
- nemo_platform/resources/guardrail/guardrail.py +463 -0
- nemo_platform/resources/iam/__init__.py +48 -0
- nemo_platform/resources/iam/api.md +22 -0
- nemo_platform/resources/iam/iam.py +117 -0
- nemo_platform/resources/iam/role_bindings.py +537 -0
- nemo_platform/resources/inference/__init__.py +118 -0
- nemo_platform/resources/inference/api.md +224 -0
- nemo_platform/resources/inference/deployment_configs/__init__.py +48 -0
- nemo_platform/resources/inference/deployment_configs/deployment_configs.py +756 -0
- nemo_platform/resources/inference/deployment_configs/versions.py +418 -0
- nemo_platform/resources/inference/deployments/__init__.py +48 -0
- nemo_platform/resources/inference/deployments/deployments.py +1017 -0
- nemo_platform/resources/inference/deployments/versions.py +434 -0
- nemo_platform/resources/inference/gateway/__init__.py +76 -0
- nemo_platform/resources/inference/gateway/gateway.py +181 -0
- nemo_platform/resources/inference/gateway/model.py +708 -0
- nemo_platform/resources/inference/gateway/openai/__init__.py +48 -0
- nemo_platform/resources/inference/gateway/openai/openai.py +700 -0
- nemo_platform/resources/inference/gateway/openai/v1/__init__.py +48 -0
- nemo_platform/resources/inference/gateway/openai/v1/models.py +290 -0
- nemo_platform/resources/inference/gateway/openai/v1/v1.py +117 -0
- nemo_platform/resources/inference/gateway/provider.py +749 -0
- nemo_platform/resources/inference/inference.py +277 -0
- nemo_platform/resources/inference/models.py +290 -0
- nemo_platform/resources/inference/providers.py +1049 -0
- nemo_platform/resources/inference/virtual_models.py +846 -0
- nemo_platform/resources/intake/__init__.py +132 -0
- nemo_platform/resources/intake/api.md +268 -0
- nemo_platform/resources/intake/apps/__init__.py +48 -0
- nemo_platform/resources/intake/apps/apps.py +718 -0
- nemo_platform/resources/intake/apps/tasks.py +731 -0
- nemo_platform/resources/intake/entries/__init__.py +48 -0
- nemo_platform/resources/intake/entries/entries.py +855 -0
- nemo_platform/resources/intake/entries/events.py +320 -0
- nemo_platform/resources/intake/evaluator_results.py +512 -0
- nemo_platform/resources/intake/exports/__init__.py +48 -0
- nemo_platform/resources/intake/exports/exports.py +229 -0
- nemo_platform/resources/intake/exports/jobs.py +464 -0
- nemo_platform/resources/intake/ingest/__init__.py +76 -0
- nemo_platform/resources/intake/ingest/atif.py +242 -0
- nemo_platform/resources/intake/ingest/chat_completions.py +270 -0
- nemo_platform/resources/intake/ingest/ingest.py +181 -0
- nemo_platform/resources/intake/ingest/otlp/__init__.py +48 -0
- nemo_platform/resources/intake/ingest/otlp/otlp.py +117 -0
- nemo_platform/resources/intake/ingest/otlp/v1/__init__.py +48 -0
- nemo_platform/resources/intake/ingest/otlp/v1/traces.py +183 -0
- nemo_platform/resources/intake/ingest/otlp/v1/v1.py +117 -0
- nemo_platform/resources/intake/intake.py +309 -0
- nemo_platform/resources/intake/spans/__init__.py +48 -0
- nemo_platform/resources/intake/spans/evaluator_results.py +197 -0
- nemo_platform/resources/intake/spans/spans.py +367 -0
- nemo_platform/resources/intake/traces.py +351 -0
- nemo_platform/resources/jobs/__init__.py +76 -0
- nemo_platform/resources/jobs/api.md +118 -0
- nemo_platform/resources/jobs/jobs.py +1300 -0
- nemo_platform/resources/jobs/results.py +555 -0
- nemo_platform/resources/jobs/steps.py +491 -0
- nemo_platform/resources/jobs/tasks.py +470 -0
- nemo_platform/resources/members/__init__.py +34 -0
- nemo_platform/resources/members/api.md +19 -0
- nemo_platform/resources/members/members.py +634 -0
- nemo_platform/resources/models/__init__.py +48 -0
- nemo_platform/resources/models/adapters.py +514 -0
- nemo_platform/resources/models/api.md +44 -0
- nemo_platform/resources/models/models.py +981 -0
- nemo_platform/resources/projects/__init__.py +34 -0
- nemo_platform/resources/projects/api.md +21 -0
- nemo_platform/resources/projects/projects.py +736 -0
- nemo_platform/resources/safe_synthesizer/__init__.py +48 -0
- nemo_platform/resources/safe_synthesizer/api.md +62 -0
- nemo_platform/resources/safe_synthesizer/jobs/__init__.py +48 -0
- nemo_platform/resources/safe_synthesizer/jobs/jobs.py +895 -0
- nemo_platform/resources/safe_synthesizer/jobs/results.py +819 -0
- nemo_platform/resources/safe_synthesizer/safe_synthesizer.py +117 -0
- nemo_platform/resources/secrets/__init__.py +48 -0
- nemo_platform/resources/secrets/admin.py +150 -0
- nemo_platform/resources/secrets/api.md +34 -0
- nemo_platform/resources/secrets/secrets.py +756 -0
- nemo_platform/resources/workspaces/__init__.py +34 -0
- nemo_platform/resources/workspaces/api.md +20 -0
- nemo_platform/resources/workspaces/workspaces.py +734 -0
- nemo_platform/skills/__init__.py +28 -0
- nemo_platform/skills/inference/SKILL.md +564 -0
- nemo_platform/skills/nemo-build-agent/SKILL.md +221 -0
- nemo_platform/skills/nemo-build-agent/references/templates/data-designer-config.py +80 -0
- nemo_platform/skills/nemo-evaluator/SKILL.md +140 -0
- nemo_platform/skills/nemo-explore/SKILL.md +70 -0
- nemo_platform/skills/nemo-files/SKILL.md +81 -0
- nemo_platform/skills/nemo-fine-tune/SKILL.md +43 -0
- nemo_platform/skills/nemo-guardrails/SKILL.md +519 -0
- nemo_platform/skills/nemo-secrets/SKILL.md +60 -0
- nemo_platform/skills/nemo-skill-selection/SKILL.md +146 -0
- nemo_platform/skills/nemo-spec/SKILL.md +76 -0
- nemo_platform/skills/nemo-spec/references/templates/agent-spec.md +68 -0
- nemo_platform/skills/nemo-status/SKILL.md +115 -0
- nemo_platform/skills/nemo-teardown/SKILL.md +185 -0
- nemo_platform/skills/nemo-try-agent/SKILL.md +102 -0
- nemo_platform/types/__init__.py +54 -0
- nemo_platform/types/adapters/__init__.py +24 -0
- nemo_platform/types/adapters/adapter_create_params.py +63 -0
- nemo_platform/types/adapters/adapter_entity_filter_param.py +56 -0
- nemo_platform/types/adapters/adapter_list_params.py +46 -0
- nemo_platform/types/adapters/adapter_patch_params.py +35 -0
- nemo_platform/types/adapters/adapters_page.py +37 -0
- nemo_platform/types/audit/__init__.py +18 -0
- nemo_platform/types/audit/jobs/__init__.py +18 -0
- nemo_platform/types/entities/__init__.py +26 -0
- nemo_platform/types/entities/entities_page.py +37 -0
- nemo_platform/types/entities/entity.py +63 -0
- nemo_platform/types/entities/entity_create_params.py +46 -0
- nemo_platform/types/entities/entity_delete_entity_by_name_params.py +31 -0
- nemo_platform/types/entities/entity_get_entity_by_name_params.py +31 -0
- nemo_platform/types/entities/entity_list_params.py +47 -0
- nemo_platform/types/entities/entity_update_entity_by_name_params.py +52 -0
- nemo_platform/types/evaluation/__init__.py +242 -0
- nemo_platform/types/evaluation/agent.py +68 -0
- nemo_platform/types/evaluation/agent_goal_accuracy_metric.py +92 -0
- nemo_platform/types/evaluation/agent_goal_accuracy_metric_param.py +69 -0
- nemo_platform/types/evaluation/agent_goal_accuracy_metric_param_param.py +70 -0
- nemo_platform/types/evaluation/agent_goal_accuracy_metric_response.py +88 -0
- nemo_platform/types/evaluation/agent_param.py +69 -0
- nemo_platform/types/evaluation/aggregate_range_score.py +65 -0
- nemo_platform/types/evaluation/aggregate_rubric_score.py +64 -0
- nemo_platform/types/evaluation/aggregated_metric_result.py +34 -0
- nemo_platform/types/evaluation/answer_accuracy_metric.py +89 -0
- nemo_platform/types/evaluation/answer_accuracy_metric_param.py +66 -0
- nemo_platform/types/evaluation/answer_accuracy_metric_param_param.py +67 -0
- nemo_platform/types/evaluation/answer_accuracy_metric_response.py +85 -0
- nemo_platform/types/evaluation/benchmark.py +81 -0
- nemo_platform/types/evaluation/benchmark_create_params.py +64 -0
- nemo_platform/types/evaluation/benchmark_create_response.py +26 -0
- nemo_platform/types/evaluation/benchmark_evaluation_job.py +75 -0
- nemo_platform/types/evaluation/benchmark_evaluation_jobs_list_filter_param.py +49 -0
- nemo_platform/types/evaluation/benchmark_evaluation_jobs_page.py +37 -0
- nemo_platform/types/evaluation/benchmark_evaluation_jobs_sort_field.py +22 -0
- nemo_platform/types/evaluation/benchmark_job_create_params.py +58 -0
- nemo_platform/types/evaluation/benchmark_job_get_logs_params.py +30 -0
- nemo_platform/types/evaluation/benchmark_job_list_params.py +44 -0
- nemo_platform/types/evaluation/benchmark_job_result.py +93 -0
- nemo_platform/types/evaluation/benchmark_job_result_list_params.py +116 -0
- nemo_platform/types/evaluation/benchmark_job_result_retrieve_params.py +50 -0
- nemo_platform/types/evaluation/benchmark_job_results_list_response.py +37 -0
- nemo_platform/types/evaluation/benchmark_jobs/__init__.py +18 -0
- nemo_platform/types/evaluation/benchmark_jobs/results/__init__.py +22 -0
- nemo_platform/types/evaluation/benchmark_jobs/results/benchmark_evaluation_result.py +30 -0
- nemo_platform/types/evaluation/benchmark_jobs/results/benchmark_metric_result.py +44 -0
- nemo_platform/types/evaluation/benchmark_jobs/results/row_score_download_params.py +28 -0
- nemo_platform/types/evaluation/benchmark_list_params.py +84 -0
- nemo_platform/types/evaluation/benchmark_offline_job.py +43 -0
- nemo_platform/types/evaluation/benchmark_offline_job_param.py +44 -0
- nemo_platform/types/evaluation/benchmark_online_agent_job.py +71 -0
- nemo_platform/types/evaluation/benchmark_online_agent_job_param.py +74 -0
- nemo_platform/types/evaluation/benchmark_online_job.py +66 -0
- nemo_platform/types/evaluation/benchmark_online_job_param.py +68 -0
- nemo_platform/types/evaluation/benchmark_ref.py +22 -0
- nemo_platform/types/evaluation/benchmark_retrieve_params.py +29 -0
- nemo_platform/types/evaluation/benchmark_retrieve_response.py +27 -0
- nemo_platform/types/evaluation/benchmarks_list_response.py +42 -0
- nemo_platform/types/evaluation/bleu_metric.py +76 -0
- nemo_platform/types/evaluation/bleu_metric_param.py +50 -0
- nemo_platform/types/evaluation/bleu_metric_param_param.py +52 -0
- nemo_platform/types/evaluation/bleu_metric_response.py +69 -0
- nemo_platform/types/evaluation/built_in_dataset.py +46 -0
- nemo_platform/types/evaluation/context_entity_recall_metric.py +89 -0
- nemo_platform/types/evaluation/context_entity_recall_metric_param.py +66 -0
- nemo_platform/types/evaluation/context_entity_recall_metric_param_param.py +67 -0
- nemo_platform/types/evaluation/context_entity_recall_metric_response.py +85 -0
- nemo_platform/types/evaluation/context_precision_metric.py +89 -0
- nemo_platform/types/evaluation/context_precision_metric_param.py +66 -0
- nemo_platform/types/evaluation/context_precision_metric_param_param.py +67 -0
- nemo_platform/types/evaluation/context_precision_metric_response.py +85 -0
- nemo_platform/types/evaluation/context_recall_metric.py +89 -0
- nemo_platform/types/evaluation/context_recall_metric_param.py +66 -0
- nemo_platform/types/evaluation/context_recall_metric_param_param.py +67 -0
- nemo_platform/types/evaluation/context_recall_metric_response.py +85 -0
- nemo_platform/types/evaluation/context_relevance_metric.py +89 -0
- nemo_platform/types/evaluation/context_relevance_metric_param.py +66 -0
- nemo_platform/types/evaluation/context_relevance_metric_param_param.py +67 -0
- nemo_platform/types/evaluation/context_relevance_metric_response.py +85 -0
- nemo_platform/types/evaluation/dataset_rows.py +35 -0
- nemo_platform/types/evaluation/dataset_rows_param.py +36 -0
- nemo_platform/types/evaluation/evaluate_dataset_rows_param.py +33 -0
- nemo_platform/types/evaluation/exact_match_metric.py +79 -0
- nemo_platform/types/evaluation/exact_match_metric_param.py +53 -0
- nemo_platform/types/evaluation/exact_match_metric_param_param.py +53 -0
- nemo_platform/types/evaluation/exact_match_metric_response.py +72 -0
- nemo_platform/types/evaluation/extended_benchmark.py +130 -0
- nemo_platform/types/evaluation/f1_metric.py +76 -0
- nemo_platform/types/evaluation/f1_metric_param.py +50 -0
- nemo_platform/types/evaluation/f1_metric_param_param.py +50 -0
- nemo_platform/types/evaluation/f1_metric_response.py +69 -0
- nemo_platform/types/evaluation/faithfulness_metric.py +89 -0
- nemo_platform/types/evaluation/faithfulness_metric_param.py +66 -0
- nemo_platform/types/evaluation/faithfulness_metric_param_param.py +67 -0
- nemo_platform/types/evaluation/faithfulness_metric_response.py +85 -0
- nemo_platform/types/evaluation/field_mapping.py +56 -0
- nemo_platform/types/evaluation/field_mapping_param.py +57 -0
- nemo_platform/types/evaluation/fileset.py +48 -0
- nemo_platform/types/evaluation/fileset_param.py +49 -0
- nemo_platform/types/evaluation/fileset_ref.py +22 -0
- nemo_platform/types/evaluation/histogram.py +30 -0
- nemo_platform/types/evaluation/histogram_bin.py +33 -0
- nemo_platform/types/evaluation/inference_params.py +65 -0
- nemo_platform/types/evaluation/inference_params_param.py +53 -0
- nemo_platform/types/evaluation/json_score_parser.py +35 -0
- nemo_platform/types/evaluation/json_score_parser_param.py +34 -0
- nemo_platform/types/evaluation/llm_judge_metric.py +126 -0
- nemo_platform/types/evaluation/llm_judge_metric_param.py +103 -0
- nemo_platform/types/evaluation/llm_judge_metric_param_param.py +105 -0
- nemo_platform/types/evaluation/llm_judge_metric_response.py +120 -0
- nemo_platform/types/evaluation/metric_create_params.py +959 -0
- nemo_platform/types/evaluation/metric_create_response.py +75 -0
- nemo_platform/types/evaluation/metric_evaluate_params.py +111 -0
- nemo_platform/types/evaluation/metric_evaluation_job.py +65 -0
- nemo_platform/types/evaluation/metric_evaluation_jobs_list_filter_param.py +49 -0
- nemo_platform/types/evaluation/metric_evaluation_jobs_page.py +37 -0
- nemo_platform/types/evaluation/metric_evaluation_jobs_sort_field.py +22 -0
- nemo_platform/types/evaluation/metric_evaluation_response.py +98 -0
- nemo_platform/types/evaluation/metric_evaluation_row_score.py +45 -0
- nemo_platform/types/evaluation/metric_job_create_params.py +48 -0
- nemo_platform/types/evaluation/metric_job_get_logs_params.py +30 -0
- nemo_platform/types/evaluation/metric_job_list_params.py +44 -0
- nemo_platform/types/evaluation/metric_job_result.py +93 -0
- nemo_platform/types/evaluation/metric_job_result_list_params.py +114 -0
- nemo_platform/types/evaluation/metric_job_result_retrieve_params.py +50 -0
- nemo_platform/types/evaluation/metric_job_results_list_response.py +37 -0
- nemo_platform/types/evaluation/metric_jobs/__init__.py +18 -0
- nemo_platform/types/evaluation/metric_jobs/results/__init__.py +20 -0
- nemo_platform/types/evaluation/metric_jobs/results/row_score_download_params.py +28 -0
- nemo_platform/types/evaluation/metric_list_params.py +73 -0
- nemo_platform/types/evaluation/metric_offline_job.py +106 -0
- nemo_platform/types/evaluation/metric_offline_job_param.py +107 -0
- nemo_platform/types/evaluation/metric_online_agent_job.py +133 -0
- nemo_platform/types/evaluation/metric_online_agent_job_param.py +135 -0
- nemo_platform/types/evaluation/metric_online_job.py +127 -0
- nemo_platform/types/evaluation/metric_online_job_param.py +129 -0
- nemo_platform/types/evaluation/metric_output.py +30 -0
- nemo_platform/types/evaluation/metric_ref.py +22 -0
- nemo_platform/types/evaluation/metric_retrieve_response.py +98 -0
- nemo_platform/types/evaluation/metric_retriever_job.py +64 -0
- nemo_platform/types/evaluation/metric_retriever_job_param.py +65 -0
- nemo_platform/types/evaluation/metric_type.py +47 -0
- nemo_platform/types/evaluation/metrics_list_response.py +90 -0
- nemo_platform/types/evaluation/model.py +44 -0
- nemo_platform/types/evaluation/model_param.py +44 -0
- nemo_platform/types/evaluation/model_ref.py +22 -0
- nemo_platform/types/evaluation/nemo_agent_toolkit_remote_metric.py +87 -0
- nemo_platform/types/evaluation/nemo_agent_toolkit_remote_metric_param.py +64 -0
- nemo_platform/types/evaluation/nemo_agent_toolkit_remote_metric_param_param.py +65 -0
- nemo_platform/types/evaluation/nemo_agent_toolkit_remote_metric_response.py +80 -0
- nemo_platform/types/evaluation/noise_sensitivity_metric.py +89 -0
- nemo_platform/types/evaluation/noise_sensitivity_metric_param.py +66 -0
- nemo_platform/types/evaluation/noise_sensitivity_metric_param_param.py +67 -0
- nemo_platform/types/evaluation/noise_sensitivity_metric_response.py +85 -0
- nemo_platform/types/evaluation/number_check_metric.py +104 -0
- nemo_platform/types/evaluation/number_check_metric_param.py +81 -0
- nemo_platform/types/evaluation/number_check_metric_param_param.py +83 -0
- nemo_platform/types/evaluation/number_check_metric_response.py +97 -0
- nemo_platform/types/evaluation/parameter.py +42 -0
- nemo_platform/types/evaluation/parameter_param.py +40 -0
- nemo_platform/types/evaluation/percentiles.py +54 -0
- nemo_platform/types/evaluation/range_score.py +56 -0
- nemo_platform/types/evaluation/range_score_param.py +57 -0
- nemo_platform/types/evaluation/reasoning_params.py +41 -0
- nemo_platform/types/evaluation/reasoning_params_param.py +41 -0
- nemo_platform/types/evaluation/regex_score_parser.py +38 -0
- nemo_platform/types/evaluation/regex_score_parser_param.py +37 -0
- nemo_platform/types/evaluation/remote_metric.py +91 -0
- nemo_platform/types/evaluation/remote_metric_param.py +68 -0
- nemo_platform/types/evaluation/remote_metric_param_param.py +69 -0
- nemo_platform/types/evaluation/remote_metric_response.py +84 -0
- nemo_platform/types/evaluation/remote_score.py +49 -0
- nemo_platform/types/evaluation/remote_score_param.py +50 -0
- nemo_platform/types/evaluation/response_groundedness_metric.py +89 -0
- nemo_platform/types/evaluation/response_groundedness_metric_param.py +66 -0
- nemo_platform/types/evaluation/response_groundedness_metric_param_param.py +67 -0
- nemo_platform/types/evaluation/response_groundedness_metric_response.py +85 -0
- nemo_platform/types/evaluation/response_relevancy_metric.py +95 -0
- nemo_platform/types/evaluation/response_relevancy_metric_param.py +74 -0
- nemo_platform/types/evaluation/response_relevancy_metric_param_param.py +75 -0
- nemo_platform/types/evaluation/response_relevancy_metric_response.py +93 -0
- nemo_platform/types/evaluation/retriever_pipeline.py +34 -0
- nemo_platform/types/evaluation/retriever_pipeline_param.py +35 -0
- nemo_platform/types/evaluation/rouge_metric.py +76 -0
- nemo_platform/types/evaluation/rouge_metric_param.py +53 -0
- nemo_platform/types/evaluation/rouge_metric_param_param.py +53 -0
- nemo_platform/types/evaluation/rouge_metric_response.py +69 -0
- nemo_platform/types/evaluation/row_score.py +59 -0
- nemo_platform/types/evaluation/rubric.py +40 -0
- nemo_platform/types/evaluation/rubric_param.py +40 -0
- nemo_platform/types/evaluation/rubric_score.py +54 -0
- nemo_platform/types/evaluation/rubric_score_param.py +55 -0
- nemo_platform/types/evaluation/rubric_score_stat.py +38 -0
- nemo_platform/types/evaluation/run_config.py +39 -0
- nemo_platform/types/evaluation/run_config_online.py +51 -0
- nemo_platform/types/evaluation/run_config_online_model.py +73 -0
- nemo_platform/types/evaluation/run_config_online_model_param.py +75 -0
- nemo_platform/types/evaluation/run_config_online_param.py +51 -0
- nemo_platform/types/evaluation/run_config_param.py +39 -0
- nemo_platform/types/evaluation/string_check_metric.py +82 -0
- nemo_platform/types/evaluation/string_check_metric_param.py +59 -0
- nemo_platform/types/evaluation/string_check_metric_param_param.py +61 -0
- nemo_platform/types/evaluation/string_check_metric_response.py +75 -0
- nemo_platform/types/evaluation/system_benchmark.py +71 -0
- nemo_platform/types/evaluation/system_benchmark_offline_job.py +58 -0
- nemo_platform/types/evaluation/system_benchmark_offline_job_param.py +60 -0
- nemo_platform/types/evaluation/system_benchmark_online_job.py +54 -0
- nemo_platform/types/evaluation/system_benchmark_online_job_param.py +55 -0
- nemo_platform/types/evaluation/system_metric.py +70 -0
- nemo_platform/types/evaluation/system_metric_param.py +50 -0
- nemo_platform/types/evaluation/system_metric_param_param.py +51 -0
- nemo_platform/types/evaluation/system_metric_response.py +66 -0
- nemo_platform/types/evaluation/tool_call_accuracy_metric.py +70 -0
- nemo_platform/types/evaluation/tool_call_accuracy_metric_param.py +44 -0
- nemo_platform/types/evaluation/tool_call_accuracy_metric_param_param.py +44 -0
- nemo_platform/types/evaluation/tool_call_accuracy_metric_response.py +63 -0
- nemo_platform/types/evaluation/tool_calling_metric.py +70 -0
- nemo_platform/types/evaluation/tool_calling_metric_param.py +47 -0
- nemo_platform/types/evaluation/tool_calling_metric_param_param.py +47 -0
- nemo_platform/types/evaluation/tool_calling_metric_response.py +63 -0
- nemo_platform/types/evaluation/topic_adherence_metric.py +92 -0
- nemo_platform/types/evaluation/topic_adherence_metric_param.py +69 -0
- nemo_platform/types/evaluation/topic_adherence_metric_param_param.py +70 -0
- nemo_platform/types/evaluation/topic_adherence_metric_response.py +88 -0
- nemo_platform/types/files/__init__.py +45 -0
- nemo_platform/types/files/cache_status.py +22 -0
- nemo_platform/types/files/dataset_metadata_content.py +46 -0
- nemo_platform/types/files/dataset_metadata_content_param.py +45 -0
- nemo_platform/types/files/file_list_files_params.py +35 -0
- nemo_platform/types/files/file_upload_file_params.py +28 -0
- nemo_platform/types/files/fileset.py +62 -0
- nemo_platform/types/files/fileset_create_params.py +74 -0
- nemo_platform/types/files/fileset_file.py +36 -0
- nemo_platform/types/files/fileset_filter_param.py +54 -0
- nemo_platform/types/files/fileset_list_params.py +47 -0
- nemo_platform/types/files/fileset_metadata_param.py +46 -0
- nemo_platform/types/files/fileset_metadata_param_param.py +47 -0
- nemo_platform/types/files/fileset_outputs_page.py +37 -0
- nemo_platform/types/files/fileset_purpose.py +22 -0
- nemo_platform/types/files/fileset_update_params.py +49 -0
- nemo_platform/types/files/huggingface_storage_config.py +60 -0
- nemo_platform/types/files/huggingface_storage_config_param.py +60 -0
- nemo_platform/types/files/list_fileset_files_response.py +27 -0
- nemo_platform/types/files/local_storage_config.py +39 -0
- nemo_platform/types/files/local_storage_config_param.py +38 -0
- nemo_platform/types/files/ngc_storage_config.py +66 -0
- nemo_platform/types/files/ngc_storage_config_param.py +66 -0
- nemo_platform/types/files/otlp/__init__.py +22 -0
- nemo_platform/types/files/otlp/log_query_params.py +36 -0
- nemo_platform/types/files/otlp/otel_export_logs_partial_success.py +34 -0
- nemo_platform/types/files/otlp/otel_export_logs_service_response.py +35 -0
- nemo_platform/types/files/s3_storage_config.py +85 -0
- nemo_platform/types/files/s3_storage_config_param.py +85 -0
- nemo_platform/types/files/secret_ref.py +22 -0
- nemo_platform/types/files/storage_config_type.py +22 -0
- nemo_platform/types/guardrail/__init__.py +165 -0
- nemo_platform/types/guardrail/action_rails.py +36 -0
- nemo_platform/types/guardrail/action_rails_param.py +38 -0
- nemo_platform/types/guardrail/activated_rail.py +61 -0
- nemo_platform/types/guardrail/ai_defense_rail_config.py +36 -0
- nemo_platform/types/guardrail/ai_defense_rail_config_param.py +36 -0
- nemo_platform/types/guardrail/auto_align_options.py +29 -0
- nemo_platform/types/guardrail/auto_align_options_param.py +30 -0
- nemo_platform/types/guardrail/auto_align_rail_config.py +35 -0
- nemo_platform/types/guardrail/auto_align_rail_config_param.py +37 -0
- nemo_platform/types/guardrail/cache_stats_config.py +32 -0
- nemo_platform/types/guardrail/cache_stats_config_param.py +32 -0
- nemo_platform/types/guardrail/chat_completion_assistant_message_param.py +45 -0
- nemo_platform/types/guardrail/chat_completion_content_part_image_param.py +34 -0
- nemo_platform/types/guardrail/chat_completion_content_part_text_param.py +32 -0
- nemo_platform/types/guardrail/chat_completion_function_message_param.py +35 -0
- nemo_platform/types/guardrail/chat_completion_message_tool_call_param.py +37 -0
- nemo_platform/types/guardrail/chat_completion_system_message_param.py +35 -0
- nemo_platform/types/guardrail/chat_completion_tool_message_param.py +35 -0
- nemo_platform/types/guardrail/chat_completion_user_message_param.py +41 -0
- nemo_platform/types/guardrail/clavata_rail_config.py +47 -0
- nemo_platform/types/guardrail/clavata_rail_config_param.py +48 -0
- nemo_platform/types/guardrail/clavata_rail_options.py +36 -0
- nemo_platform/types/guardrail/clavata_rail_options_param.py +38 -0
- nemo_platform/types/guardrail/config_create_params.py +36 -0
- nemo_platform/types/guardrail/config_list_params.py +47 -0
- nemo_platform/types/guardrail/config_update_params.py +33 -0
- nemo_platform/types/guardrail/content_safety_config.py +34 -0
- nemo_platform/types/guardrail/content_safety_config_param.py +35 -0
- nemo_platform/types/guardrail/crowd_strike_aidr_rail_config.py +29 -0
- nemo_platform/types/guardrail/crowd_strike_aidr_rail_config_param.py +29 -0
- nemo_platform/types/guardrail/dialog_rails.py +34 -0
- nemo_platform/types/guardrail/dialog_rails_param.py +35 -0
- nemo_platform/types/guardrail/executed_action.py +48 -0
- nemo_platform/types/guardrail/fact_checking_rail_config.py +31 -0
- nemo_platform/types/guardrail/fact_checking_rail_config_param.py +32 -0
- nemo_platform/types/guardrail/fiddler_guardrails.py +35 -0
- nemo_platform/types/guardrail/fiddler_guardrails_param.py +35 -0
- nemo_platform/types/guardrail/function_call_param.py +35 -0
- nemo_platform/types/guardrail/function_param.py +35 -0
- nemo_platform/types/guardrail/g_li_ner_detection.py +51 -0
- nemo_platform/types/guardrail/g_li_ner_detection_options.py +29 -0
- nemo_platform/types/guardrail/g_li_ner_detection_options_param.py +31 -0
- nemo_platform/types/guardrail/g_li_ner_detection_param.py +52 -0
- nemo_platform/types/guardrail/generation_log.py +44 -0
- nemo_platform/types/guardrail/generation_log_options_param.py +50 -0
- nemo_platform/types/guardrail/generation_options_param.py +55 -0
- nemo_platform/types/guardrail/generation_rails_options_param.py +53 -0
- nemo_platform/types/guardrail/generation_stats.py +56 -0
- nemo_platform/types/guardrail/guardrail_check_params.py +164 -0
- nemo_platform/types/guardrail/guardrail_check_response.py +36 -0
- nemo_platform/types/guardrail/guardrail_config.py +59 -0
- nemo_platform/types/guardrail/guardrail_config_filter_param.py +49 -0
- nemo_platform/types/guardrail/guardrail_configs_page.py +37 -0
- nemo_platform/types/guardrail/guardrails_ai_rail_config.py +33 -0
- nemo_platform/types/guardrail/guardrails_ai_rail_config_param.py +35 -0
- nemo_platform/types/guardrail/guardrails_ai_validator_config.py +44 -0
- nemo_platform/types/guardrail/guardrails_ai_validator_config_param.py +45 -0
- nemo_platform/types/guardrail/guardrails_data.py +40 -0
- nemo_platform/types/guardrail/guardrails_data_param.py +67 -0
- nemo_platform/types/guardrail/image_u_rl_param.py +32 -0
- nemo_platform/types/guardrail/injection_detection.py +49 -0
- nemo_platform/types/guardrail/injection_detection_param.py +52 -0
- nemo_platform/types/guardrail/input_rails.py +32 -0
- nemo_platform/types/guardrail/input_rails_param.py +34 -0
- nemo_platform/types/guardrail/instruction.py +30 -0
- nemo_platform/types/guardrail/instruction_param.py +32 -0
- nemo_platform/types/guardrail/jailbreak_detection_config.py +52 -0
- nemo_platform/types/guardrail/jailbreak_detection_config_param.py +58 -0
- nemo_platform/types/guardrail/llm_call_info.py +63 -0
- nemo_platform/types/guardrail/log_adapter_config.py +41 -0
- nemo_platform/types/guardrail/log_adapter_config_param.py +27 -0
- nemo_platform/types/guardrail/message_template.py +30 -0
- nemo_platform/types/guardrail/message_template_param.py +32 -0
- nemo_platform/types/guardrail/model.py +55 -0
- nemo_platform/types/guardrail/model_cache_config.py +36 -0
- nemo_platform/types/guardrail/model_cache_config_param.py +37 -0
- nemo_platform/types/guardrail/model_param.py +55 -0
- nemo_platform/types/guardrail/model_parameters.py +51 -0
- nemo_platform/types/guardrail/model_parameters_param.py +38 -0
- nemo_platform/types/guardrail/multilingual_config.py +40 -0
- nemo_platform/types/guardrail/multilingual_config_param.py +41 -0
- nemo_platform/types/guardrail/output_rails.py +44 -0
- nemo_platform/types/guardrail/output_rails_param.py +46 -0
- nemo_platform/types/guardrail/output_rails_streaming_config.py +44 -0
- nemo_platform/types/guardrail/output_rails_streaming_config_param.py +44 -0
- nemo_platform/types/guardrail/pangea_rail_config.py +33 -0
- nemo_platform/types/guardrail/pangea_rail_config_param.py +34 -0
- nemo_platform/types/guardrail/pangea_rail_options.py +31 -0
- nemo_platform/types/guardrail/pangea_rail_options_param.py +33 -0
- nemo_platform/types/guardrail/patronus_evaluate_api_params.py +38 -0
- nemo_platform/types/guardrail/patronus_evaluate_api_params_param.py +40 -0
- nemo_platform/types/guardrail/patronus_evaluate_config.py +30 -0
- nemo_platform/types/guardrail/patronus_evaluate_config_param.py +31 -0
- nemo_platform/types/guardrail/patronus_evaluation_success_strategy.py +22 -0
- nemo_platform/types/guardrail/patronus_rail_config.py +33 -0
- nemo_platform/types/guardrail/patronus_rail_config_param.py +34 -0
- nemo_platform/types/guardrail/private_ai_detection.py +39 -0
- nemo_platform/types/guardrail/private_ai_detection_options.py +29 -0
- nemo_platform/types/guardrail/private_ai_detection_options_param.py +31 -0
- nemo_platform/types/guardrail/private_ai_detection_param.py +40 -0
- nemo_platform/types/guardrail/rail_status.py +26 -0
- nemo_platform/types/guardrail/rails.py +73 -0
- nemo_platform/types/guardrail/rails_config.py +79 -0
- nemo_platform/types/guardrail/rails_config_data.py +94 -0
- nemo_platform/types/guardrail/rails_config_data_param.py +95 -0
- nemo_platform/types/guardrail/rails_config_param.py +81 -0
- nemo_platform/types/guardrail/rails_param.py +74 -0
- nemo_platform/types/guardrail/reasoning_config.py +32 -0
- nemo_platform/types/guardrail/reasoning_config_param.py +32 -0
- nemo_platform/types/guardrail/regex_detection.py +36 -0
- nemo_platform/types/guardrail/regex_detection_options.py +32 -0
- nemo_platform/types/guardrail/regex_detection_options_param.py +34 -0
- nemo_platform/types/guardrail/regex_detection_param.py +37 -0
- nemo_platform/types/guardrail/retrieval_rails.py +29 -0
- nemo_platform/types/guardrail/retrieval_rails_param.py +31 -0
- nemo_platform/types/guardrail/sensitive_data_detection.py +43 -0
- nemo_platform/types/guardrail/sensitive_data_detection_options.py +37 -0
- nemo_platform/types/guardrail/sensitive_data_detection_options_param.py +39 -0
- nemo_platform/types/guardrail/sensitive_data_detection_param.py +45 -0
- nemo_platform/types/guardrail/single_call_config.py +31 -0
- nemo_platform/types/guardrail/single_call_config_param.py +31 -0
- nemo_platform/types/guardrail/status_enum.py +22 -0
- nemo_platform/types/guardrail/task_prompt.py +63 -0
- nemo_platform/types/guardrail/task_prompt_param.py +65 -0
- nemo_platform/types/guardrail/tool_input_rails.py +36 -0
- nemo_platform/types/guardrail/tool_input_rails_param.py +38 -0
- nemo_platform/types/guardrail/tool_output_rails.py +36 -0
- nemo_platform/types/guardrail/tool_output_rails_param.py +38 -0
- nemo_platform/types/guardrail/tracing_config.py +48 -0
- nemo_platform/types/guardrail/tracing_config_param.py +50 -0
- nemo_platform/types/guardrail/trend_micro_rail_config.py +51 -0
- nemo_platform/types/guardrail/trend_micro_rail_config_param.py +51 -0
- nemo_platform/types/guardrail/user_messages_config.py +42 -0
- nemo_platform/types/guardrail/user_messages_config_param.py +42 -0
- nemo_platform/types/iam/__init__.py +26 -0
- nemo_platform/types/iam/date_range_filter_param.py +36 -0
- nemo_platform/types/iam/role_binding.py +42 -0
- nemo_platform/types/iam/role_binding_create_params.py +39 -0
- nemo_platform/types/iam/role_binding_delete_params.py +30 -0
- nemo_platform/types/iam/role_binding_filter_param.py +49 -0
- nemo_platform/types/iam/role_binding_list_params.py +44 -0
- nemo_platform/types/iam/role_bindings_page.py +37 -0
- nemo_platform/types/inference/__init__.py +60 -0
- nemo_platform/types/inference/deployment_config_create_params.py +47 -0
- nemo_platform/types/inference/deployment_config_list_params.py +46 -0
- nemo_platform/types/inference/deployment_config_update_params.py +37 -0
- nemo_platform/types/inference/deployment_configs/__init__.py +20 -0
- nemo_platform/types/inference/deployment_configs/version_list_response.py +25 -0
- nemo_platform/types/inference/deployment_create_params.py +45 -0
- nemo_platform/types/inference/deployment_list_models_response.py +23 -0
- nemo_platform/types/inference/deployment_list_params.py +52 -0
- nemo_platform/types/inference/deployment_update_params.py +35 -0
- nemo_platform/types/inference/deployment_update_status_params.py +42 -0
- nemo_platform/types/inference/deployments/__init__.py +20 -0
- nemo_platform/types/inference/deployments/version_list_response.py +25 -0
- nemo_platform/types/inference/gateway/__init__.py +38 -0
- nemo_platform/types/inference/gateway/model_patch_params.py +31 -0
- nemo_platform/types/inference/gateway/model_patch_response.py +23 -0
- nemo_platform/types/inference/gateway/model_post_params.py +31 -0
- nemo_platform/types/inference/gateway/model_post_response.py +23 -0
- nemo_platform/types/inference/gateway/model_put_params.py +31 -0
- nemo_platform/types/inference/gateway/model_put_response.py +23 -0
- nemo_platform/types/inference/gateway/openai/__init__.py +18 -0
- nemo_platform/types/inference/gateway/openai/v1/__init__.py +21 -0
- nemo_platform/types/inference/gateway/openai/v1/openai_list_models_resp.py +31 -0
- nemo_platform/types/inference/gateway/openai/v1/openai_model_resp.py +34 -0
- nemo_platform/types/inference/gateway/openai_patch_params.py +29 -0
- nemo_platform/types/inference/gateway/openai_patch_response.py +23 -0
- nemo_platform/types/inference/gateway/openai_post_params.py +29 -0
- nemo_platform/types/inference/gateway/openai_post_response.py +23 -0
- nemo_platform/types/inference/gateway/openai_put_params.py +29 -0
- nemo_platform/types/inference/gateway/openai_put_response.py +23 -0
- nemo_platform/types/inference/gateway/provider_patch_params.py +31 -0
- nemo_platform/types/inference/gateway/provider_patch_response.py +23 -0
- nemo_platform/types/inference/gateway/provider_post_params.py +31 -0
- nemo_platform/types/inference/gateway/provider_post_response.py +23 -0
- nemo_platform/types/inference/gateway/provider_put_params.py +31 -0
- nemo_platform/types/inference/gateway/provider_put_response.py +23 -0
- nemo_platform/types/inference/gateway/provider_ready_response.py +23 -0
- nemo_platform/types/inference/k8s_nim_operator_config.py +57 -0
- nemo_platform/types/inference/k8s_nim_operator_config_param.py +58 -0
- nemo_platform/types/inference/middleware_call.py +55 -0
- nemo_platform/types/inference/middleware_call_param.py +56 -0
- nemo_platform/types/inference/model_deployment.py +97 -0
- nemo_platform/types/inference/model_deployment_config.py +76 -0
- nemo_platform/types/inference/model_deployment_config_filter_param.py +49 -0
- nemo_platform/types/inference/model_deployment_configs_page.py +37 -0
- nemo_platform/types/inference/model_deployment_filter_param.py +56 -0
- nemo_platform/types/inference/model_deployment_status.py +24 -0
- nemo_platform/types/inference/model_deployment_status_history_item.py +37 -0
- nemo_platform/types/inference/model_deployments_page.py +37 -0
- nemo_platform/types/inference/model_provider.py +134 -0
- nemo_platform/types/inference/model_provider_filter_param.py +56 -0
- nemo_platform/types/inference/model_provider_sort.py +24 -0
- nemo_platform/types/inference/model_provider_status.py +24 -0
- nemo_platform/types/inference/model_providers_page.py +37 -0
- nemo_platform/types/inference/model_type.py +22 -0
- nemo_platform/types/inference/nim_deployment.py +96 -0
- nemo_platform/types/inference/nim_deployment_param.py +93 -0
- nemo_platform/types/inference/provider_create_params.py +94 -0
- nemo_platform/types/inference/provider_list_params.py +47 -0
- nemo_platform/types/inference/provider_update_params.py +87 -0
- nemo_platform/types/inference/provider_update_status_params.py +48 -0
- nemo_platform/types/inference/served_model_mapping.py +35 -0
- nemo_platform/types/inference/served_model_mapping_param.py +32 -0
- nemo_platform/types/inference/virtual_model.py +91 -0
- nemo_platform/types/inference/virtual_model_create_params.py +83 -0
- nemo_platform/types/inference/virtual_model_inference_config.py +32 -0
- nemo_platform/types/inference/virtual_model_inference_config_param.py +34 -0
- nemo_platform/types/inference/virtual_model_list_params.py +35 -0
- nemo_platform/types/inference/virtual_model_patch_params.py +80 -0
- nemo_platform/types/inference/virtual_models_page.py +37 -0
- nemo_platform/types/intake/__init__.py +86 -0
- nemo_platform/types/intake/app.py +51 -0
- nemo_platform/types/intake/app_create_params.py +38 -0
- nemo_platform/types/intake/app_filter_param.py +46 -0
- nemo_platform/types/intake/app_list_params.py +44 -0
- nemo_platform/types/intake/app_patch_params.py +35 -0
- nemo_platform/types/intake/app_sort_field.py +22 -0
- nemo_platform/types/intake/apps/__init__.py +26 -0
- nemo_platform/types/intake/apps/task.py +54 -0
- nemo_platform/types/intake/apps/task_create_params.py +40 -0
- nemo_platform/types/intake/apps/task_filter_param.py +49 -0
- nemo_platform/types/intake/apps/task_list_params.py +44 -0
- nemo_platform/types/intake/apps/task_patch_params.py +37 -0
- nemo_platform/types/intake/apps/task_sort_field.py +22 -0
- nemo_platform/types/intake/apps/tasks_page.py +37 -0
- nemo_platform/types/intake/apps_page.py +37 -0
- nemo_platform/types/intake/entries/__init__.py +20 -0
- nemo_platform/types/intake/entries/event_create_params.py +40 -0
- nemo_platform/types/intake/entry.py +98 -0
- nemo_platform/types/intake/entry_context.py +79 -0
- nemo_platform/types/intake/entry_context_filter_param.py +41 -0
- nemo_platform/types/intake/entry_context_param.py +82 -0
- nemo_platform/types/intake/entry_create_params.py +85 -0
- nemo_platform/types/intake/entry_data.py +48 -0
- nemo_platform/types/intake/entry_data_param.py +51 -0
- nemo_platform/types/intake/entry_filter_param.py +85 -0
- nemo_platform/types/intake/entry_list_params.py +47 -0
- nemo_platform/types/intake/entry_patch_params.py +79 -0
- nemo_platform/types/intake/entry_sort_field.py +22 -0
- nemo_platform/types/intake/entry_user_rating_filter_param.py +31 -0
- nemo_platform/types/intake/entrys_page.py +37 -0
- nemo_platform/types/intake/evaluation_context_param.py +41 -0
- nemo_platform/types/intake/evaluator_result.py +52 -0
- nemo_platform/types/intake/evaluator_result_create_params.py +52 -0
- nemo_platform/types/intake/evaluator_result_data_type.py +22 -0
- nemo_platform/types/intake/evaluator_result_event.py +67 -0
- nemo_platform/types/intake/evaluator_result_event_param.py +69 -0
- nemo_platform/types/intake/evaluator_result_filter_param.py +49 -0
- nemo_platform/types/intake/evaluator_result_list_params.py +43 -0
- nemo_platform/types/intake/evaluator_result_sort_field.py +22 -0
- nemo_platform/types/intake/evaluator_results_page.py +37 -0
- nemo_platform/types/intake/export_config_param.py +44 -0
- nemo_platform/types/intake/export_config_param_param.py +45 -0
- nemo_platform/types/intake/export_preview_params.py +34 -0
- nemo_platform/types/intake/export_preview_response.py +39 -0
- nemo_platform/types/intake/exports/__init__.py +28 -0
- nemo_platform/types/intake/exports/export_config.py +44 -0
- nemo_platform/types/intake/exports/export_job.py +76 -0
- nemo_platform/types/intake/exports/export_job_filter_param.py +50 -0
- nemo_platform/types/intake/exports/export_job_sort_field.py +22 -0
- nemo_platform/types/intake/exports/export_jobs_page.py +37 -0
- nemo_platform/types/intake/exports/export_status_details.py +35 -0
- nemo_platform/types/intake/exports/job_create_params.py +40 -0
- nemo_platform/types/intake/exports/job_list_params.py +46 -0
- nemo_platform/types/intake/exports/job_status.py +22 -0
- nemo_platform/types/intake/flexible_entry_request.py +63 -0
- nemo_platform/types/intake/flexible_entry_request_param.py +51 -0
- nemo_platform/types/intake/flexible_entry_response.py +62 -0
- nemo_platform/types/intake/flexible_entry_response_param.py +49 -0
- nemo_platform/types/intake/flexible_message.py +56 -0
- nemo_platform/types/intake/flexible_message_param.py +43 -0
- nemo_platform/types/intake/float_filter_param.py +32 -0
- nemo_platform/types/intake/ingest/__init__.py +37 -0
- nemo_platform/types/intake/ingest/atif_agent_param.py +35 -0
- nemo_platform/types/intake/ingest/atif_content_part_image_param.py +30 -0
- nemo_platform/types/intake/ingest/atif_content_part_param.py +28 -0
- nemo_platform/types/intake/ingest/atif_content_part_text_param.py +28 -0
- nemo_platform/types/intake/ingest/atif_create_params.py +52 -0
- nemo_platform/types/intake/ingest/atif_final_metrics_param.py +37 -0
- nemo_platform/types/intake/ingest/atif_image_source_param.py +28 -0
- nemo_platform/types/intake/ingest/atif_metrics_param.py +41 -0
- nemo_platform/types/intake/ingest/atif_observation_param.py +29 -0
- nemo_platform/types/intake/ingest/atif_observation_result_param.py +36 -0
- nemo_platform/types/intake/ingest/atif_step_agent_param.py +58 -0
- nemo_platform/types/intake/ingest/atif_step_param.py +29 -0
- nemo_platform/types/intake/ingest/atif_step_system_param.py +43 -0
- nemo_platform/types/intake/ingest/atif_step_user_param.py +43 -0
- nemo_platform/types/intake/ingest/atif_subagent_trajectory_ref_param.py +33 -0
- nemo_platform/types/intake/ingest/atif_tool_call_param.py +31 -0
- nemo_platform/types/intake/ingest/chat_completion_create_params.py +66 -0
- nemo_platform/types/intake/ingest/chat_completions_ingest_response.py +26 -0
- nemo_platform/types/intake/ingest/otlp/__init__.py +18 -0
- nemo_platform/types/intake/ingest/otlp/v1/__init__.py +20 -0
- nemo_platform/types/intake/ingest/otlp/v1/ingest_response.py +26 -0
- nemo_platform/types/intake/message_role.py +22 -0
- nemo_platform/types/intake/reviewer_annotation_event.py +95 -0
- nemo_platform/types/intake/reviewer_annotation_event_param.py +97 -0
- nemo_platform/types/intake/span.py +100 -0
- nemo_platform/types/intake/span_evaluation_context.py +40 -0
- nemo_platform/types/intake/span_filter_param.py +95 -0
- nemo_platform/types/intake/span_kind.py +24 -0
- nemo_platform/types/intake/span_list_params.py +46 -0
- nemo_platform/types/intake/span_sort_field.py +22 -0
- nemo_platform/types/intake/span_status.py +22 -0
- nemo_platform/types/intake/spans/__init__.py +20 -0
- nemo_platform/types/intake/spans/evaluator_result_list_response.py +25 -0
- nemo_platform/types/intake/spans_page.py +37 -0
- nemo_platform/types/intake/thumb_direction.py +22 -0
- nemo_platform/types/intake/trace.py +65 -0
- nemo_platform/types/intake/trace_filter_param.py +60 -0
- nemo_platform/types/intake/trace_list_params.py +49 -0
- nemo_platform/types/intake/trace_retrieve_params.py +32 -0
- nemo_platform/types/intake/trace_sort_field.py +22 -0
- nemo_platform/types/intake/traces_page.py +37 -0
- nemo_platform/types/intake/usage.py +65 -0
- nemo_platform/types/intake/usage_param.py +68 -0
- nemo_platform/types/intake/user_action_event.py +65 -0
- nemo_platform/types/intake/user_action_event_param.py +68 -0
- nemo_platform/types/intake/user_feedback_event.py +84 -0
- nemo_platform/types/intake/user_feedback_event_param.py +86 -0
- nemo_platform/types/intake/user_rating.py +68 -0
- nemo_platform/types/intake/user_rating_param.py +70 -0
- nemo_platform/types/jobs/__init__.py +95 -0
- nemo_platform/types/jobs/compute_resource_spec.py +32 -0
- nemo_platform/types/jobs/compute_resource_spec_param.py +32 -0
- nemo_platform/types/jobs/compute_resources.py +46 -0
- nemo_platform/types/jobs/compute_resources_param.py +47 -0
- nemo_platform/types/jobs/container_spec.py +35 -0
- nemo_platform/types/jobs/container_spec_param.py +37 -0
- nemo_platform/types/jobs/cpu_execution_provider.py +46 -0
- nemo_platform/types/jobs/cpu_execution_provider_param.py +46 -0
- nemo_platform/types/jobs/distributed_gpu_execution_provider.py +46 -0
- nemo_platform/types/jobs/distributed_gpu_execution_provider_param.py +46 -0
- nemo_platform/types/jobs/docker_job_execution_profile.py +43 -0
- nemo_platform/types/jobs/docker_job_execution_profile_config.py +52 -0
- nemo_platform/types/jobs/docker_job_network_config.py +27 -0
- nemo_platform/types/jobs/docker_job_storage_config.py +36 -0
- nemo_platform/types/jobs/docker_volume_mount.py +47 -0
- nemo_platform/types/jobs/e2e_job_execution_profile.py +43 -0
- nemo_platform/types/jobs/gpu_execution_provider.py +46 -0
- nemo_platform/types/jobs/gpu_execution_provider_param.py +46 -0
- nemo_platform/types/jobs/image_pull_secret.py +27 -0
- nemo_platform/types/jobs/job_create_params.py +46 -0
- nemo_platform/types/jobs/job_execution_profile_config.py +42 -0
- nemo_platform/types/jobs/job_get_logs_params.py +41 -0
- nemo_platform/types/jobs/job_list_execution_profiles_response.py +37 -0
- nemo_platform/types/jobs/job_list_params.py +47 -0
- nemo_platform/types/jobs/job_update_status_details_params.py +29 -0
- nemo_platform/types/jobs/kubernetes_empty_dir_volume.py +32 -0
- nemo_platform/types/jobs/kubernetes_job_execution_profile.py +43 -0
- nemo_platform/types/jobs/kubernetes_job_execution_profile_config.py +101 -0
- nemo_platform/types/jobs/kubernetes_job_storage_config.py +40 -0
- nemo_platform/types/jobs/kubernetes_object_metadata.py +28 -0
- nemo_platform/types/jobs/kubernetes_persistent_volume_claim.py +32 -0
- nemo_platform/types/jobs/kubernetes_volume.py +37 -0
- nemo_platform/types/jobs/kubernetes_volume_mount.py +38 -0
- nemo_platform/types/jobs/platform_job_environment_variable.py +36 -0
- nemo_platform/types/jobs/platform_job_environment_variable_param.py +37 -0
- nemo_platform/types/jobs/platform_job_list_task_response.py +29 -0
- nemo_platform/types/jobs/platform_job_response.py +75 -0
- nemo_platform/types/jobs/platform_job_responses_page.py +37 -0
- nemo_platform/types/jobs/platform_job_secret_environment_variable_ref.py +27 -0
- nemo_platform/types/jobs/platform_job_secret_environment_variable_ref_param.py +29 -0
- nemo_platform/types/jobs/platform_job_sort_field.py +22 -0
- nemo_platform/types/jobs/platform_job_spec.py +30 -0
- nemo_platform/types/jobs/platform_job_spec_param.py +32 -0
- nemo_platform/types/jobs/platform_job_step.py +75 -0
- nemo_platform/types/jobs/platform_job_step_spec.py +63 -0
- nemo_platform/types/jobs/platform_job_step_spec_param.py +65 -0
- nemo_platform/types/jobs/platform_job_step_with_context.py +67 -0
- nemo_platform/types/jobs/platform_job_step_with_contexts_page.py +37 -0
- nemo_platform/types/jobs/platform_job_steps_list_filter_param.py +38 -0
- nemo_platform/types/jobs/platform_job_task.py +75 -0
- nemo_platform/types/jobs/platform_jobs_list_filter_param.py +51 -0
- nemo_platform/types/jobs/result_create_params.py +34 -0
- nemo_platform/types/jobs/result_list_params.py +34 -0
- nemo_platform/types/jobs/step_lifecycle.py +37 -0
- nemo_platform/types/jobs/step_lifecycle_param.py +37 -0
- nemo_platform/types/jobs/step_list_params.py +44 -0
- nemo_platform/types/jobs/step_update_status_params.py +44 -0
- nemo_platform/types/jobs/subprocess_execution_provider.py +33 -0
- nemo_platform/types/jobs/subprocess_execution_provider_param.py +34 -0
- nemo_platform/types/jobs/subprocess_job_execution_profile.py +36 -0
- nemo_platform/types/jobs/subprocess_job_execution_profile_config.py +49 -0
- nemo_platform/types/jobs/task_create_or_update_params.py +46 -0
- nemo_platform/types/jobs/volcano_job_execution_profile.py +39 -0
- nemo_platform/types/jobs/volcano_job_execution_profile_config.py +114 -0
- nemo_platform/types/members/__init__.py +24 -0
- nemo_platform/types/members/member_create_params.py +40 -0
- nemo_platform/types/members/member_delete_params.py +32 -0
- nemo_platform/types/members/member_update_params.py +37 -0
- nemo_platform/types/members/workspace_member.py +39 -0
- nemo_platform/types/members/workspace_member_list_response.py +29 -0
- nemo_platform/types/models/__init__.py +34 -0
- nemo_platform/types/models/adapter.py +73 -0
- nemo_platform/types/models/adapter_create_params.py +54 -0
- nemo_platform/types/models/adapter_update_params.py +37 -0
- nemo_platform/types/models/base_model_filter_param.py +29 -0
- nemo_platform/types/models/finetuning_type_filter_param.py +31 -0
- nemo_platform/types/models/lora.py +30 -0
- nemo_platform/types/models/lora_param.py +30 -0
- nemo_platform/types/models/model_create_params.py +93 -0
- nemo_platform/types/models/model_entity.py +112 -0
- nemo_platform/types/models/model_entity_filter_param.py +72 -0
- nemo_platform/types/models/model_entity_sort_field.py +22 -0
- nemo_platform/types/models/model_entitys_page.py +37 -0
- nemo_platform/types/models/model_list_params.py +50 -0
- nemo_platform/types/models/model_retrieve_params.py +29 -0
- nemo_platform/types/models/model_update_params.py +86 -0
- nemo_platform/types/projects/__init__.py +25 -0
- nemo_platform/types/projects/project.py +45 -0
- nemo_platform/types/projects/project_create_params.py +37 -0
- nemo_platform/types/projects/project_list_params.py +49 -0
- nemo_platform/types/projects/project_sort_field.py +22 -0
- nemo_platform/types/projects/project_update_params.py +29 -0
- nemo_platform/types/projects/projects_page.py +37 -0
- nemo_platform/types/safe_synthesizer/__init__.py +68 -0
- nemo_platform/types/safe_synthesizer/classify_config.py +41 -0
- nemo_platform/types/safe_synthesizer/classify_config_param.py +43 -0
- nemo_platform/types/safe_synthesizer/column.py +46 -0
- nemo_platform/types/safe_synthesizer/column_actions.py +36 -0
- nemo_platform/types/safe_synthesizer/column_actions_param.py +38 -0
- nemo_platform/types/safe_synthesizer/column_param.py +49 -0
- nemo_platform/types/safe_synthesizer/data_parameters.py +69 -0
- nemo_platform/types/safe_synthesizer/data_parameters_param.py +69 -0
- nemo_platform/types/safe_synthesizer/differential_privacy_hyperparams.py +48 -0
- nemo_platform/types/safe_synthesizer/differential_privacy_hyperparams_param.py +48 -0
- nemo_platform/types/safe_synthesizer/evaluation_parameters.py +64 -0
- nemo_platform/types/safe_synthesizer/evaluation_parameters_param.py +66 -0
- nemo_platform/types/safe_synthesizer/generate_parameters.py +104 -0
- nemo_platform/types/safe_synthesizer/generate_parameters_param.py +102 -0
- nemo_platform/types/safe_synthesizer/gliner_config.py +41 -0
- nemo_platform/types/safe_synthesizer/gliner_config_param.py +41 -0
- nemo_platform/types/safe_synthesizer/globals.py +45 -0
- nemo_platform/types/safe_synthesizer/globals_param.py +47 -0
- nemo_platform/types/safe_synthesizer/job_create_params.py +46 -0
- nemo_platform/types/safe_synthesizer/job_get_logs_params.py +30 -0
- nemo_platform/types/safe_synthesizer/job_list_params.py +44 -0
- nemo_platform/types/safe_synthesizer/jobs/__init__.py +21 -0
- nemo_platform/types/safe_synthesizer/jobs/safe_synthesizer_summary.py +95 -0
- nemo_platform/types/safe_synthesizer/jobs/safe_synthesizer_timing.py +41 -0
- nemo_platform/types/safe_synthesizer/ner_config.py +42 -0
- nemo_platform/types/safe_synthesizer/ner_config_param.py +44 -0
- nemo_platform/types/safe_synthesizer/pii_replacer_config.py +40 -0
- nemo_platform/types/safe_synthesizer/pii_replacer_config_param.py +42 -0
- nemo_platform/types/safe_synthesizer/row.py +50 -0
- nemo_platform/types/safe_synthesizer/row_actions.py +33 -0
- nemo_platform/types/safe_synthesizer/row_actions_param.py +35 -0
- nemo_platform/types/safe_synthesizer/row_param.py +53 -0
- nemo_platform/types/safe_synthesizer/safe_synthesizer_job.py +63 -0
- nemo_platform/types/safe_synthesizer/safe_synthesizer_job_config.py +55 -0
- nemo_platform/types/safe_synthesizer/safe_synthesizer_job_config_param.py +56 -0
- nemo_platform/types/safe_synthesizer/safe_synthesizer_jobs_list_filter_param.py +49 -0
- nemo_platform/types/safe_synthesizer/safe_synthesizer_jobs_page.py +37 -0
- nemo_platform/types/safe_synthesizer/safe_synthesizer_jobs_sort_field.py +22 -0
- nemo_platform/types/safe_synthesizer/safe_synthesizer_parameters.py +91 -0
- nemo_platform/types/safe_synthesizer/safe_synthesizer_parameters_param.py +92 -0
- nemo_platform/types/safe_synthesizer/step_definition.py +39 -0
- nemo_platform/types/safe_synthesizer/step_definition_param.py +41 -0
- nemo_platform/types/safe_synthesizer/time_series_parameters.py +73 -0
- nemo_platform/types/safe_synthesizer/time_series_parameters_param.py +74 -0
- nemo_platform/types/safe_synthesizer/training_hyperparams.py +165 -0
- nemo_platform/types/safe_synthesizer/training_hyperparams_param.py +167 -0
- nemo_platform/types/safe_synthesizer/validation_parameters.py +54 -0
- nemo_platform/types/safe_synthesizer/validation_parameters_param.py +54 -0
- nemo_platform/types/secrets/__init__.py +28 -0
- nemo_platform/types/secrets/platform_secret_access_response.py +33 -0
- nemo_platform/types/secrets/platform_secret_admin_rotation_response.py +28 -0
- nemo_platform/types/secrets/platform_secret_response.py +40 -0
- nemo_platform/types/secrets/platform_secret_responses_page.py +37 -0
- nemo_platform/types/secrets/secret_create_params.py +39 -0
- nemo_platform/types/secrets/secret_list_params.py +32 -0
- nemo_platform/types/secrets/secret_update_params.py +32 -0
- nemo_platform/types/shared/__init__.py +50 -0
- nemo_platform/types/shared/api_endpoint_data.py +43 -0
- nemo_platform/types/shared/auth_context.py +48 -0
- nemo_platform/types/shared/auth_discovery_response.py +32 -0
- nemo_platform/types/shared/backend_format.py +22 -0
- nemo_platform/types/shared/datetime_filter.py +33 -0
- nemo_platform/types/shared/delete_response.py +33 -0
- nemo_platform/types/shared/error_response.py +46 -0
- nemo_platform/types/shared/field_error.py +28 -0
- nemo_platform/types/shared/file_storage_type.py +22 -0
- nemo_platform/types/shared/fileset_metadata.py +46 -0
- nemo_platform/types/shared/finetuning_type.py +48 -0
- nemo_platform/types/shared/generic_sort_field.py +22 -0
- nemo_platform/types/shared/http_validation_error.py +27 -0
- nemo_platform/types/shared/linear_layer_spec.py +33 -0
- nemo_platform/types/shared/mamba_config.py +44 -0
- nemo_platform/types/shared/mo_e_config.py +41 -0
- nemo_platform/types/shared/model_metadata_content.py +38 -0
- nemo_platform/types/shared/model_spec.py +111 -0
- nemo_platform/types/shared/oidc_discovery_response.py +42 -0
- nemo_platform/types/shared/pagination_data.py +37 -0
- nemo_platform/types/shared/platform_job_list_result_response.py +27 -0
- nemo_platform/types/shared/platform_job_log.py +34 -0
- nemo_platform/types/shared/platform_job_log_page.py +33 -0
- nemo_platform/types/shared/platform_job_result_response.py +44 -0
- nemo_platform/types/shared/platform_job_status.py +24 -0
- nemo_platform/types/shared/platform_job_status_response.py +48 -0
- nemo_platform/types/shared/platform_job_step_status_response.py +48 -0
- nemo_platform/types/shared/platform_job_task_status_response.py +47 -0
- nemo_platform/types/shared/prompt_data.py +47 -0
- nemo_platform/types/shared/sliding_window_config.py +27 -0
- nemo_platform/types/shared/tool_call_config.py +46 -0
- nemo_platform/types/shared/tool_calling_metadata_content.py +48 -0
- nemo_platform/types/shared/validation_error.py +34 -0
- nemo_platform/types/shared_params/__init__.py +33 -0
- nemo_platform/types/shared_params/api_endpoint_data.py +38 -0
- nemo_platform/types/shared_params/backend_format.py +24 -0
- nemo_platform/types/shared_params/datetime_filter.py +34 -0
- nemo_platform/types/shared_params/file_storage_type.py +24 -0
- nemo_platform/types/shared_params/finetuning_type.py +50 -0
- nemo_platform/types/shared_params/generic_sort_field.py +24 -0
- nemo_platform/types/shared_params/linear_layer_spec.py +35 -0
- nemo_platform/types/shared_params/mamba_config.py +44 -0
- nemo_platform/types/shared_params/mo_e_config.py +41 -0
- nemo_platform/types/shared_params/model_metadata_content.py +39 -0
- nemo_platform/types/shared_params/model_spec.py +113 -0
- nemo_platform/types/shared_params/platform_job_status.py +26 -0
- nemo_platform/types/shared_params/prompt_data.py +48 -0
- nemo_platform/types/shared_params/sliding_window_config.py +29 -0
- nemo_platform/types/shared_params/tool_call_config.py +46 -0
- nemo_platform/types/shared_params/tool_calling_metadata_content.py +48 -0
- nemo_platform/types/workspaces/__init__.py +24 -0
- nemo_platform/types/workspaces/workspace.py +48 -0
- nemo_platform/types/workspaces/workspace_create_params.py +41 -0
- nemo_platform/types/workspaces/workspace_list_params.py +47 -0
- nemo_platform/types/workspaces/workspace_update_params.py +27 -0
- nemo_platform/types/workspaces/workspaces_page.py +37 -0
- nemo_platform/ui/__init__.py +15 -0
- nemo_platform/ui/output.py +109 -0
- nemo_platform/ui/prompts.py +678 -0
- nemo_platform_plugin/.agents/skills/creating-a-plugin/SKILL.md +275 -0
- nemo_platform_plugin/.agents/skills/plugin-config/SKILL.md +168 -0
- nemo_platform_plugin/.agents/skills/plugin-controller/SKILL.md +320 -0
- nemo_platform_plugin/.agents/skills/plugin-entities/SKILL.md +290 -0
- nemo_platform_plugin/.agents/skills/plugin-function/SKILL.md +292 -0
- nemo_platform_plugin/.agents/skills/plugin-inference-middleware/SKILL.md +346 -0
- nemo_platform_plugin/.agents/skills/plugin-job/SKILL.md +247 -0
- nemo_platform_plugin/.agents/skills/plugin-platform-services/SKILL.md +239 -0
- nemo_platform_plugin/.agents/skills/plugin-platform-services/services-reference.md +192 -0
- nemo_platform_plugin/.agents/skills/plugin-service/SKILL.md +181 -0
- nemo_platform_plugin/.agents/skills/plugin-service/crud-example.md +353 -0
- nemo_platform_plugin/.agents/skills/plugin-testing/SKILL.md +206 -0
- nemo_platform_plugin/README.md +43 -0
- nemo_platform_plugin/_base.py +53 -0
- nemo_platform_plugin/_spec_flags.py +573 -0
- nemo_platform_plugin/api/filter.py +189 -0
- nemo_platform_plugin/api/parsed_filter.py +288 -0
- nemo_platform_plugin/api/text_filter.py +291 -0
- nemo_platform_plugin/cli.py +152 -0
- nemo_platform_plugin/cli_errors.py +232 -0
- nemo_platform_plugin/cli_renderer.py +92 -0
- nemo_platform_plugin/commands.py +1433 -0
- nemo_platform_plugin/config.py +844 -0
- nemo_platform_plugin/controller.py +148 -0
- nemo_platform_plugin/dependencies.py +64 -0
- nemo_platform_plugin/discovery.py +484 -0
- nemo_platform_plugin/docs/ARCHITECTURE.md +160 -0
- nemo_platform_plugin/docs/CONFIG.md +151 -0
- nemo_platform_plugin/docs/CONTROLLER.md +209 -0
- nemo_platform_plugin/docs/ENTITY.md +186 -0
- nemo_platform_plugin/docs/INFERENCE_MIDDLEWARE.md +408 -0
- nemo_platform_plugin/docs/JOB.md +237 -0
- nemo_platform_plugin/docs/QUICKSTART.md +306 -0
- nemo_platform_plugin/docs/SERVICE.md +302 -0
- nemo_platform_plugin/entities.py +793 -0
- nemo_platform_plugin/entity.py +79 -0
- nemo_platform_plugin/entity_client.py +54 -0
- nemo_platform_plugin/filter_ops.py +169 -0
- nemo_platform_plugin/function.py +299 -0
- nemo_platform_plugin/function_context.py +61 -0
- nemo_platform_plugin/functions/frames.py +69 -0
- nemo_platform_plugin/functions/routes.py +454 -0
- nemo_platform_plugin/inference_middleware.py +1191 -0
- nemo_platform_plugin/interface.py +28 -0
- nemo_platform_plugin/job.py +370 -0
- nemo_platform_plugin/job_context.py +86 -0
- nemo_platform_plugin/job_results.py +209 -0
- nemo_platform_plugin/jobs/_cli_options.py +204 -0
- nemo_platform_plugin/jobs/api_factory.py +1178 -0
- nemo_platform_plugin/jobs/constants.py +27 -0
- nemo_platform_plugin/jobs/docker.py +76 -0
- nemo_platform_plugin/jobs/exceptions.py +8 -0
- nemo_platform_plugin/jobs/file_manager.py +238 -0
- nemo_platform_plugin/jobs/openapi_utils.py +174 -0
- nemo_platform_plugin/jobs/profile.py +110 -0
- nemo_platform_plugin/jobs/result_manager.py +291 -0
- nemo_platform_plugin/jobs/routes.py +297 -0
- nemo_platform_plugin/jobs/schemas.py +174 -0
- nemo_platform_plugin/refs.py +154 -0
- nemo_platform_plugin/run_dependencies.py +137 -0
- nemo_platform_plugin/scheduler.py +537 -0
- nemo_platform_plugin/schema.py +216 -0
- nemo_platform_plugin/sdk.py +34 -0
- nemo_platform_plugin/seed.py +71 -0
- nemo_platform_plugin/service.py +130 -0
- nemo_platform_plugin/tasks/dispatcher.py +226 -0
- nemo_platform_plugin-0.1.0.dist-info/METADATA +88 -0
- nemo_platform_plugin-0.1.0.dist-info/RECORD +1224 -0
- 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")
|