Refactor Op
CVCUDA/CV-CUDA
Find and safely apply per-operator refactoring / redundancy-reduction opportunities in a CV-CUDA operator (near-duplicate Tensor/VarShape kernels, reinvented shared utilities, dead code).
A skill your agent uses 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.
$ npx skills add NVIDIA-NeMo/Anonymizer --skill anonymizer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install NVIDIA-NeMo/Anonymizer anonymizer --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/NVIDIA-NeMo/Anonymizer.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/anonymizer .claude/skills/anonymizer && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "anonymizer" agent skill from https://github.com/NVIDIA-NeMo/Anonymizer/tree/main/skills/anonymizer into .claude/skills/anonymizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "anonymizer", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/NVIDIA-NeMo/Anonymizer/tree/main/skills/anonymizerType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add NVIDIA-NeMo/Anonymizer --skill anonymizer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install NVIDIA-NeMo/Anonymizer anonymizer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA-NeMo/Anonymizer.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/anonymizer .agents/skills/anonymizer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "anonymizer" agent skill from https://github.com/NVIDIA-NeMo/Anonymizer/tree/main/skills/anonymizer into .agents/skills/anonymizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "anonymizer", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add NVIDIA-NeMo/Anonymizer --skill anonymizer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install NVIDIA-NeMo/Anonymizer anonymizer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA-NeMo/Anonymizer.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/anonymizer .cursor/skills/anonymizer && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "anonymizer" agent skill from https://github.com/NVIDIA-NeMo/Anonymizer/tree/main/skills/anonymizer into .cursor/skills/anonymizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "anonymizer", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/NVIDIA-NeMo/Anonymizer.git --path skills/anonymizer--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add NVIDIA-NeMo/Anonymizer --skill anonymizer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install NVIDIA-NeMo/Anonymizer anonymizer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA-NeMo/Anonymizer.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/anonymizer .gemini/skills/anonymizer && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "anonymizer" agent skill from https://github.com/NVIDIA-NeMo/Anonymizer/tree/main/skills/anonymizer into .gemini/skills/anonymizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "anonymizer", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install NVIDIA-NeMo/Anonymizer anonymizerInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add NVIDIA-NeMo/Anonymizer --skill anonymizer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/NVIDIA-NeMo/Anonymizer.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/anonymizer .github/skills/anonymizer && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "anonymizer" agent skill from https://github.com/NVIDIA-NeMo/Anonymizer/tree/main/skills/anonymizer into .github/skills/anonymizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "anonymizer", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add NVIDIA-NeMo/Anonymizer --skill anonymizer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install NVIDIA-NeMo/Anonymizer anonymizer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA-NeMo/Anonymizer.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/anonymizer .opencode/skills/anonymizer && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "anonymizer" agent skill from https://github.com/NVIDIA-NeMo/Anonymizer/tree/main/skills/anonymizer into .opencode/skills/anonymizer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "anonymizer", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
anonymizerA skill your agent uses 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.
Anonymizer is an agent skill from NVIDIA-NeMo/Anonymizer. 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).
Its SKILL.md is about 5.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including reference files (for example `BENCHMARK.md`, `evals/evals.json` and `references/interactive.md`).
It works with Python and NVIDIA AI Platform. The repository describes itself as: 🕵️ NeMo Anonymizer: Detect and protect PII through context-aware replacement and rewriting. The licence is Apache-2.0.
Read from SKILL.md and the folder at commit 630002d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pippythonFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
nvidia-nemo.github.ioFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
OPENROUTER_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Anonymizer loads about 5.1k tokens when it runs, and up to ~6.6k if it reads all its reference files. Until then it costs about 71 tokens; SKILL.md has 1,432 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from NVIDIA-NeMo/Anonymizer at commit 630002d, republished under its Apache-2.0 licence (© NVIDIA-NeMo). 1,432 words, ~5,101 tokens.
.claude/skills/anonymizer/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Do not explore the workspace first. The workflow's data-inspection step shows you what you need.
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.
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.
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.Hash, not Substitute. Substitute is consistent within a row only.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.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.AnonymizerInput.data_summary, even briefly. It is the single cheapest quality lever and it improves both detection and rewrite.risk_tolerance. Tell the user this when you finalize.Detect.entity_labels=None (the default) is permissive — the augmenter LLM may invent labels not in DEFAULT_ENTITY_LABELS. Setting an explicit list switches to strict mode where only the listed labels are detected.DEFAULT_ENTITY_LABELS, while any label not present in this list is called a non-default label. An explicit label set is supplied through entity_labels and may contain either kind.Detect.entity_label_examples provides configured positive examples for detection. For a default label, configured examples are appended to its built-in examples. Every non-default label referenced by entity_label_examples must also appear in the explicit entity_labels set. To keep every default while adding one, use entity_labels=[*DEFAULT_ENTITY_LABELS, "clinical_facility"]. Configured examples are soft detection guidance: they do not limit detection to the listed value formats, and they are not passed to substitution or evaluation. Keep configured examples concise and lists short to limit prompt growth, token cost, latency, and context-window pressure. Use synthetic values because configured examples are included in prompts, exported builders, provider requests, and explicitly enabled raw message traces.Detect.excluded_entity_labels removes specific label types from the active detection scope and final results. Use it when a label type is systematically noisy for your data or should never be anonymized (e.g. Detect(excluded_entity_labels=["occupation", "gender"])). Exclusions take precedence over labels and examples; configured examples for excluded labels are ignored with a warning. If exclusions empty the default or explicit label set, Detect raises a ValueError."clinical_facility", "internal_project_codename"), not codes or enum values. Any concept you can name in English is a label GLiNER can detect.Rewrite.instructions is a dead field today — it exists on the model but the rewrite engine never reads it. Do not use it. Put rewriter guidance in privacy_goal.protect / privacy_goal.preserve instead.risk_tolerance only applies to Rewrite mode, not Replace.PrivacyGoal.protect and .preserve must each be 10–1000 chars and at least 3 words. Be specific (categories, named identifiers, structural facets); avoid generic phrasing like "preserve meaning".entity_validator: [a, b, c] in models.yaml if rate limits drop rows. Other roles (rewriter, evaluator, etc.) are single-alias.python tools/serve_gliner.py. The server is not installed by pip install nemo-anonymizer. Add a provider with endpoint: http://localhost:8001/v1, then route entity_detector through a gliner-pii-detector alias whose model is fastino/gliner2-privacy-filter-PII-multi, whose provider points to that endpoint (the bundled name is local-gliner2), and whose skip_health_check is true. Match any custom --port or --host in the provider endpoint. model_configs is a complete model pool, not an overlay. Copy src/anonymizer/config/default_model_configs/models.yaml and change only the provider name or endpoint as needed, keeping the LLM entries. See docs/concepts/self-hosting-gliner.md or the published self-hosting guide.entity_coverage_judge, detection_validity_judge, replace_type_fidelity_judge, replace_relational_consistency_judge, replace_attribute_fidelity_judge, rewrite_judge), configured in the evaluate section of models.yaml. They are not consumed by preview() / run(), so a config that anonymizes fine can still fail validation at evaluate() if those roles are unset. Defaults ship in src/anonymizer/config/default_model_configs/evaluate.yaml (entity_coverage_judge defaults to nemotron-super).None means "unscored", never a pass. entity_coverage is a 0–1 float (1.0 = no missed candidate values or no PII found) or None; missed_entities lists unique candidate values the anonymizer failed to detect. Replace verdict columns (type_fidelity_valid, etc.) are True / False / None. Rewrite detection_valid is a 0–1 float fraction (or None if unscored). Inspect verdicts per record with evaluated.display_record(i).EvaluateConfig has one knob today: compute_detection_validity (default False). Plain anonymizer.evaluate(result) runs entity coverage + the mode's quality judges; pass EvaluateConfig(compute_detection_validity=True) only to additionally score detection validity (an internal-facing tag-precision metric).The agent should consult these as it goes — do not try to enumerate field reference inline:
docs/concepts/choosing-a-strategy.md or the published strategy guide for choosing a mode, replacement strategy, risk tolerance, privacy goal, and detection settings.docs/troubleshooting.md or the published troubleshooting guide for dropped rows, leakage, low utility, and pipeline failures. Read the relevant section when a symptom appears.docs/concepts/detection.md or the published detection guide for GLiNER threshold semantics, entity labels, augmentation, and validation.docs/concepts/evaluation.md or the published evaluation guide for Replace and Rewrite evaluation, judge roles, result columns, and saved-result evaluation.docs/concepts/models.md or the published models guide for model roles and validator pools.docs/concepts/self-hosting-gliner.md or the published self-hosting guide for the local entity_detector server, OpenAI-compatible contract, and YAML configuration.This section covers environment-level issues. For quality and pipeline issues,
read docs/troubleshooting.md or the
published troubleshooting guide.
anonymizer not installed: Tell the user nemo-anonymizer is not in this Python environment (requires Python ≥ 3.11). Ask if they want you to install it (pip install nemo-anonymizer) or do it themselves. Do not install without permission.Anonymizer() ships with bundled models.yaml and providers.yaml (see src/anonymizer/config/default_model_configs/). For the default path, confirm OPENROUTER_API_KEY is set. Pass custom model_configs or model_providers only for non-default endpoints or model pools. See docs/concepts/models.md or the published models guide.docs/troubleshooting.md "Validation passed but preview errors at LLM call" or the published troubleshooting guide.tools/serve_gliner.py from the Anonymizer repo, start the server, add a provider with endpoint: http://localhost:8001/v1, and point the fastino/gliner2-privacy-filter-PII-multi detector config at that provider (local-gliner2 in the bundled defaults) with skip_health_check: true. Preflight errors about missing aliases usually mean model_configs lists only the detector. Include the full default pool. A wrong endpoint or stopped server raises an actionable configuration error before detection starts. See docs/concepts/self-hosting-gliner.md or the published self-hosting guide.Write a Python script to the current directory. Name it after the dataset (for
example, anonymize_clinical_notes.py or anonymize_support_logs.py). Fill in
the TODO markers in this template and remove unused sections.
"""Anonymize <dataset> using NeMo Anonymizer.
Generated by the anonymizer agent skill.
Usage:
python <this_script>.py # preview on 5 rows (fast, cheap)
python <this_script>.py --full # run on the full dataset
python <this_script>.py --evaluate # preview 5 rows, then LLM-judge-score those rows
python <this_script>.py --full --evaluate # run full dataset, then score the full output
"""
from __future__ import annotations
import argparse
import sys
from anonymizer import (
Anonymizer,
AnonymizerConfig,
AnonymizerInput,
Detect,
# Pick what you need:
# Replace mode:
Substitute, Redact, Annotate, Hash,
# Rewrite mode:
Rewrite, PrivacyGoal,
)
def build_config() -> tuple[AnonymizerInput, AnonymizerConfig]:
"""Single source of truth for what we anonymize and how."""
data = AnonymizerInput(
source="TODO: path to .csv / .parquet / .jsonl",
text_column="TODO: name of the text column",
data_summary="TODO: one-line description of the data (domain, genre, anything non-obvious)",
)
detect = Detect(
# Every non-default label referenced by entity_label_examples must also be in this explicit label set.
# entity_labels=["clinical_facility", "diagnosis_code"],
# entity_label_examples={
# "clinical_facility": ["North Valley Oncology Center"],
# "diagnosis_code": ["C50.919"],
# },
gliner_threshold=0.3, # default; lower (0.2) for recall, raise (0.5) for cost savings
)
# ---- Pick ONE of the two strategies below ----
# Replace mode (Substitute | Redact | Annotate | Hash):
# config = AnonymizerConfig(detect=detect, replace=Substitute(
# instructions="TODO: short hint about the domain (e.g. names should remain plausible "
# "for the original cultural context)",
# ))
# Rewrite mode (free-text de-identification with inferable-identifier suppression):
config = AnonymizerConfig(
detect=detect,
rewrite=Rewrite(
privacy_goal=PrivacyGoal(
protect="TODO: what must not appear in the output, even by inference",
preserve="TODO: what must be kept so the rewritten text is still useful",
),
risk_tolerance="low", # minimal | low | moderate | high
strict_entity_protection=False, # True = force every detected entity into a protective disposition
max_repair_iterations=3,
),
)
return data, config
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--full", action="store_true", help="Run on full dataset (default: preview 5 rows)")
parser.add_argument("--num-records", type=int, default=5, help="Rows to preview (ignored with --full)")
parser.add_argument(
"--evaluate",
action="store_true",
help="LLM-judge-score the output produced this run (preview rows, or full output with --full)",
)
args = parser.parse_args()
anonymizer = Anonymizer()
data, config = build_config()
if args.full:
result = anonymizer.run(config=config, data=data)
out_path = "output.parquet" # TODO: change path/format (.csv, .jsonl) as needed
result.dataframe.to_parquet(out_path)
print(f"Wrote {len(result.dataframe)} rows to {out_path}")
else:
result = anonymizer.preview(config=config, data=data, num_records=args.num_records)
print(f"Previewed {len(result.dataframe)} rows.")
# Save preview output so you can investigate without re-running.
# trace_dataframe is a superset of dataframe — it has the user-facing
# columns plus internal columns (validation decisions, sensitivity
# dispositions, etc.) that explain why entities were kept, dropped,
# or rewritten.
result.trace_dataframe.to_parquet("preview.parquet")
print("Saved: preview.parquet (load with pd.read_parquet)")
# Failure-first protocol: dropped rows are infra issues, not strategy issues.
if result.failed_records:
print(f"\n⚠️ {len(result.failed_records)} record(s) failed:")
for fr in result.failed_records[:3]:
print(f" - record_id={fr.record_id} step={fr.step} reason={fr.reason}")
print("\nFix dropped rows before tweaking strategy. See docs/troubleshooting.md or https://nvidia-nemo.github.io/Anonymizer/dev/troubleshooting/.")
sys.exit(1)
# Optional LLM-as-judge evaluation (Replace and Rewrite modes). Opt-in, separate
# step — scores quality without changing the anonymized output.
# Both modes: entity_coverage (judge-anchored recall) always runs.
# Replace: Substitute adds type fidelity, relational consistency, attribute fidelity.
# Rewrite: adds the holistic privacy/quality/style judge.
# Detection validity is opt-in (EvaluateConfig(compute_detection_validity=True)).
# Needs the `evaluate` model roles in models.yaml
# (see src/anonymizer/config/default_model_configs/evaluate.yaml).
if args.evaluate:
result = anonymizer.evaluate(result)
df = result.dataframe
# entity_coverage is a per-record 0–1 float (1.0 = no missed candidate values or no PII found by judge); aggregate mean shown below.
if "entity_coverage" in df.columns:
scored = int(df["entity_coverage"].notna().sum())
mean_cov = df["entity_coverage"].mean()
print(f"entity_coverage: mean={mean_cov:.2f} scored={scored}/{len(df)}")
if config.replace is not None:
for col in (
"type_fidelity_valid",
"relational_consistency_valid",
"attribute_fidelity_valid",
"detection_valid", # present only with compute_detection_validity=True
):
if col in df.columns:
passed = int(df[col].eq(True).sum()) # None = unscored, never a pass
scored = int(df[col].notna().sum())
print(f"{col}: {passed}/{scored} passed ({len(df) - scored} unscored)")
else:
# Rewrite: detection_valid is a 0–1 fraction (present only when opted in).
if "detection_valid" in df.columns:
scored = int(df["detection_valid"].notna().sum())
mean_val = df["detection_valid"].mean()
print(f"detection_valid: mean={mean_val:.2f} scored={scored}/{len(df)}")
if "judge_evaluation" in df.columns:
scored = int(df["judge_evaluation"].notna().sum())
print(f"judge_evaluation: {scored}/{len(df)} scored")
# In a notebook, inspect per-record verdicts visually:
# result.display_record(0)
# Rewrite-mode quality summary (skip for Replace mode).
if config.rewrite is not None:
df = result.dataframe
print(f"\nleakage_mass: mean={df['leakage_mass'].mean():.3f} max={df['leakage_mass'].max():.3f}")
print(f"utility_score: mean={df['utility_score'].mean():.3f} min={df['utility_score'].min():.3f}")
print(f"flagged for review: {int(df['needs_human_review'].sum())} / {len(df)}")
if __name__ == "__main__":
main()© NVIDIA-NeMo, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (references) in skills/anonymizer of NVIDIA-NeMo/Anonymizer.
Open the folder on GitHubat commit 630002d
Anonymizer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Anonymizer this skillNVIDIA-NeMo/Anonymizer | 123 | — | ~5.1k | Automated safety check: Pass | Apache-2.0 | |
| Refactor OpCVCUDA/CV-CUDA | 2.7k | — | ~1.5k | Automated safety check: Pass | Custom licence | |
| Dstack Prototypingdstackai/dstack | 2.3k | — | ~1.6k | Automated safety check: Pass | MPL-2.0 | |
| Gds DiagNVIDIA/MagnumIO | 125 | — | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| Nsight Graphics AnalyzerLuna5ama/Alpha-Piscium | 156 | — | ~4.7k | Automated safety check: Pass | GPL-3.0 | |
| Optimize OpCVCUDA/CV-CUDA | 2.7k | — | ~834 | Automated safety check: Pass | Custom licence |
CVCUDA/CV-CUDA
Find and safely apply per-operator refactoring / redundancy-reduction opportunities in a CV-CUDA operator (near-duplicate Tensor/VarShape kernels, reinvented shared utilities, dead code).
dstackai/dstack
Use with the dstack skill for model-serving work when the image, serving command, resources, backend/fleet choice, or service behavior is not proven.
NVIDIA/MagnumIO
A skill your agent uses when diagnosing NVIDIA GPUDirect Storage with this repository: choose and run the right gds-diag.py subcommand, interpret its output, and explain operator next steps without…
Luna5ama/Alpha-Piscium
Drive NVIDIA Nsight Graphics 2026.1+ from the command line for GPU performance analysis, frame capture, frame trace inspection, draw-call inspection, NVTX/D3DPERF stage timing, replay metadata…
CVCUDA/CV-CUDA
Drive a single-operator optimization campaign per .agents/guidance/OPTIMIZATIONGUIDELINES.md, with a deterministically enforced definition-of-done and versioned MR summary.
NVIDIA-AI-Blueprints/deep-researcher-agent
A skill your agent uses when asked to run deep research or Deep Researcher Agent research through a reachable NVIDIA Deep Researcher Agent Blueprint backend.
Works with
A skill your agent uses 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. Anonymizer is an agent skill from NVIDIA-NeMo/Anonymizer. 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.
Anonymizer fits situations like: the user wants to anonymize a text dataset; de-identify free-text data; rewrite text to remove sensitive; inferable identifying information.
Run `npx skills add NVIDIA-NeMo/Anonymizer --skill anonymizer -a claude-code`. Or copy the skill folder (skills/anonymizer in NVIDIA-NeMo/Anonymizer) into .claude/skills/anonymizer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add NVIDIA-NeMo/Anonymizer --skill anonymizer -a codex`. Or copy the skill folder (skills/anonymizer in NVIDIA-NeMo/Anonymizer) into .agents/skills/anonymizer in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add NVIDIA-NeMo/Anonymizer --skill anonymizer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/anonymizer, .gemini/skills/anonymizer, .github/skills/anonymizer and .opencode/skills/anonymizer in your project.
Going by SKILL.md and its folder, Anonymizer needs the command-line tools its instructions call (pip and python) and credentials named OPENROUTER_API_KEY. Our summary lists: Python 3; A credential in OPENROUTER_API_KEY.
SKILL.md names 1 domain. In commands or code: nvidia-nemo.github.io; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Anonymizer is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.1k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.5k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Anonymizer: Refactor Op (CVCUDA/CV-CUDA, 2.7k stars), Dstack Prototyping (dstackai/dstack, 2.3k stars), Gds Diag (NVIDIA/MagnumIO, 125 stars) and Nsight Graphics Analyzer (Luna5ama/Alpha-Piscium, 156 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
NVIDIA-NeMo (a GitHub organization) maintains it in NVIDIA-NeMo/Anonymizer, which has 123 GitHub stars. The repository was last updated on October 8, 2026.
Source: NVIDIA-NeMo/Anonymizer on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.