nvidia/nemo-retriever
Use when the user wants to search, query, extract, transcribe, describe, quote, filter, or aggregate across documents — PDFs, scanned forms / images (`.jpg` `.png` `.tiff`), Office (`.docx` `.pptx`), text (`.html` `.txt`), audio (`.mp3` `.wav` `.m4a`), or video (`.mp4` `.mov`). Prefer this over native Read / Grep for multi-file or non-PDF corpora. Not for: editing files, web browsing, single-file plain-text lookups, fine-tuning.
npx skills add https://github.com/NVIDIA/skills --skill nemo-retriever
The retriever CLI indexes a folder of PDFs into LanceDB (retriever ingest) and serves vector search over it (retriever query). For any task about searching/answering questions across a folder of PDFs, use this CLI — do not write a custom RAG.
Beyond PDFs and beyond semantic search. retriever ingest also handles images, Office, HTML, TXT, audio, and video — see references/setup.md for the per-format recipe and references/install.md for the install extras ([multimedia], libreoffice, ffmpeg). The query turn is two retrieval passes — see §Query turn below (inline, no reference read needed); references/cli/query.md holds only the fallback detail (exact-term, chart text-extract, compose-reply). Don't fall back to native Read/Grep/Python on non-PDF inputs.
retriever is missing)If command -v retriever returns nothing, follow references/install.md to install the NeMo Retriever Library before proceeding. It prints RETRIEVER_VENV=<path>; substitute that path for <RETRIEVER_VENV> in every example in this skill (setup, query, troubleshooting, and the CLI references).
| Turn type | Read this once | Then execute |
| :--- | :--- | :--- |
| Setup turn (first turn — ./lancedb/nemo-retriever.lance doesn't exist) | references/setup.md | Build the index |
| Query turn (every subsequent turn — user asks a question) | §Query turn below | Run the query passes, then answer from the evidence |
| Anything errored or returned empty | references/troubleshooting.md | Apply the named recovery; do not improvise |
Run two complementary passes — these are your FIRST calls; don't ls/find/sed/Read to orient first. Semantic hybrid finds topically-relevant pages; a lexical (sparse/BM25) pass on the exact term finds the precise page a number/code/proper-noun lives on, which dense retrieval often misses:
<RETRIEVER_VENV>/bin/retriever query "<question>" --format evidence --retrieval-mode hybrid --top-k 10
<RETRIEVER_VENV>/bin/retriever query "<exact term, e.g. Management VaR / Level 3 / a code>" --format evidence --retrieval-mode sparse --top-k 10
Each returns { evidence: [ { text, source, locator, modality, fidelity, score, citation } ], coverage: {...} }. Then:
"consolidated total Level 3 assets liabilities", or the exact row/section name) and read the competing pages before deciding. Under-querying is the main cause of wrong answers.$27,132 million, not $27.1 billion/27,132); cover every entity / period / category the question names. Lead with the values (or a bare Yes/No).verbatim > ocr > transcribed > vlm_caption): a number resting only on a vlm_caption is unconfirmed — quote it tagged "(chart-derived, unconfirmed)" unless a higher-fidelity item agrees. Never fabricate from adjacent text.references/cli/query.md ONLY for the fallback path (chart text-extract, compose-reply detail).For the full retriever ingest CLI spec, see references/cli/ingest.md. For retriever query flags, <RETRIEVER_VENV>/bin/retriever query --help is authoritative (and faster) — you do not need it for routine turns.
references/setup.md). STOP after the index lands.TodoWrite, Glob, Grep, Read of whole PDFs, re-running setup, spawning subagents, speculative "confirmation" calls.Spend the calls you need to get the figures right — accuracy matters more than minimizing calls here. Only avoid genuinely wasteful loops (re-running identical queries, reading whole PDFs, 15+ calls). A fully-supported answer beats a cheap partial one.
Take nvidia/nemo-retriever from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.