Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
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
2 changes: 1 addition & 1 deletion .github/workflows/ci_python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ jobs:
- name: Build SDK with native extension
run: |
uv venv --python "${UV_PYTHON:-${{ matrix.python-version }}}" .venv
uv sync --no-default-groups --group adapter-tests --group test --extra claude --extra codex --extra deepagents ${{ matrix.python-version != '3.11' && '--extra harbor' || '' }} ${{ matrix.python-version != '3.14' && '--extra hermes-agent' || '' }} --extra relay
uv sync --no-default-groups --group adapter-tests --group test --extra claude --extra codex --extra deepagents --extra mini-swe-agent ${{ matrix.python-version != '3.11' && '--extra harbor' || '' }} ${{ matrix.python-version != '3.14' && '--extra hermes-agent' || '' }} --extra relay

- name: Run pytest
run: |
Expand Down
3,175 changes: 3,035 additions & 140 deletions ATTRIBUTIONS-Python.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ expressions install the components shown in each column:
| [Codex](docs/integrations/harness/codex.mdx) | `nemo-fabric[codex]` | `nemo-fabric-adapters-codex[harness]` | `nemo-fabric-adapters-codex` |
| [Hermes Agent](docs/integrations/harness/hermes.mdx) | `nemo-fabric[hermes-agent]` | `nemo-fabric-adapters-hermes[harness]` | `nemo-fabric-adapters-hermes` |
| [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` |

The `nemo-fabric` package always installs the runtime, and each root harness
extra adds the corresponding adapter and supported harness. Use the
Expand Down
66 changes: 35 additions & 31 deletions adapters/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ provider should expose more precise provenance.
| [Codex](codex/README.md) | `nvidia.fabric.codex` | `nemo-fabric-adapters-codex` | 3.11+ |
| [LangChain Deep Agents](deepagents/README.md) | `nvidia.fabric.langchain.deepagents` | `nemo-fabric-adapters-deepagents` | 3.11+ |
| [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+ |

## Configuration Compatibility

Expand All @@ -56,6 +57,7 @@ provider should expose more precise provenance.
| [Codex](codex/README.md) | Native OpenAI or a configured Responses-compatible provider | `tools.enabled` and `tools.blocked` unsupported | Normalized: stdio, HTTP, and streamable HTTP | Normalized `SKILL.md` directories | Not exposed |
| [LangChain Deep Agents](deepagents/README.md) | LangChain model providers | Middleware enforces `tools.enabled` and `tools.blocked` across built-ins, MCP, and local delegation | Normalized through `langchain-mcp-adapters` | Normalized | Built-in, declarative, and Agent Protocol |
| [Hermes Agent](hermes/README.md) | Configurable provider, model, and base URL | `tools.enabled` and `tools.blocked` map to Hermes native toolset selectors | Normalized | Normalized | Not exposed |
| [mini-SWE-agent](mini-swe-agent/README.md) | Configured provider and model | Not exposed | Not exposed | Not exposed | Not exposed |

"Normalized" means that the adapter accepts the corresponding `FabricConfig`
field. "Not exposed" does not mean that the underlying harness lacks the
Expand All @@ -81,36 +83,36 @@ its harness. `No` means an explicitly configured value fails planning instead
of being ignored. The following table groups provider-specific Relay subfields
and additive extension maps because their support does not vary by adapter:

| `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` | Closed adapter schema | Closed adapter schema | Closed adapter schema | Closed adapter schema |
| `workflow.entrypoint`, `.settings` | No | No | No | No |
| `models.<role>.provider` | `anthropic` uses native auth; custom names require an Anthropic Messages-compatible `base_url` and `api_key_env` | `openai` uses native auth; custom names require a Responses-compatible `base_url` and `api_key_env` | Dynamic LangChain provider; custom OpenAI-compatible endpoints require `base_url` and `api_key_env` | 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 |
| `instructions.system` | Yes | Yes; base instructions | Yes | Yes |
| `runtime.input_schema`, `.output_schema` | Core | Core | Core | Core |
| `runtime.artifacts`, `.timeout_seconds` | Core | Core | Core | Core |
| `runtime.max_turns` | Yes | No | No | Yes; iteration limit |
| `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.enabled`, `.blocked` | Yes | No | Yes | Yes; native selectors are Hermes toolset names |
| `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 |
| `FabricConfig` Field | Claude | Codex | Deep Agents | Hermes Agent | mini-SWE-agent |
| --- | --- | --- | --- | --- | --- |
| `schema_version` | Core | Core | Core | Core | Core |
| `metadata.name`, `.description` | Core | Core | Core | Core | Core |
| `harness.adapter_id`, `.resolution` | Core | Core | Core | Core | Core |
| `harness.settings` | Closed adapter schema | Closed adapter schema | Closed adapter schema | Closed adapter schema | Closed `timeout` schema |
| `workflow.entrypoint`, `.settings` | No | No | No | No | No |
| `models.<role>.provider` | `anthropic` uses native auth; custom names require an Anthropic Messages-compatible `base_url` and `api_key_env` | `openai` uses native auth; custom names require a Responses-compatible `base_url` and `api_key_env` | Dynamic LangChain provider; custom OpenAI-compatible endpoints require `base_url` and `api_key_env` | Dynamic Hermes provider | Configured provider |
| `models.<role>.model` | Yes | Yes | Yes | Yes | Yes |
| `models.<role>.api_key_env` | Yes | Yes | Yes | Yes | Yes |
| `models.<role>.base_url` | Yes | Yes | Yes | Yes | Yes |
| `models.<role>.temperature` | No | No | Yes | Yes | Yes |
| `models.<role>.settings.<key>` | No keys declared | No keys declared | No keys declared | No keys declared | No keys declared |
| `instructions.system` | Yes | Yes; base instructions | Yes | Yes | Yes |
| `runtime.input_schema`, `.output_schema` | Core | Core | Core | Core | Core |
| `runtime.artifacts`, `.timeout_seconds` | Core | Core | Core | Core | Core |
| `runtime.max_turns` | Yes | No | No | Yes; iteration limit | Yes |
| `environment.provider`, `.control_location`, `.ownership` | Core | Core | Core | Core | Core |
| `environment.workspace`, `.artifacts`, `.env` | Core | Core | Core | Core | Core |
| `environment.connection`, `.metadata`, `.settings` | Environment-provider-owned | Environment-provider-owned | Environment-provider-owned | Environment-provider-owned | Environment-provider-owned |
| `tools.enabled`, `.blocked` | Yes | No | Yes | Yes; native selectors are Hermes toolset names | No |
| `skills.paths` | Yes | Yes | Yes | Yes | No |
| `mcp.servers.<name>.transport`, `.url` with `harness_native` exposure | Yes | Yes | Yes | Yes | No |
| `mcp.servers.<name>.exposure = "fabric_managed"` | No; not implemented | No; not implemented | No; not implemented | No; not implemented | No |
| `telemetry.providers.relay` | Yes | Yes | Yes | Yes | No |
| `telemetry.providers.native` | No | Yes; OpenTelemetry | Yes; OpenTelemetry and OpenInference | No | No |
| `telemetry.providers.<provider>.config` | Declared-provider pass-through | Declared-provider pass-through | Declared-provider pass-through | Declared-provider pass-through | No |
| `relay.project`, `.output_dir`, `.observability` | Yes | Yes | Yes | Yes | No |
| `relay.components`, `.policy` | Yes | Yes | Yes | Yes | No |
| 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 | Preserved; no portable adapter semantics |

The selected model role is `default`, or the sole configured role when no
`default` exists. More than one role without `default` fails planning.
Expand Down Expand Up @@ -138,11 +140,13 @@ and produces normalized trajectories in Agent Trajectory Interchange Format
| [Codex](codex/README.md) | `AsyncCodex` app-server client and SDK thread | Runtime-owned Relay CLI gateway and Codex SDK hooks | Reuses the SDK thread and persists its thread ID | Closes the SDK client and app server, then stops the gateway | Not implemented |
| [LangChain Deep Agents](deepagents/README.md) | Compiled LangGraph agent, checkpointer, and thread ID | NeMo Relay Python SDK integration added when the agent is compiled | Creates a fresh Relay request scope and callback for each invocation | Closes the checkpointer; no gateway process | Not implemented |
| [Hermes Agent](hermes/README.md) | `AIAgent`, `SessionDB`, and conversation history | Hermes Agent NeMo Relay plugin context | Finalizes and flushes Relay after each invocation | Closes the agent and database, then exits the plugin context | Not implemented |
| [mini-SWE-agent](mini-swe-agent/README.md) | Conversation history | Not supported | Not applicable | Not applicable | Not implemented |

Telemetry output names use the descriptor contract values. Claude, Codex, and
Hermes Agent can emit NeMo Relay ATIF, OpenTelemetry, and OpenInference output. Deep
Agents supports the same Relay outputs plus native OpenTelemetry and
OpenInference; Codex also supports native OpenTelemetry.
OpenInference; Codex also supports native OpenTelemetry. mini-SWE-agent does
not support telemetry output.

Shared lifecycle, Relay gateway, hook, and payload helpers are documented in
the [adapter utilities guide](common/README.md).
1 change: 1 addition & 0 deletions adapters/mini-swe-agent/LICENSE
73 changes: 73 additions & 0 deletions adapters/mini-swe-agent/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<!--
SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: Apache-2.0
-->

# NVIDIA NeMo Fabric mini-SWE-agent Adapter

Use the `nvidia.fabric.mini-swe-agent` adapter to run mini-SWE-agent with
NVIDIA NeMo Fabric.

## Install

| Installation | Runtime | Adapter | Harness |
| --- | --- | --- | --- |
| `pip install "nemo-fabric[mini-swe-agent]"` | Yes | Yes | Yes |
| `pip install "nemo-fabric-adapters-mini-swe-agent[harness]"` | No | Yes | Yes |
| `pip install "nemo-fabric-adapters-mini-swe-agent[full]"` | No | Yes | Yes |
| `pip install nemo-fabric-adapters-mini-swe-agent` | No | Yes | No |
Comment thread
zhongxuanwang-nv marked this conversation as resolved.

The `harness` and `full` extras install the latest compatible mini-SWE-agent
2.x release.

## Configuration

The adapter supports `models`, `models.base_url`, `models.temperature`,
`instructions.system`, `runtime.max_turns`, and `environment.workspace`.
`runtime.timeout_seconds` sets the NVIDIA NeMo Fabric invocation deadline. Use
`harness.settings.timeout` to set the maximum duration of one command; the
default is `30` seconds.

Set `models.<role>.api_key_env` to the environment variable containing the
model-provider credential. This adapter does not support MCP, skills, tool
policy, streaming, or telemetry output.

```python
import asyncio

from nemo_fabric import EnvironmentConfig, Fabric, FabricConfig, HarnessConfig
from nemo_fabric import InstructionConfig, InstructionsConfig, MetadataConfig
from nemo_fabric import ModelConfig, RuntimeConfig

config = FabricConfig(
metadata=MetadataConfig(name="mini-swe-agent"),
harness=HarnessConfig(
adapter_id="nvidia.fabric.mini-swe-agent",
resolution="preinstalled",
settings={"timeout": 30},
),
models={
"default": ModelConfig(
provider="nvidia",
model="nvidia/nemotron-3-nano-omni-30b-a3b-reasoning",
api_key_env="NVIDIA_API_KEY",
base_url="https://integrate.api.nvidia.com/v1",
)
},
instructions=InstructionsConfig(
system=InstructionConfig(content="Work carefully and verify the change.")
),
runtime=RuntimeConfig(max_turns=50, timeout_seconds=1800),
environment=EnvironmentConfig(provider="local", workspace="/workspace"),
)

async def main():
return await Fabric().run(
config, base_dir="/workspace", input="Fix the failing test."
)


result = asyncio.run(main())
```

The result includes the submitted final text and API-call usage.
57 changes: 57 additions & 0 deletions adapters/mini-swe-agent/fabric-adapter.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{
"contract_version": "fabric.adapter/v1alpha2",
"adapter_id": "nvidia.fabric.mini-swe-agent",
"harness": "mini-swe-agent",
"adapter_kind": "python",
"runner": {
"module": "nemo_fabric_adapters.mini_swe_agent.adapter"
},
"model_schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"provider": {"type": "string", "minLength": 1},
"model": {"type": "string", "minLength": 1},
"temperature": {"type": "number"},
"api_key_env": {"type": "string", "minLength": 1},
"base_url": {"type": "string", "minLength": 1},
"settings": {
"type": "object",
"properties": {},
"additionalProperties": false
}
},
"required": ["provider", "model"],
"additionalProperties": false
},
"settings_schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"timeout": {
"type": "integer",
"minimum": 1,
"default": 30,
"description": "Maximum duration of one shell command."
}
},
"additionalProperties": false
},
"requirements": {},
"config": {
"input": "agent_config",
"accepts": [
"models",
"models.base_url",
"models.temperature",
"instructions.system",
"runtime.max_turns"
]
},
"capabilities": {
"service": false,
"streaming": false,
"updates": false,
"cancellation": false
}
}
27 changes: 27 additions & 0 deletions adapters/mini-swe-agent/pypi.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<!--
SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: Apache-2.0
-->

