Skip to content

feat: validate adapter model compatibility#118

Draft
AjayThorve wants to merge 9 commits into
NVIDIA:mainfrom
AjayThorve:feat/validate-model-compatibility
Draft

feat: validate adapter model compatibility#118
AjayThorve wants to merge 9 commits into
NVIDIA:mainfrom
AjayThorve:feat/validate-model-compatibility

Conversation

@AjayThorve

@AjayThorve AjayThorve commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

Overview

Extend adapter descriptors so Fabric.plan(...) and Fabric.doctor(...) can
validate normalized model configuration before starting an adapter.

This PR is stacked on #117 and should merge after it. Once #117 lands, this
branch will be rebased so the final diff contains only the FABRIC-64 descriptor
extension.

The descriptor can now declare:

  • supported models.<role>.provider values; and
  • typed provider-specific models.<role>.settings with required flags and
    descriptions.

Claude declares anthropic and nvidia; Codex declares openai and nvidia.
Adapters without a provider allowlist retain dynamic-provider behavior. No
first-party adapter currently declares provider-specific setting keys.

Details

Planning and doctor now share the same fail-closed diagnostics for:

  • a provider outside the selected adapter's declared allowlist;
  • an undeclared provider-specific setting;
  • a missing required setting;
  • a setting with the wrong JSON type; and
  • malformed provider or setting declarations in an adapter descriptor.

Diagnostics identify the canonical field path without including secret setting
values.

The complete normalized compatibility matrix remains:

FabricConfig field Claude Codex Deep Agents Hermes Agent
schema_version Core Core Core Core
metadata.name, .description Core Core Core Core
harness.adapter_id, .resolution Core Core Core Core
harness.settings Adapter-owned escape hatch Adapter-owned escape hatch Adapter-owned escape hatch Adapter-owned escape hatch
models.<role>.provider anthropic, nvidia openai, nvidia Dynamic LangChain provider Dynamic Hermes provider
models.<role>.model Yes Yes Yes Yes
models.<role>.api_key_env Yes Yes Yes Yes
models.<role>.base_url Yes Yes Yes Yes
models.<role>.temperature No No Yes Yes
models.<role>.settings.<key> No keys declared No keys declared No keys declared No keys declared
system_prompt Yes Yes; maps to Codex base instructions Yes Yes
max_turns Yes No No Yes; maps to Hermes iterations
runtime.input_schema, .output_schema Core Core Core Core
runtime.artifacts, .timeout_seconds Core Core Core Core
environment.provider, .control_location, .ownership Core Core Core Core
environment.workspace, .artifacts, .env Core Core Core Core
environment.connection, .metadata, .settings Environment-provider-owned Environment-provider-owned Environment-provider-owned Environment-provider-owned
tools.blocked Yes No Yes No
tools.toolsets.enabled, .blocked No No No Yes
skills.paths Yes Yes Yes Yes
mcp.servers.<name>.transport, .url with harness_native exposure Yes Yes Yes Yes
mcp.servers.<name>.exposure = "fabric_managed" No; not implemented No; not implemented No; not implemented No; not implemented
telemetry.providers.relay Yes Yes Yes Yes
telemetry.providers.native No Yes; OpenTelemetry Yes; OpenTelemetry and OpenInference No
telemetry.providers.<provider>.config Declared-provider pass-through Declared-provider pass-through Declared-provider pass-through Declared-provider pass-through
relay.project, .output_dir, .observability Yes Yes Yes Yes
relay.components, .policy Yes Yes Yes Yes
Additive extensions on typed config objects Preserved; no portable adapter semantics Preserved; no portable adapter semantics Preserved; no portable adapter semantics Preserved; no portable adapter semantics

Breaking behavior: Claude and Codex provider mismatches, and undeclared
models.<role>.settings keys, now fail before adapter startup instead of
reaching adapter-native validation or being ignored.

Validation

  • RUSTUP_TOOLCHAIN=1.94.0 just test-rust — 54 tests passed, plus doc tests.
  • RUSTUP_TOOLCHAIN=1.94.0 cargo check -p fabric-python --locked — passed.
  • Focused Python planning and descriptor tests — 6 passed.
  • Changed-file pre-commit hooks — passed.
  • RUSTUP_TOOLCHAIN=1.94.0 ... just docs — Fern and generated API reference
    checks passed; redirect validation was skipped because this machine is not
    authenticated to Fern.

Where should the reviewer start?

Start with AdapterModelConfigSupport, AdapterSettingSchema, and
validate_model_compatibility in crates/fabric-core/src/config.rs. Then review
the Claude and Codex fabric-adapter.json declarations and the shared
plan/doctor tests in tests/python/test_typed_config.py.

Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)

Summary by CodeRabbit

  • New Features

    • Added first-class configuration for model endpoints, system prompts, turn limits, invocation timeouts, environment variables, and toolset policies.
    • Added typed toolset configuration with separate enabled and blocked toolsets.
    • Expanded Harbor integration inputs for model, runtime, environment, and toolset settings.
    • Added adapter compatibility matrices and clearer normalized configuration guidance.
  • Bug Fixes

    • Incompatible configurations now fail during planning, validation, or runtime checks with actionable compatibility errors instead of being ignored or partially applied.
  • Documentation

    • Updated quickstarts, integration guides, examples, schemas, and API references to reflect the revised configuration model and adapter behavior.

