Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 37 additions & 123 deletions docs/about-nemo-fabric/overview.mdx
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
---
title: "NVIDIA NeMo Fabric"
title: "NVIDIA NeMo Fabric Documentation"
slug: "/about-nemo-fabric/overview"
description: "Configure, plan, run, and observe agent harnesses through one typed execution contract."
template-library-version: "1.0.0"
---
{/* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: Apache-2.0 */}

NeMo Fabric is the harness-management layer that turns multiple agent runtimes
NVIDIA NeMo Fabric is the harness-management layer that turns multiple agent runtimes
into one configurable, observable execution surface. Applications use the same
versioned config, lifecycle, result, artifact, and telemetry contracts whether
the selected harness is Hermes Agent, Codex, or a custom adapter.
the selected harness is [Hermes Agent](https://hermes-agent.nousresearch.com/docs/),
[Codex SDK](https://openai.com/codex/), or a custom adapter.

NeMo Fabric owns the seam between an application and its harness. It resolves
configuration, selects an adapter, drives the runtime lifecycle,
Expand All @@ -19,25 +21,42 @@ into the caller.
## What NeMo Fabric Gives You

<CardGroup cols={2}>
<Card title="Typed configuration">
<Card title="Typed Configuration">
Construct a complete, versioned `FabricConfig` in Python. Applications
create variants with ordinary functions and typed copies.
</Card>
<Card title="Harness-neutral execution">
<Card title="Harness-Neutral Execution">
Plan and invoke different harnesses through one Rust core, CLI, and Python
SDK instead of embedding harness launch logic in every consumer.
</Card>
<Card title="Typed lifecycle contracts">
<Card title="Typed Lifecycle Contracts">
Resolve configs, inspect capabilities, run single-invocation jobs, and hold
multi-turn runtimes with typed requests, plans, handles, and results.
</Card>
<Card title="Normalized evidence">
<Card title="Normalized Evidence">
Collect output, errors, lifecycle events, artifact manifests, and telemetry
references in stable contracts suitable for platforms and evaluations.
</Card>
</CardGroup>

## How NeMo Fabric Fits

## Choose Your Interface

Use the following table to choose the NeMo Fabric interface that best fits how
your application works with harnesses:

| Interface | Use it when | Start with |
| --- | --- | --- |
| Python SDK | Your application owns job config, runtime lifecycle, or multi-turn state | [Client API](../reference/api/python-library-reference/nemo_fabric.client.md) |
| Runtime API | You need multiple ordered turns over one live harness runtime | [Runtime](../reference/api/python-library-reference/nemo_fabric.runtime.md) |
| Streaming API | You need live ATOF records generated by NeMo Relay during a runtime turn | [Streaming](../reference/api/python-library-reference/nemo_fabric.streaming.md) |
Comment thread
dagardner-nv marked this conversation as resolved.
Comment thread
dagardner-nv marked this conversation as resolved.
| `nemo-fabric` CLI | You are experimenting with harnesses, running maintained examples, or troubleshooting configs | [Experimentation CLI](../experimentation/cli.mdx) |
| JSON Schema | You are building editors, validation, code generation, or another language binding | Committed schemas in the [repository](https://github.com/NVIDIA/NeMo-Fabric/tree/main/schemas) |
Comment thread
dagardner-nv marked this conversation as resolved.

Use `FabricConfig` as the canonical configuration contract. CLI selectors
obtain complete typed configs from built-in presets or maintained examples.

## Core Workflow

```text
Application or evaluation harness
Expand All @@ -55,87 +74,6 @@ Hermes Agent | Codex | custom harness
RunResult + artifacts + events + telemetry references
```

The experimentation CLI and its catalogs live in the Rust `fabric-cli` crate
and are installed separately from the Python SDK. Built-in presets and
maintained examples produce a complete `FabricConfig` before using the same
run-plan contract. Adapters own harness-specific preparation and invocation;
consumers own the request and returned evidence.

## Quick Start

Install `just` 1.50.0+ if it is not already available.

```bash
cargo install just --locked
```

Refer to the [official installation guide](https://just.systems/man/en/installation.html)
for more details.

Ensure that the Cargo bin directory is in your `PATH`:

```bash
export PATH="$HOME/.cargo/bin:$PATH"
```

Create a Python virtual environment and activate it (replace `3.13` with your preferred Python version):

```bash
uv venv -p 3.13 --seed .venv
source .venv/bin/activate
```

Build the Python SDK and install the Rust CLI from a source checkout:

```bash
just build-all
```

Run the example through the Python SDK:

```python
import asyncio
from examples.code_review_agent import BASE_DIR, hermes_config
from nemo_fabric import Fabric


async def main() -> None:
config = hermes_config()
client = Fabric()
result = await client.run(
config,
base_dir=BASE_DIR,
input="Reply with exactly: fabric works",
)

print(result.status)


asyncio.run(main())
```

Harness installation and credential requirements differ by adapter. The
[repository quick start](https://github.com/NVIDIA/NeMo-Fabric#quick-start-hermes-agent)
contains the complete Hermes Agent environment recipe.

Refer to the [Python SDK guide](../sdk/python.mdx) for planning,
diagnostics, typed requests, multi-turn runtimes, and NVIDIA NeMo Relay streaming.

## Choose Your Interface

| Interface | Use it when | Start with |
| --- | --- | --- |
| Python SDK | Your application owns job config, runtime lifecycle, or multi-turn state | [Client API](../reference/api/python-library-reference/nemo_fabric.client.md) |
| Runtime API | You need multiple ordered turns over one live harness runtime | [Runtime](../reference/api/python-library-reference/nemo_fabric.runtime.md) |
| Streaming API | You need live ATOF records generated by NeMo Relay during a runtime turn | [Streaming](../reference/api/python-library-reference/nemo_fabric.streaming.md) |
| `nemo-fabric` CLI | You are experimenting with harnesses, running maintained examples, or troubleshooting configs | [Experimentation CLI](../experimentation/cli.mdx) |
| JSON Schema | You are building editors, validation, code generation, or another language binding | Committed schemas in the [repository](https://github.com/NVIDIA/NeMo-Fabric/tree/main/schemas) |

Use `FabricConfig` as the canonical configuration contract. CLI selectors
obtain complete typed configs from built-in presets or maintained examples.

## Core Workflow

1. **Configure** a typed `FabricConfig` with a harness adapter,
environment, models, tools, skills, MCP, and telemetry.
2. **Create variants** from deep copies to vary harness, model, environment, or
Expand All @@ -148,38 +86,14 @@ obtain complete typed configs from built-in presets or maintained examples.
5. **Consume evidence** from `RunResult`: output, structured failure details,
artifacts, events, and telemetry references.

## Next Steps
## Learn More

<CardGroup cols={2}>
<Card
title="Client API"
href="/reference/api/python-library-reference/client"
>
Resolve, plan, diagnose, run, and start stateful runtimes.
</Card>
<Card
title="Runtime"
href="/reference/api/python-library-reference/runtime"
>
Invoke multiple ordered turns and stop runtime handles safely.
</Card>
<Card
title="Streaming"
href="/reference/api/python-library-reference/streaming"
>
Consume live, raw NeMo Relay ATOF records and retrieve the terminal run result.
</Card>
<Card
title="Types"
href="/reference/api/python-library-reference/types"
>
Explore all mutable config objects and immutable request, plan, result,
artifact, telemetry, and runtime models.
</Card>
<Card
title="Errors"
href="/reference/api/python-library-reference/errors"
>
Handle config, capability, lifecycle, state, and native-extension failures.
</Card>
</CardGroup>
Continue exploring NeMo Fabric through these resources.

- **Installation** — [Installation](../getting-started/install.mdx) to set up the runtime and adapters.
- **Quickstart** — [Quickstart](../getting-started/quickstart.mdx) to build from
source and run the maintained SDK example.
- **Python SDK** — [Python SDK](../sdk/python.mdx) for planning, diagnostics,
typed requests, and multi-turn runtimes.
- **API Reference** — [Client API](../reference/api/python-library-reference/nemo_fabric.client.md)
to resolve, plan, diagnose, run, and start stateful runtimes.
2 changes: 1 addition & 1 deletion docs/getting-started/install.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: "Install NVIDIA NeMo Fabric"
title: "NVIDIA NeMo Fabric Installation"
description: "Install guide."
---
{/* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
Expand Down
2 changes: 2 additions & 0 deletions docs/getting-started/quickstart.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
title: "NVIDIA NeMo Fabric Quickstart"
description: "Get started with NVIDIA NeMo Fabric."
template-library-version: "1.0.0"
---
{/* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: Apache-2.0 */}
Expand Down Expand Up @@ -68,4 +69,5 @@ A more detailed version of this example is available as a [Jupyter Notebook](htt
at [`examples/notebooks/01_quickstart.ipynb`](https://github.com/NVIDIA/NeMo-Fabric/blob/main/examples/notebooks/01_quickstart.ipynb).

## Next Steps

- [Python SDK](../sdk/python.mdx)
32 changes: 17 additions & 15 deletions tests/docs/test_python_api_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
ROOT = Path(__file__).resolve().parents[2]
REFERENCE_DIR = ROOT / "docs" / "reference" / "api" / "python-library-reference"
LANDING_PAGE = ROOT / "docs" / "about-nemo-fabric" / "overview.mdx"
INSTALL_PAGE = ROOT / "docs" / "getting-started" / "install.mdx"
QUICKSTART_PAGE = ROOT / "docs" / "getting-started" / "quickstart.mdx"
NAVIGATION = ROOT / "docs" / "index.yml"
MODULE_SLUGS = {
"nemo_fabric.client": "/reference/api/python-library-reference/client",
Expand Down Expand Up @@ -354,33 +356,33 @@ def test_generated_module_and_class_headings_have_blank_lines():

def test_landing_page_routes_new_users_through_the_product() -> None:
landing = LANDING_PAGE.read_text(encoding="utf-8")
installation = INSTALL_PAGE.read_text(encoding="utf-8")
quickstart = QUICKSTART_PAGE.read_text(encoding="utf-8")
navigation = NAVIGATION.read_text(encoding="utf-8")

assert " - section: API\n" in navigation
assert " - section: APIs\n" not in navigation
assert 'title: "NVIDIA NeMo Fabric Documentation"' in landing
assert 'title: "NVIDIA NeMo Fabric Installation"' in installation
assert 'title: "NVIDIA NeMo Fabric Quickstart"' in quickstart
assert 'template-library-version: "1.0.0"' in landing
assert 'template-library-version: "1.0.0"' in quickstart

for heading in (
"## What NeMo Fabric Gives You",
"## How NeMo Fabric Fits",
"## Quick Start",
"## Choose Your Interface",
"## Core Workflow",
"## Next Steps",
"## Learn More",
):
assert heading in landing

for destination in (
"/reference/api/python-library-reference/client",
"/reference/api/python-library-reference/runtime",
"/reference/api/python-library-reference/streaming",
"/reference/api/python-library-reference/types",
"/reference/api/python-library-reference/errors",
"../getting-started/install.mdx",
"../getting-started/quickstart.mdx",
"../experimentation/cli.mdx",
"../sdk/python.mdx",
"../reference/api/python-library-reference/nemo_fabric.client.md",
"../reference/api/python-library-reference/nemo_fabric.runtime.md",
"../reference/api/python-library-reference/nemo_fabric.streaming.md",
):
assert destination in landing

quick_start = landing.split("## Quick Start", maxsplit=1)[1].split(
"## Choose Your Interface", maxsplit=1
)[0]
assert "client.plan(" not in quick_start
assert "client.doctor(" not in quick_start
assert "/sdk/python" in quick_start
Loading