NeMo Anonymizer skill

An NVIDIA skill that leads an agent from a privacy brief to a script that finds and replaces personal data in text datasets.

  • 137 ★ on the repository
  • Last commit
  • Apache-2.0
Skill

Extended access

Why this level

  • The generated script sends texts with personal data to OpenRouter models unless custom providers are set.
  • The script runs code on user data and spends paid model calls.
All reasons and checks

nvidia-nemo/anonymizer

Install

In your terminal, with SkillFoxx CLI

npx skillfoxx add skills/nemo-anonymizer

Detects the agents on your machine, shows the access level and pins the version.

Other ways to install

Access and checks

How we review

Extended accessThe tool runs code or makes network calls and only reads external data.

  • The generated script sends texts with personal data to OpenRouter models unless custom providers are set.
  • The script runs code on user data and spends paid model calls.

This is third-party code. Review the repository files before installing.

What it does

The `anonymizer` skill ships with the NeMo Anonymizer library. The agent clarifies the leakage tolerance and the privacy goal, names a mode and writes one runnable Python script with an `AnonymizerConfig`. Replace mode finds entities and replaces them in place with the Substitute, Redact, Annotate or Hash strategies; Rewrite mode rewrites the whole text to remove inferable identifiers too. The script first runs `preview` on a few rows, shows failed records and quality metrics, optionally scores the result with a model-based judge and runs the full pipeline only after approval. The script stays with the user for reruns and version control.

Who it is for. Data engineers and developers preparing text datasets with personal data: clinical notes, support tickets, logs, biographies.

Good fit when

  • Before training or handing data to a contractor, names, emails and phone numbers are removed from a set of tickets.
  • Clinical notes or depositions are rewritten so that no indirect identifying signs remain.
  • One value must be replaced identically across all records: `Hash` serves that.
  • Before a full run you want a preview, entity coverage metrics and a list of misses.

Not a fit when

  • Data must not go to OpenRouter or another external service and there are no own models.
  • An autopilot decision without questions is wanted: the skill always asks for mode and leakage threshold.
  • The data is tabular and numeric, with no free text.

Example request

Anonymize the `biography` column in `bios.csv` with the anonymizer skill: ask about the mode first, then show a preview on three rows.

Limitations

The skill only writes a script, and the work happens in the `nemo-anonymizer` library, which is installed separately with `pip install nemo-anonymizer`. By default the library expects a local GLiNER2 endpoint for entity detection and uses OpenRouter-hosted text models for validation, so `OPENROUTER_API_KEY` is required and sensitive data goes to an external service under its terms. The Annotate strategy keeps the original text and is unfit for production. Judge-based quality evaluation costs model calls and is diagnostic: it does not change the output.

How to disable. Delete the `anonymizer` folder from the agent skills directory. Remove the library with `pip uninstall nemo-anonymizer` and revoke the OpenRouter key if it is no longer needed.

FAQ

How do I install the NeMo Anonymizer skill?

Run `npx skills add NVIDIA-NeMo/Anonymizer`. Then call it with `/anonymizer` or just describe the task and the skill loads on its own.

How do Replace and Rewrite differ?

Replace finds entities and swaps each one in place: faster, cheaper and it keeps the text shape. Rewrite rewrites the whole text and removes inferable identifiers, but costs more and may restructure it.

How do I replace one value identically across all records?

Use `Hash`. The `Substitute` strategy is consistent only within one row, so it does not fit cross-record links.

What if records are missing after the preview?

Fix the source of the failure first: rate limits, authorization or the model provider. Strategy settings will not bring dropped rows back.

Can it run without OpenRouter?

Yes. Pass your own providers file to `Anonymizer(model_providers="path/to/model_providers.yaml")` and name your own models.

Discussion

No questions or reviews yet.

Skills
Official

NVIDIA's skill for Claude Code and Codex: the agent turns a dataset description into a config, validates it, previews it and generates synthetic data

SkillExtended access2.4KRepository stars

Скилл Claude Code учит агента библиотеке tangermeme для анализа геномных нейросетей: DeepLIFT/SHAP, мутагенез, дизайн.

SkillMinimal access333Repository stars

A skill that teaches an agent to write nvMolKit code: GPU versions of RDKit fingerprints, similarity, conformers and clustering.

SkillMinimal access284Repository stars