# NVIDIA NeMo Fabric mini-SWE-agent Adapter
Comment thread
zhongxuanwang-nv marked this conversation as resolved.

[![License](https://img.shields.io/github/license/NVIDIA/NeMo-Fabric)](https://github.com/NVIDIA/NeMo-Fabric/blob/main/LICENSE)
[![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)

`nemo-fabric-adapters-mini-swe-agent` translates the NVIDIA NeMo Fabric
adapter contract into mini-SWE-agent's native shell-only execution loop.

## Install

The following table shows which components each installation provides:

| Installation | Runtime | Adapter | Harness |
| --- | --- | --- | --- |
| `pip install "nemo-fabric[mini-swe-agent]"` | Yes | Yes | Yes |
| `pip install "nemo-fabric-adapters-mini-swe-agent[harness]"` | No | Yes | Yes |
| `pip install "nemo-fabric-adapters-mini-swe-agent[full]"` | No | Yes | Yes |
| `pip install nemo-fabric-adapters-mini-swe-agent` | No | Yes | No |

For configuration and behavior, see the
[mini-SWE-agent adapter README](https://github.com/NVIDIA/NeMo-Fabric/tree/main/adapters/mini-swe-agent/README.md).
55 changes: 55 additions & 0 deletions adapters/mini-swe-agent/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

[build-system]
requires = [
"setuptools>=77",
]
build-backend = "setuptools.build_meta"

[project]
name = "nemo-fabric-adapters-mini-swe-agent"
version = "0.2.0"
description = "mini-SWE-agent adapter for NeMo Fabric"
authors = [
{ name = "NVIDIA Corporation" },
]
keywords = ["agents", "ai", "nemo-fabric", "runtime", "tools"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Programming Language :: Python :: 3",
]
license = "Apache-2.0"
license-files = ["LICENSE"]
readme = "pypi.md"
requires-python = ">=3.11"
dependencies = [
"nemo-fabric-adapter-contract == 0.2.0",
"nemo-fabric-adapters-common == 0.2.0",
]

[project.optional-dependencies]
harness = [
"mini-swe-agent>=2.0,<3",
]
full = [
"mini-swe-agent>=2.0,<3",
]

[project.urls]
Repository = "https://github.com/NVIDIA/NeMo-Fabric"
Homepage = "https://github.com/NVIDIA/NeMo-Fabric"
Issues = "https://github.com/NVIDIA/NeMo-Fabric/issues"
Documentation = "https://docs.nvidia.com/nemo/fabric"

[tool.setuptools.packages.find]
where = ["src"]
include = ["nemo_fabric_adapters.mini_swe_agent*"]

[tool.setuptools.data-files]
"share/nemo-fabric/adapters/mini-swe-agent" = ["fabric-adapter.json"]

[tool.uv.sources]
nemo-fabric-adapter-contract = { path = "../../adapter-contract", editable = true }
nemo-fabric-adapters-common = { path = "../common", editable = true }
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

"""mini-SWE-agent adapter package for NeMo Fabric."""
Loading
Loading