Skip to content
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
00722f7
docs: plan adapter contract guide refresh
AnuradhaKaruppiah Aug 16, 2026
561c586
docs: rewrite adapter contract as staged guide
AnuradhaKaruppiah Aug 16, 2026
ba333d4
docs: present Fabric 0.2 adapter targets
AnuradhaKaruppiah Aug 16, 2026
b6f9928
docs: remove superseded hero image
AnuradhaKaruppiah Aug 16, 2026
2d7f2e8
docs: clarify harness adapter references
AnuradhaKaruppiah Aug 16, 2026
e2ac017
docs: simplify adapter contract overview
AnuradhaKaruppiah Aug 17, 2026
c026147
docs: clarify adapter contract boundaries
AnuradhaKaruppiah Aug 17, 2026
1a93999
docs: address adapter contract review feedback
AnuradhaKaruppiah Aug 17, 2026
7a8678e
docs: require repeated adapter invocation check
AnuradhaKaruppiah Aug 17, 2026
aed0c13
docs: use stable hero image path
AnuradhaKaruppiah Aug 17, 2026
c0b990a
Normalize adapter invocation request and result
AnuradhaKaruppiah Aug 17, 2026
12858eb
Remove redundant adapter config input selector
AnuradhaKaruppiah Aug 17, 2026
cc0877e
fix: harden normalized invocation values
AnuradhaKaruppiah Aug 17, 2026
569ae7d
docs: clarify adapter overview and roadmap
AnuradhaKaruppiah Aug 17, 2026
7dd8fd5
fix: address combined adapter contract review
AnuradhaKaruppiah Aug 17, 2026
4156279
docs: complete the adapter invocation boundary
AnuradhaKaruppiah Aug 17, 2026
dd088d0
docs: clarify Fabric overview and release notes
AnuradhaKaruppiah Aug 18, 2026
615f7c1
fix: address adapter invocation review feedback
AnuradhaKaruppiah Aug 18, 2026
98be43a
docs: clarify adapter target descriptor fields
AnuradhaKaruppiah Aug 18, 2026
2b964a1
docs: address adapter contract review feedback
AnuradhaKaruppiah Aug 18, 2026
2bc2fad
docs: polish adapter contract guidance
AnuradhaKaruppiah Aug 18, 2026
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
77 changes: 53 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,27 +13,47 @@ SPDX-License-Identifier: Apache-2.0
[![Crates.io](https://img.shields.io/crates/v/nemo-fabric-cli?label=nemo-fabric-cli&color=B7410E&logo=rust)](https://crates.io/crates/nemo-fabric-cli)

<p align="center">
<img src="assets/fabric-hero-option2.png" alt="Diagram showing NeMo Fabric connecting applications, evaluations, and reinforcement learning rollouts to Hermes, Codex, Claude, and Deep Agents, with results, artifacts, and telemetry as outputs." width="1000">
<img src="assets/fabric-hero.png" alt="Diagram showing NeMo Fabric connecting applications, evaluation systems, and reinforcement learning rollouts to Hermes Agent, Codex, Claude Code, LangChain Deep Agents, and custom agents, with results, artifacts, and telemetry as outputs." width="1000">
</p>

NeMo Fabric gives users one configurable, observable way to run applications
across multiple agent harnesses. It standardizes configuration, lifecycle
management, and results without requiring a separate integration for every harness.
across agent harnesses and custom agents. It standardizes configuration,
lifecycle management, and results without requiring target-specific control
code in every consumer.

NeMo Fabric lets you change harnesses without rebuilding each integration,
isolate conflicting runtime dependencies, and manage harness configuration,
execution, and observability consistently. Every run returns normalized
results, artifacts, and telemetry for downstream systems to consume.
NeMo Fabric lets you change Adapter Targets without rebuilding each consumer
integration, isolate conflicting runtime dependencies, and manage target
configuration, execution, and observability consistently. Every run returns
normalized results, artifacts, and telemetry for downstream systems to
consume.

It provides:

- a versioned, typed configuration contract;
- ordinary Python composition for experiment variants;
- adapter integrations for harness-specific launch and control;
- a public adapter contract for harnesses and custom agents;
- adapter integrations for target-specific launch and control;
- a Python SDK backed by the Rust core;
- normalized run results, artifact manifests, and telemetry references.

## Supported Harnesses
## What's New in Fabric 0.2

Fabric 0.2 expands the adapter boundary beyond bundled harness integrations:
Comment thread
AnuradhaKaruppiah marked this conversation as resolved.
Outdated

- The v1alpha2 adapter contract publishes canonical JSON Schemas,
dependency-free Python dataclasses, generated TypeScript types, maintained
authoring documentation, and a public adapter-building skill.
- Adapter Target Descriptors let independently installed custom agents select
a shared framework adapter and publish their own entry point and settings
schema without importing target code during planning.
- The NeMo Agent Toolkit reference demonstrates a shared adapter for multiple
registered workflows, while the LangGraph email-phishing example
demonstrates a dedicated custom-agent adapter.
- Native OpenAI Chat Completions streaming, MCP authentication and per-server
tool filters, and the compact mini-SWE-agent adapter extend the available
integration patterns.

## Bundled Harness Adapters

NeMo Fabric provides the following harness integrations. The package
expressions install the components shown in each column:
Expand All @@ -46,6 +66,14 @@ expressions install the components shown in each column:
| [LangChain Deep Agents](docs/integrations/harness/deepagents.mdx) | `nemo-fabric[deepagents]` | `nemo-fabric-adapters-deepagents[harness]` | `nemo-fabric-adapters-deepagents` |
| [mini-SWE-agent](docs/integrations/harness/mini-swe-agent.mdx) | `nemo-fabric[mini-swe-agent]` | `nemo-fabric-adapters-mini-swe-agent[harness]` | `nemo-fabric-adapters-mini-swe-agent` |

Custom agents use the same contract. Start with the
[NeMo Agent Toolkit shared adapter](external/nat/README.md) when one framework
adapter can load multiple registered agents, or the
[LangGraph custom-agent example](examples/langgraph_custom_agent/README.md)
when the application needs a dedicated adapter. The
[adapter contract overview](docs/adapter-contract/README.md) explains how to
choose and implement either path.

The `nemo-fabric` package always installs the runtime. Package-installable
harnesses provide root extras that add the corresponding adapter and supported
harness. Hermes Agent 0.20 and later is not available from PyPI; install it by
Expand Down Expand Up @@ -134,10 +162,10 @@ print(result.output.response)
`HarnessConfig.adapter_id` selects the Hermes Agent adapter. To use another
supported harness, install its package extra and set the corresponding adapter
ID. Pass harness-specific options through `HarnessConfig.settings` only when
the selected adapter descriptor declares them in `settings_schema`. Adapters
that expose selectable executables can accept `FabricConfig.workflow`; the
selected Adapter Target Descriptor defines the workflow entry point and
validates its settings.
the selected adapter descriptor declares them in `settings_schema`. A shared
framework adapter can expose registered custom agents through
`FabricConfig.workflow.target_id`; the selected Adapter Target Descriptor
defines the workflow entry point and validates its settings.

For a guided version of this example, refer to the
[`01_quickstart.ipynb` notebook](examples/notebooks/01_quickstart.ipynb). The
Expand Down Expand Up @@ -224,7 +252,7 @@ flowchart TB
Config["Typed configuration\nFabricConfig"]
Core["NeMo Fabric Rust core\nresolve | plan | create | invoke | destroy"]
Adapter["Selected NeMo Fabric adapter"]
Harness["Agent harness runtime\nHermes Agent | Codex | Claude Code | LangChain Deep Agents | custom"]
Harness["Adapter Target\nagent harness | shared framework | custom agent"]
Artifacts["Normalized results and artifacts\nresponse | logs | patches | telemetry refs"]
Relay["NVIDIA NeMo Relay\nATOF | ATIF | OTel | OpenInference when enabled"]

Expand Down Expand Up @@ -268,23 +296,24 @@ following resources to build or validate a consumer integration:
calculator verification test. You can also run the same task with Hermes
Agent or Claude and evaluate coding tasks with SWE-Bench.

### Harness Integrations
### Adapter Integrations

Harness integrations are southbound: they connect NeMo Fabric to agent harnesses
through adapters. Use the following reference to compare the integrations:
Adapter integrations are southbound: they connect NeMo Fabric to agent
harnesses and custom agents. Use these references to compare and build them:

- [Adapter compatibility and guides](adapters/README.md): compare bundled
harness support, runtime ownership, telemetry integration, and package guides.
- [Adapter contract](docs/adapter-contract/README.md): build third-party
adapters against the canonical schemas or the dependency-free Python and
TypeScript contract bindings.
- [Adapter contract](docs/adapter-contract/README.md): follow the incremental
guide for a minimum adapter, custom-agent patterns, canonical schemas, and
Python or TypeScript contract bindings.
- [Adapter examples](docs/adapter-contract/examples.md): compare the complete
Hermes Agent harness adapter, the minimum-surface mini-SWE-agent adapter, the
shared NeMo Agent Toolkit reference, and the dedicated LangGraph example.
Comment thread
AnuradhaKaruppiah marked this conversation as resolved.
Outdated

## Roadmap

- **Custom harness adapter contract:** Publish and evolve canonical schemas and
dependency-free language bindings for third-party harness integrations.
- **Experimental NVIDIA NeMo Agent Toolkit adapter:** Develop an experimental adapter
for running NeMo Agent Toolkit workflows through the NeMo Fabric lifecycle.
- **Third-party adapter registry:** Extend installed and explicit descriptor
discovery with a provider-backed registry and catalog experience.
- **OOAgents:** Add support for
[OOAgents](https://github.com/NVIDIA-NeMo/labs-OO-Agents).
- **Remote agents:** Add support for invoking remotely hosted agents through the
Expand Down
14 changes: 8 additions & 6 deletions adapter-contract/python/pypi.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ SPDX-License-Identifier: Apache-2.0
[![GitHub](https://img.shields.io/badge/github-repo-blue?logo=github)](https://github.com/NVIDIA/NeMo-Fabric/)
[![Release](https://img.shields.io/github/v/release/NVIDIA/NeMo-Fabric?color=green)](https://github.com/NVIDIA/NeMo-Fabric/releases)

![Diagram showing NeMo Fabric connecting applications, evaluations, and reinforcement learning rollouts to Hermes, Codex, Claude, and Deep Agents, with results, artifacts, and telemetry as outputs.](https://raw.githubusercontent.com/NVIDIA/NeMo-Fabric/refs/heads/main/assets/fabric-hero-option2.png)
![Diagram showing NeMo Fabric connecting applications, evaluation systems, and reinforcement learning rollouts to harnesses and custom agents, with results, artifacts, and telemetry as outputs.](https://raw.githubusercontent.com/NVIDIA/NeMo-Fabric/refs/heads/main/assets/fabric-hero.png)
Comment thread
AnuradhaKaruppiah marked this conversation as resolved.

`nemo-fabric-adapter-contract` provides the typed Python configuration and
execution contract implemented by NeMo Fabric adapters. It does not include a
Expand All @@ -30,9 +30,9 @@ Import `AgentConfig` from the contract models module:
from nemo_fabric_adapter_contract.models import AgentConfig
```

An adapter descriptor opts into the southbound configuration with
`config.input=agent_config`. Python adapters using the optional common
lifecycle host pass `AgentConfig.from_mapping` as the `config_loader`.
NeMo Fabric delivers `AgentConfig` as the southbound configuration. Python
adapters using the optional common lifecycle host pass
`AgentConfig.from_mapping` as the `config_loader`.

## Install

Expand All @@ -48,6 +48,8 @@ Install the optional `pydantic` extra to enable Pydantic interoperability.
pip install "nemo-fabric-adapter-contract[pydantic]"
```

Refer to the [NeMo Fabric documentation](https://docs.nvidia.com/nemo/fabric)
for adapter and configuration guidance. Source code is available in the
Use the maintained
[adapter contract documentation](https://github.com/NVIDIA/NeMo-Fabric/tree/main/docs/adapter-contract)
and [canonical JSON Schemas](https://github.com/NVIDIA/NeMo-Fabric/tree/main/schemas/adapter-contract)
as the implementation source of truth. Source code is available in the
[NVIDIA NeMo Fabric repository](https://github.com/NVIDIA/NeMo-Fabric).
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,7 @@ class AgentConfig(AgentContractBlock):

@dataclass(slots=True, kw_only=True)
class AgentRunRequest(AgentContractBlock):
"""Preview southbound request for the future typed invoke transport."""
"""Southbound invocation request passed to an adapter target."""

input: JsonValue = _json_value_field()
context: dict[str, JsonValue] = _json_dict()
Expand Down Expand Up @@ -506,7 +506,7 @@ def _validate(self) -> None:

@dataclass(slots=True, kw_only=True)
class AgentRunResult(AgentContractBlock):
"""Preview southbound result for the future typed invoke transport."""
"""Southbound terminal result returned by an adapter target."""

status: AgentRunStatus
output: JsonValue = _json_value_field()
Expand Down
10 changes: 7 additions & 3 deletions adapter-contract/typescript/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,20 @@ import type {

const descriptor: AdapterDescriptor = {
contract_version: ADAPTER_CONTRACT_VERSION,
adapter_id: "pi",
harness: "pi",
adapter_kind: "process",
adapter_id: "com.acme.fabric.example",
adapter_kind: "http",
};
```

Property names intentionally match the JSON wire format and remain
`snake_case`. Optional properties are distinct from properties whose value may
be `null`.

Use the maintained
[adapter contract documentation](https://github.com/NVIDIA/NeMo-Fabric/tree/main/docs/adapter-contract)
for the implementation sequence and the bundled schemas for runtime
validation.

## Invocation Types

The package root also exports the same request and result models as the Python
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,16 +70,6 @@
}
]
},
"AdapterConfigInput": {
"description": "Configuration object delivered to an adapter lifecycle host.",
"oneOf": [
{
"const": "agent_config",
"description": "Deliver the resolved southbound `AgentConfig` contract.",
"type": "string"
}
]
},
"AdapterConfigSupport": {
"additionalProperties": true,
"description": "Adapter config support.",
Expand All @@ -97,11 +87,6 @@
"type": "string"
},
"type": "array"
},
"input": {
"$ref": "#/$defs/AdapterConfigInput",
"default": "agent_config",
"description": "Configuration object delivered to the adapter lifecycle host."
}
},
"type": "object"
Expand Down Expand Up @@ -282,9 +267,7 @@
},
"config": {
"$ref": "#/$defs/AdapterConfigSupport",
"default": {
"input": "agent_config"
},
"default": {},
"description": "NeMo Fabric config areas this adapter consumes or generates."
},
"contract_version": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"description": "Preview southbound invocation request.\n\nThe current local-host transport does not enforce this type. It will join\nthe negotiated adapter contract when typed invoke transport is implemented.",
"description": "Southbound invocation request passed to an adapter target.",
"properties": {
"context": {
"additionalProperties": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@
}
}
],
"description": "Preview southbound terminal result.\n\nThe current local-host transport does not decode this type. It will join\nthe negotiated adapter contract when typed invoke transport is implemented.",
"description": "Southbound terminal result returned by an adapter target.",
"properties": {
"artifacts": {
"description": "Artifacts produced by the adapter target.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,6 @@ export type AdapterConfigSupport = {
* Harness-native files generated by this adapter.
*/
generates?: string[];
/**
* Configuration object delivered to the adapter lifecycle host.
*/
input?: "agent_config";
} & JsonObject;
/**
* Runtime requirements.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@
import type { JsonObject, JsonValue } from "../json.js";

/**
* Preview southbound invocation request.
*
* The current local-host transport does not enforce this type. It will join
* the negotiated adapter contract when typed invoke transport is implemented.
* Southbound invocation request passed to an adapter target.
*/
export interface AgentRunRequest {
/**
Expand Down
8 changes: 1 addition & 7 deletions adapter-contract/typescript/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
// SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

import type {
AdapterConfigSupport,
AdapterDescriptor,
} from "./generated/adapter-descriptor.js";
import type { AdapterDescriptor } from "./generated/adapter-descriptor.js";
import type { AgentInstructionConfig } from "./generated/agent-config.js";
import type { AgentRunResult } from "./generated/agent-run-result.js";
import type { EnvironmentHandle } from "./generated/runtime-context.js";
Expand All @@ -29,9 +26,6 @@ export type AdapterContractVersion = typeof ADAPTER_CONTRACT_VERSION;
/** Adapter implementation kind. */
export type AdapterKind = AdapterDescriptor["adapter_kind"];

/** Configuration object delivered to an adapter lifecycle host. */
export type AdapterConfigInput = NonNullable<AdapterConfigSupport["input"]>;

/** How an instruction value is applied to the selected harness. */
export type InstructionMode = NonNullable<AgentInstructionConfig["mode"]>;

Expand Down
3 changes: 0 additions & 3 deletions adapter-contract/typescript/test/stable.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

import { ADAPTER_CONTRACT_VERSION } from "../src/index.js";
import type {
AdapterConfigInput,
AdapterContractVersion,
AdapterDescriptor,
AdapterKind,
Expand Down Expand Up @@ -98,7 +97,6 @@ const jsonValues: JsonValue[] = [
];

const supportTypes: [
AdapterConfigInput,
AdapterContractVersion,
AdapterKind,
ControlLocation,
Expand All @@ -107,7 +105,6 @@ const supportTypes: [
TelemetryProvider,
AdapterTelemetryProviderSupport,
] = [
"agent_config",
ADAPTER_CONTRACT_VERSION,
"process",
"external_control",
Expand Down
25 changes: 20 additions & 5 deletions adapters/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All
SPDX-License-Identifier: Apache-2.0
-->

# NVIDIA NeMo Fabric Agent Harness Adapters
# NVIDIA NeMo Fabric Adapters

NeMo Fabric adapters translate the normalized NeMo Fabric contract into
harness-native models, tools, sessions, and telemetry. Use this reference to
compare the bundled adapters and then open the linked package guide for
installation, authentication, and configuration details.
NeMo Fabric adapters translate the normalized NeMo Fabric contract into the
native models, tools, sessions, and telemetry of an agent harness or custom
agent. Use this reference to compare the bundled harness adapters, then refer
to the custom-agent examples when building a shared framework adapter or a
dedicated adapter.

The adapter descriptor selected in `RunPlan` is authoritative for normalized
configuration, its adapter-owned settings schema, and telemetry support.
Expand Down Expand Up @@ -40,6 +41,20 @@ schemas come from independently registered Adapter Target Descriptors.
| [Hermes Agent](hermes/README.md) | `nvidia.fabric.hermes` | `nemo-fabric-adapters-hermes` | 3.11-3.13 |
| [mini-SWE-agent](mini-swe-agent/README.md) | `nvidia.fabric.mini-swe-agent` | `nemo-fabric-adapters-mini-swe-agent` | 3.11+ |

## Custom-Agent Adapter References

Custom-agent support uses the same adapter contract as the bundled harnesses:

- The [NeMo Agent Toolkit reference adapter](../external/nat/README.md) shows
one shared framework adapter with separately registered calculator and
email-phishing targets.
- The [LangGraph custom-agent example](../examples/langgraph_custom_agent/README.md)
shows a dedicated adapter beside an application-owned graph.

Start with the
[adapter contract overview](../docs/adapter-contract/README.md) to choose an
integration shape and implement the minimum lifecycle.

## Configuration Compatibility

| Agent Harness | Models | Tool Policy | MCP | Skills | Subagents |
Expand Down
14 changes: 13 additions & 1 deletion adapters/claude/claude.fabric-adapter.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,20 @@
"required": [],
"additionalProperties": false
},
"extension_schemas": {
"run_error": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"subtype": {"type": "string"},
"api_error_status": {"type": "integer"},
"exit_code": {"type": "integer"},
"timeout_seconds": {"type": "number", "minimum": 0}
},
"additionalProperties": false
}
},
"config": {
"input": "agent_config",
"accepts": [
"models",
"models.base_url",
Expand Down
Loading
Loading