> This page is for version Latest (default).
> For other versions, use one of these documentation indexes:
> - Latest (default): https://docs.nvidia.com/nemo-helix/latest/llms.txt
> - 0.8.0: https://docs.nvidia.com/nemo-helix/v0.8.0/llms.txt
> - 0.7.1: https://docs.nvidia.com/nemo-helix/v0.7.1/llms.txt
> - 0.7.0: https://docs.nvidia.com/nemo-helix/v0.7.0/llms.txt
> - 0.6.0: https://docs.nvidia.com/nemo-helix/v0.6.0/llms.txt
> - 0.5.1: https://docs.nvidia.com/nemo-helix/v0.5.1/llms.txt
> - 0.5.0: https://docs.nvidia.com/nemo-helix/v0.5.0/llms.txt
> - 0.4.0: https://docs.nvidia.com/nemo-helix/v0.4.0/llms.txt
> - 0.3.0: https://docs.nvidia.com/nemo-helix/v0.3.0/llms.txt
> - 0.2.0: https://docs.nvidia.com/nemo-helix/v0.2.0/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/nemo-helix/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/nemo-helix/_mcp/server.

# Tutorials

These tutorials cover the two user-facing surfaces of the Anonymizer plugin: the streaming `preview` workflow for iteration, and the `run` job for full datasets.

## Library vs. Service

Anonymizer separates **configuration** (what to detect and how to replace it) from **execution** (where the work runs and how models are reached).

**Part 1: Build the config (library)**

