Repository navigation
fix(dcode): apply the compatible-endpoint reasoning effort at runtime - #7971
Conversation
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (3)
🚧 Files skipped from review as they are similar to previous changes (3)
📝 WalkthroughWalkthroughThe change adds managed reasoning-effort configuration for LangChain Deep Agents Code. DCode profiles resolve ChangesManaged DCode reasoning effort
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant StartupProfile
participant ImageBuild
participant GenerateConfig
participant ManagedRuntime
participant ProviderPatch
participant OpenAIEndpoint
StartupProfile->>ImageBuild: Provide NEMOCLAW_REASONING_EFFORT
ImageBuild->>ImageBuild: Validate and record reasoning effort
GenerateConfig->>GenerateConfig: Read and validate NEMOCLAW_REASONING_EFFORT
ManagedRuntime->>ManagedRuntime: Read managed_reasoning_effort()
ProviderPatch->>ProviderPatch: Add extra_body.reasoning_effort
ProviderPatch->>OpenAIEndpoint: Send request with reasoning_effort
Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in commit 0a71152 in the TypeScript / code-coverage/cliThe overall coverage in commit 0a71152 in the Show a code coverage summary of the most impacted files.
Updated |
|
🌿 Preview your docs: https://nvidia-preview-pr-7971.docs.buildwithfern.com/nemoclaw |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 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 `@agents/langchain-deepagents-code/managed-dcode-runtime.py`:
- Around line 1333-1338: Extend the reasoning-effort negative-path tests around
managed_reasoning_effort() to replace the fixture capability path with a
symbolic link, then assert the function returns None and generated OpenAI kwargs
omit extra_body. Ensure the test also verifies the rejection does not expose
sensitive capability-path details through errors, logs, state, or process
arguments.
In `@docs/inference/configure-model-capabilities.mdx`:
- Line 92: Update the reasoning-effort instruction associated with the page’s
agent-variants metadata to refer only to OpenClaw, removing the Hermes reference
from this OpenClaw-only page. Do not add Hermes guidance here; place it on a
page published for Hermes if needed, and ensure rendered navigation remains
scoped to the correct agent variant.
In `@test/langchain-deepagents-code-reasoning-effort.test.ts`:
- Around line 81-91: Remove the contents-based conditional from the
parameterized test using writeManagedReasoningEffort. Move the null “missing
capability file” case into a separate it block, and keep the remaining
parameterized cases limited to inputs that write a capability file.
🪄 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: 0dad58f5-7144-4d7b-bfd4-74bfda096843
📒 Files selected for processing (10)
agents/langchain-deepagents-code/Dockerfileagents/langchain-deepagents-code/generate-config.tsagents/langchain-deepagents-code/managed-dcode-runtime.pyagents/langchain-deepagents-code/patch-managed-deepagents-code.pydocs/get-started/quickstart-langchain-deepagents-code.mdxdocs/inference/configure-model-capabilities.mdxscripts/check-dcode-profile-import-gate.shtest/helpers/langchain-deepagents-code-patch-fixture.tstest/langchain-deepagents-code-config.test.tstest/langchain-deepagents-code-reasoning-effort.test.ts
PR Review Advisor — No blocking findings reportedAdvisor assessment: No blocking advisor findings reported Model lanes
Nemotron output stays in workflow artifacts and does not change the assessment above. E2E guidanceAdvisory only. E2E / PR Gate selects and runs jobs independently. Recommended E2E: This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge. |
…onal Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
The managed startup profile requires every stock Docker input to map to a versioned startup field or a declared build-only exclusion, and the new reasoning-effort build argument had neither. It now maps to the same tuning field OpenClaw uses, and the DCode mapper emits the root-owned capability file the sandbox runtime reads, matching the auto-approval input it sits beside. Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
jyaunches
left a comment
There was a problem hiding this comment.
Approved after exact-revision merge gate: current head/base CI and selected E2E evidence pass, the linked supported regression is covered by tests and documentation, contributor requirements pass, and no unresolved correctness or security findings remain.
<!-- markdownlint-disable MD041 --> ## Summary Adds the canonical dated changelog entry for `v0.0.100` so the maintainer release plan can verify the pre-tag documentation prerequisite. The entry summarizes the user-facing changes merged since `v0.0.99` and links to the relevant guides. ## Changes - Add `docs/changelog/2026-07-31.mdx` with the exact `## v0.0.100` heading. - Cover restored OpenClaw pairing, transactional replacement, Deep Agents Code, onboarding recovery, lifecycle cleanup, Hermes builds, host provenance, documentation, and trusted E2E evidence. - Distinguish active Docker and Kubernetes runtime-bundle enforcement from the still-inactive managed shared-state transaction foundation. ## Source Coverage The release entry maps the doc-impacting merged PRs in the `v0.0.99..main` release range to `docs/changelog/2026-07-31.mdx`: #8021, #8024, #7973, #8028, #7947, #7788, #7884, #8023, #7969, #8020, #7989, #8000, #7907, #7942, #7567, #8013, #7955, #8017, #8014, #8015, #7629, #7644, #7821, #7971, and #7991. PR #7974 was reviewed after the final rebase and excluded because it changes internal maintainer-skill attribution policy and tests only; it does not change a user-facing product or documentation surface. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [x] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates - [ ] Tests added or updated for changed behavior - [x] Existing tests cover changed behavior — justification: the changelog contract test validates the dated entry, version heading, SPDX form, and route constraints. - [ ] Tests not applicable — justification: - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [ ] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Documentation Writer Review - [x] Documentation writer subagent reviewed the completed changes - Result: `docs-updated` - Evidence: `docs/changelog/2026-07-31.mdx`; exact-head review passed for `6093f44f`; writing rules and documentation style reviewed; `npx vitest run test/changelog-docs.test.ts` passed 6/6; `npm run docs` passed with zero Fern errors and two generic Fern upgrade notices. - Agent: Codex Desktop <!-- docs-review-head-sha: 6093f44 --> <!-- docs-review-agents-blob-sha: 3dd7c24 --> ## DGX Station Hardware Evidence - [ ] Tested on DGX Station - Tested commit: Not applicable; no DGX Station host script changed. - Station profile/scenario: Not applicable. - Result: Not applicable. - Supporting evidence: Not applicable. ## Verification - [x] PR description includes a `Signed-off-by:` line and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or `npm run validate:pr` passed after refreshing `origin/main` when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result or justification: `npx vitest run test/changelog-docs.test.ts` passed 6/6 at `6093f44f`. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: Not applicable to a dated prose-only release entry. - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) — validation passed with zero errors; Fern emitted two generic upgrade notices. - [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) — the changelog entry has the required parser-safe MDX SPDX header; dated changelog entries intentionally do not use page frontmatter. --- Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added release notes for v0.0.100. * Documented improvements to restore pairing, sandbox replacement, onboarding recovery, lifecycle cleanup, runtime handling, build support, host readiness, and end-to-end validation. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary Sandbox creation built its inference selection with a hardcoded `null` reasoning effort, so a compatible-endpoint route onboarded with an explicit `NEMOCLAW_REASONING_EFFORT` was registered without it and `status` reported `endpoint-default`. This PR threads the requested effort through the sandbox phase the same way the neighbouring reasoning flag already travels. Closes #12744. ## Reproduction Executed on our Ubuntu 24.04 x86_64 test host (no GPU), from a clean uninstall each time: ```bash export NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE=1 NEMOCLAW_NON_INTERACTIVE=1 NEMOCLAW_POLICY_MODE=suggested export NEMOCLAW_PROVIDER=custom NEMOCLAW_ENDPOINT_URL=<an OpenAI-compatible endpoint> export NEMOCLAW_MODEL=nvidia/nemotron-3-ultra-550b-a55b export NEMOCLAW_REASONING_EFFORT=high nemoclaw onboard --agent langchain-deepagents-code --name repro-12744 --non-interactive --yes --no-gpu nemoclaw repro-12744 status ``` **Environment** - Ubuntu 24.04.3 LTS, x86_64, Node.js v22.22.2, OpenShell 0.0.116 - Reproduced on the reporter's version `v0.0.130` (`a73099c77`) and on `main` (`f633c9958`) - Agent: Deep Agents Code; provider: `compatible-endpoint` over a public OpenAI-compatible endpoint **Observed on `main` (before fix)** ``` Sandbox: repro-12744 Model: nvidia/nemotron-3-ultra-550b-a55b Provider: compatible-endpoint Reasoning effort: endpoint-default ``` The onboarding session recorded the request correctly, but the registry entry did not: ``` onboard-session.json : "compatibleEndpointReasoningEffort": "high" sandboxes.json : "compatibleEndpointReasoningEffort": null ``` **Observed on `fix/dcode-reasoning-effort-12744` (after fix)** ``` Sandbox: repro-12744 Provider: compatible-endpoint Reasoning effort: high sandboxes.json : "compatibleEndpointReasoningEffort": "high" ``` The issue's expected result also covers a rebuild. A source build of `main` cannot exercise `rebuild` (its managed image catalog is not published, so the preflight fails with a GHCR 404 before reaching any of this code), so that half was verified on `v0.0.130` with this patch applied: ``` BASE=a73099c77 PATCH_APPLIED=ok BUILD=0 nemoclaw v0.0.130 ONBOARD_EXIT=0 -> Reasoning effort: high REBUILD_EXIT=0 -> Reasoning effort: high ``` ## Analysis `status` renders the effort through `getEffectiveReasoningEffort()` (`src/lib/inference/selection.ts:102-120`), which returns `endpoint-default` when the route is a compatible endpoint on `openai-completions` and the recorded effort is absent. That output was correct; the recorded value was missing. Instrumenting the onboarding chain on the test host showed the requested value surviving every hop up to and including the provider-inference handler's return: ``` selection.custom effort=high env=high flow.readSelection… effort=high stateEffort=high flow.beforeClear provider=compatible-endpoint effort=high handler.fromSelection effort=high reuseCred=false handler.return effort=high api=openai-completions provider=compatible-endpoint registration.selection match=true sessEffort=high sessReasoning=false registry.register effortIn=null reasoningIn=false <-- dropped here ``` The drop is at `src/lib/onboard/machine/handlers/sandbox.ts:2322-2332`, where the sandbox phase builds the selection it hands to `createSandbox()`. Every field there is threaded from `this.options` — provider, model, endpoint URL and source, credential env, preferred API, `compatibleEndpointReasoning`, NIM container — except the effort, which was written as a literal `null`. The phase options type did not carry the field at all, and `src/lib/onboard/machine/core-flow-phases.ts:357` did not pass it, even though the same function passes `context.compatibleEndpointReasoningEffort` to the two neighbouring phases (lines 277 and 302). That is why the sibling `compatibleEndpointReasoning` value reached the registry while the effort did not. The registry entry is the durable record: `nemoclaw <sandbox> status` reads it, and `rebuild-resume-config.ts:123-125` replays it on rebuild. With the field empty at creation, both reads were correct about an empty value. #7971 fixed propagation inside provider selection and into the onboarding session, which is why the session still shows `high` on v0.0.130. This last hop into the created sandbox was never connected. ## Fix - `src/lib/onboard/machine/handlers/sandbox.ts`: add `compatibleEndpointReasoningEffort` to the phase options and pass `this.options.compatibleEndpointReasoningEffort` into `sandboxCreateInferenceSelection()` instead of the literal `null`. - `src/lib/onboard/machine/core-flow-phases.ts`: pass `context.compatibleEndpointReasoningEffort` into the sandbox phase, matching the two sibling phases. - `src/lib/onboard/machine/handlers/sandbox-test-fixtures.ts`: the shared options fixture gains the new required field. Normalization is unchanged: `normalizeInferenceSelection()` still drops an effort recorded against a provider that cannot use it, so threading the value cannot smuggle it onto another route. **Whole-class check.** `sandboxCreateInferenceSelection()` has exactly one call site (the one fixed). `buildCreatedSandboxRegistryEntry()` has one call site, which consumes that selection. The other literal `compatibleEndpointReasoningEffort: null` in `setup-nim-flow.ts:880` is an initial-state default sitting beside `compatibleEndpointReasoning: null` and is not affected. The rebuild path reads the registry rather than rebuilding the selection, so it needs no change — and the rebuild run above confirms it. **Failure path.** The change adds no branch and no new failure mode: it replaces a constant with a value that was already validated and normalized downstream. An absent request stays `null` and the endpoint default continues to apply. ## Changes - `src/lib/onboard/machine/handlers/sandbox.ts`: thread the requested reasoning effort into the created sandbox selection. - `src/lib/onboard/machine/core-flow-phases.ts`: pass the effort into the sandbox phase options. - `src/lib/onboard/machine/handlers/sandbox-test-fixtures.ts`: add the new option to the shared fixture. - `src/lib/onboard/machine/handlers/sandbox-reasoning-effort.test.ts`: new regression coverage. - `src/lib/state/registry-route-reservation.test.ts`: give the durable-route staging block its own timeout budget — unrelated to the fix, see below. ## Unrelated CI fix carried here `cli-test-shards (6)` failed on this branch, and on unmodified `main`, because the first case of the durable-route staging block in `src/lib/state/registry-route-reservation.test.ts` exceeds the 5 s default once the shard adds coverage instrumentation: ```text # unmodified main npx vitest run src/lib/state/registry-route-reservation.test.ts --coverage \ --coverage.reporter=json-summary --coverage.include="src/**/*.ts" × stages fresh Model Router route from the durable route 5007ms ``` Without coverage the same case takes 1722 / 1667 / 1760 ms and the file passes 53/53, so the budget was exceeded by construction rather than by timing luck; three shard reruns did not change it. The case pays the cold import of `./registry` and `../onboard/sandbox-registration` after `vi.resetModules()`. This PR gives that block an explicit budget through the shared `testTimeout` helper, which restores a green shard (53/53 with coverage). #12818 tracks the underlying cost if maintainers would rather make the setup cheaper than widen the budget. ## Test matrix - Requested effort reaches the created sandbox selection (regression lock; fails without the fix). - No requested effort stays absent, so the endpoint default still applies. - An effort recorded against a provider that cannot use it is still dropped by normalization. - Full `src/lib/onboard/machine/handlers` suite: 45 files, 637 tests, passing. ## Type of Change - [x] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [ ] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Verification - [x] `npx prek run --all-files` passes - [x] `npm test` passes (touched files at minimum) - [x] Tests added or updated for new or changed behavior - [x] No secrets, API keys, or credentials committed - [ ] Docs updated for user-facing behavior changes - [ ] `make docs` builds without warnings (doc changes only) - [ ] 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) ## AI Disclosure - [x] AI-assisted — tool: Claude Code Signed-off-by: Yanyun Liao <yanyunl@nvidia.com> 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Sandbox creation during onboarding now uses the configured reasoning effort when the selected endpoint supports it. When no effort is configured or the endpoint is incompatible, no reasoning effort is selected. This ensures the sandbox’s inference selection reflects the onboarding settings and the selected endpoint’s capabilities. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Yanyun Liao <yanyunl@nvidia.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Summary
A NemoClaw-managed Deep Agents Code sandbox recorded a compatible-endpoint reasoning effort in registry state but sent every model request without it, so the endpoint default applied instead. The managed image now bakes the recorded effort into a root-owned file, and the managed provider resolver supplies it as an
extra_body.reasoning_effortrequest parameter.Related Issue
Fixes #7938
Changes
agents/langchain-deepagents-code/DockerfiledeclaresARG NEMOCLAW_REASONING_EFFORT, validates it as empty,low,medium, orhighat build time, and writes it to root-owned0444/usr/local/share/nemoclaw/dcode-reasoning-effort. The staged-Dockerfile patcher already rewrote this ARG name for OpenClaw; with no matching declaration here the rewrite was a silent no-op.agents/langchain-deepagents-code/managed-dcode-runtime.pyaddsmanaged_reasoning_effort(). It repeats the fail-closed shape ofmanaged_auto_approval_mode()because both read image state that runtime must not trust: ownership, mode, exact size,O_NOFOLLOW, and a read-race check. An unsafe or unrecognized file returnsNone, which keeps the endpoint default. Direct-module cases intest/langchain-deepagents-code-reasoning-effort.test.tspin the rejected shapes.agents/langchain-deepagents-code/patch-managed-deepagents-code.pysetsextra_body.reasoning_efforton the managed OpenAI adapter. The hardened resolver never consumes the mutableconfig.tomlparams table, so a generator-only change cannot reach the request. The same file adds the new function to the stale-helper guard, which now covers every managed capability rather than auto-approval alone.agents/langchain-deepagents-code/generate-config.tsrecords the effort in the generated per-model params table.extra_bodynow merges the Ultra template argument and the reasoning effort into one table; an unset effort produces byte-identical output to before.scripts/check-dcode-profile-import-gate.shallows the new ARG name. The gate refuses any unlisted ARG, so the build fails without this entry.inference setcould change the effort on a Deep Agents Code sandbox.Type of Change
Quality Gates
Documentation Writer Review
blockeddocs/get-started/quickstart-langchain-deepagents-code.mdx,docs/inference/configure-model-capabilities.mdx. The authoring host ran with subagents disabled, so no documentation writer subagent reviewed the change.npm run docsreports 0 errors, including the route check that rejected an earlier cross-variant link.DGX Station Hardware Evidence
Verification
Signed-off-by:line and every commit appears asVerifiedin GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run validate:prpassed after refreshingorigin/mainwhen hooks were skipped or unavailablenpx vitest run --project integration test/langchain-deepagents-code-config.test.ts test/langchain-deepagents-code-reasoning-effort.test.ts test/langchain-deepagents-code-direct-module-patch.test.ts test/langchain-deepagents-code-nemotron-profile-plugin.test.ts test/langchain-deepagents-code-image.test.ts test/langchain-deepagents-code-auto-approval-image.test.ts test/langchain-deepagents-code-profile-build-gate.test.ts— 7 files, 150 tests passed.npm run typecheck:clireports 0 errors.npm testfor broad runtime/test-harness changes;npm run checkfor repo-wide validation/coverage changes — command/result:npm run docsbuilds without warnings (doc changes only)Signed-off-by: Tinson Lai tinsonl@nvidia.com
Summary by CodeRabbit
New Features
Documentation
Tests