A knowledge base from your documents where people and AI agents annotate together, with an MCP server and skills for Claude Code

MCP serverExtended access93Repository stars

An agent skill that turns an arxiv paper into a minimal Python implementation, with code anchored to sections and equations and gaps flagged honestly

SkillExtended access1.5KRepository stars

Comparison with similar tools

Cards that share the main search query, and how they differ.

ToolOfficialAuthenticationRepository starsMain difference
NeMo Anonymizer (this card)no137
PII Guardno255PII Guard locally anonymizes Traditional Chinese documents with restoration after AI; NeMo Anonymizer prepares a script for text datasets with a choice of strategies
152-FZ personal data anonymizernonot required5The MCP server masks personal data under Russian law 152-FZ before sending to an LLM; the NVIDIA skill builds a pipeline for a whole dataset

README in short

The library finds entities through GLiNER-PII and model validation, then replaces them with four strategies. The main entry points are the CLI with `preview`, `run` and `validate` commands and the Python API, and the skill has its own section.

README badge

Original SKILL.md

---
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
name: anonymizer
description: Use when the user wants to anonymize a text dataset, redact PII, de-identify free-text data, or rewrite text to remove sensitive or inferable identifying information. Produces a runnable Python script that calls the NeMo Anonymizer pipeline (detection → replace or rewrite).
license: Apache-2.0
metadata:
  author: Aaron Gonzales <aagonzales@nvidia.com>
---

# Before You Start

Do not explore the workspace first. The workflow's data-inspection step shows you what you need.

# Goal

Anonymize a text dataset using NeMo Anonymizer in the way the user describes:

$ARGUMENTS

The output is a single runnable Python script that builds an `AnonymizerConfig`, previews results on a few rows, inspects failures and quality metrics, optionally scores output with LLM-as-judge evaluation (Replace and Rewrite modes), and (on user approval) runs the full pipeline. The script is the durable artifact — the user keeps it for re-runs, version control, and production.

# Workflow

Read `references/interactive.md` and follow it. Anonymization is high-stakes,
so there is no autopilot mode. Even when the user says "you decide" or "be
opinionated", ask the minimum questions needed to choose `risk_tolerance` and
phrase `privacy_goal`. The user must make those choices based on their
regulatory and business context.

# Rules

- **Always preview before running the full pipeline.** Preview is cheap; a full run can be expensive and slow.
- **If `result.failed_records` is non-empty after preview, fix that *before* tweaking strategy.** Dropped rows are a model/provider/infra problem (rate limits, auth, etc.), not a config problem. Strategy knobs won't help. See `docs/troubleshooting.md` "Did the run actually complete cleanly?" or the [published troubleshooting guide](https://nvidia-nemo.github.io/Anonymizer/dev/troubleshooting/).
- **Ask the user which mode.** Briefly describe both: Replace detects entities and replaces each in place (faster, cheaper, keeps shape); Rewrite transforms the full text to also remove inferable identifiers (more expensive, may restructure). Use the data shape as a hint — free-text with implicit identifiers (clinical notes, biographies, depositions) leans Rewrite; structured records / log lines lean Replace — but the user picks.
- **For cross-record consistency** (same value → same replacement everywhere), use `Hash`, not `Substitute`. `Substitute` is consistent within a row only.
- **In Replace mode, default to `Substitute`** if the user hasn't specified a strategy. It's the most general-purpose choice and matches the bulk of production usage.
- **`Annotate` is for inspection, not production.** Its output keeps the original entity text and is not privacy-safe. Use it during iteration to confirm detection is working, then switch.
- **Evaluation is opt-in and runs as a separate step** (Replace and Rewrite modes). After `preview()` / `run()`, call `anonymizer.evaluate(result)` to score the output with LLM-as-judge. **Entity coverage always runs** in both modes — it reports detection recall over the judge's unique candidate values (`entity_coverage` + `missed_entities`). On top of that: Replace `Substitute` adds three quality judges (type fidelity, relational consistency, attribute fidelity); Rewrite adds the holistic privacy/quality/style judge. Detection validity is **opt-in** via `EvaluateConfig(compute_detection_validity=True)` (off by default). Evaluation is diagnostic — it scores quality, it does not change the anonymized output.
- **Always set `data_summary` on the input**, even briefly. It is the single cheapest quality lever and it improves both detection and rewrite.

Report a problem