Use [`anonymizer.config`](https://github.com/NVIDIA-NeMo/Anonymizer/tree/main/docs) to define the rewrite or replacement strategy and detection options. This code is identical whether you run Anonymizer standalone or through NeMo Helix service.

```python
from anonymizer.config.anonymizer_config import AnonymizerConfig
from anonymizer.config.replace_strategies import Redact

config = AnonymizerConfig(
    replace=Redact(format_template="[REDACTED_{label}]"),
)
```

**Part 2: Execute (platform)**

Submit the config to the Anonymizer service. The plugin owns the request shape (`PreviewRequest`, `AnonymizerRequest`) so it can also describe the input source and model routing:

```python
import os
from anonymizer.config.anonymizer_config import AnonymizerConfig
from anonymizer.config.replace_strategies import Redact
from data_designer.config import ModelConfig
from nemo_anonymizer_plugin.app.input import AnonymizerInputSpec
from nemo_anonymizer_plugin.app.task_config import PreviewRequest
from nemo_anonymizer_plugin.sdk.resources import AnonymizerResource
from nemo_helix_plugin.client.client import NemoClient

MODEL_PROVIDER = os.environ.get("NHX_ANON_PROVIDER", "nvidia-build")

config = AnonymizerConfig(
    replace=Redact(format_template="[REDACTED_{label}]"),
)

model_configs = [
    # The Anonymizer plugin manages a default PII entity detector, so it is not
    # configured here (you may override it with a ModelConfig, but that is
    # optional). These entries cover the remaining LLM roles.
    ModelConfig(alias="gpt-oss-120b", provider=MODEL_PROVIDER, model="openai/gpt-oss-120b"),
    ModelConfig(alias="nemotron-30b-thinking", provider=MODEL_PROVIDER, model="nvidia/nemotron-3.5-lightning-30b-a3b"),
]

client = NemoClient.from_config()
WORKSPACE = client.resolve_workspace()
anonymizer = AnonymizerResource(client)

preview = anonymizer.preview(
    PreviewRequest(
        config=config,
        data=AnonymizerInputSpec(
            source=f"fileset://{WORKSPACE}/anonymizer-inputs#anonymizer-input.csv",
            text_column="biography",
            id_column="id",
        ),
        model_configs=model_configs,
        num_records=10,
    )
)
```

## Service-Specific Considerations

When using Anonymizer as a NeMo Helix service:

| Feature        | Difference                           | Details                                                                                        |
| -------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------- |
| **Inference**  | Routes through the Inference Gateway | Configure providers once and reference them by name from `model_configs`.                      |
| **Input data** | Filesets and HTTP(S) URLs            | Use `client.files.create_fileset` / `client.files.upload_file`, then reference with `#<path>`. |
| **Artifacts**  | Platform-managed                     | `run` stores artifacts in NeMo Helix job storage.                                              |

## Prerequisites

Complete [Setup](/documentation/get-started) to install NeMo Helix, run `nemo services run`, and configure an inference provider. The Anonymizer plugin is currently supported from NeMo Helix monorepo workspace: run `make bootstrap` at the repo root, or `make bootstrap-python` / `uv sync` if you only need Python dependencies, so uv can resolve `nemo-anonymizer-plugin` and the workspace prerequisites `nhx-common`, `nemo-helix-plugin`, and `data-designer-nemo`.

The root workspace includes the Anonymizer plugin, so `nemo services run` discovers it automatically and mounts `/apis/anonymizer/...` on the gateway. Standalone installation from a fresh environment outside the repo is not available. Verify the CLI is registered:

```bash
nemo anonymizer --help
```

You should see `validate`, `preview`, and `run` commands.

These tutorials route inference through an [Inference Gateway](/documentation/models-and-inference) provider, so a NeMo Helix cluster must be running before you preview or run a job. The examples reference the default NVIDIA Build provider created during setup.

> **Note**
>
> `nemo setup` pre-configures a `default/nvidia-build` model provider during local startup.
> This provider routes inference requests to models hosted on `build.nvidia.com` using the API base URL `https://integrate.api.nvidia.com`
> and the NGC API key with `Public API Endpoints` permissions provided during deployment.
>
> You can verify this provider exists by running `nemo inference providers list --workspace default`.
>
> The tutorials in these docs use this provider for inference, but you can alternatively create your own and use it instead.

### Upload an Input Fileset

`anonymizer.preview`, `nemo anonymizer preview`, and `nemo anonymizer run` reject local file paths, so the tutorials read from a fileset. Create a small CSV containing PII and upload it to a fileset named `anonymizer-inputs`:

```python
import tempfile
from pathlib import Path

from nemo_helix_plugin.client.client import NemoClient
from nemo_helix_plugin.files.types import CreateFilesetRequest

FILESET = "anonymizer-inputs"
INPUT_FILENAME = "anonymizer-input.csv"

client = NemoClient.from_config()
WORKSPACE = client.resolve_workspace()

with tempfile.NamedTemporaryFile("w", suffix=".csv", delete=False) as f:
    f.write(
        "id,biography\n"
        "1,Alice Johnson lives in Seattle and works at NVIDIA.\n"
        "2,Bob Smith can be reached at bob.smith@example.com.\n"
    )
    input_path = Path(f.name)

client.files.create_fileset(
    workspace=WORKSPACE,
    body=CreateFilesetRequest(name=FILESET, description="Anonymizer input files"),
    exist_ok=True,
)

client.files.upload_file(
    workspace=WORKSPACE,
    name=FILESET,
    path=INPUT_FILENAME,
    content=input_path.read_bytes(),
)
```

The tutorials reference this file with `fileset://{WORKSPACE}/anonymizer-inputs#anonymizer-input.csv`.

## Tutorials

#### [Preview a Config](/documentation/anonymize-data/tutorials/preview-a-config)

Stream a small anonymized sample to iterate on `AnonymizerConfig` and `model_configs` with the SDK or `nemo anonymizer preview`.

beginner anonymizer

#### [Run an Anonymizer Job](/documentation/anonymize-data/tutorials/run-an-anonymizer-job)

Submit the full pipeline to the Jobs worker with `nemo anonymizer run`. Load `dataset.parquet`, `trace.parquet`, and `failed_records.json` artifacts.

intermediate anonymizer