fix(onboard): preflight NEMOCLAW_VLLM_MODEL before side effects (#5207) - #5214
Conversation
A non-interactive `nemoclaw onboard` with an unrecognised NEMOCLAW_VLLM_MODEL slug only validated the value deep inside the express-vLLM installer (the [3/8] provider step). The variable was thus checked late and ignored entirely on non-installer paths, so onboarding could run past the failure instead of failing fast with a non-zero exit. Validate the variable up front in onboard(), mirroring the connect preflight added in #4567: run the installer's selectVllmModelFromEnv + assertGatedModelAccess checks before preflight/Docker and exit non-zero with the canonical, slug-listing error message. Signed-off-by: Jason Ma <jama@nvidia.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
📝 WalkthroughWalkthroughThe PR adds an early call to preflightVllmModelEnvOrExit() during onboarding to validate NEMOCLAW_VLLM_MODEL (and provider hint), exiting with status 1 on invalid slugs; it also adds a regression test asserting the fast-fail happens before any preflight steps run. ChangesvLLM Model Validation in Onboarding
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related issues
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
…l-preflight-5207 # Conflicts: # src/lib/onboard.ts
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/lib/onboard.ts`:
- Around line 5699-5711: The added preflight block in onboard.ts
(preflightVllmModelEnv + vllmModelPreflight check) increases file size; extract
this wiring into a small helper to keep onboard.ts within budget. Create a new
helper (e.g., ensureVllmModelPreflight or validateVllmModelEnv) under
src/lib/onboard/* that calls preflightVllmModelEnv and exits on failure, then
replace the inline block in onboard.ts with a single call to that helper; keep
references to preflightVllmModelEnv, selectVllmModelFromEnv and
assertGatedModelAccess unchanged so tests and behavior remain the same.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 9f24e718-017a-433d-88e1-8c0bb0ab08a4
📒 Files selected for processing (2)
src/lib/onboard.tstest/onboard-vllm-model-preflight.test.ts
E2E Advisor RecommendationRequired E2E: Dispatch hint: Full advisor summaryE2E Recommendation AdvisorBase: Required E2E
Optional E2E
New E2E recommendations
Dispatch hint
|
Vitest E2E Scenario RecommendationRequired Vitest E2E scenarios: Dispatch required Vitest E2E scenarios:
Full Vitest E2E advisor summaryVitest E2E Scenario AdvisorBase: Required Vitest E2E scenarios
Optional Vitest E2E scenarios
Relevant changed files
|
PR Review AdvisorFindings: 0 needs attention, 0 worth checking, 0 nice ideas Consider writing more tests for
This is an automated advisory review. A human maintainer must make the final merge decision. |
Keep src/lib/onboard.ts net-neutral per the codebase-growth guardrail: the NEMOCLAW_VLLM_MODEL fast-fail check now lives in src/lib/onboard/vllm-model-preflight.ts and is composed with the early NEMOCLAW_PROVIDER hint check via resume-config's preflightEarlyOnboardEnv(). Behavior is unchanged from the previous commit. Signed-off-by: Jason Ma <jama@nvidia.com> Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/lib/onboard.ts`:
- Around line 5060-5064: The call to resumeConfig.preflightEarlyOnboardEnv()
omits the nonInteractive flag so it defaults to false and skips provider-hint
validation during non-interactive runs; update the call to pass the current
non-interactive setting (e.g.,
resumeConfig.preflightEarlyOnboardEnv(nonInteractive) or the appropriate
options.nonInteractive value available in scope) so preflightEarlyOnboardEnv
receives the correct boolean and runs the non-interactive validation path.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: f70751aa-2811-432e-bbf0-aac4d81e9327
📒 Files selected for processing (3)
src/lib/onboard.tssrc/lib/onboard/resume-config.tssrc/lib/onboard/vllm-model-preflight.ts
| // Validate NEMOCLAW_PROVIDER and NEMOCLAW_VLLM_MODEL early so invalid values | ||
| // fail before preflight (Docker/OpenShell checks). Without this, users see a | ||
| // misleading 'Docker is not reachable' error instead of the real | ||
| // problem: an unsupported provider value. | ||
| getRequestedProviderHint(); | ||
| // problem: an unsupported provider value or unrecognised vLLM model slug. | ||
| resumeConfig.preflightEarlyOnboardEnv(); |
There was a problem hiding this comment.
Pass the non-interactive mode into early env preflight.
preflightEarlyOnboardEnv() defaults nonInteractive to false, so this call skips the provider-hint validation path in non-interactive onboard runs.
🔧 Minimal fix
- resumeConfig.preflightEarlyOnboardEnv();
+ resumeConfig.preflightEarlyOnboardEnv(isNonInteractive());📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // Validate NEMOCLAW_PROVIDER and NEMOCLAW_VLLM_MODEL early so invalid values | |
| // fail before preflight (Docker/OpenShell checks). Without this, users see a | |
| // misleading 'Docker is not reachable' error instead of the real | |
| // problem: an unsupported provider value. | |
| getRequestedProviderHint(); | |
| // problem: an unsupported provider value or unrecognised vLLM model slug. | |
| resumeConfig.preflightEarlyOnboardEnv(); | |
| // Validate NEMOCLAW_PROVIDER and NEMOCLAW_VLLM_MODEL early so invalid values | |
| // fail before preflight (Docker/OpenShell checks). Without this, users see a | |
| // misleading 'Docker is not reachable' error instead of the real | |
| // problem: an unsupported provider value or unrecognised vLLM model slug. | |
| resumeConfig.preflightEarlyOnboardEnv(isNonInteractive()); |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/lib/onboard.ts` around lines 5060 - 5064, The call to
resumeConfig.preflightEarlyOnboardEnv() omits the nonInteractive flag so it
defaults to false and skips provider-hint validation during non-interactive
runs; update the call to pass the current non-interactive setting (e.g.,
resumeConfig.preflightEarlyOnboardEnv(nonInteractive) or the appropriate
options.nonInteractive value available in scope) so preflightEarlyOnboardEnv
receives the correct boolean and runs the non-interactive validation path.
## Summary Refreshes release-prep documentation for NemoClaw v0.0.65. Adds the v0.0.65 release-notes section and refreshes generated `nemoclaw-user-*` skills from the Fern MDX source docs. ## Changes - Added the v0.0.65 release notes to `docs/about/release-notes.mdx` with links to the deeper docs pages for lifecycle, troubleshooting, inference, CLI commands, messaging, credentials, network policy, Hermes, and sub-agents. - Regenerated the `nemoclaw-user-*` skills with `scripts/docs-to-skills.py` so release-prep skill output matches the merged source docs. - Used the v0.0.65 announcement discussion as release context: #5472. ## Source Summary - #2492 -> `docs/about/release-notes.mdx`: Documents deadline-based gateway wait reliability in the v0.0.65 recovery summary. - #4958 -> `docs/about/release-notes.mdx`: Documents re-execed OpenClaw gateway health check recovery in the sandbox recovery summary. - #5163 -> `docs/about/release-notes.mdx`: Documents safer uninstall TTY confirmation behavior in the day-two CLI summary. - #5178 -> `docs/about/release-notes.mdx`: Documents fail-closed config restore merge behavior in the rebuild and restore summary. - #5179 -> `docs/about/release-notes.mdx`: Documents WeChat QR token redaction in the messaging summary. - #5182 -> `docs/about/release-notes.mdx`: Documents sustained gateway serving checks in the recovery summary. - #5194 -> `docs/about/release-notes.mdx`: Documents model-router teardown during uninstall in the day-two CLI summary. - #5195 -> `docs/about/release-notes.mdx`: Documents Shields auto-restore lock reconfirmation in the rebuild and restore summary. - #5198 -> `docs/about/release-notes.mdx`: Documents Docker Desktop WSL CDI injection failure handling in the onboarding diagnostics summary. - #5201 -> `docs/about/release-notes.mdx`: Documents sandbox download/upload wrappers and sessions export in the day-two CLI summary. - #5205 -> `docs/about/release-notes.mdx`: Documents reporter-owned model metadata preservation in the rebuild and restore summary. - #5214 -> `docs/about/release-notes.mdx`: Documents managed vLLM model preflight before side effects in the inference setup summary. - #5215 -> `docs/about/release-notes.mdx`: Documents managed vLLM extra serve arguments in the inference setup summary. - #5216 -> `docs/about/release-notes.mdx`: Documents silent OpenClaw runtime fallback surfacing in the onboarding diagnostics summary. - #5225 -> `docs/about/release-notes.mdx`: Documents persisted sandbox gateway lookup in the gateway recovery summary. - #5238 -> `docs/about/release-notes.mdx`: Documents sub-agent gateway dial-back through the sandbox interface in the Hermes and sub-agent summary. - #5248 -> `docs/about/release-notes.mdx`: Documents Discord per-account proxy resolution in the messaging summary. - #5264 -> `docs/about/release-notes.mdx`: Documents reserved Hermes port `8642` handling in the Hermes compatibility summary. - #5267 -> `docs/about/release-notes.mdx`: Documents the narrower Hermes baseline policy in the Hermes compatibility summary. - #5321 -> `docs/about/release-notes.mdx`: Documents restored gateway guard chains in the gateway recovery summary. - #5328 -> `docs/about/release-notes.mdx`: Documents compact persisted messaging plans in the messaging summary. - #5338 -> `docs/about/release-notes.mdx`: Documents manifest channel migration in the messaging summary. - #5352 -> `docs/about/release-notes.mdx`: Documents persisted agent preservation through registry recovery in the rebuild and restore summary. - #5371 -> `.agents/skills/nemoclaw-user-reference/references/commands.md`: Refreshes generated skill output for custom build cache and layer-ordering source docs. - #5379 -> `docs/about/release-notes.mdx`: Documents dashboard port allocation across multiple NemoClaw gateways in the recovery summary. - #5382 -> `docs/about/release-notes.mdx`: Documents recovery when an active gateway has no sandbox spec in the recovery summary. - #5389 -> `.agents/skills/nemoclaw-user-reference/references/troubleshooting.md`: Refreshes generated skill output for declared agent `forward_ports` recovery source docs. - #5400 -> `docs/about/release-notes.mdx`: Documents bounded compatible endpoint probes in the inference setup summary. - #5410 -> `docs/about/release-notes.mdx`: Documents provider credential hash removal from sandbox registry entries in the messaging summary. - #5418 -> `docs/about/release-notes.mdx`: Documents summarized inference validation failures in the onboarding diagnostics summary. - #5457 -> `docs/about/release-notes.mdx`: Documents context-window recomputation after runtime model switches in the inference setup summary. - #5463 -> `docs/about/release-notes.mdx`: Documents cleanup of hard-coded messaging channel stragglers in the messaging summary. ## Skipped - #5366 matched `docs/.docs-skip` entries through skipped experimental paths, so this PR does not add new release-note text for that commit. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [ ] Doc only (prose changes, no code sample modifications) - [x] Doc only (includes code sample changes) ## Verification - [x] Git hooks passed during commit and push, or `npx prek run --from-ref main --to-ref HEAD` passes - [ ] Targeted tests pass for changed behavior - [ ] Full `npm test` passes (broad runtime changes only) - [ ] Tests added or updated for new or changed behavior - [x] No secrets, API keys, or credentials committed - [x] Docs updated for user-facing behavior changes - [ ] `npm run docs` builds without warnings (doc changes only) - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [ ] New doc pages include SPDX header and frontmatter (new pages only) Verification notes: - `npm run docs` passed after rerunning outside the sandbox. Fern reported 0 errors and 1 hidden warning. - The first sandboxed `npm run docs` attempt failed before validation because `tsx` could not create its local IPC pipe under sandbox restrictions. - `npm run build:cli` passed before push to refresh the local `dist/` artifacts used by the CLI typecheck hook. - `npm test` was not run because this is a docs-only release refresh. --- Signed-off-by: Miyoung Choi <miyoungc@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Released NemoClaw v0.0.65 with improved gateway/sandbox recovery, safer day-two workflows, and enhanced Hermes compatibility. * Added managed vLLM extra-arguments configuration via `NEMOCLAW_VLLM_EXTRA_ARGS_JSON`. * Added Hermes troubleshooting guidance for port forwarding and health checks. * **Documentation** * Updated NVIDIA Endpoints/NIM setup and examples to use `NVIDIA_INFERENCE_API_KEY`. * Refined NVIDIA network policy and Model Router API base configuration. * Expanded CLI/environment variable documentation (including sub-agent gateway connectivity) and plugin build performance tips. * **Tests** * Expanded Vitest-backed E2E release validation coverage. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Summary
Non-interactive
nemoclaw onboardnow validatesNEMOCLAW_VLLM_MODELup front, so an unrecognised (or gated, token-less) slug fails fast with a non-zero exit code and the canonical, slug-listing error message — before preflight, Docker, or any sandbox side effects.Related Issue
Fixes #5207
Changes
src/lib/onboard.ts: callpreflightVllmModelEnv()early inonboard(), alongside the existing earlyNEMOCLAW_PROVIDERvalidation (beforeacquireOnboardLock/preflight). On failure it prints the installer's error verbatim and exits 1. This mirrors theconnectpreflight added in fix(inference): preflight NEMOCLAW_VLLM_MODEL on sandbox connect #4567 (NVBug 6282062) for the analogous code path the issue calls out.test/onboard-vllm-model-preflight.test.ts: regression test — a non-interactiveonboardwithNEMOCLAW_VLLM_MODEL=not-a-real-modelexits 1, surfaces the slug error on stderr, and never reaches the[1/8] Preflight checksstep (proving the fast-fail happens before any side effects).Root cause
NEMOCLAW_VLLM_MODELwas only consulted deep inside the express-vLLM installer (resolveVllmInstallModel, the[3/8]provider step). That made the variable validated late and path-dependent: any onboard path that does not run the installer silently ignored an invalid slug, so the failure was not reliably surfaced as a non-zero exit. The fix adds one up-front, path-independent validation surface, exactly asconnectgot in #4567.Type of Change
Verification
npx prek run --all-filespassesnpm testpassesnpm run docsbuilds without warnings (doc changes only)Signed-off-by: Jason Ma jama@nvidia.com
Summary by CodeRabbit
Bug Fixes
Tests