@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

The PR introduces typed normalized configuration fields, separate tool and toolset policies, adapter compatibility validation, runtime environment propagation, and updated Claude, Codex, Deep Agents, and Hermes mappings. SDK models, CLI scaffolding, schemas, tests, examples, and documentation are updated accordingly.

Changes

Typed configuration and compatibility

Layer / File(s) Summary
Core configuration contracts and planning
crates/fabric-core/src/config.rs, crates/fabric-core/src/error.rs, schemas/*
Adds normalized prompts, turn limits, timeouts, model endpoints, environment variables, and toolset policies; typed adapter capability schemas and explicit compatibility diagnostics are introduced.
Runtime propagation and enforcement
crates/fabric-core/src/runtime.rs
Propagates normalized environment variables, applies configurable invocation timeouts, and rejects unsupported capability routes before runtime execution.

Adapter normalization

Layer / File(s) Summary
Shared adapter accessors
adapters/common/.../utils.py
Centralizes model selection, endpoint resolution, normalized execution fields, environment values, and toolset accessors.
Bundled adapter mappings
adapters/{claude,codex,deepagents,hermes}/src/**
Adapters consume normalized model/runtime/environment/toolset fields, reject legacy harness aliases, and update provider, relay, state, and prompt wiring.
Adapter manifests and guidance
adapters/*/fabric-adapter.json, adapters/*/README.md
Descriptor contracts and compatibility documentation declare typed model and policy support.

SDK, CLI, and validation

Layer / File(s) Summary
Python configuration models
python/src/nemo_fabric/models.py, python/src/nemo_fabric/types.py
Adds ToolsetConfig, endpoint, timeout, environment, prompt, and turn-limit fields with validation and snapshot mapping.
Harbor and CLI configuration paths
python/src/nemo_fabric/integrations/harbor/*, crates/fabric-cli/**
Threads normalized fields through Harbor inputs, presets, generated Python/Rust configurations, and scaffolding tests.
Tests and examples
tests/**, examples/**
Updates fixtures, integration paths, adapter tests, end-to-end tests, examples, and notebooks for the normalized configuration shape.

Documentation and API references

Layer / File(s) Summary
Configuration guidance
README.md, docs/sdk/*, skills/nemo-fabric-integrate/*, docs/getting-started/*, docs/integrations/*
Documents separate tool policies, normalized compatibility behavior, adapter-owned settings, and updated configuration examples.
Generated API references
docs/reference/api/**, scripts/generate_api_docs.sh
Documents new public types and fields and generalizes generated Markdown formatting fixes.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 27.62% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title follows Conventional Commits and accurately summarizes the adapter model compatibility validation change.
Description check ✅ Passed The description includes the required overview, reviewer-start guidance, related issues, and confirmation checkboxes, so it is mostly complete.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 9

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py (1)

328-334: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

state_dir() is not scoped by runtime ID, unlike Hermes's equivalent fix.

This function's own removal message for harness.settings.state_dir claims state is "derived from the Fabric artifact root and runtime ID," and the README says the same, but the returned path never includes the runtime ID. Runtimes sharing an artifact root/base_dir will share the same .fabric/deepagents directory, colliding on LangGraph checkpointer/session state across concurrent Fabric runtimes. Hermes's equivalent code in this same PR (adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py:264-269) correctly wraps its home directory with common_utils.runtime_state_directory(...).

🐛 Proposed fix
 def state_dir(payload: dict[str, Any]) -> Path:
     base_dir = Path(common_utils.base_dir(payload)).resolve()
     artifacts = common_utils.runtime_context(payload).get("artifacts") or {}
     root = artifacts.get("root") or os.environ.get("FABRIC_ARTIFACTS")
-    if root:
-        return Path(str(root)).resolve() / ".fabric" / "deepagents"
-    return base_dir / "artifacts" / "deepagents" / ".fabric"
+    if root:
+        base = Path(str(root)).resolve() / ".fabric" / "deepagents"
+    else:
+        base = base_dir / "artifacts" / "deepagents" / ".fabric"
+    return common_utils.runtime_state_directory(base, payload)
🤖 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 `@adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py` around
lines 328 - 334, Update state_dir() to scope the resolved Fabric artifact or
base directory through common_utils.runtime_state_directory(...), matching
Hermes's equivalent implementation, before appending the deepagents state path.
Ensure the returned path includes the current runtime ID while preserving the
existing artifact-root and fallback-directory selection.
🤖 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 `@adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py`:
- Around line 47-51: Update the Hermes adapter’s terminal backend handling so
the configured terminal_backend is honored throughout, including TERMINAL_ENV
and build_hermes_config()["terminal"]["backend"], or revise
REMOVED_SETTING_FIELDS to explicitly document that only local execution is
supported. Keep validation and runtime configuration consistent so accepted
settings are not silently overridden.

In `@crates/fabric-core/src/runtime.rs`:
- Around line 577-581: The AdapterCompatibility error path in resolve_run_plan
currently reports route.name directly for unsupported MCP routes; map the field
through the existing CapabilityKind-to-field logic used by
validate_capability_plan_compatibility so MCP routes emit the canonical
mcp.servers.{name} path. Preserve the existing adapter_id and reason handling.

In `@docs/reference/api/python-library-reference/nemo_fabric.models.md`:
- Around line 1364-1365: Regenerate the API reference documentation so the
ToolsetConfig heading has the required blank lines before and after it,
resolving markdownlint MD022. Do not edit the generated file under
docs/reference/api/ directly; update the source or generation inputs and run the
established reference-generation process.

In
`@docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterdescriptorsource.mdx`:
- Line 5: Regenerate the generated API reference output rather than editing it
directly: update the relevant source or generator for the position changes, then
run just docs. Apply the regeneration to
docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterdescriptorsource.mdx:5-5
and
docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterkind.mdx:5-5.

In
`@docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterconfigsupport.mdx`:
- Line 20: Update the Rust documentation source descriptions to use the
product-qualified naming: in
docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterconfigsupport.mdx:20,
use “NVIDIA NeMo Fabric” for the first mention; in
docs/reference/api/rust-library-reference/nemo-fabric-core/config/index.mdx:58,
use “NeMo Fabric” thereafter. Regenerate the API references after updating the
source.

In
`@docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx`:
- Line 5: Do not edit the generated AdapterDescriptor API reference directly;
apply the position ordering change in the source documentation or generator that
produces it, then regenerate the affected docs/reference/api output.

In `@examples/harbor/README.md`:
- Around line 80-88: Update the FabricConfig field column in the README table to
use the exact paths models.default.base_url, system_prompt, max_turns,
runtime.timeout_seconds, environment.env, tools.toolsets.enabled,
tools.toolsets.blocked, and harness.settings; remove the duplicate
fabric_blocked_tools row while preserving the corresponding descriptions and
command syntax.

In `@schemas/agent.schema.json`:
- Around line 993-1001: Update the Rust source contract for max_turns to require
values greater than zero by setting its minimum to 1, then regenerate
schemas/agent.schema.json so the snapshot matches. Add or update the
schema-parity assertion to verify max_turns rejects 0 and accepts valid positive
values.

In `@schemas/run-plan.schema.json`:
- Around line 1631-1637: Update the Rust/Python contract for timeout_seconds to
reject negative values while preserving nullability, then regenerate the
schemas/run-plan.schema.json snapshot. Add invalid-input coverage demonstrating
that negative invocation timeouts are rejected, using the existing
timeout_seconds contract and validation tests.

---

Outside diff comments:
In `@adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py`:
- Around line 328-334: Update state_dir() to scope the resolved Fabric artifact
or base directory through common_utils.runtime_state_directory(...), matching
Hermes's equivalent implementation, before appending the deepagents state path.
Ensure the returned path includes the current runtime ID while preserving the
existing artifact-root and fallback-directory selection.
🪄 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: ASSERTIVE

Plan: Enterprise

Run ID: 0c7e7cf5-75a4-4ac5-ab0c-593c7e93f734

📥 Commits

Reviewing files that changed from the base of the PR and between c8bc400 and 7d8db50.

📒 Files selected for processing (144)
  • README.md
  • adapters/README.md
  • adapters/claude/README.md
  • adapters/claude/fabric-adapter.json
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • adapters/codex/README.md
  • adapters/codex/fabric-adapter.json
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • adapters/deepagents/README.md
  • adapters/deepagents/fabric-adapter.json
  • adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py
  • adapters/hermes/README.md
  • adapters/hermes/fabric-adapter.json
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-cli/assets/adapters/codex/fabric-adapter.json
  • crates/fabric-cli/assets/adapters/deepagents/fabric-adapter.json
  • crates/fabric-cli/assets/adapters/hermes/fabric-adapter.json
  • crates/fabric-cli/src/examples.rs
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-cli/src/scaffold.rs
  • crates/fabric-cli/templates/python/main.py.tmpl
  • crates/fabric-cli/templates/rust/main.rs.tmpl
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/lib.rs
  • crates/fabric-core/src/runtime.rs
  • docs/getting-started/quickstart.mdx
  • docs/integrations/claude.mdx
  • docs/integrations/codex.mdx
  • docs/reference/api/python-library-reference/index.md
  • docs/reference/api/python-library-reference/nemo_fabric.client.md
  • docs/reference/api/python-library-reference/nemo_fabric.models.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterconfigfield.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterdescriptorsource.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterkind.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adaptersettingtype.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-capabilitykind.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-capabilitytarget.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-controllocation.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-environmentownership.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-mcpexposure.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatifstorageconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatofendpointfieldnamepolicy.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatofendpointtransport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatofmode.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayotlptransport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayunsupportedbehavior.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-resolutionstrategy.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-telemetryprovider.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/fn-load-adapter-descriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/fn-resolve-run-plan-from-config.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterconfigsupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptermodelconfigsupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterrequirements.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptersettingschema.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptertelemetryprovidersupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptertelemetrysupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-capabilityplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-capabilityroute.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-capabilitytargetplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-environmentconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-environmentplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-fabricconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-harnessconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-mcpconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-mcpserverconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-mcpserverplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-metadataconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-modelconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayatifconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayatofconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayatofendpointconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relaycomponentconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayconfigpolicy.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayobservabilityconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayotlpconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-resolvecontext.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-resolvedadapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-runplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-runtimecapabilities.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-runtimeconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-skillconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-telemetryconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-telemetryplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-telemetryproviderconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-toolsconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-toolsetconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-toolsplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/enum-doctorstatus.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/fn-doctor-plan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/struct-doctorcheck.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/struct-doctorreport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/type-result.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/fn-version.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/runtime/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/runtime/struct-environmenthandle.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/schema/index.mdx
  • docs/sdk/python.mdx
  • examples/code_review_agent/config.py
  • examples/harbor/README.md
  • examples/harbor/calculator/README.md
  • examples/harbor/swebench/README.md
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • examples/harbor/swebench/adapters/hermes/fabric-adapter.json
  • examples/notebooks/01_quickstart.ipynb
  • python/src/nemo_fabric/__init__.py
  • python/src/nemo_fabric/integrations/harbor/fabric_agent.py
  • python/src/nemo_fabric/models.py
  • python/src/nemo_fabric/types.py
  • schemas/adapter-descriptor.schema.json
  • schemas/adapter-invocation.schema.json
  • schemas/agent.schema.json
  • schemas/environment-handle.schema.json
  • schemas/run-plan.schema.json
  • schemas/runtime-context.schema.json
  • schemas/runtime-handle.schema.json
  • skills/nemo-fabric-integrate/SKILL.md
  • skills/nemo-fabric-integrate/references/config-mapping.md
  • tests/_utils/configs.py
  • tests/adapters/test_adapaters_common_utils.py
  • tests/adapters/test_claude_adapter.py
  • tests/adapters/test_codex_adapter.py
  • tests/adapters/test_deepagents.py
  • tests/adapters/test_hermes_adapter.py
  • tests/e2e/test_claude.py
  • tests/e2e/test_codex.py
  • tests/e2e/test_deepagents.py
  • tests/e2e/test_hermes_config_mapping.py
  • tests/e2e/test_hermes_e2e.py
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/src/nemo_fabric_test_adapters/hermes_shim/adapter.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_native_sdk.py
  • tests/python/test_sdk_contract.py
  • tests/python/test_typed_config.py

Comment thread adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
Comment thread crates/fabric-core/src/runtime.rs
Comment thread docs/reference/api/python-library-reference/nemo_fabric.models.md
Comment thread examples/harbor/README.md Outdated
Comment thread schemas/agent.schema.json
Comment thread schemas/run-plan.schema.json
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
docs/reference/api/python-library-reference/nemo_fabric.client.md (1)

4-4: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use the full product name on first use.

The new description says “with NeMo Fabric” without the required first-use “NVIDIA” qualifier. Update the source docstring or generator to emit “with NVIDIA NeMo Fabric,” then regenerate this page. As per coding guidelines, user-facing prose must use “NVIDIA NeMo Fabric” on first use and “NeMo Fabric” thereafter. As per path instructions, generated API references must be regenerated rather than edited directly.

🤖 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 `@docs/reference/api/python-library-reference/nemo_fabric.client.md` at line 4,
Update the source docstring or generator responsible for the API page
description to use “with NVIDIA NeMo Fabric” on first use, then regenerate the
generated reference page rather than editing it directly; retain “NeMo Fabric”
for subsequent mentions.

Sources: Coding guidelines, Path instructions

docs/sdk/python.mdx (1)

178-182: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use NeMo Fabric for the product name.

The new definition says “Fabric owns the behavior,” using standalone capitalized “Fabric” for the product. Change it to “NeMo Fabric owns the behavior.” As per path instructions, user-facing prose must use “NVIDIA NeMo Fabric” on first use and “NeMo Fabric” thereafter, and must not use standalone capitalized “Fabric” for the product.

🤖 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 `@docs/sdk/python.mdx` around lines 178 - 182, Update the definition containing
“Fabric owns the behavior” to use “NeMo Fabric owns the behavior,” preserving
the rest of the documentation text and terminology.

Source: Path instructions

docs/reference/api/python-library-reference/nemo_fabric.models.md (3)

1385-1445: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Document the ToolsetConfig fields and semantics.

The new class section exposes inherited helpers but does not document enabled or blocked, including the important None versus empty-list behavior and overlap validation. Add this to the source model documentation, then regenerate the API reference.

As per path instructions, files under docs/reference/api/ are generated output and must not be edited directly.

🤖 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 `@docs/reference/api/python-library-reference/nemo_fabric.models.md` around
lines 1385 - 1445, Document the enabled and blocked fields and their semantics
in the source definition of ToolsetConfig, including the distinction between
None and empty lists and the validation behavior for overlapping entries. Then
regenerate the API reference so the generated ToolsetConfig section reflects
this documentation; do not edit docs/reference/api files directly.

Source: Path instructions


4-4: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use NVIDIA NeMo Fabric on first use across generated API references.

  • docs/reference/api/python-library-reference/nemo_fabric.models.md#L4-L4: update the new frontmatter description to use the full product name.
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterconfigfield.mdx#L4-L4: update the MDX description to use the full product name.
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterconfigfield.mdx#L28-L28: update the generated body description consistently.

As per path instructions, update the source documentation and regenerate these files rather than editing generated output directly.

🤖 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 `@docs/reference/api/python-library-reference/nemo_fabric.models.md` at line 4,
Update the source documentation descriptions to use “NVIDIA NeMo Fabric” on
first use, then regenerate the affected outputs. Apply this to
docs/reference/api/python-library-reference/nemo_fabric.models.md lines 4-4,
docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterconfigfield.mdx
lines 4-4, and the generated body description at lines 28-28; do not edit
generated files directly.

Source: Path instructions


1586-1595: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Document configure_toolsets as keyword-only.

The source API defines configure_toolsets(*, enabled=..., blocked=...), but this generated signature omits * and implies positional arguments are accepted. Update the generator/source documentation and regenerate the reference with just docs.

As per path instructions, files under docs/reference/api/ are generated output and must not be edited directly.

🤖 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 `@docs/reference/api/python-library-reference/nemo_fabric.models.md` around
lines 1586 - 1595, Update the source or documentation generator definition for
configure_toolsets so enabled and blocked are documented as keyword-only by
including the keyword-only marker in the generated signature. Do not edit the
generated file under docs/reference/api; regenerate the reference documentation
with just docs and verify the signature matches the source API.

Source: Path instructions

🤖 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 `@adapters/README.md`:
- Around line 101-105: The documentation overstates model-setting validation as
covering every configured role; update the corresponding guidance to specify
validation of the selected model role’s settings, preserving the existing
selected-role behavior. Apply this wording correction in adapters/README.md
lines 101-105 and docs/sdk/python.mdx lines 217-221; no core resolver change is
required.

In `@tests/python/test_typed_config.py`:
- Around line 164-175: Extend the tests in
test_plan_rejects_undeclared_model_setting_without_exposing_value with an async
Fabric().doctor counterpart using the same undeclared regionn value, and assert
the resulting FabricConfigError diagnostic contains
models.default.settings.regionn but not secret-setting-value. Mark the new test
async and await Fabric().doctor(config) to cover the doctor error path.

---

Outside diff comments:
In `@docs/reference/api/python-library-reference/nemo_fabric.client.md`:
- Line 4: Update the source docstring or generator responsible for the API page
description to use “with NVIDIA NeMo Fabric” on first use, then regenerate the
generated reference page rather than editing it directly; retain “NeMo Fabric”
for subsequent mentions.

In `@docs/reference/api/python-library-reference/nemo_fabric.models.md`:
- Around line 1385-1445: Document the enabled and blocked fields and their
semantics in the source definition of ToolsetConfig, including the distinction
between None and empty lists and the validation behavior for overlapping
entries. Then regenerate the API reference so the generated ToolsetConfig
section reflects this documentation; do not edit docs/reference/api files
directly.
- Line 4: Update the source documentation descriptions to use “NVIDIA NeMo
Fabric” on first use, then regenerate the affected outputs. Apply this to
docs/reference/api/python-library-reference/nemo_fabric.models.md lines 4-4,
docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterconfigfield.mdx
lines 4-4, and the generated body description at lines 28-28; do not edit
generated files directly.
- Around line 1586-1595: Update the source or documentation generator definition
for configure_toolsets so enabled and blocked are documented as keyword-only by
including the keyword-only marker in the generated signature. Do not edit the
generated file under docs/reference/api; regenerate the reference documentation
with just docs and verify the signature matches the source API.

In `@docs/sdk/python.mdx`:
- Around line 178-182: Update the definition containing “Fabric owns the
behavior” to use “NeMo Fabric owns the behavior,” preserving the rest of the
documentation text and terminology.
🪄 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: ASSERTIVE

Plan: Enterprise

Run ID: 33357197-5440-4e66-a37c-34481fd1587e

📥 Commits

Reviewing files that changed from the base of the PR and between 7d8db50 and de79c72.

📒 Files selected for processing (100)
  • adapters/README.md
  • adapters/claude/fabric-adapter.json
  • adapters/codex/fabric-adapter.json
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-cli/assets/adapters/codex/fabric-adapter.json
  • crates/fabric-cli/src/examples.rs
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/lib.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/schema.rs
  • docs/reference/api/python-library-reference/nemo_fabric.client.md
  • docs/reference/api/python-library-reference/nemo_fabric.errors.md
  • docs/reference/api/python-library-reference/nemo_fabric.models.md
  • docs/reference/api/python-library-reference/nemo_fabric.runtime.md
  • docs/reference/api/python-library-reference/nemo_fabric.types.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterconfigfield.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adaptersettingtype.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-capabilitykind.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-capabilitytarget.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-controllocation.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-environmentownership.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-mcpexposure.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatifstorageconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatofendpointfieldnamepolicy.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatofendpointtransport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatofmode.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayotlptransport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayunsupportedbehavior.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-resolutionstrategy.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-telemetryprovider.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/fn-load-adapter-descriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/fn-resolve-run-plan-from-config.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterconfigsupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptermodelconfigsupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterrequirements.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptersettingschema.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptertelemetryprovidersupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptertelemetrysupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-capabilityplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-capabilityroute.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-capabilitytargetplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-environmentconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-environmentplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-fabricconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-harnessconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-mcpconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-mcpserverconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-mcpserverplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-metadataconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-modelconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayatifconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayatofconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayatofendpointconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relaycomponentconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayconfigpolicy.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayobservabilityconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayotlpconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-resolvecontext.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-resolvedadapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-runplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-runtimecapabilities.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-runtimeconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-skillconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-telemetryconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-telemetryplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-telemetryproviderconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-toolsconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-toolsetconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-toolsplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/enum-doctorstatus.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/fn-doctor-plan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/struct-doctorcheck.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/struct-doctorreport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/type-result.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/fn-version.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/runtime/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/schema/index.mdx
  • docs/sdk/python.mdx
  • examples/harbor/README.md
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • python/src/nemo_fabric/models.py
  • schemas/adapter-descriptor.schema.json
  • schemas/agent.schema.json
  • schemas/run-plan.schema.json
  • scripts/generate_api_docs.sh
  • skills/nemo-fabric-integrate/SKILL.md
  • skills/nemo-fabric-integrate/references/config-mapping.md
  • tests/adapters/test_claude_adapter.py
  • tests/adapters/test_codex_adapter.py
  • tests/adapters/test_hermes_adapter.py
  • tests/e2e/test_codex.py
  • tests/python/test_sdk_contract.py
  • tests/python/test_typed_config.py

Comment thread adapters/README.md
Comment thread tests/python/test_typed_config.py Outdated
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@AjayThorve
AjayThorve force-pushed the feat/validate-model-compatibility branch from de79c72 to d088452 Compare July 24, 2026 16:40
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@AjayThorve
AjayThorve force-pushed the feat/validate-model-compatibility branch from d088452 to bc43fc6 Compare July 24, 2026 16:45

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 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 `@adapters/common/src/nemo_fabric_adapters/common/utils.py`:
- Around line 142-144: Update timeout_seconds() to reject boolean and other
non-numeric timeout_seconds values before coercion, while preserving the default
when the value is absent. Return a validated float only for supported numeric
values, and raise the established configuration error used by the adapters so
invalid settings produce a clean fail-closed diagnostic; keep max_turns()
behavior as the validation model and ensure downstream boolean guards remain
meaningful.

In `@adapters/hermes/README.md`:
- Around line 34-51: Update the Hermes adapter documentation around
build_hermes_config to remove the claim that runtime.timeout_seconds controls
invocation timeouts, since the adapter does not consume it. Document the
supported harness.settings.terminal_timeout configuration instead, matching the
existing Hermes configuration behavior.

In `@docs/integrations/claude.mdx`:
- Around line 11-14: Update the documentation text around the environment
configuration and SDK pin so the configuration key `environment.env` and package
specification `claude-agent-sdk==0.2.120` use inline code formatting, preserving
the surrounding prose.

In `@docs/reference/api/python-library-reference/nemo_fabric.client.md`:
- Line 4: The first-use descriptions in
docs/reference/api/python-library-reference/nemo_fabric.client.md:4 and
docs/reference/api/python-library-reference/nemo_fabric.models.md:4 must use
“NVIDIA NeMo Fabric” instead of “NeMo Fabric”; update the source or generator
for both API references, then regenerate the files.

In `@docs/reference/api/python-library-reference/nemo_fabric.models.md`:
- Around line 1647-1656: Update the source or documentation generator for
configure_toolsets so its rendered signature preserves the keyword-only marker
after self, matching the source definition in models.py. Do not edit the
generated reference page directly; rerun just docs and verify the output shows
enabled and blocked as keyword-only parameters.
🪄 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: ASSERTIVE

Plan: Enterprise

Run ID: 3fd3b73f-50ed-47f0-9e33-d68d4ff28f9a

📥 Commits

Reviewing files that changed from the base of the PR and between de79c72 and bc43fc6.

📒 Files selected for processing (149)
  • README.md
  • adapters/README.md
  • adapters/claude/README.md
  • adapters/claude/fabric-adapter.json
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • adapters/codex/README.md
  • adapters/codex/fabric-adapter.json
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • adapters/deepagents/README.md
  • adapters/deepagents/fabric-adapter.json
  • adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py
  • adapters/hermes/README.md
  • adapters/hermes/fabric-adapter.json
  • adapters/hermes/src/nemo_fabric_adapters/hermes/adapter.py
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-cli/assets/adapters/codex/fabric-adapter.json
  • crates/fabric-cli/assets/adapters/deepagents/fabric-adapter.json
  • crates/fabric-cli/assets/adapters/hermes/fabric-adapter.json
  • crates/fabric-cli/src/examples.rs
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-cli/src/scaffold.rs
  • crates/fabric-cli/templates/python/main.py.tmpl
  • crates/fabric-cli/templates/rust/main.rs.tmpl
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/lib.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/schema.rs
  • docs/getting-started/quickstart.mdx
  • docs/integrations/claude.mdx
  • docs/integrations/codex.mdx
  • docs/reference/api/python-library-reference/index.md
  • docs/reference/api/python-library-reference/nemo_fabric.client.md
  • docs/reference/api/python-library-reference/nemo_fabric.errors.md
  • docs/reference/api/python-library-reference/nemo_fabric.models.md
  • docs/reference/api/python-library-reference/nemo_fabric.runtime.md
  • docs/reference/api/python-library-reference/nemo_fabric.types.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterconfigfield.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterdescriptorsource.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adapterkind.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-adaptersettingtype.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-capabilitykind.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-capabilitytarget.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-controllocation.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-environmentownership.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-mcpexposure.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatifstorageconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatofmode.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatofsinkconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatofstreamfieldnamepolicy.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayatofstreamtransport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayotlptransport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-relayunsupportedbehavior.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-resolutionstrategy.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/enum-telemetryprovider.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/fn-load-adapter-descriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/fn-resolve-run-plan-from-config.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterconfigsupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptermodelconfigsupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterrequirements.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptersettingschema.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptertelemetryprovidersupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adaptertelemetrysupport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-capabilityplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-capabilityroute.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-capabilitytargetplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-environmentconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-environmentplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-fabricconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-harnessconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-mcpconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-mcpserverconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-mcpserverplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-metadataconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-modelconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayatifconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayatofconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relaycomponentconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayconfigpolicy.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayobservabilityconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-relayotlpconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-resolvecontext.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-resolvedadapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-runplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-runtimecapabilities.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-runtimeconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-skillconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-telemetryconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-telemetryplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-telemetryproviderconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-toolsconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-toolsetconfig.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-toolsplan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/enum-doctorstatus.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/fn-doctor-plan.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/struct-doctorcheck.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/doctor/struct-doctorreport.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/type-result.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/fn-version.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/runtime/index.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/runtime/struct-environmenthandle.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/schema/index.mdx
  • docs/sdk/python.mdx
  • examples/code_review_agent/config.py
  • examples/harbor/README.md
  • examples/harbor/calculator/README.md
  • examples/harbor/swebench/README.md
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • examples/harbor/swebench/adapters/hermes/fabric-adapter.json
  • examples/notebooks/01_quickstart.ipynb
  • python/src/nemo_fabric/__init__.py
  • python/src/nemo_fabric/integrations/harbor/fabric_agent.py
  • python/src/nemo_fabric/models.py
  • python/src/nemo_fabric/types.py
  • schemas/adapter-descriptor.schema.json
  • schemas/adapter-invocation.schema.json
  • schemas/agent.schema.json
  • schemas/environment-handle.schema.json
  • schemas/run-plan.schema.json
  • schemas/runtime-context.schema.json
  • schemas/runtime-handle.schema.json
  • scripts/generate_api_docs.sh
  • skills/nemo-fabric-integrate/SKILL.md
  • skills/nemo-fabric-integrate/references/config-mapping.md
  • tests/_utils/configs.py
  • tests/adapters/test_adapaters_common_utils.py
  • tests/adapters/test_claude_adapter.py
  • tests/adapters/test_codex_adapter.py
  • tests/adapters/test_deepagents.py
  • tests/adapters/test_hermes_adapter.py
  • tests/e2e/test_claude.py
  • tests/e2e/test_codex.py
  • tests/e2e/test_deepagents.py
  • tests/e2e/test_hermes_config_mapping.py
  • tests/e2e/test_hermes_e2e.py
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/src/nemo_fabric_test_adapters/hermes_shim/adapter.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_native_sdk.py
  • tests/python/test_sdk_contract.py
  • tests/python/test_typed_config.py

Comment on lines +142 to +144
def timeout_seconds(payload: dict[str, Any], *, default: float) -> float:
value = (fabric_config(payload).get("runtime") or {}).get("timeout_seconds")
return float(default if value is None else value)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

timeout_seconds() silently accepts a boolean config value where max_turns() (two functions above) explicitly rejects one.

def max_turns(payload: dict[str, Any]) -> int | None:
    value = fabric_config(payload).get("max_turns")
    return value if isinstance(value, int) and not isinstance(value, bool) else None

def timeout_seconds(payload: dict[str, Any], *, default: float) -> float:
    value = (fabric_config(payload).get("runtime") or {}).get("timeout_seconds")
    return float(default if value is None else value)

float(True) is 1.0, so a config value of runtime.timeout_seconds: true (a plausible typo/misconfiguration) silently becomes a 1-second timeout instead of failing validation — directly undermining the fail-closed diagnostics goal this PR is built around. It also neutralizes the downstream isinstance(value, bool) guards in adapters/claude/.../adapter.py and adapters/codex/.../adapter.py, which now check a value that's already been coerced to float by this function and can therefore never be a bool again. A non-numeric type (e.g. a list/dict) would also raise an unstructured TypeError/ValueError here instead of a clean adapter-specific configuration error.

🐛 Proposed fix
 def timeout_seconds(payload: dict[str, Any], *, default: float) -> float:
     value = (fabric_config(payload).get("runtime") or {}).get("timeout_seconds")
-    return float(default if value is None else value)
+    if value is None:
+        return float(default)
+    if isinstance(value, bool) or not isinstance(value, (int, float)):
+        raise ValueError(
+            f"runtime.timeout_seconds must be a number, got {type(value).__name__}"
+        )
+    return float(value)
🤖 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 `@adapters/common/src/nemo_fabric_adapters/common/utils.py` around lines 142 -
144, Update timeout_seconds() to reject boolean and other non-numeric
timeout_seconds values before coercion, while preserving the default when the
value is absent. Return a validated float only for supported numeric values, and
raise the established configuration error used by the adapters so invalid
settings produce a clean fail-closed diagnostic; keep max_turns() behavior as
the validation model and ensure downstream boolean guards remain meaningful.

Comment thread adapters/hermes/README.md
Comment on lines +34 to +51
- selected model provider, model name, base URL, and temperature through
`models`;
- top-level `system_prompt` and `max_turns`;
- workspace and explicit environment variables through `environment`;
- invocation timeout through `runtime.timeout_seconds`;
- NeMo Fabric skills as external skill directories for Hermes Agent;
- NeMo Fabric MCP servers as Hermes Agent MCP server config;
- `tools.blocked` as disabled toolsets for Hermes Agent, unioned with
`harness.settings.disabled_toolsets`;
- `tools.toolsets.enabled` and `tools.toolsets.blocked` as Hermes toolset
selection and blocking policy;
- optional NeMo Relay telemetry plugin configuration.

`hermes_home` configures a base directory. The adapter creates a child under
`runtimes/<runtime_id>` so invocations in one NeMo Fabric runtime share Hermes Agent state
without sharing config or the session database with another runtime.
Per-tool `tools.blocked` is not accepted by Hermes because Hermes exposes
toolset-level policy at this boundary. Keep Hermes-specific controls such as
terminal timeout, reasoning configuration, and plugin configuration in
`harness.settings`. The adapter derives Hermes state from the Fabric artifact
root and creates a child under `runtimes/<runtime_id>`, so invocations in one
NeMo Fabric runtime share state without sharing config or the session database
with another runtime.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove or implement the runtime.timeout_seconds mapping claim.

build_hermes_config does not consume runtime.timeout_seconds; Hermes currently uses harness.settings.terminal_timeout. The README promises a control that the adapter does not map.

As per coding guidelines, “For NeMo Fabric documentation, verify technical claims against the current repository, public API, or documented command before reviewing style.”

🤖 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 `@adapters/hermes/README.md` around lines 34 - 51, Update the Hermes adapter
documentation around build_hermes_config to remove the claim that
runtime.timeout_seconds controls invocation timeouts, since the adapter does not
consume it. Document the supported harness.settings.terminal_timeout
configuration instead, matching the existing Hermes configuration behavior.

Sources: Coding guidelines, Path instructions

Comment on lines +11 to +14
variables plus values explicitly configured in `environment.env`.

The adapter pins `claude-agent-sdk==0.2.120`. The SDK owns its compatible Claude
Code runtime unless `harness.settings.cli_path` explicitly selects another
executable.
The adapter pins `claude-agent-sdk==0.2.120`. The SDK owns and selects its
compatible Claude Code runtime.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Format configuration fields and package pins as code.

Wrap environment.env and claude-agent-sdk==0.2.120 in backticks. The documentation rules require code elements and package names to use inline code formatting.

As per coding guidelines, code elements, package names, and paths must use inline code formatting.

🤖 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 `@docs/integrations/claude.mdx` around lines 11 - 14, Update the documentation
text around the environment configuration and SDK pin so the configuration key
`environment.env` and package specification `claude-agent-sdk==0.2.120` use
inline code formatting, preserving the surrounding prose.

Source: Coding guidelines

title: "Client"
slug: "/reference/api/python-library-reference/client"
description: "Resolve, plan, diagnose, and run agents with Fabric."
description: "Resolve, plan, diagnose, and run agents with NeMo Fabric."

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use the full product name in first-use descriptions.

Both changed descriptions should use NVIDIA NeMo Fabric on first use, then reserve NeMo Fabric for subsequent references.

  • docs/reference/api/python-library-reference/nemo_fabric.client.md#L4-L4: change the description to use NVIDIA NeMo Fabric.
  • docs/reference/api/python-library-reference/nemo_fabric.models.md#L4-L4: change the description to use NVIDIA NeMo Fabric.

As per coding guidelines, first use must be “NVIDIA NeMo Fabric”; as per path instructions, regenerate these API references through the source or generator.

📍 Affects 2 files
  • docs/reference/api/python-library-reference/nemo_fabric.client.md#L4-L4 (this comment)
  • docs/reference/api/python-library-reference/nemo_fabric.models.md#L4-L4
🤖 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 `@docs/reference/api/python-library-reference/nemo_fabric.client.md` at line 4,
The first-use descriptions in
docs/reference/api/python-library-reference/nemo_fabric.client.md:4 and
docs/reference/api/python-library-reference/nemo_fabric.models.md:4 must use
“NVIDIA NeMo Fabric” instead of “NeMo Fabric”; update the source or generator
for both API references, then regenerate the files.

Sources: Coding guidelines, Path instructions

Comment on lines +1647 to +1656
### <kbd>method</kbd> `configure_toolsets`

```python
configure_toolsets(
enabled: 'Sequence[str] | None' = None,
blocked: 'Sequence[str]' = ()
) → Self
```

Set adapter-native toolset selection and blocking policy.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Preserve the keyword-only configure_toolsets contract.

The source method in python/src/nemo_fabric/models.py defines configure_toolsets(*, enabled, blocked), but this page renders no *. Users following the documentation can pass positional arguments and receive TypeError; preserve the keyword-only marker in the generator output and rerun just docs.

As per path instructions, update the source or documentation generator instead of patching generated output directly.

🤖 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 `@docs/reference/api/python-library-reference/nemo_fabric.models.md` around
lines 1647 - 1656, Update the source or documentation generator for
configure_toolsets so its rendered signature preserves the keyword-only marker
after self, matching the source definition in models.py. Do not edit the
generated reference page directly; rerun just docs and verify the output shows
enabled and blocked as keyword-only parameters.

Source: Path instructions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant