Best for
- Use when creating adapter or target descriptors, mapping AgentConfig into an agent harness or custom-agent runtime, implementing start/invoke/stop, declaring schemas and capabilities, packaging discovery metadata, or as…
NVIDIA/skills/skills/nemo-fabric-build-adapter/SKILL.md
Build, migrate, review, and maintain third-party NVIDIA NeMo Fabric adapters against the public adapter contract. Use when creating adapter or target descriptors, mapping AgentConfig into an agent harness or custom-agent runtime, implementing start/invoke/stop, declaring schemas and capabilities, packaging discovery metadata, or assessing adapter conformance. Do not use for consumer applications that only call the NVIDIA NeMo Fabric SDK.
Decision brief
Build against the published southbound contract. Keep the adapter thin: let NeMo Fabric own planning and consumer-facing behavior, and let the adapter own only target translation and lifecycle state.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/NVIDIA/skills --skill "skills/nemo-fabric-build-adapter"Inspect the Agent Skill "nemo-fabric-build-adapter" from https://github.com/NVIDIA/skills/blob/994b87022af46deada9fdb79fc560a77aaf931ce/skills/nemo-fabric-build-adapter/SKILL.md at commit 994b87022af46deada9fdb79fc560a77aaf931ce. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Read the current adapter contract before changing code. Start with the overview, choose an integration shape, then follow the numbered descriptor, configuration, execution, results, registration, and verification stages. Read the custom-agent page when the target loads applicati…
Establish the adapter boundary before defining its descriptor:
Create one self-contained .fabric-adapter.json before implementing target translation:
Install the descriptor in the standard shared-data location. For setuptools:
Accept a validated AgentConfig and translate each declared field once at the adapter boundary:
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 93/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 3,106 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Build against the published southbound contract. Keep the adapter thin: let NeMo Fabric own planning and consumer-facing behavior, and let the adapter own only target translation and lifecycle state.
Read the current adapter contract before changing code. Start with the overview, choose an integration shape, then follow the numbered descriptor, configuration, execution, results, registration, and verification stages. Read the custom-agent page when the target loads application-defined agents or workflows. Read the optional native OpenAI streaming page only when the adapter claims that capability.
Use the committed adapter-contract JSON Schemas or the schemas installed with the matching NeMo Fabric release for exact wire shapes. Do not reconstruct a schema from examples or copy field lists into adapter code.
Establish the adapter boundary before defining its descriptor:
adapter_id.harness.settings, per-target workflow.settings,
and typed extensions.If the requested behavior cannot be expressed by the current contract, surface the gap. Do not silently consume an unsupported northbound field or hide it in an unrelated extension.
Create one self-contained *.fabric-adapter.json before implementing target
translation:
contract_version, a globally stable adapter_id,
adapter_kind, and runner binding.config.accepts fields the implementation enforces.mcp.auth.oauth2 or mcp.auth.service_account only when the adapter
implements the corresponding MCP authentication mode.settings_schema, model_schema, tool_definition_schema,
and extension_schemas where applicable. Use
model_schema only for static model/provider compatibility and model settings;
keep credential validity and provider availability in startup validation.capabilities.streaming only
when the adapter implements native OpenAI Chat Completions streaming through
invoke_openai_stream. Relay-backed ATOF streaming is independent and does
not require this capability.If the adapter loads registered targets, list their types in target_types.
Create one *.fabric-target.json per target. The target record owns its
adapter_id, type-specific entry point, and workflow settings schema. It uses
the same contract_version as the Adapter Descriptor.
Validate descriptor schemas without importing adapter code. Keep all schema references local to the descriptor document; do not rely on HTTP or file references.
Install the descriptor in the standard shared-data location. For setuptools:
[tool.setuptools.data-files]
"share/nemo-fabric/adapters/acme" = ["acme.fabric-adapter.json"]
"share/nemo-fabric/targets/acme" = ["email.fabric-target.json"]
Depend on nemo-fabric-adapter-contract for typed standard-library dataclasses.
Install its optional pydantic extra only for Pydantic interoperability. Add
nemo-fabric-adapters-common only if the adapter chooses its lifecycle or
Relay helpers. A bare adapter package should not depend on the NeMo Fabric
runtime.
For a TypeScript adapter, depend on
nemo-fabric-adapter-contract. Import descriptor, configuration,
runtime-context, request, and result types from the package root, matching the
Python package's single model namespace. TypeScript types do not validate data
received from a process or network boundary; validate untrusted values against
the JSON Schemas included with the package.
Accept a validated AgentConfig and translate each declared field once at the
adapter boundary:
start in
the task environment.RuntimeContext,
not from workflow settings.Reject unsupported values with stable, safe error codes. Do not log complete configs, environment values, headers, credentials, or arbitrary user input.
Use typed extension models and publish their schemas at the exact descriptor
extension point. Never treat extensions as an unchecked dictionary escape
hatch.
Implement exactly one start, zero or more ordered invoke operations, and
one stop for each NeMo Fabric runtime.
start.AgentRunRequest and RuntimeContext, then return one
AgentRunResult from invoke.stop safe after partial startup and failed invocation.capabilities.streaming, implement
async invoke_openai_stream(request, context, emit). Execute the target exactly once,
await emit(chunk) only for the openai.chat_completions.chunk/v1 profile,
and return one AgentRunResult. Each chunk requires
non-empty id and model, a nonnegative integer created, the exact
chat.completion.chunk discriminator, and structurally valid choices. An
invocation that emits no chunks is valid.Runtime.invoke_stream(); execute ordinary invoke and use the provided
telemetry context.For native OpenAI streaming, the SDK owns the authenticated loopback HTTP
transport with chunked NDJSON framing. The common host validates the transport,
removes its credentials from the adapter payload, and supplies the emit
callback. Do not persist or log stream credentials, write chunks to stdout, add
SSE framing, or forward other target-native event profiles.
For a Python adapter that opts into the common host:
from nemo_fabric_adapter_contract.models import AgentConfig
from nemo_fabric_adapter_contract.models import AgentRunRequest
from nemo_fabric_adapter_contract.models import AgentRunResult
from nemo_fabric_adapter_contract.models import AgentRunStatus
from nemo_fabric_adapter_contract.models import RuntimeContext
from nemo_fabric_adapters.common import lifecycle
class TargetRuntime:
async def start(self, payload):
config: AgentConfig = payload["config"]
...
async def invoke(
self,
request: AgentRunRequest,
context: RuntimeContext,
) -> AgentRunResult:
native = await self.target.run(request.input)
return AgentRunResult(
status=AgentRunStatus.SUCCEEDED,
output={"response": native.text},
)
async def invoke_openai_stream(self, request, context, emit):
async for chunk in self.target.stream(request.input):
await emit(chunk)
return AgentRunResult(
status=AgentRunStatus.SUCCEEDED,
output={"response": self.target.final_text},
)
async def stop(self):
...
def main() -> None:
lifecycle.serve(TargetRuntime, config_loader=AgentConfig.from_mapping)
The common host decodes the internal lifecycle envelope before calling the
adapter and encodes its terminal result afterward. Adapter code does not parse
the transport envelope or infer failure from fields inside output.
Return AgentRunStatus.FAILED with an AgentRunError when the target completes
with a failed outcome. Raise an exception when the adapter cannot produce a
normalized terminal result.
For a shared framework adapter, select the registered target with
FabricConfig.workflow.target_id. Use the selected Adapter Target Descriptor's
spec.entrypoint.kind for adapter-scoped resolution semantics and ref for
the factory identity. Validate workflow.settings against that target's
spec.settings_schema.
factory intent to the corresponding target-native factory.
The current NeMo Agent Toolkit reference maps fabric.agent.react to its
ReAct workflow factory.FabricConfig
or AgentConfig.Compare the NeMo Agent Toolkit shared adapter with the dedicated LangGraph example before choosing the custom-agent boundary.
Complete these checks before handing off an adapter:
share/nemo-fabric and inspect the resolved adapter
and target descriptors in Fabric().plan(...).doctor(...) with both missing and satisfied requirements.Do not claim automated NeMo Fabric conformance until the published conformance suite exists and the exact adapter release passes it.
Frequently asked questions
Build against the published southbound contract. Keep the adapter thin: let NeMo Fabric own planning and consumer-facing behavior, and let the adapter own only target translation and lifecycle state.
The source record exposes this install command: npx skills add https://github.com/NVIDIA/skills --skill "skills/nemo-fabric-build-adapter". Inspect the command and pinned source before running it.