[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-nvidia-digital-health-clinical-asr-setup":3,"mdc-ki9ry0-key":34,"related-org-nvidia-digital-health-clinical-asr-setup":2644,"related-repo-nvidia-digital-health-clinical-asr-setup":2804},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"digital-health-clinical-asr-setup","bootstrap clinical ASR flywheel cycles","Stage 1 of Clinical ASR Flywheel. Use when bootstrapping a cycle: NVCF+MW disclosure, NVIDIA_API_KEY check, deps install, TTS+ASR smoke test.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"nvidia","NVIDIA","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnvidia.png",[12,16,19,20],{"name":13,"slug":14,"type":15},"Healthcare","healthcare","tag",{"name":17,"slug":18,"type":15},"Transcription","transcription",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Speech","speech",2473,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fskills","2026-07-14T05:27:03.854232","Apache-2.0",281,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"AI agent skills published by NVIDIA","https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fdigital-health-clinical-asr-setup","---\nname: \"digital-health-clinical-asr-setup\"\ndescription: \"Stage 1 of Clinical ASR Flywheel. Use when bootstrapping a cycle: NVCF+MW disclosure, NVIDIA_API_KEY check, deps install, TTS+ASR smoke test.\"\nversion: \"1.1.0\"\nauthor: \"Ben Randoing \u003Cbrandoing@nvidia.com>\"\ntags:\n  - clinical-asr\n  - setup\n  - flywheel\n  - bootstrap\ntools:\n  - Read\n  - Write\n  - Bash\n  - Skill\nlicense: Apache-2.0\ncompatibility: \"NVIDIA_API_KEY (required) for hosted Magpie TTS + Parakeet\u002FNemotron ASR via NVCF. DICTIONARY_API_KEY (optional) for Merriam-Webster pronunciation lookup. NGC_API_KEY (optional) for Stage 4 fine-tune. Python 3.10+.\"\nmetadata:\n  author: \"Ben Randoing \u003Cbrandoing@nvidia.com>\"\n  tags:\n    - clinical-asr\n    - flywheel\n    - setup\n    - bootstrap\n  team: healthcare-tme\n  domain: ai-ml\n  stage: 1\n  next_skill: digital-health-clinical-asr-build\n---\n\n\u003C!--\nSPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\nSPDX-License-Identifier: Apache-2.0\n-->\n\n# Clinical ASR Flywheel — Stage 1 (Setup)\n\n> **Agent: this file is the complete Stage 1 procedure.** Do not invoke `find`, `ls`, `rg`, or `grep` looking for an installer or hidden config — there isn't one. The four sections below (outbound-data disclosure, three numbered checks, sibling hand-off) are all required reading; don't skip any. Function IDs, env-var conventions, and the smoke-test gate are inlined further down — answer from what's actually written here rather than from prior Riva\u002FNVCF familiarity.\n\nStage 1 has one job: prove the user can reach NVIDIA's hosted speech stack with the `NVIDIA_API_KEY` they currently hold. Once a single clinical sentence round-trips through Magpie TTS → Parakeet\u002FNemotron ASR successfully, the user is cleared to advance to `\u002Fdigital-health-clinical-asr-build`.\n\nThe four-stage flywheel exists to drive down **KER (keyword error rate)** on clinical entities — drugs, procedures, anatomy, conditions, labs, roles. WER averages obscure the failures that hurt clinically; KER is what Stage 3 will measure you against.\n\nThere is **no installer script** anywhere in this skill — not `install.sh`, not `setup.py`, nothing hidden. Stage 1 *is* the three steps below: verify the key, install Python deps, run the smoke test. Anything past Stage 1 is composed from sibling skills (`\u002Fdata-designer`, `\u002Friva-tts`, the inlined Stage 3 ASR recipe, `\u002Friva-asr-custom`). If a user asks \"what script installs everything?\", answer from this paragraph; don't go searching.\n\n## Outbound data flows — surface before any text or audio is sent\n\nTwo external endpoints receive data during this flywheel. The user has to acknowledge both before Stage 2 begins, against whatever data-governance policy their organization enforces. **Render the table below word-for-word in your response — a paraphrase doesn't satisfy the disclosure; the literal phrasing is what counts.**\n\n| Service | What gets sent | When | Hosted by |\n|---|---|---|---|\n| **NVIDIA NVCF** (`grpc.nvcf.nvidia.com`) | The clinical sentences you synthesize (text), and the WAV files you transcribe (audio) | Every Stage 2 TTS call and every Stage 3 ASR call | NVIDIA, governed by build.nvidia.com terms |\n| **Merriam-Webster** (`dictionaryapi.com` JSON API **or** the public `merriam-webster.com` HTML site) | Individual clinical terms (drug names, anatomy, procedures), one HTTP request per term | Stage 2 IPA tagging — see \"Two MW paths\" below for which endpoint applies | Merriam-Webster, governed by their API or site terms |\n\nThe data is **synthetic by construction** — the flywheel manufactures sentences and audio from a user-curated term list, never from real patient encounters. That said: **do not feed real patient transcripts, recorded clinical audio, or any PHI through any stage.** If the term list itself contains sensitive material (codename drugs, unreleased product names), the user should consult their organization's external-API policy before proceeding. Either endpoint can be turned off:\n\n- **Skip Merriam-Webster entirely:** leave `DICTIONARY_API_KEY` unset and don't run a scraper. Stage 2 falls back to Magpie G2P, which still works but with weaker coverage on long-tail clinical terms.\n- **Skip NVCF:** this is a hard stop. Magpie TTS + Parakeet\u002FNemotron ASR *are* the workload; without them this skill family is the wrong tool — a self-hosted ASR\u002FTTS pipeline is what you want instead.\n\nRecommend a copy of this notice lands in the user's workspace `README.md`; bring it forward on first invocation if it isn't already there.\n\n## Purpose\n\nGet a fresh environment ready for Stage 2. Three things to confirm: key is present, deps import cleanly, hosted stack actually answers. Close by naming which skill to run next.\n\nThe four `digital-health-clinical-asr-*` skills are **self-contained** — every TTS, ASR, IPA-tagging, and scoring recipe lives inside them; no other agent skill needs installing to run the flywheel end-to-end.\n\nThis skill takes no opinion on workspace layout. The user decides where their cycle artifacts live; `data\u002Feval_sets\u002Fcycle\u003CN>\u002F` is not imposed.\n\n## When to use this skill\n\nActivate on user phrases like:\n\n- \"Set up the Clinical ASR Flywheel\"\n- \"Initialize the clinical-asr eval\"\n- \"I want to evaluate ASR on clinical terminology — where do I start?\"\n- \"Bootstrap my environment for the flywheel\"\n- \"What do I need installed before I run the flywheel?\"\n\nDo **not** activate when:\n\n- The user already has a manifest and wants to score it → `\u002Fdigital-health-clinical-asr-eval`\n- The user already has the env set up and wants to curate terms → `\u002Fdigital-health-clinical-asr-build`\n- The user is asking about Stage 4 fine-tune NGC\u002FDocker setup specifically → that's covered inside `\u002Fdigital-health-clinical-asr-finetune`\n\n## Prerequisites\n\n| Requirement | Required? | Why | How |\n|---|---|---|---|\n| `NVIDIA_API_KEY` (`nvapi-…`) | **Required** | Hosted Magpie TTS + Parakeet\u002FNemotron ASR via NVCF | Issue at \u003Chttps:\u002F\u002Fbuild.nvidia.com>; `export NVIDIA_API_KEY=...` in shell |\n| Python ≥ 3.10 | **Required** | NeMo client, scoring, manifest tools | `python3 --version` |\n| `nvidia-riva-client`, `pandas`, `soundfile`, `requests` | **Required** | TTS + ASR clients, manifest I\u002FO, MW lookup | `pip install nvidia-riva-client pandas soundfile requests` |\n| `DICTIONARY_API_KEY` | Optional | Merriam-Webster Medical Dictionary lookup via the JSON API (Path A in the build skill — recommended) | Free key at \u003Chttps:\u002F\u002Fdictionaryapi.com>. Path B (HTML scrape of `merriam-webster.com`, no key, brittle) is also documented in the build skill if you can't get a key. Without either path, Stage 2 falls through to Magpie G2P with weaker long-tail coverage. |\n| `jiwer` | Optional | Reference WER\u002FCER against the inlined Levenshtein implementation | `pip install jiwer` — the eval skill includes a pure-Python fallback |\n| (Stage 4 only) `NGC_API_KEY` + CUDA host + NeMo container | Optional, deferred | Fine-tune workload | Set up inside `\u002Fdigital-health-clinical-asr-finetune`; defer until the eval shows KER > 0.3 |\n\n## Instructions\n\n**Scope.** This skill performs **read-only environment checks**: confirming a key is exported (length-only), the Python version, that libraries import, and that the hosted NVCF stack responds to a single smoke-test round-trip. It does **not** install system packages, modify shell rc files, write to disk outside an explicit `.venv\u002F`, or attempt to authenticate with the real key value. Validate; never mutate without explicit user direction.\n\n### 1a. Verify `NVIDIA_API_KEY` (length-only — never echo the value)\n\n```bash\n# Export NVIDIA_API_KEY in your shell — never echo or commit the value\nexport NVIDIA_API_KEY=nvapi-...     # from https:\u002F\u002Fbuild.nvidia.com\n\n# Length-only check; the key value never appears in any log\ntest -n \"$NVIDIA_API_KEY\" && echo \"NVIDIA_API_KEY len=${#NVIDIA_API_KEY}\"\n```\n\nA length of 70+ is normal. If the output is empty or shows `len=0`, the user must paste a key from \u003Chttps:\u002F\u002Fbuild.nvidia.com>. Do **not** print the key, even truncated. To persist across shell sessions, add the `export` line to your shell rc (`~\u002F.bashrc`, `~\u002F.zshrc`) — or use a per-directory tool like `direnv`.\n\n### 1b. Install Python dependencies\n\n```bash\npython3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npip install nvidia-riva-client pandas soundfile requests\n# optional\npip install jiwer\n```\n\nFor Stage 4 (fine-tune) only: `nemo-toolkit` and Docker + NVIDIA Container Toolkit are also required. Defer those to `\u002Fdigital-health-clinical-asr-finetune` — there is no point installing them up front if the user may never reach Stage 4.\n\n### 1c. Smoke-test the hosted NVCF stack\n\n**`NVIDIA_API_KEY` handling — load-bearing, do not deviate:**\n\n- The agent harness reads `$NVIDIA_API_KEY` from the shell and passes it as an **explicit function argument** to `smoke_test(api_key=…)`.\n- Auditors can grep the recipe for every wire crossing — every `api_key` use is visible in `auth_for(...)`.\n- Do **not** `echo`, `print`, or log the key value (including truncated). Length-only checks are fine (see §1a).\n- Do **not** let the recipe read `os.environ[\"NVIDIA_API_KEY\"]` itself — the explicit-argument pattern is the auditability guarantee.\n- Do **not** commit the key to any file, including `.env` examples or notebook outputs.\n\nVerify the `NVIDIA_API_KEY` actually works against Magpie TTS and Parakeet\u002FNemotron ASR before advancing. The four skills inline every recipe needed; this round-trip just confirms the API key + network path are real.\n\nThe agent harness loads the `NVIDIA_API_KEY` shell variable and passes it as an explicit function argument to the helpers below. The recipe code itself does not read environment variables — auditors can see exactly which API keys cross the wire.\n\n```python\nimport wave, tempfile\nimport riva.client\n\nNVCF_HOST = \"grpc.nvcf.nvidia.com:443\"\nMAGPIE_FUNCTION_ID    = \"877104f7-e885-42b9-8de8-f6e4c6303969\"   # Magpie TTS\nPARAKEET_FUNCTION_ID  = \"d3fe9151-442b-4204-a70d-5fcc597fd610\"   # Parakeet TDT 0.6B v2 (offline ASR)\n\ndef auth_for(function_id: str, api_key: str) -> riva.client.Auth:\n    return riva.client.Auth(\n        use_ssl=True, uri=NVCF_HOST,\n        metadata_args=[\n            [\"function-id\", function_id],\n            [\"authorization\", f\"Bearer {api_key}\"],\n        ],\n    )\n\ndef smoke_test(api_key: str) -> str:\n    \"\"\"Caller passes api_key (the harness reads $NVIDIA_API_KEY at the shell;\n    this code never touches the environment). Returns the ASR transcript.\"\"\"\n\n    # 1. TTS: \"The patient was prescribed cefazolin.\"\n    tts = riva.client.SpeechSynthesisService(auth_for(MAGPIE_FUNCTION_ID, api_key))\n    pcm = b\"\".join(c.audio for c in tts.synthesize_online(\n        text=\"The patient was prescribed cefazolin.\",\n        voice_name=\"Magpie-Multilingual.EN-US.Mia\",\n        language_code=\"en-US\", sample_rate_hz=16000,\n    ))\n    with tempfile.NamedTemporaryFile(suffix=\".wav\", delete=False) as f:\n        with wave.open(f, \"wb\") as w:\n            w.setnchannels(1); w.setsampwidth(2); w.setframerate(16000); w.writeframes(pcm)\n        wav_path = f.name\n\n    # 2. ASR: transcribe the WAV we just synthesized.\n    asr = riva.client.ASRService(auth_for(PARAKEET_FUNCTION_ID, api_key))\n    with open(wav_path, \"rb\") as f:\n        audio_bytes = f.read()\n    config = riva.client.RecognitionConfig(\n        encoding=riva.client.AudioEncoding.LINEAR_PCM,\n        sample_rate_hertz=16000, language_code=\"en-US\",\n        max_alternatives=1, enable_automatic_punctuation=True,\n    )\n    response = asr.offline_recognize(audio_bytes, config)\n    transcript = response.results[0].alternatives[0].transcript if response.results else \"\"\n    print(f\"TTS:  The patient was prescribed cefazolin.\")\n    print(f\"ASR:  {transcript}\")\n    return transcript\n\n# Invoke from the agent (api_key sourced by the harness, not by this code):\n# smoke_test(api_key=\"\u003CNVIDIA_API_KEY value>\")\n```\n\n**Run the smoke test — don't defer it.** This is the gate that proves Stages 2–4 can reach the hosted stack with the user's current key. \"I can run it later\" is not an acceptable completion of Stage 1; either invoke `smoke_test(api_key=…)` now or, if the user has explicitly opted out, log the deferral in your closing summary so they know what they're missing.\n\nIf the transcript matches the input within ~1 token, the hosted stack is reachable and the user can advance to Stage 2. If either call fails:\n\n- `401 Unauthorized` \u002F `PERMISSION_DENIED` → `NVIDIA_API_KEY` is wrong, expired, or not exported in this shell. Re-export and re-test.\n- `404` \u002F `INVALID_ARGUMENT: function not found` → the function ID is stale. Look up the current ID at \u003Chttps:\u002F\u002Fbuild.nvidia.com> and update the constant above.\n- `RESOURCE_EXHAUSTED` → NVCF rate limit. Retry after 30 seconds; this is normal under load.\n- Network\u002FTLS errors → corporate proxy or DNS issue. Test `curl https:\u002F\u002Fbuild.nvidia.com` first.\n\n### 1d. (Optional) Verify Merriam-Webster lookup\n\nTwo paths produce a `merriam-webster`-tagged manifest row in Stage 2. Pick one (or neither — Magpie G2P fall-through is a valid posture):\n\n- **Path A — JSON API + key.** Recommended for standalone use of this skill. Check the key is set:\n\n  ```bash\n  test -n \"$DICTIONARY_API_KEY\" && echo \"DICTIONARY_API_KEY len=${#DICTIONARY_API_KEY}\" \\\n    || echo \"DICTIONARY_API_KEY not set — Path A is off\"\n  ```\n\n  Free key issues instantly at \u003Chttps:\u002F\u002Fdictionaryapi.com>.\n\n- **Path B — HTML scraping.** No API key needed; reachability is the only prerequisite. Brittle to MW site HTML changes; recipe inlined in the build skill's `references\u002Fpronunciation-pipeline.md`.\n\n  ```bash\n  curl -fsS -o \u002Fdev\u002Fnull -w \"merriam-webster.com reachable, HTTP %{http_code}\\n\" \\\n    https:\u002F\u002Fwww.merriam-webster.com\u002Fmedical\u002Fcefazolin\n  ```\n\n  If you don't want to maintain a scraper, use Path A instead.\n\nRemember the data-disclosure note at the top: under either path, each clinical term in your seed list goes out as an HTTP request to a Merriam-Webster endpoint.\n\n## Examples\n\n**Fresh shell, never run before.** User says something like *\"I want to start the flywheel.\"* → Quote the disclosure table first, then walk through 1a → 1b → 1c in order. On a green smoke test, point them at `\u002Fdigital-health-clinical-asr-build` and explicitly name KER as the metric Stage 3 will judge them by.\n\n**Returning user, env already up.** User says *\"I already have the env, just confirm I'm good to go.\"* → Skip the venv + `pip install` (1b). Run only the length check (1a) and the smoke test (1c). On green, advance.\n\n## Artifacts produced\n\n- `NVIDIA_API_KEY` exported in the user's shell\n- An activated virtualenv with `nvidia-riva-client`, `pandas`, `soundfile`, `requests`\n- A confirmed TTS→ASR round-trip on a clinical sentence (proof the hosted stack works)\n\nNo manifest, audio, or model artifact is produced at this stage — those come at Stages 2–4.\n\n## Troubleshooting\n\n- **Length check shows nothing or `len=0`** → `NVIDIA_API_KEY` isn't exported in this shell. Run `export NVIDIA_API_KEY=nvapi-...` and re-check.\n- **Variable is set in one shell but not another** → exports don't persist across sessions. Add the `export` line to your shell rc (`~\u002F.bashrc`, `~\u002F.zshrc`), or use a per-directory loader like `direnv`.\n- **`401 Unauthorized` on the smoke test** → key value is wrong or expired. Re-issue at \u003Chttps:\u002F\u002Fbuild.nvidia.com>.\n- **`grpc.RpcError: function not found`** → the inlined function IDs need updating against the current NVCF catalog. Check \u003Chttps:\u002F\u002Fbuild.nvidia.com> and edit the constants in 1c. The eval skill (`\u002Fdigital-health-clinical-asr-eval`) provides a catalog of current function IDs in its Step 3a \"Other catalog options\" list.\n- **`StatusCode.INVALID_ARGUMENT` with `CUDA error: an illegal memory access was encountered`** → NVCF-side backend fault on this specific function ID (Triton\u002FPyTorch on NVCF, not your env). Either retry later or temporarily point at a different offline ASR NIM — Whisper Large v3 function-id `b702f636-f60c-4a3d-a6f4-f3568c13bd7d` is the closest drop-in (also offline; pass `language_code=\"en\"` instead of `\"en-US\"`). For routine eval cycles, prefer to wait for the Parakeet backend to recover so Stage 3 baseline and Stage 4 SFT base stay aligned.\n- **`TypeError: Auth.__init__() got an unexpected keyword argument 'ssl_cert'`** → you're on `nvidia-riva-client >= 2.x` where the kwarg was renamed to `ssl_root_cert` (and is no longer needed for hosted NVCF). Drop the `ssl_cert=None,` line from your local copy of the recipe.\n- **`ModuleNotFoundError: riva.client`** → step 1b was skipped or the venv isn't activated. `source .venv\u002Fbin\u002Factivate && pip install nvidia-riva-client`.\n\n## Limitations\n\n- **Scope is environment readiness only.** Whether the user's term list or pronunciation overrides make sense is decided in `\u002Fdigital-health-clinical-asr-build`, not here.\n- **Magpie en-US assumption.** Downstream IPA validation rides on Magpie's English phoneme inventory; other locales require a different phoneme set entirely.\n- **Hosted NVCF is the assumed deployment.** Running self-hosted Riva NIMs is possible but the setup for that lives inside `\u002Fdigital-health-clinical-asr-finetune` Stage 4d.\n- **Synthetic data only.** This skill family is built for benchmarks generated from a curated term list. Real patient transcripts and recorded audio must not flow through any stage.\n\n## Next steps\n\n**Mandatory close on success:** finish the Stage 1 response by **pointing the user explicitly to `\u002Fdigital-health-clinical-asr-build`** and **naming KER (keyword error rate) as the headline measure** they'll see at Stage 3. Both pointers are required, not optional — they place the user inside the four-stage flywheel.\n\n- **Default forward route:** `\u002Fdigital-health-clinical-asr-build` — specialty interview, term curation, IPA tagging, NeMo manifest synthesis.\n- **Direct jump to Stage 3** (only when the user is bringing their own NeMo-format manifest with `term` \u002F `entity_category` \u002F `ipa_source` fields): `\u002Fdigital-health-clinical-asr-eval`.\n\n## References\n\n- [`references\u002Fdependency-ownership.md`](references\u002Fdependency-ownership.md) — boundary between skill-owned and companion-owned responsibilities.\n\n",{"data":35,"body":55},{"name":4,"description":6,"version":36,"author":37,"tags":38,"tools":43,"license":26,"compatibility":48,"metadata":49},"1.1.0","Ben Randoing \u003Cbrandoing@nvidia.com>",[39,40,41,42],"clinical-asr","setup","flywheel","bootstrap",[44,45,46,47],"Read","Write","Bash","Skill","NVIDIA_API_KEY (required) for hosted Magpie TTS + Parakeet\u002FNemotron ASR via NVCF. DICTIONARY_API_KEY (optional) for Merriam-Webster pronunciation lookup. NGC_API_KEY (optional) for Stage 4 fine-tune. Python 3.10+.",{"author":37,"tags":50,"team":51,"domain":52,"stage":53,"next_skill":54},[39,41,40,42],"healthcare-tme","ai-ml",1,"digital-health-clinical-asr-build",{"type":56,"children":57},"root",[58,67,115,136,148,207,214,224,348,367,407,420,426,431,451,464,470,475,503,515,550,556,837,843,874,888,1025,1080,1086,1187,1207,1213,1226,1336,1348,1360,1798,1815,1820,1898,1904,1917,2116,2121,2127,2151,2176,2182,2228,2233,2239,2460,2466,2523,2529,2558,2615,2621,2638],{"type":59,"tag":60,"props":61,"children":63},"element","h1",{"id":62},"clinical-asr-flywheel-stage-1-setup",[64],{"type":65,"value":66},"text","Clinical ASR Flywheel — Stage 1 (Setup)",{"type":59,"tag":68,"props":69,"children":70},"blockquote",{},[71],{"type":59,"tag":72,"props":73,"children":74},"p",{},[75,81,83,90,92,98,99,105,107,113],{"type":59,"tag":76,"props":77,"children":78},"strong",{},[79],{"type":65,"value":80},"Agent: this file is the complete Stage 1 procedure.",{"type":65,"value":82}," Do not invoke ",{"type":59,"tag":84,"props":85,"children":87},"code",{"className":86},[],[88],{"type":65,"value":89},"find",{"type":65,"value":91},", ",{"type":59,"tag":84,"props":93,"children":95},{"className":94},[],[96],{"type":65,"value":97},"ls",{"type":65,"value":91},{"type":59,"tag":84,"props":100,"children":102},{"className":101},[],[103],{"type":65,"value":104},"rg",{"type":65,"value":106},", or ",{"type":59,"tag":84,"props":108,"children":110},{"className":109},[],[111],{"type":65,"value":112},"grep",{"type":65,"value":114}," looking for an installer or hidden config — there isn't one. The four sections below (outbound-data disclosure, three numbered checks, sibling hand-off) are all required reading; don't skip any. Function IDs, env-var conventions, and the smoke-test gate are inlined further down — answer from what's actually written here rather than from prior Riva\u002FNVCF familiarity.",{"type":59,"tag":72,"props":116,"children":117},{},[118,120,126,128,134],{"type":65,"value":119},"Stage 1 has one job: prove the user can reach NVIDIA's hosted speech stack with the ",{"type":59,"tag":84,"props":121,"children":123},{"className":122},[],[124],{"type":65,"value":125},"NVIDIA_API_KEY",{"type":65,"value":127}," they currently hold. Once a single clinical sentence round-trips through Magpie TTS → Parakeet\u002FNemotron ASR successfully, the user is cleared to advance to ",{"type":59,"tag":84,"props":129,"children":131},{"className":130},[],[132],{"type":65,"value":133},"\u002Fdigital-health-clinical-asr-build",{"type":65,"value":135},".",{"type":59,"tag":72,"props":137,"children":138},{},[139,141,146],{"type":65,"value":140},"The four-stage flywheel exists to drive down ",{"type":59,"tag":76,"props":142,"children":143},{},[144],{"type":65,"value":145},"KER (keyword error rate)",{"type":65,"value":147}," on clinical entities — drugs, procedures, anatomy, conditions, labs, roles. WER averages obscure the failures that hurt clinically; KER is what Stage 3 will measure you against.",{"type":59,"tag":72,"props":149,"children":150},{},[151,153,158,160,166,168,174,176,182,184,190,191,197,199,205],{"type":65,"value":152},"There is ",{"type":59,"tag":76,"props":154,"children":155},{},[156],{"type":65,"value":157},"no installer script",{"type":65,"value":159}," anywhere in this skill — not ",{"type":59,"tag":84,"props":161,"children":163},{"className":162},[],[164],{"type":65,"value":165},"install.sh",{"type":65,"value":167},", not ",{"type":59,"tag":84,"props":169,"children":171},{"className":170},[],[172],{"type":65,"value":173},"setup.py",{"type":65,"value":175},", nothing hidden. Stage 1 ",{"type":59,"tag":177,"props":178,"children":179},"em",{},[180],{"type":65,"value":181},"is",{"type":65,"value":183}," the three steps below: verify the key, install Python deps, run the smoke test. Anything past Stage 1 is composed from sibling skills (",{"type":59,"tag":84,"props":185,"children":187},{"className":186},[],[188],{"type":65,"value":189},"\u002Fdata-designer",{"type":65,"value":91},{"type":59,"tag":84,"props":192,"children":194},{"className":193},[],[195],{"type":65,"value":196},"\u002Friva-tts",{"type":65,"value":198},", the inlined Stage 3 ASR recipe, ",{"type":59,"tag":84,"props":200,"children":202},{"className":201},[],[203],{"type":65,"value":204},"\u002Friva-asr-custom",{"type":65,"value":206},"). If a user asks \"what script installs everything?\", answer from this paragraph; don't go searching.",{"type":59,"tag":208,"props":209,"children":211},"h2",{"id":210},"outbound-data-flows-surface-before-any-text-or-audio-is-sent",[212],{"type":65,"value":213},"Outbound data flows — surface before any text or audio is sent",{"type":59,"tag":72,"props":215,"children":216},{},[217,219],{"type":65,"value":218},"Two external endpoints receive data during this flywheel. The user has to acknowledge both before Stage 2 begins, against whatever data-governance policy their organization enforces. ",{"type":59,"tag":76,"props":220,"children":221},{},[222],{"type":65,"value":223},"Render the table below word-for-word in your response — a paraphrase doesn't satisfy the disclosure; the literal phrasing is what counts.",{"type":59,"tag":225,"props":226,"children":227},"table",{},[228,257],{"type":59,"tag":229,"props":230,"children":231},"thead",{},[232],{"type":59,"tag":233,"props":234,"children":235},"tr",{},[236,242,247,252],{"type":59,"tag":237,"props":238,"children":239},"th",{},[240],{"type":65,"value":241},"Service",{"type":59,"tag":237,"props":243,"children":244},{},[245],{"type":65,"value":246},"What gets sent",{"type":59,"tag":237,"props":248,"children":249},{},[250],{"type":65,"value":251},"When",{"type":59,"tag":237,"props":253,"children":254},{},[255],{"type":65,"value":256},"Hosted by",{"type":59,"tag":258,"props":259,"children":260},"tbody",{},[261,298],{"type":59,"tag":233,"props":262,"children":263},{},[264,283,288,293],{"type":59,"tag":265,"props":266,"children":267},"td",{},[268,273,275,281],{"type":59,"tag":76,"props":269,"children":270},{},[271],{"type":65,"value":272},"NVIDIA NVCF",{"type":65,"value":274}," (",{"type":59,"tag":84,"props":276,"children":278},{"className":277},[],[279],{"type":65,"value":280},"grpc.nvcf.nvidia.com",{"type":65,"value":282},")",{"type":59,"tag":265,"props":284,"children":285},{},[286],{"type":65,"value":287},"The clinical sentences you synthesize (text), and the WAV files you transcribe (audio)",{"type":59,"tag":265,"props":289,"children":290},{},[291],{"type":65,"value":292},"Every Stage 2 TTS call and every Stage 3 ASR call",{"type":59,"tag":265,"props":294,"children":295},{},[296],{"type":65,"value":297},"NVIDIA, governed by build.nvidia.com terms",{"type":59,"tag":233,"props":299,"children":300},{},[301,333,338,343],{"type":59,"tag":265,"props":302,"children":303},{},[304,309,310,316,318,323,325,331],{"type":59,"tag":76,"props":305,"children":306},{},[307],{"type":65,"value":308},"Merriam-Webster",{"type":65,"value":274},{"type":59,"tag":84,"props":311,"children":313},{"className":312},[],[314],{"type":65,"value":315},"dictionaryapi.com",{"type":65,"value":317}," JSON API ",{"type":59,"tag":76,"props":319,"children":320},{},[321],{"type":65,"value":322},"or",{"type":65,"value":324}," the public ",{"type":59,"tag":84,"props":326,"children":328},{"className":327},[],[329],{"type":65,"value":330},"merriam-webster.com",{"type":65,"value":332}," HTML site)",{"type":59,"tag":265,"props":334,"children":335},{},[336],{"type":65,"value":337},"Individual clinical terms (drug names, anatomy, procedures), one HTTP request per term",{"type":59,"tag":265,"props":339,"children":340},{},[341],{"type":65,"value":342},"Stage 2 IPA tagging — see \"Two MW paths\" below for which endpoint applies",{"type":59,"tag":265,"props":344,"children":345},{},[346],{"type":65,"value":347},"Merriam-Webster, governed by their API or site terms",{"type":59,"tag":72,"props":349,"children":350},{},[351,353,358,360,365],{"type":65,"value":352},"The data is ",{"type":59,"tag":76,"props":354,"children":355},{},[356],{"type":65,"value":357},"synthetic by construction",{"type":65,"value":359}," — the flywheel manufactures sentences and audio from a user-curated term list, never from real patient encounters. That said: ",{"type":59,"tag":76,"props":361,"children":362},{},[363],{"type":65,"value":364},"do not feed real patient transcripts, recorded clinical audio, or any PHI through any stage.",{"type":65,"value":366}," If the term list itself contains sensitive material (codename drugs, unreleased product names), the user should consult their organization's external-API policy before proceeding. Either endpoint can be turned off:",{"type":59,"tag":368,"props":369,"children":370},"ul",{},[371,390],{"type":59,"tag":372,"props":373,"children":374},"li",{},[375,380,382,388],{"type":59,"tag":76,"props":376,"children":377},{},[378],{"type":65,"value":379},"Skip Merriam-Webster entirely:",{"type":65,"value":381}," leave ",{"type":59,"tag":84,"props":383,"children":385},{"className":384},[],[386],{"type":65,"value":387},"DICTIONARY_API_KEY",{"type":65,"value":389}," unset and don't run a scraper. Stage 2 falls back to Magpie G2P, which still works but with weaker coverage on long-tail clinical terms.",{"type":59,"tag":372,"props":391,"children":392},{},[393,398,400,405],{"type":59,"tag":76,"props":394,"children":395},{},[396],{"type":65,"value":397},"Skip NVCF:",{"type":65,"value":399}," this is a hard stop. Magpie TTS + Parakeet\u002FNemotron ASR ",{"type":59,"tag":177,"props":401,"children":402},{},[403],{"type":65,"value":404},"are",{"type":65,"value":406}," the workload; without them this skill family is the wrong tool — a self-hosted ASR\u002FTTS pipeline is what you want instead.",{"type":59,"tag":72,"props":408,"children":409},{},[410,412,418],{"type":65,"value":411},"Recommend a copy of this notice lands in the user's workspace ",{"type":59,"tag":84,"props":413,"children":415},{"className":414},[],[416],{"type":65,"value":417},"README.md",{"type":65,"value":419},"; bring it forward on first invocation if it isn't already there.",{"type":59,"tag":208,"props":421,"children":423},{"id":422},"purpose",[424],{"type":65,"value":425},"Purpose",{"type":59,"tag":72,"props":427,"children":428},{},[429],{"type":65,"value":430},"Get a fresh environment ready for Stage 2. Three things to confirm: key is present, deps import cleanly, hosted stack actually answers. Close by naming which skill to run next.",{"type":59,"tag":72,"props":432,"children":433},{},[434,436,442,444,449],{"type":65,"value":435},"The four ",{"type":59,"tag":84,"props":437,"children":439},{"className":438},[],[440],{"type":65,"value":441},"digital-health-clinical-asr-*",{"type":65,"value":443}," skills are ",{"type":59,"tag":76,"props":445,"children":446},{},[447],{"type":65,"value":448},"self-contained",{"type":65,"value":450}," — every TTS, ASR, IPA-tagging, and scoring recipe lives inside them; no other agent skill needs installing to run the flywheel end-to-end.",{"type":59,"tag":72,"props":452,"children":453},{},[454,456,462],{"type":65,"value":455},"This skill takes no opinion on workspace layout. The user decides where their cycle artifacts live; ",{"type":59,"tag":84,"props":457,"children":459},{"className":458},[],[460],{"type":65,"value":461},"data\u002Feval_sets\u002Fcycle\u003CN>\u002F",{"type":65,"value":463}," is not imposed.",{"type":59,"tag":208,"props":465,"children":467},{"id":466},"when-to-use-this-skill",[468],{"type":65,"value":469},"When to use this skill",{"type":59,"tag":72,"props":471,"children":472},{},[473],{"type":65,"value":474},"Activate on user phrases like:",{"type":59,"tag":368,"props":476,"children":477},{},[478,483,488,493,498],{"type":59,"tag":372,"props":479,"children":480},{},[481],{"type":65,"value":482},"\"Set up the Clinical ASR Flywheel\"",{"type":59,"tag":372,"props":484,"children":485},{},[486],{"type":65,"value":487},"\"Initialize the clinical-asr eval\"",{"type":59,"tag":372,"props":489,"children":490},{},[491],{"type":65,"value":492},"\"I want to evaluate ASR on clinical terminology — where do I start?\"",{"type":59,"tag":372,"props":494,"children":495},{},[496],{"type":65,"value":497},"\"Bootstrap my environment for the flywheel\"",{"type":59,"tag":372,"props":499,"children":500},{},[501],{"type":65,"value":502},"\"What do I need installed before I run the flywheel?\"",{"type":59,"tag":72,"props":504,"children":505},{},[506,508,513],{"type":65,"value":507},"Do ",{"type":59,"tag":76,"props":509,"children":510},{},[511],{"type":65,"value":512},"not",{"type":65,"value":514}," activate when:",{"type":59,"tag":368,"props":516,"children":517},{},[518,529,539],{"type":59,"tag":372,"props":519,"children":520},{},[521,523],{"type":65,"value":522},"The user already has a manifest and wants to score it → ",{"type":59,"tag":84,"props":524,"children":526},{"className":525},[],[527],{"type":65,"value":528},"\u002Fdigital-health-clinical-asr-eval",{"type":59,"tag":372,"props":530,"children":531},{},[532,534],{"type":65,"value":533},"The user already has the env set up and wants to curate terms → ",{"type":59,"tag":84,"props":535,"children":537},{"className":536},[],[538],{"type":65,"value":133},{"type":59,"tag":372,"props":540,"children":541},{},[542,544],{"type":65,"value":543},"The user is asking about Stage 4 fine-tune NGC\u002FDocker setup specifically → that's covered inside ",{"type":59,"tag":84,"props":545,"children":547},{"className":546},[],[548],{"type":65,"value":549},"\u002Fdigital-health-clinical-asr-finetune",{"type":59,"tag":208,"props":551,"children":553},{"id":552},"prerequisites",[554],{"type":65,"value":555},"Prerequisites",{"type":59,"tag":225,"props":557,"children":558},{},[559,585],{"type":59,"tag":229,"props":560,"children":561},{},[562],{"type":59,"tag":233,"props":563,"children":564},{},[565,570,575,580],{"type":59,"tag":237,"props":566,"children":567},{},[568],{"type":65,"value":569},"Requirement",{"type":59,"tag":237,"props":571,"children":572},{},[573],{"type":65,"value":574},"Required?",{"type":59,"tag":237,"props":576,"children":577},{},[578],{"type":65,"value":579},"Why",{"type":59,"tag":237,"props":581,"children":582},{},[583],{"type":65,"value":584},"How",{"type":59,"tag":258,"props":586,"children":587},{},[588,643,672,726,767,799],{"type":59,"tag":233,"props":589,"children":590},{},[591,607,615,620],{"type":59,"tag":265,"props":592,"children":593},{},[594,599,600,606],{"type":59,"tag":84,"props":595,"children":597},{"className":596},[],[598],{"type":65,"value":125},{"type":65,"value":274},{"type":59,"tag":84,"props":601,"children":603},{"className":602},[],[604],{"type":65,"value":605},"nvapi-…",{"type":65,"value":282},{"type":59,"tag":265,"props":608,"children":609},{},[610],{"type":59,"tag":76,"props":611,"children":612},{},[613],{"type":65,"value":614},"Required",{"type":59,"tag":265,"props":616,"children":617},{},[618],{"type":65,"value":619},"Hosted Magpie TTS + Parakeet\u002FNemotron ASR via NVCF",{"type":59,"tag":265,"props":621,"children":622},{},[623,625,633,635,641],{"type":65,"value":624},"Issue at ",{"type":59,"tag":626,"props":627,"children":631},"a",{"href":628,"rel":629},"https:\u002F\u002Fbuild.nvidia.com",[630],"nofollow",[632],{"type":65,"value":628},{"type":65,"value":634},"; ",{"type":59,"tag":84,"props":636,"children":638},{"className":637},[],[639],{"type":65,"value":640},"export NVIDIA_API_KEY=...",{"type":65,"value":642}," in shell",{"type":59,"tag":233,"props":644,"children":645},{},[646,651,658,663],{"type":59,"tag":265,"props":647,"children":648},{},[649],{"type":65,"value":650},"Python ≥ 3.10",{"type":59,"tag":265,"props":652,"children":653},{},[654],{"type":59,"tag":76,"props":655,"children":656},{},[657],{"type":65,"value":614},{"type":59,"tag":265,"props":659,"children":660},{},[661],{"type":65,"value":662},"NeMo client, scoring, manifest tools",{"type":59,"tag":265,"props":664,"children":665},{},[666],{"type":59,"tag":84,"props":667,"children":669},{"className":668},[],[670],{"type":65,"value":671},"python3 --version",{"type":59,"tag":233,"props":673,"children":674},{},[675,705,712,717],{"type":59,"tag":265,"props":676,"children":677},{},[678,684,685,691,692,698,699],{"type":59,"tag":84,"props":679,"children":681},{"className":680},[],[682],{"type":65,"value":683},"nvidia-riva-client",{"type":65,"value":91},{"type":59,"tag":84,"props":686,"children":688},{"className":687},[],[689],{"type":65,"value":690},"pandas",{"type":65,"value":91},{"type":59,"tag":84,"props":693,"children":695},{"className":694},[],[696],{"type":65,"value":697},"soundfile",{"type":65,"value":91},{"type":59,"tag":84,"props":700,"children":702},{"className":701},[],[703],{"type":65,"value":704},"requests",{"type":59,"tag":265,"props":706,"children":707},{},[708],{"type":59,"tag":76,"props":709,"children":710},{},[711],{"type":65,"value":614},{"type":59,"tag":265,"props":713,"children":714},{},[715],{"type":65,"value":716},"TTS + ASR clients, manifest I\u002FO, MW lookup",{"type":59,"tag":265,"props":718,"children":719},{},[720],{"type":59,"tag":84,"props":721,"children":723},{"className":722},[],[724],{"type":65,"value":725},"pip install nvidia-riva-client pandas soundfile requests",{"type":59,"tag":233,"props":727,"children":728},{},[729,737,742,747],{"type":59,"tag":265,"props":730,"children":731},{},[732],{"type":59,"tag":84,"props":733,"children":735},{"className":734},[],[736],{"type":65,"value":387},{"type":59,"tag":265,"props":738,"children":739},{},[740],{"type":65,"value":741},"Optional",{"type":59,"tag":265,"props":743,"children":744},{},[745],{"type":65,"value":746},"Merriam-Webster Medical Dictionary lookup via the JSON API (Path A in the build skill — recommended)",{"type":59,"tag":265,"props":748,"children":749},{},[750,752,758,760,765],{"type":65,"value":751},"Free key at ",{"type":59,"tag":626,"props":753,"children":756},{"href":754,"rel":755},"https:\u002F\u002Fdictionaryapi.com",[630],[757],{"type":65,"value":754},{"type":65,"value":759},". Path B (HTML scrape of ",{"type":59,"tag":84,"props":761,"children":763},{"className":762},[],[764],{"type":65,"value":330},{"type":65,"value":766},", no key, brittle) is also documented in the build skill if you can't get a key. Without either path, Stage 2 falls through to Magpie G2P with weaker long-tail coverage.",{"type":59,"tag":233,"props":768,"children":769},{},[770,779,783,788],{"type":59,"tag":265,"props":771,"children":772},{},[773],{"type":59,"tag":84,"props":774,"children":776},{"className":775},[],[777],{"type":65,"value":778},"jiwer",{"type":59,"tag":265,"props":780,"children":781},{},[782],{"type":65,"value":741},{"type":59,"tag":265,"props":784,"children":785},{},[786],{"type":65,"value":787},"Reference WER\u002FCER against the inlined Levenshtein implementation",{"type":59,"tag":265,"props":789,"children":790},{},[791,797],{"type":59,"tag":84,"props":792,"children":794},{"className":793},[],[795],{"type":65,"value":796},"pip install jiwer",{"type":65,"value":798}," — the eval skill includes a pure-Python fallback",{"type":59,"tag":233,"props":800,"children":801},{},[802,815,820,825],{"type":59,"tag":265,"props":803,"children":804},{},[805,807,813],{"type":65,"value":806},"(Stage 4 only) ",{"type":59,"tag":84,"props":808,"children":810},{"className":809},[],[811],{"type":65,"value":812},"NGC_API_KEY",{"type":65,"value":814}," + CUDA host + NeMo container",{"type":59,"tag":265,"props":816,"children":817},{},[818],{"type":65,"value":819},"Optional, deferred",{"type":59,"tag":265,"props":821,"children":822},{},[823],{"type":65,"value":824},"Fine-tune workload",{"type":59,"tag":265,"props":826,"children":827},{},[828,830,835],{"type":65,"value":829},"Set up inside ",{"type":59,"tag":84,"props":831,"children":833},{"className":832},[],[834],{"type":65,"value":549},{"type":65,"value":836},"; defer until the eval shows KER > 0.3",{"type":59,"tag":208,"props":838,"children":840},{"id":839},"instructions",[841],{"type":65,"value":842},"Instructions",{"type":59,"tag":72,"props":844,"children":845},{},[846,851,853,858,860,864,866,872],{"type":59,"tag":76,"props":847,"children":848},{},[849],{"type":65,"value":850},"Scope.",{"type":65,"value":852}," This skill performs ",{"type":59,"tag":76,"props":854,"children":855},{},[856],{"type":65,"value":857},"read-only environment checks",{"type":65,"value":859},": confirming a key is exported (length-only), the Python version, that libraries import, and that the hosted NVCF stack responds to a single smoke-test round-trip. It does ",{"type":59,"tag":76,"props":861,"children":862},{},[863],{"type":65,"value":512},{"type":65,"value":865}," install system packages, modify shell rc files, write to disk outside an explicit ",{"type":59,"tag":84,"props":867,"children":869},{"className":868},[],[870],{"type":65,"value":871},".venv\u002F",{"type":65,"value":873},", or attempt to authenticate with the real key value. Validate; never mutate without explicit user direction.",{"type":59,"tag":875,"props":876,"children":878},"h3",{"id":877},"_1a-verify-nvidia_api_key-length-only-never-echo-the-value",[879,881,886],{"type":65,"value":880},"1a. Verify ",{"type":59,"tag":84,"props":882,"children":884},{"className":883},[],[885],{"type":65,"value":125},{"type":65,"value":887}," (length-only — never echo the value)",{"type":59,"tag":889,"props":890,"children":895},"pre",{"className":891,"code":892,"language":893,"meta":894,"style":894},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Export NVIDIA_API_KEY in your shell — never echo or commit the value\nexport NVIDIA_API_KEY=nvapi-...     # from https:\u002F\u002Fbuild.nvidia.com\n\n# Length-only check; the key value never appears in any log\ntest -n \"$NVIDIA_API_KEY\" && echo \"NVIDIA_API_KEY len=${#NVIDIA_API_KEY}\"\n","bash","",[896],{"type":59,"tag":84,"props":897,"children":898},{"__ignoreMap":894},[899,910,942,952,961],{"type":59,"tag":900,"props":901,"children":903},"span",{"class":902,"line":53},"line",[904],{"type":59,"tag":900,"props":905,"children":907},{"style":906},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[908],{"type":65,"value":909},"# Export NVIDIA_API_KEY in your shell — never echo or commit the value\n",{"type":59,"tag":900,"props":911,"children":913},{"class":902,"line":912},2,[914,920,926,932,937],{"type":59,"tag":900,"props":915,"children":917},{"style":916},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[918],{"type":65,"value":919},"export",{"type":59,"tag":900,"props":921,"children":923},{"style":922},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[924],{"type":65,"value":925}," NVIDIA_API_KEY",{"type":59,"tag":900,"props":927,"children":929},{"style":928},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[930],{"type":65,"value":931},"=",{"type":59,"tag":900,"props":933,"children":934},{"style":922},[935],{"type":65,"value":936},"nvapi-...     ",{"type":59,"tag":900,"props":938,"children":939},{"style":906},[940],{"type":65,"value":941},"# from https:\u002F\u002Fbuild.nvidia.com\n",{"type":59,"tag":900,"props":943,"children":945},{"class":902,"line":944},3,[946],{"type":59,"tag":900,"props":947,"children":949},{"emptyLinePlaceholder":948},true,[950],{"type":65,"value":951},"\n",{"type":59,"tag":900,"props":953,"children":955},{"class":902,"line":954},4,[956],{"type":59,"tag":900,"props":957,"children":958},{"style":906},[959],{"type":65,"value":960},"# Length-only check; the key value never appears in any log\n",{"type":59,"tag":900,"props":962,"children":964},{"class":902,"line":963},5,[965,971,977,982,987,992,997,1002,1006,1011,1016,1020],{"type":59,"tag":900,"props":966,"children":968},{"style":967},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[969],{"type":65,"value":970},"test",{"type":59,"tag":900,"props":972,"children":974},{"style":973},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[975],{"type":65,"value":976}," -n",{"type":59,"tag":900,"props":978,"children":979},{"style":928},[980],{"type":65,"value":981}," \"",{"type":59,"tag":900,"props":983,"children":984},{"style":922},[985],{"type":65,"value":986},"$NVIDIA_API_KEY",{"type":59,"tag":900,"props":988,"children":989},{"style":928},[990],{"type":65,"value":991},"\"",{"type":59,"tag":900,"props":993,"children":994},{"style":928},[995],{"type":65,"value":996}," &&",{"type":59,"tag":900,"props":998,"children":999},{"style":967},[1000],{"type":65,"value":1001}," echo",{"type":59,"tag":900,"props":1003,"children":1004},{"style":928},[1005],{"type":65,"value":981},{"type":59,"tag":900,"props":1007,"children":1008},{"style":973},[1009],{"type":65,"value":1010},"NVIDIA_API_KEY len=",{"type":59,"tag":900,"props":1012,"children":1013},{"style":928},[1014],{"type":65,"value":1015},"${#",{"type":59,"tag":900,"props":1017,"children":1018},{"style":922},[1019],{"type":65,"value":125},{"type":59,"tag":900,"props":1021,"children":1022},{"style":928},[1023],{"type":65,"value":1024},"}\"\n",{"type":59,"tag":72,"props":1026,"children":1027},{},[1028,1030,1036,1038,1043,1045,1049,1051,1056,1058,1064,1065,1071,1073,1079],{"type":65,"value":1029},"A length of 70+ is normal. If the output is empty or shows ",{"type":59,"tag":84,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":65,"value":1035},"len=0",{"type":65,"value":1037},", the user must paste a key from ",{"type":59,"tag":626,"props":1039,"children":1041},{"href":628,"rel":1040},[630],[1042],{"type":65,"value":628},{"type":65,"value":1044},". Do ",{"type":59,"tag":76,"props":1046,"children":1047},{},[1048],{"type":65,"value":512},{"type":65,"value":1050}," print the key, even truncated. To persist across shell sessions, add the ",{"type":59,"tag":84,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":65,"value":919},{"type":65,"value":1057}," line to your shell rc (",{"type":59,"tag":84,"props":1059,"children":1061},{"className":1060},[],[1062],{"type":65,"value":1063},"~\u002F.bashrc",{"type":65,"value":91},{"type":59,"tag":84,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":65,"value":1070},"~\u002F.zshrc",{"type":65,"value":1072},") — or use a per-directory tool like ",{"type":59,"tag":84,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":65,"value":1078},"direnv",{"type":65,"value":135},{"type":59,"tag":875,"props":1081,"children":1083},{"id":1082},"_1b-install-python-dependencies",[1084],{"type":65,"value":1085},"1b. Install Python dependencies",{"type":59,"tag":889,"props":1087,"children":1089},{"className":891,"code":1088,"language":893,"meta":894,"style":894},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npip install nvidia-riva-client pandas soundfile requests\n# optional\npip install jiwer\n",[1090],{"type":59,"tag":84,"props":1091,"children":1092},{"__ignoreMap":894},[1093,1117,1130,1163,1171],{"type":59,"tag":900,"props":1094,"children":1095},{"class":902,"line":53},[1096,1102,1107,1112],{"type":59,"tag":900,"props":1097,"children":1099},{"style":1098},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1100],{"type":65,"value":1101},"python3",{"type":59,"tag":900,"props":1103,"children":1104},{"style":973},[1105],{"type":65,"value":1106}," -m",{"type":59,"tag":900,"props":1108,"children":1109},{"style":973},[1110],{"type":65,"value":1111}," venv",{"type":59,"tag":900,"props":1113,"children":1114},{"style":973},[1115],{"type":65,"value":1116}," .venv\n",{"type":59,"tag":900,"props":1118,"children":1119},{"class":902,"line":912},[1120,1125],{"type":59,"tag":900,"props":1121,"children":1122},{"style":967},[1123],{"type":65,"value":1124},"source",{"type":59,"tag":900,"props":1126,"children":1127},{"style":973},[1128],{"type":65,"value":1129}," .venv\u002Fbin\u002Factivate\n",{"type":59,"tag":900,"props":1131,"children":1132},{"class":902,"line":944},[1133,1138,1143,1148,1153,1158],{"type":59,"tag":900,"props":1134,"children":1135},{"style":1098},[1136],{"type":65,"value":1137},"pip",{"type":59,"tag":900,"props":1139,"children":1140},{"style":973},[1141],{"type":65,"value":1142}," install",{"type":59,"tag":900,"props":1144,"children":1145},{"style":973},[1146],{"type":65,"value":1147}," nvidia-riva-client",{"type":59,"tag":900,"props":1149,"children":1150},{"style":973},[1151],{"type":65,"value":1152}," pandas",{"type":59,"tag":900,"props":1154,"children":1155},{"style":973},[1156],{"type":65,"value":1157}," soundfile",{"type":59,"tag":900,"props":1159,"children":1160},{"style":973},[1161],{"type":65,"value":1162}," requests\n",{"type":59,"tag":900,"props":1164,"children":1165},{"class":902,"line":954},[1166],{"type":59,"tag":900,"props":1167,"children":1168},{"style":906},[1169],{"type":65,"value":1170},"# optional\n",{"type":59,"tag":900,"props":1172,"children":1173},{"class":902,"line":963},[1174,1178,1182],{"type":59,"tag":900,"props":1175,"children":1176},{"style":1098},[1177],{"type":65,"value":1137},{"type":59,"tag":900,"props":1179,"children":1180},{"style":973},[1181],{"type":65,"value":1142},{"type":59,"tag":900,"props":1183,"children":1184},{"style":973},[1185],{"type":65,"value":1186}," jiwer\n",{"type":59,"tag":72,"props":1188,"children":1189},{},[1190,1192,1198,1200,1205],{"type":65,"value":1191},"For Stage 4 (fine-tune) only: ",{"type":59,"tag":84,"props":1193,"children":1195},{"className":1194},[],[1196],{"type":65,"value":1197},"nemo-toolkit",{"type":65,"value":1199}," and Docker + NVIDIA Container Toolkit are also required. Defer those to ",{"type":59,"tag":84,"props":1201,"children":1203},{"className":1202},[],[1204],{"type":65,"value":549},{"type":65,"value":1206}," — there is no point installing them up front if the user may never reach Stage 4.",{"type":59,"tag":875,"props":1208,"children":1210},{"id":1209},"_1c-smoke-test-the-hosted-nvcf-stack",[1211],{"type":65,"value":1212},"1c. Smoke-test the hosted NVCF stack",{"type":59,"tag":72,"props":1214,"children":1215},{},[1216],{"type":59,"tag":76,"props":1217,"children":1218},{},[1219,1224],{"type":59,"tag":84,"props":1220,"children":1222},{"className":1221},[],[1223],{"type":65,"value":125},{"type":65,"value":1225}," handling — load-bearing, do not deviate:",{"type":59,"tag":368,"props":1227,"children":1228},{},[1229,1255,1275,1300,1318],{"type":59,"tag":372,"props":1230,"children":1231},{},[1232,1234,1239,1241,1246,1248,1254],{"type":65,"value":1233},"The agent harness reads ",{"type":59,"tag":84,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":65,"value":986},{"type":65,"value":1240}," from the shell and passes it as an ",{"type":59,"tag":76,"props":1242,"children":1243},{},[1244],{"type":65,"value":1245},"explicit function argument",{"type":65,"value":1247}," to ",{"type":59,"tag":84,"props":1249,"children":1251},{"className":1250},[],[1252],{"type":65,"value":1253},"smoke_test(api_key=…)",{"type":65,"value":135},{"type":59,"tag":372,"props":1256,"children":1257},{},[1258,1260,1266,1268,1274],{"type":65,"value":1259},"Auditors can grep the recipe for every wire crossing — every ",{"type":59,"tag":84,"props":1261,"children":1263},{"className":1262},[],[1264],{"type":65,"value":1265},"api_key",{"type":65,"value":1267}," use is visible in ",{"type":59,"tag":84,"props":1269,"children":1271},{"className":1270},[],[1272],{"type":65,"value":1273},"auth_for(...)",{"type":65,"value":135},{"type":59,"tag":372,"props":1276,"children":1277},{},[1278,1279,1283,1285,1291,1292,1298],{"type":65,"value":507},{"type":59,"tag":76,"props":1280,"children":1281},{},[1282],{"type":65,"value":512},{"type":65,"value":1284}," ",{"type":59,"tag":84,"props":1286,"children":1288},{"className":1287},[],[1289],{"type":65,"value":1290},"echo",{"type":65,"value":91},{"type":59,"tag":84,"props":1293,"children":1295},{"className":1294},[],[1296],{"type":65,"value":1297},"print",{"type":65,"value":1299},", or log the key value (including truncated). Length-only checks are fine (see §1a).",{"type":59,"tag":372,"props":1301,"children":1302},{},[1303,1304,1308,1310,1316],{"type":65,"value":507},{"type":59,"tag":76,"props":1305,"children":1306},{},[1307],{"type":65,"value":512},{"type":65,"value":1309}," let the recipe read ",{"type":59,"tag":84,"props":1311,"children":1313},{"className":1312},[],[1314],{"type":65,"value":1315},"os.environ[\"NVIDIA_API_KEY\"]",{"type":65,"value":1317}," itself — the explicit-argument pattern is the auditability guarantee.",{"type":59,"tag":372,"props":1319,"children":1320},{},[1321,1322,1326,1328,1334],{"type":65,"value":507},{"type":59,"tag":76,"props":1323,"children":1324},{},[1325],{"type":65,"value":512},{"type":65,"value":1327}," commit the key to any file, including ",{"type":59,"tag":84,"props":1329,"children":1331},{"className":1330},[],[1332],{"type":65,"value":1333},".env",{"type":65,"value":1335}," examples or notebook outputs.",{"type":59,"tag":72,"props":1337,"children":1338},{},[1339,1341,1346],{"type":65,"value":1340},"Verify the ",{"type":59,"tag":84,"props":1342,"children":1344},{"className":1343},[],[1345],{"type":65,"value":125},{"type":65,"value":1347}," actually works against Magpie TTS and Parakeet\u002FNemotron ASR before advancing. The four skills inline every recipe needed; this round-trip just confirms the API key + network path are real.",{"type":59,"tag":72,"props":1349,"children":1350},{},[1351,1353,1358],{"type":65,"value":1352},"The agent harness loads the ",{"type":59,"tag":84,"props":1354,"children":1356},{"className":1355},[],[1357],{"type":65,"value":125},{"type":65,"value":1359}," shell variable and passes it as an explicit function argument to the helpers below. The recipe code itself does not read environment variables — auditors can see exactly which API keys cross the wire.",{"type":59,"tag":889,"props":1361,"children":1365},{"className":1362,"code":1363,"language":1364,"meta":894,"style":894},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import wave, tempfile\nimport riva.client\n\nNVCF_HOST = \"grpc.nvcf.nvidia.com:443\"\nMAGPIE_FUNCTION_ID    = \"877104f7-e885-42b9-8de8-f6e4c6303969\"   # Magpie TTS\nPARAKEET_FUNCTION_ID  = \"d3fe9151-442b-4204-a70d-5fcc597fd610\"   # Parakeet TDT 0.6B v2 (offline ASR)\n\ndef auth_for(function_id: str, api_key: str) -> riva.client.Auth:\n    return riva.client.Auth(\n        use_ssl=True, uri=NVCF_HOST,\n        metadata_args=[\n            [\"function-id\", function_id],\n            [\"authorization\", f\"Bearer {api_key}\"],\n        ],\n    )\n\ndef smoke_test(api_key: str) -> str:\n    \"\"\"Caller passes api_key (the harness reads $NVIDIA_API_KEY at the shell;\n    this code never touches the environment). Returns the ASR transcript.\"\"\"\n\n    # 1. TTS: \"The patient was prescribed cefazolin.\"\n    tts = riva.client.SpeechSynthesisService(auth_for(MAGPIE_FUNCTION_ID, api_key))\n    pcm = b\"\".join(c.audio for c in tts.synthesize_online(\n        text=\"The patient was prescribed cefazolin.\",\n        voice_name=\"Magpie-Multilingual.EN-US.Mia\",\n        language_code=\"en-US\", sample_rate_hz=16000,\n    ))\n    with tempfile.NamedTemporaryFile(suffix=\".wav\", delete=False) as f:\n        with wave.open(f, \"wb\") as w:\n            w.setnchannels(1); w.setsampwidth(2); w.setframerate(16000); w.writeframes(pcm)\n        wav_path = f.name\n\n    # 2. ASR: transcribe the WAV we just synthesized.\n    asr = riva.client.ASRService(auth_for(PARAKEET_FUNCTION_ID, api_key))\n    with open(wav_path, \"rb\") as f:\n        audio_bytes = f.read()\n    config = riva.client.RecognitionConfig(\n        encoding=riva.client.AudioEncoding.LINEAR_PCM,\n        sample_rate_hertz=16000, language_code=\"en-US\",\n        max_alternatives=1, enable_automatic_punctuation=True,\n    )\n    response = asr.offline_recognize(audio_bytes, config)\n    transcript = response.results[0].alternatives[0].transcript if response.results else \"\"\n    print(f\"TTS:  The patient was prescribed cefazolin.\")\n    print(f\"ASR:  {transcript}\")\n    return transcript\n\n# Invoke from the agent (api_key sourced by the harness, not by this code):\n# smoke_test(api_key=\"\u003CNVIDIA_API_KEY value>\")\n","python",[1366],{"type":59,"tag":84,"props":1367,"children":1368},{"__ignoreMap":894},[1369,1377,1385,1392,1400,1408,1417,1425,1434,1443,1452,1461,1470,1479,1488,1497,1505,1514,1523,1532,1540,1549,1558,1567,1576,1585,1594,1603,1612,1621,1630,1639,1647,1656,1665,1674,1683,1692,1701,1710,1719,1727,1736,1745,1754,1763,1772,1780,1789],{"type":59,"tag":900,"props":1370,"children":1371},{"class":902,"line":53},[1372],{"type":59,"tag":900,"props":1373,"children":1374},{},[1375],{"type":65,"value":1376},"import wave, tempfile\n",{"type":59,"tag":900,"props":1378,"children":1379},{"class":902,"line":912},[1380],{"type":59,"tag":900,"props":1381,"children":1382},{},[1383],{"type":65,"value":1384},"import riva.client\n",{"type":59,"tag":900,"props":1386,"children":1387},{"class":902,"line":944},[1388],{"type":59,"tag":900,"props":1389,"children":1390},{"emptyLinePlaceholder":948},[1391],{"type":65,"value":951},{"type":59,"tag":900,"props":1393,"children":1394},{"class":902,"line":954},[1395],{"type":59,"tag":900,"props":1396,"children":1397},{},[1398],{"type":65,"value":1399},"NVCF_HOST = \"grpc.nvcf.nvidia.com:443\"\n",{"type":59,"tag":900,"props":1401,"children":1402},{"class":902,"line":963},[1403],{"type":59,"tag":900,"props":1404,"children":1405},{},[1406],{"type":65,"value":1407},"MAGPIE_FUNCTION_ID    = \"877104f7-e885-42b9-8de8-f6e4c6303969\"   # Magpie TTS\n",{"type":59,"tag":900,"props":1409,"children":1411},{"class":902,"line":1410},6,[1412],{"type":59,"tag":900,"props":1413,"children":1414},{},[1415],{"type":65,"value":1416},"PARAKEET_FUNCTION_ID  = \"d3fe9151-442b-4204-a70d-5fcc597fd610\"   # Parakeet TDT 0.6B v2 (offline ASR)\n",{"type":59,"tag":900,"props":1418,"children":1420},{"class":902,"line":1419},7,[1421],{"type":59,"tag":900,"props":1422,"children":1423},{"emptyLinePlaceholder":948},[1424],{"type":65,"value":951},{"type":59,"tag":900,"props":1426,"children":1428},{"class":902,"line":1427},8,[1429],{"type":59,"tag":900,"props":1430,"children":1431},{},[1432],{"type":65,"value":1433},"def auth_for(function_id: str, api_key: str) -> riva.client.Auth:\n",{"type":59,"tag":900,"props":1435,"children":1437},{"class":902,"line":1436},9,[1438],{"type":59,"tag":900,"props":1439,"children":1440},{},[1441],{"type":65,"value":1442},"    return riva.client.Auth(\n",{"type":59,"tag":900,"props":1444,"children":1446},{"class":902,"line":1445},10,[1447],{"type":59,"tag":900,"props":1448,"children":1449},{},[1450],{"type":65,"value":1451},"        use_ssl=True, uri=NVCF_HOST,\n",{"type":59,"tag":900,"props":1453,"children":1455},{"class":902,"line":1454},11,[1456],{"type":59,"tag":900,"props":1457,"children":1458},{},[1459],{"type":65,"value":1460},"        metadata_args=[\n",{"type":59,"tag":900,"props":1462,"children":1464},{"class":902,"line":1463},12,[1465],{"type":59,"tag":900,"props":1466,"children":1467},{},[1468],{"type":65,"value":1469},"            [\"function-id\", function_id],\n",{"type":59,"tag":900,"props":1471,"children":1473},{"class":902,"line":1472},13,[1474],{"type":59,"tag":900,"props":1475,"children":1476},{},[1477],{"type":65,"value":1478},"            [\"authorization\", f\"Bearer {api_key}\"],\n",{"type":59,"tag":900,"props":1480,"children":1482},{"class":902,"line":1481},14,[1483],{"type":59,"tag":900,"props":1484,"children":1485},{},[1486],{"type":65,"value":1487},"        ],\n",{"type":59,"tag":900,"props":1489,"children":1491},{"class":902,"line":1490},15,[1492],{"type":59,"tag":900,"props":1493,"children":1494},{},[1495],{"type":65,"value":1496},"    )\n",{"type":59,"tag":900,"props":1498,"children":1500},{"class":902,"line":1499},16,[1501],{"type":59,"tag":900,"props":1502,"children":1503},{"emptyLinePlaceholder":948},[1504],{"type":65,"value":951},{"type":59,"tag":900,"props":1506,"children":1508},{"class":902,"line":1507},17,[1509],{"type":59,"tag":900,"props":1510,"children":1511},{},[1512],{"type":65,"value":1513},"def smoke_test(api_key: str) -> str:\n",{"type":59,"tag":900,"props":1515,"children":1517},{"class":902,"line":1516},18,[1518],{"type":59,"tag":900,"props":1519,"children":1520},{},[1521],{"type":65,"value":1522},"    \"\"\"Caller passes api_key (the harness reads $NVIDIA_API_KEY at the shell;\n",{"type":59,"tag":900,"props":1524,"children":1526},{"class":902,"line":1525},19,[1527],{"type":59,"tag":900,"props":1528,"children":1529},{},[1530],{"type":65,"value":1531},"    this code never touches the environment). Returns the ASR transcript.\"\"\"\n",{"type":59,"tag":900,"props":1533,"children":1535},{"class":902,"line":1534},20,[1536],{"type":59,"tag":900,"props":1537,"children":1538},{"emptyLinePlaceholder":948},[1539],{"type":65,"value":951},{"type":59,"tag":900,"props":1541,"children":1543},{"class":902,"line":1542},21,[1544],{"type":59,"tag":900,"props":1545,"children":1546},{},[1547],{"type":65,"value":1548},"    # 1. TTS: \"The patient was prescribed cefazolin.\"\n",{"type":59,"tag":900,"props":1550,"children":1552},{"class":902,"line":1551},22,[1553],{"type":59,"tag":900,"props":1554,"children":1555},{},[1556],{"type":65,"value":1557},"    tts = riva.client.SpeechSynthesisService(auth_for(MAGPIE_FUNCTION_ID, api_key))\n",{"type":59,"tag":900,"props":1559,"children":1561},{"class":902,"line":1560},23,[1562],{"type":59,"tag":900,"props":1563,"children":1564},{},[1565],{"type":65,"value":1566},"    pcm = b\"\".join(c.audio for c in tts.synthesize_online(\n",{"type":59,"tag":900,"props":1568,"children":1570},{"class":902,"line":1569},24,[1571],{"type":59,"tag":900,"props":1572,"children":1573},{},[1574],{"type":65,"value":1575},"        text=\"The patient was prescribed cefazolin.\",\n",{"type":59,"tag":900,"props":1577,"children":1579},{"class":902,"line":1578},25,[1580],{"type":59,"tag":900,"props":1581,"children":1582},{},[1583],{"type":65,"value":1584},"        voice_name=\"Magpie-Multilingual.EN-US.Mia\",\n",{"type":59,"tag":900,"props":1586,"children":1588},{"class":902,"line":1587},26,[1589],{"type":59,"tag":900,"props":1590,"children":1591},{},[1592],{"type":65,"value":1593},"        language_code=\"en-US\", sample_rate_hz=16000,\n",{"type":59,"tag":900,"props":1595,"children":1597},{"class":902,"line":1596},27,[1598],{"type":59,"tag":900,"props":1599,"children":1600},{},[1601],{"type":65,"value":1602},"    ))\n",{"type":59,"tag":900,"props":1604,"children":1606},{"class":902,"line":1605},28,[1607],{"type":59,"tag":900,"props":1608,"children":1609},{},[1610],{"type":65,"value":1611},"    with tempfile.NamedTemporaryFile(suffix=\".wav\", delete=False) as f:\n",{"type":59,"tag":900,"props":1613,"children":1615},{"class":902,"line":1614},29,[1616],{"type":59,"tag":900,"props":1617,"children":1618},{},[1619],{"type":65,"value":1620},"        with wave.open(f, \"wb\") as w:\n",{"type":59,"tag":900,"props":1622,"children":1624},{"class":902,"line":1623},30,[1625],{"type":59,"tag":900,"props":1626,"children":1627},{},[1628],{"type":65,"value":1629},"            w.setnchannels(1); w.setsampwidth(2); w.setframerate(16000); w.writeframes(pcm)\n",{"type":59,"tag":900,"props":1631,"children":1633},{"class":902,"line":1632},31,[1634],{"type":59,"tag":900,"props":1635,"children":1636},{},[1637],{"type":65,"value":1638},"        wav_path = f.name\n",{"type":59,"tag":900,"props":1640,"children":1642},{"class":902,"line":1641},32,[1643],{"type":59,"tag":900,"props":1644,"children":1645},{"emptyLinePlaceholder":948},[1646],{"type":65,"value":951},{"type":59,"tag":900,"props":1648,"children":1650},{"class":902,"line":1649},33,[1651],{"type":59,"tag":900,"props":1652,"children":1653},{},[1654],{"type":65,"value":1655},"    # 2. ASR: transcribe the WAV we just synthesized.\n",{"type":59,"tag":900,"props":1657,"children":1659},{"class":902,"line":1658},34,[1660],{"type":59,"tag":900,"props":1661,"children":1662},{},[1663],{"type":65,"value":1664},"    asr = riva.client.ASRService(auth_for(PARAKEET_FUNCTION_ID, api_key))\n",{"type":59,"tag":900,"props":1666,"children":1668},{"class":902,"line":1667},35,[1669],{"type":59,"tag":900,"props":1670,"children":1671},{},[1672],{"type":65,"value":1673},"    with open(wav_path, \"rb\") as f:\n",{"type":59,"tag":900,"props":1675,"children":1677},{"class":902,"line":1676},36,[1678],{"type":59,"tag":900,"props":1679,"children":1680},{},[1681],{"type":65,"value":1682},"        audio_bytes = f.read()\n",{"type":59,"tag":900,"props":1684,"children":1686},{"class":902,"line":1685},37,[1687],{"type":59,"tag":900,"props":1688,"children":1689},{},[1690],{"type":65,"value":1691},"    config = riva.client.RecognitionConfig(\n",{"type":59,"tag":900,"props":1693,"children":1695},{"class":902,"line":1694},38,[1696],{"type":59,"tag":900,"props":1697,"children":1698},{},[1699],{"type":65,"value":1700},"        encoding=riva.client.AudioEncoding.LINEAR_PCM,\n",{"type":59,"tag":900,"props":1702,"children":1704},{"class":902,"line":1703},39,[1705],{"type":59,"tag":900,"props":1706,"children":1707},{},[1708],{"type":65,"value":1709},"        sample_rate_hertz=16000, language_code=\"en-US\",\n",{"type":59,"tag":900,"props":1711,"children":1713},{"class":902,"line":1712},40,[1714],{"type":59,"tag":900,"props":1715,"children":1716},{},[1717],{"type":65,"value":1718},"        max_alternatives=1, enable_automatic_punctuation=True,\n",{"type":59,"tag":900,"props":1720,"children":1722},{"class":902,"line":1721},41,[1723],{"type":59,"tag":900,"props":1724,"children":1725},{},[1726],{"type":65,"value":1496},{"type":59,"tag":900,"props":1728,"children":1730},{"class":902,"line":1729},42,[1731],{"type":59,"tag":900,"props":1732,"children":1733},{},[1734],{"type":65,"value":1735},"    response = asr.offline_recognize(audio_bytes, config)\n",{"type":59,"tag":900,"props":1737,"children":1739},{"class":902,"line":1738},43,[1740],{"type":59,"tag":900,"props":1741,"children":1742},{},[1743],{"type":65,"value":1744},"    transcript = response.results[0].alternatives[0].transcript if response.results else \"\"\n",{"type":59,"tag":900,"props":1746,"children":1748},{"class":902,"line":1747},44,[1749],{"type":59,"tag":900,"props":1750,"children":1751},{},[1752],{"type":65,"value":1753},"    print(f\"TTS:  The patient was prescribed cefazolin.\")\n",{"type":59,"tag":900,"props":1755,"children":1757},{"class":902,"line":1756},45,[1758],{"type":59,"tag":900,"props":1759,"children":1760},{},[1761],{"type":65,"value":1762},"    print(f\"ASR:  {transcript}\")\n",{"type":59,"tag":900,"props":1764,"children":1766},{"class":902,"line":1765},46,[1767],{"type":59,"tag":900,"props":1768,"children":1769},{},[1770],{"type":65,"value":1771},"    return transcript\n",{"type":59,"tag":900,"props":1773,"children":1775},{"class":902,"line":1774},47,[1776],{"type":59,"tag":900,"props":1777,"children":1778},{"emptyLinePlaceholder":948},[1779],{"type":65,"value":951},{"type":59,"tag":900,"props":1781,"children":1783},{"class":902,"line":1782},48,[1784],{"type":59,"tag":900,"props":1785,"children":1786},{},[1787],{"type":65,"value":1788},"# Invoke from the agent (api_key sourced by the harness, not by this code):\n",{"type":59,"tag":900,"props":1790,"children":1792},{"class":902,"line":1791},49,[1793],{"type":59,"tag":900,"props":1794,"children":1795},{},[1796],{"type":65,"value":1797},"# smoke_test(api_key=\"\u003CNVIDIA_API_KEY value>\")\n",{"type":59,"tag":72,"props":1799,"children":1800},{},[1801,1806,1808,1813],{"type":59,"tag":76,"props":1802,"children":1803},{},[1804],{"type":65,"value":1805},"Run the smoke test — don't defer it.",{"type":65,"value":1807}," This is the gate that proves Stages 2–4 can reach the hosted stack with the user's current key. \"I can run it later\" is not an acceptable completion of Stage 1; either invoke ",{"type":59,"tag":84,"props":1809,"children":1811},{"className":1810},[],[1812],{"type":65,"value":1253},{"type":65,"value":1814}," now or, if the user has explicitly opted out, log the deferral in your closing summary so they know what they're missing.",{"type":59,"tag":72,"props":1816,"children":1817},{},[1818],{"type":65,"value":1819},"If the transcript matches the input within ~1 token, the hosted stack is reachable and the user can advance to Stage 2. If either call fails:",{"type":59,"tag":368,"props":1821,"children":1822},{},[1823,1849,1874,1885],{"type":59,"tag":372,"props":1824,"children":1825},{},[1826,1832,1834,1840,1842,1847],{"type":59,"tag":84,"props":1827,"children":1829},{"className":1828},[],[1830],{"type":65,"value":1831},"401 Unauthorized",{"type":65,"value":1833}," \u002F ",{"type":59,"tag":84,"props":1835,"children":1837},{"className":1836},[],[1838],{"type":65,"value":1839},"PERMISSION_DENIED",{"type":65,"value":1841}," → ",{"type":59,"tag":84,"props":1843,"children":1845},{"className":1844},[],[1846],{"type":65,"value":125},{"type":65,"value":1848}," is wrong, expired, or not exported in this shell. Re-export and re-test.",{"type":59,"tag":372,"props":1850,"children":1851},{},[1852,1858,1859,1865,1867,1872],{"type":59,"tag":84,"props":1853,"children":1855},{"className":1854},[],[1856],{"type":65,"value":1857},"404",{"type":65,"value":1833},{"type":59,"tag":84,"props":1860,"children":1862},{"className":1861},[],[1863],{"type":65,"value":1864},"INVALID_ARGUMENT: function not found",{"type":65,"value":1866}," → the function ID is stale. Look up the current ID at ",{"type":59,"tag":626,"props":1868,"children":1870},{"href":628,"rel":1869},[630],[1871],{"type":65,"value":628},{"type":65,"value":1873}," and update the constant above.",{"type":59,"tag":372,"props":1875,"children":1876},{},[1877,1883],{"type":59,"tag":84,"props":1878,"children":1880},{"className":1879},[],[1881],{"type":65,"value":1882},"RESOURCE_EXHAUSTED",{"type":65,"value":1884}," → NVCF rate limit. Retry after 30 seconds; this is normal under load.",{"type":59,"tag":372,"props":1886,"children":1887},{},[1888,1890,1896],{"type":65,"value":1889},"Network\u002FTLS errors → corporate proxy or DNS issue. Test ",{"type":59,"tag":84,"props":1891,"children":1893},{"className":1892},[],[1894],{"type":65,"value":1895},"curl https:\u002F\u002Fbuild.nvidia.com",{"type":65,"value":1897}," first.",{"type":59,"tag":875,"props":1899,"children":1901},{"id":1900},"_1d-optional-verify-merriam-webster-lookup",[1902],{"type":65,"value":1903},"1d. (Optional) Verify Merriam-Webster lookup",{"type":59,"tag":72,"props":1905,"children":1906},{},[1907,1909,1915],{"type":65,"value":1908},"Two paths produce a ",{"type":59,"tag":84,"props":1910,"children":1912},{"className":1911},[],[1913],{"type":65,"value":1914},"merriam-webster",{"type":65,"value":1916},"-tagged manifest row in Stage 2. Pick one (or neither — Magpie G2P fall-through is a valid posture):",{"type":59,"tag":368,"props":1918,"children":1919},{},[1920,2034],{"type":59,"tag":372,"props":1921,"children":1922},{},[1923,1928,1930,2022,2026,2028,2033],{"type":59,"tag":76,"props":1924,"children":1925},{},[1926],{"type":65,"value":1927},"Path A — JSON API + key.",{"type":65,"value":1929}," Recommended for standalone use of this skill. Check the key is set:",{"type":59,"tag":889,"props":1931,"children":1933},{"className":891,"code":1932,"language":893,"meta":894,"style":894},"test -n \"$DICTIONARY_API_KEY\" && echo \"DICTIONARY_API_KEY len=${#DICTIONARY_API_KEY}\" \\\n  || echo \"DICTIONARY_API_KEY not set — Path A is off\"\n",[1934],{"type":59,"tag":84,"props":1935,"children":1936},{"__ignoreMap":894},[1937,1996],{"type":59,"tag":900,"props":1938,"children":1939},{"class":902,"line":53},[1940,1944,1948,1952,1957,1961,1965,1969,1973,1978,1982,1986,1991],{"type":59,"tag":900,"props":1941,"children":1942},{"style":967},[1943],{"type":65,"value":970},{"type":59,"tag":900,"props":1945,"children":1946},{"style":973},[1947],{"type":65,"value":976},{"type":59,"tag":900,"props":1949,"children":1950},{"style":928},[1951],{"type":65,"value":981},{"type":59,"tag":900,"props":1953,"children":1954},{"style":922},[1955],{"type":65,"value":1956},"$DICTIONARY_API_KEY",{"type":59,"tag":900,"props":1958,"children":1959},{"style":928},[1960],{"type":65,"value":991},{"type":59,"tag":900,"props":1962,"children":1963},{"style":928},[1964],{"type":65,"value":996},{"type":59,"tag":900,"props":1966,"children":1967},{"style":967},[1968],{"type":65,"value":1001},{"type":59,"tag":900,"props":1970,"children":1971},{"style":928},[1972],{"type":65,"value":981},{"type":59,"tag":900,"props":1974,"children":1975},{"style":973},[1976],{"type":65,"value":1977},"DICTIONARY_API_KEY len=",{"type":59,"tag":900,"props":1979,"children":1980},{"style":928},[1981],{"type":65,"value":1015},{"type":59,"tag":900,"props":1983,"children":1984},{"style":922},[1985],{"type":65,"value":387},{"type":59,"tag":900,"props":1987,"children":1988},{"style":928},[1989],{"type":65,"value":1990},"}\"",{"type":59,"tag":900,"props":1992,"children":1993},{"style":922},[1994],{"type":65,"value":1995}," \\\n",{"type":59,"tag":900,"props":1997,"children":1998},{"class":902,"line":912},[1999,2004,2008,2012,2017],{"type":59,"tag":900,"props":2000,"children":2001},{"style":928},[2002],{"type":65,"value":2003},"  ||",{"type":59,"tag":900,"props":2005,"children":2006},{"style":967},[2007],{"type":65,"value":1001},{"type":59,"tag":900,"props":2009,"children":2010},{"style":928},[2011],{"type":65,"value":981},{"type":59,"tag":900,"props":2013,"children":2014},{"style":973},[2015],{"type":65,"value":2016},"DICTIONARY_API_KEY not set — Path A is off",{"type":59,"tag":900,"props":2018,"children":2019},{"style":928},[2020],{"type":65,"value":2021},"\"\n",{"type":59,"tag":2023,"props":2024,"children":2025},"br",{},[],{"type":65,"value":2027},"Free key issues instantly at ",{"type":59,"tag":626,"props":2029,"children":2031},{"href":754,"rel":2030},[630],[2032],{"type":65,"value":754},{"type":65,"value":135},{"type":59,"tag":372,"props":2035,"children":2036},{},[2037,2042,2044,2050,2051,2111,2114],{"type":59,"tag":76,"props":2038,"children":2039},{},[2040],{"type":65,"value":2041},"Path B — HTML scraping.",{"type":65,"value":2043}," No API key needed; reachability is the only prerequisite. Brittle to MW site HTML changes; recipe inlined in the build skill's ",{"type":59,"tag":84,"props":2045,"children":2047},{"className":2046},[],[2048],{"type":65,"value":2049},"references\u002Fpronunciation-pipeline.md",{"type":65,"value":135},{"type":59,"tag":889,"props":2052,"children":2054},{"className":891,"code":2053,"language":893,"meta":894,"style":894},"curl -fsS -o \u002Fdev\u002Fnull -w \"merriam-webster.com reachable, HTTP %{http_code}\\n\" \\\n  https:\u002F\u002Fwww.merriam-webster.com\u002Fmedical\u002Fcefazolin\n",[2055],{"type":59,"tag":84,"props":2056,"children":2057},{"__ignoreMap":894},[2058,2103],{"type":59,"tag":900,"props":2059,"children":2060},{"class":902,"line":53},[2061,2066,2071,2076,2081,2086,2090,2095,2099],{"type":59,"tag":900,"props":2062,"children":2063},{"style":1098},[2064],{"type":65,"value":2065},"curl",{"type":59,"tag":900,"props":2067,"children":2068},{"style":973},[2069],{"type":65,"value":2070}," -fsS",{"type":59,"tag":900,"props":2072,"children":2073},{"style":973},[2074],{"type":65,"value":2075}," -o",{"type":59,"tag":900,"props":2077,"children":2078},{"style":973},[2079],{"type":65,"value":2080}," \u002Fdev\u002Fnull",{"type":59,"tag":900,"props":2082,"children":2083},{"style":973},[2084],{"type":65,"value":2085}," -w",{"type":59,"tag":900,"props":2087,"children":2088},{"style":928},[2089],{"type":65,"value":981},{"type":59,"tag":900,"props":2091,"children":2092},{"style":973},[2093],{"type":65,"value":2094},"merriam-webster.com reachable, HTTP %{http_code}\\n",{"type":59,"tag":900,"props":2096,"children":2097},{"style":928},[2098],{"type":65,"value":991},{"type":59,"tag":900,"props":2100,"children":2101},{"style":922},[2102],{"type":65,"value":1995},{"type":59,"tag":900,"props":2104,"children":2105},{"class":902,"line":912},[2106],{"type":59,"tag":900,"props":2107,"children":2108},{"style":973},[2109],{"type":65,"value":2110},"  https:\u002F\u002Fwww.merriam-webster.com\u002Fmedical\u002Fcefazolin\n",{"type":59,"tag":2023,"props":2112,"children":2113},{},[],{"type":65,"value":2115},"If you don't want to maintain a scraper, use Path A instead.",{"type":59,"tag":72,"props":2117,"children":2118},{},[2119],{"type":65,"value":2120},"Remember the data-disclosure note at the top: under either path, each clinical term in your seed list goes out as an HTTP request to a Merriam-Webster endpoint.",{"type":59,"tag":208,"props":2122,"children":2124},{"id":2123},"examples",[2125],{"type":65,"value":2126},"Examples",{"type":59,"tag":72,"props":2128,"children":2129},{},[2130,2135,2137,2142,2144,2149],{"type":59,"tag":76,"props":2131,"children":2132},{},[2133],{"type":65,"value":2134},"Fresh shell, never run before.",{"type":65,"value":2136}," User says something like ",{"type":59,"tag":177,"props":2138,"children":2139},{},[2140],{"type":65,"value":2141},"\"I want to start the flywheel.\"",{"type":65,"value":2143}," → Quote the disclosure table first, then walk through 1a → 1b → 1c in order. On a green smoke test, point them at ",{"type":59,"tag":84,"props":2145,"children":2147},{"className":2146},[],[2148],{"type":65,"value":133},{"type":65,"value":2150}," and explicitly name KER as the metric Stage 3 will judge them by.",{"type":59,"tag":72,"props":2152,"children":2153},{},[2154,2159,2161,2166,2168,2174],{"type":59,"tag":76,"props":2155,"children":2156},{},[2157],{"type":65,"value":2158},"Returning user, env already up.",{"type":65,"value":2160}," User says ",{"type":59,"tag":177,"props":2162,"children":2163},{},[2164],{"type":65,"value":2165},"\"I already have the env, just confirm I'm good to go.\"",{"type":65,"value":2167}," → Skip the venv + ",{"type":59,"tag":84,"props":2169,"children":2171},{"className":2170},[],[2172],{"type":65,"value":2173},"pip install",{"type":65,"value":2175}," (1b). Run only the length check (1a) and the smoke test (1c). On green, advance.",{"type":59,"tag":208,"props":2177,"children":2179},{"id":2178},"artifacts-produced",[2180],{"type":65,"value":2181},"Artifacts produced",{"type":59,"tag":368,"props":2183,"children":2184},{},[2185,2195,2223],{"type":59,"tag":372,"props":2186,"children":2187},{},[2188,2193],{"type":59,"tag":84,"props":2189,"children":2191},{"className":2190},[],[2192],{"type":65,"value":125},{"type":65,"value":2194}," exported in the user's shell",{"type":59,"tag":372,"props":2196,"children":2197},{},[2198,2200,2205,2206,2211,2212,2217,2218],{"type":65,"value":2199},"An activated virtualenv with ",{"type":59,"tag":84,"props":2201,"children":2203},{"className":2202},[],[2204],{"type":65,"value":683},{"type":65,"value":91},{"type":59,"tag":84,"props":2207,"children":2209},{"className":2208},[],[2210],{"type":65,"value":690},{"type":65,"value":91},{"type":59,"tag":84,"props":2213,"children":2215},{"className":2214},[],[2216],{"type":65,"value":697},{"type":65,"value":91},{"type":59,"tag":84,"props":2219,"children":2221},{"className":2220},[],[2222],{"type":65,"value":704},{"type":59,"tag":372,"props":2224,"children":2225},{},[2226],{"type":65,"value":2227},"A confirmed TTS→ASR round-trip on a clinical sentence (proof the hosted stack works)",{"type":59,"tag":72,"props":2229,"children":2230},{},[2231],{"type":65,"value":2232},"No manifest, audio, or model artifact is produced at this stage — those come at Stages 2–4.",{"type":59,"tag":208,"props":2234,"children":2236},{"id":2235},"troubleshooting",[2237],{"type":65,"value":2238},"Troubleshooting",{"type":59,"tag":368,"props":2240,"children":2241},{},[2242,2271,2306,2327,2355,2401,2439],{"type":59,"tag":372,"props":2243,"children":2244},{},[2245,2255,2256,2261,2263,2269],{"type":59,"tag":76,"props":2246,"children":2247},{},[2248,2250],{"type":65,"value":2249},"Length check shows nothing or ",{"type":59,"tag":84,"props":2251,"children":2253},{"className":2252},[],[2254],{"type":65,"value":1035},{"type":65,"value":1841},{"type":59,"tag":84,"props":2257,"children":2259},{"className":2258},[],[2260],{"type":65,"value":125},{"type":65,"value":2262}," isn't exported in this shell. Run ",{"type":59,"tag":84,"props":2264,"children":2266},{"className":2265},[],[2267],{"type":65,"value":2268},"export NVIDIA_API_KEY=nvapi-...",{"type":65,"value":2270}," and re-check.",{"type":59,"tag":372,"props":2272,"children":2273},{},[2274,2279,2281,2286,2287,2292,2293,2298,2300,2305],{"type":59,"tag":76,"props":2275,"children":2276},{},[2277],{"type":65,"value":2278},"Variable is set in one shell but not another",{"type":65,"value":2280}," → exports don't persist across sessions. Add the ",{"type":59,"tag":84,"props":2282,"children":2284},{"className":2283},[],[2285],{"type":65,"value":919},{"type":65,"value":1057},{"type":59,"tag":84,"props":2288,"children":2290},{"className":2289},[],[2291],{"type":65,"value":1063},{"type":65,"value":91},{"type":59,"tag":84,"props":2294,"children":2296},{"className":2295},[],[2297],{"type":65,"value":1070},{"type":65,"value":2299},"), or use a per-directory loader like ",{"type":59,"tag":84,"props":2301,"children":2303},{"className":2302},[],[2304],{"type":65,"value":1078},{"type":65,"value":135},{"type":59,"tag":372,"props":2307,"children":2308},{},[2309,2319,2321,2326],{"type":59,"tag":76,"props":2310,"children":2311},{},[2312,2317],{"type":59,"tag":84,"props":2313,"children":2315},{"className":2314},[],[2316],{"type":65,"value":1831},{"type":65,"value":2318}," on the smoke test",{"type":65,"value":2320}," → key value is wrong or expired. Re-issue at ",{"type":59,"tag":626,"props":2322,"children":2324},{"href":628,"rel":2323},[630],[2325],{"type":65,"value":628},{"type":65,"value":135},{"type":59,"tag":372,"props":2328,"children":2329},{},[2330,2339,2341,2346,2348,2353],{"type":59,"tag":76,"props":2331,"children":2332},{},[2333],{"type":59,"tag":84,"props":2334,"children":2336},{"className":2335},[],[2337],{"type":65,"value":2338},"grpc.RpcError: function not found",{"type":65,"value":2340}," → the inlined function IDs need updating against the current NVCF catalog. Check ",{"type":59,"tag":626,"props":2342,"children":2344},{"href":628,"rel":2343},[630],[2345],{"type":65,"value":628},{"type":65,"value":2347}," and edit the constants in 1c. The eval skill (",{"type":59,"tag":84,"props":2349,"children":2351},{"className":2350},[],[2352],{"type":65,"value":528},{"type":65,"value":2354},") provides a catalog of current function IDs in its Step 3a \"Other catalog options\" list.",{"type":59,"tag":372,"props":2356,"children":2357},{},[2358,2375,2377,2383,2385,2391,2393,2399],{"type":59,"tag":76,"props":2359,"children":2360},{},[2361,2367,2369],{"type":59,"tag":84,"props":2362,"children":2364},{"className":2363},[],[2365],{"type":65,"value":2366},"StatusCode.INVALID_ARGUMENT",{"type":65,"value":2368}," with ",{"type":59,"tag":84,"props":2370,"children":2372},{"className":2371},[],[2373],{"type":65,"value":2374},"CUDA error: an illegal memory access was encountered",{"type":65,"value":2376}," → NVCF-side backend fault on this specific function ID (Triton\u002FPyTorch on NVCF, not your env). Either retry later or temporarily point at a different offline ASR NIM — Whisper Large v3 function-id ",{"type":59,"tag":84,"props":2378,"children":2380},{"className":2379},[],[2381],{"type":65,"value":2382},"b702f636-f60c-4a3d-a6f4-f3568c13bd7d",{"type":65,"value":2384}," is the closest drop-in (also offline; pass ",{"type":59,"tag":84,"props":2386,"children":2388},{"className":2387},[],[2389],{"type":65,"value":2390},"language_code=\"en\"",{"type":65,"value":2392}," instead of ",{"type":59,"tag":84,"props":2394,"children":2396},{"className":2395},[],[2397],{"type":65,"value":2398},"\"en-US\"",{"type":65,"value":2400},"). For routine eval cycles, prefer to wait for the Parakeet backend to recover so Stage 3 baseline and Stage 4 SFT base stay aligned.",{"type":59,"tag":372,"props":2402,"children":2403},{},[2404,2413,2415,2421,2423,2429,2431,2437],{"type":59,"tag":76,"props":2405,"children":2406},{},[2407],{"type":59,"tag":84,"props":2408,"children":2410},{"className":2409},[],[2411],{"type":65,"value":2412},"TypeError: Auth.__init__() got an unexpected keyword argument 'ssl_cert'",{"type":65,"value":2414}," → you're on ",{"type":59,"tag":84,"props":2416,"children":2418},{"className":2417},[],[2419],{"type":65,"value":2420},"nvidia-riva-client >= 2.x",{"type":65,"value":2422}," where the kwarg was renamed to ",{"type":59,"tag":84,"props":2424,"children":2426},{"className":2425},[],[2427],{"type":65,"value":2428},"ssl_root_cert",{"type":65,"value":2430}," (and is no longer needed for hosted NVCF). Drop the ",{"type":59,"tag":84,"props":2432,"children":2434},{"className":2433},[],[2435],{"type":65,"value":2436},"ssl_cert=None,",{"type":65,"value":2438}," line from your local copy of the recipe.",{"type":59,"tag":372,"props":2440,"children":2441},{},[2442,2451,2453,2459],{"type":59,"tag":76,"props":2443,"children":2444},{},[2445],{"type":59,"tag":84,"props":2446,"children":2448},{"className":2447},[],[2449],{"type":65,"value":2450},"ModuleNotFoundError: riva.client",{"type":65,"value":2452}," → step 1b was skipped or the venv isn't activated. ",{"type":59,"tag":84,"props":2454,"children":2456},{"className":2455},[],[2457],{"type":65,"value":2458},"source .venv\u002Fbin\u002Factivate && pip install nvidia-riva-client",{"type":65,"value":135},{"type":59,"tag":208,"props":2461,"children":2463},{"id":2462},"limitations",[2464],{"type":65,"value":2465},"Limitations",{"type":59,"tag":368,"props":2467,"children":2468},{},[2469,2486,2496,2513],{"type":59,"tag":372,"props":2470,"children":2471},{},[2472,2477,2479,2484],{"type":59,"tag":76,"props":2473,"children":2474},{},[2475],{"type":65,"value":2476},"Scope is environment readiness only.",{"type":65,"value":2478}," Whether the user's term list or pronunciation overrides make sense is decided in ",{"type":59,"tag":84,"props":2480,"children":2482},{"className":2481},[],[2483],{"type":65,"value":133},{"type":65,"value":2485},", not here.",{"type":59,"tag":372,"props":2487,"children":2488},{},[2489,2494],{"type":59,"tag":76,"props":2490,"children":2491},{},[2492],{"type":65,"value":2493},"Magpie en-US assumption.",{"type":65,"value":2495}," Downstream IPA validation rides on Magpie's English phoneme inventory; other locales require a different phoneme set entirely.",{"type":59,"tag":372,"props":2497,"children":2498},{},[2499,2504,2506,2511],{"type":59,"tag":76,"props":2500,"children":2501},{},[2502],{"type":65,"value":2503},"Hosted NVCF is the assumed deployment.",{"type":65,"value":2505}," Running self-hosted Riva NIMs is possible but the setup for that lives inside ",{"type":59,"tag":84,"props":2507,"children":2509},{"className":2508},[],[2510],{"type":65,"value":549},{"type":65,"value":2512}," Stage 4d.",{"type":59,"tag":372,"props":2514,"children":2515},{},[2516,2521],{"type":59,"tag":76,"props":2517,"children":2518},{},[2519],{"type":65,"value":2520},"Synthetic data only.",{"type":65,"value":2522}," This skill family is built for benchmarks generated from a curated term list. Real patient transcripts and recorded audio must not flow through any stage.",{"type":59,"tag":208,"props":2524,"children":2526},{"id":2525},"next-steps",[2527],{"type":65,"value":2528},"Next steps",{"type":59,"tag":72,"props":2530,"children":2531},{},[2532,2537,2539,2549,2551,2556],{"type":59,"tag":76,"props":2533,"children":2534},{},[2535],{"type":65,"value":2536},"Mandatory close on success:",{"type":65,"value":2538}," finish the Stage 1 response by ",{"type":59,"tag":76,"props":2540,"children":2541},{},[2542,2544],{"type":65,"value":2543},"pointing the user explicitly to ",{"type":59,"tag":84,"props":2545,"children":2547},{"className":2546},[],[2548],{"type":65,"value":133},{"type":65,"value":2550}," and ",{"type":59,"tag":76,"props":2552,"children":2553},{},[2554],{"type":65,"value":2555},"naming KER (keyword error rate) as the headline measure",{"type":65,"value":2557}," they'll see at Stage 3. Both pointers are required, not optional — they place the user inside the four-stage flywheel.",{"type":59,"tag":368,"props":2559,"children":2560},{},[2561,2577],{"type":59,"tag":372,"props":2562,"children":2563},{},[2564,2569,2570,2575],{"type":59,"tag":76,"props":2565,"children":2566},{},[2567],{"type":65,"value":2568},"Default forward route:",{"type":65,"value":1284},{"type":59,"tag":84,"props":2571,"children":2573},{"className":2572},[],[2574],{"type":65,"value":133},{"type":65,"value":2576}," — specialty interview, term curation, IPA tagging, NeMo manifest synthesis.",{"type":59,"tag":372,"props":2578,"children":2579},{},[2580,2585,2587,2593,2594,2600,2601,2607,2609,2614],{"type":59,"tag":76,"props":2581,"children":2582},{},[2583],{"type":65,"value":2584},"Direct jump to Stage 3",{"type":65,"value":2586}," (only when the user is bringing their own NeMo-format manifest with ",{"type":59,"tag":84,"props":2588,"children":2590},{"className":2589},[],[2591],{"type":65,"value":2592},"term",{"type":65,"value":1833},{"type":59,"tag":84,"props":2595,"children":2597},{"className":2596},[],[2598],{"type":65,"value":2599},"entity_category",{"type":65,"value":1833},{"type":59,"tag":84,"props":2602,"children":2604},{"className":2603},[],[2605],{"type":65,"value":2606},"ipa_source",{"type":65,"value":2608}," fields): ",{"type":59,"tag":84,"props":2610,"children":2612},{"className":2611},[],[2613],{"type":65,"value":528},{"type":65,"value":135},{"type":59,"tag":208,"props":2616,"children":2618},{"id":2617},"references",[2619],{"type":65,"value":2620},"References",{"type":59,"tag":368,"props":2622,"children":2623},{},[2624],{"type":59,"tag":372,"props":2625,"children":2626},{},[2627,2636],{"type":59,"tag":626,"props":2628,"children":2630},{"href":2629},"references\u002Fdependency-ownership.md",[2631],{"type":59,"tag":84,"props":2632,"children":2634},{"className":2633},[],[2635],{"type":65,"value":2629},{"type":65,"value":2637}," — boundary between skill-owned and companion-owned responsibilities.",{"type":59,"tag":2639,"props":2640,"children":2641},"style",{},[2642],{"type":65,"value":2643},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2645,"total":2803},[2646,2664,2681,2692,2704,2718,2731,2745,2758,2769,2783,2792],{"slug":2647,"name":2647,"fn":2648,"description":2649,"org":2650,"tags":2651,"stars":2661,"repoUrl":2662,"updatedAt":2663},"nemoclaw-user-guide","retrieve NemoClaw documentation and configuration","Guides human users' AI agents to the NemoClaw docs MCP server and canonical Fern documentation in Markdown form. Use when users ask how to install, configure, operate, troubleshoot, secure, or learn NemoClaw with an AI coding assistant. Trigger keywords - nemoclaw docs, use nemoclaw with ai agent, nemoclaw mcp docs, nemoclaw install help, nemoclaw quickstart, nemoclaw markdown docs, llms.txt, agent skills.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2652,2655,2658],{"name":2653,"slug":2654,"type":15},"Documentation","documentation",{"name":2656,"slug":2657,"type":15},"MCP","mcp",{"name":2659,"slug":2660,"type":15},"Search","search",21777,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FNemoClaw","2026-07-20T06:00:01.461044",{"slug":2665,"name":2665,"fn":2666,"description":2667,"org":2668,"tags":2669,"stars":2678,"repoUrl":2679,"updatedAt":2680},"mcore-build-and-dependency","manage Megatron-LM development environments","Container-based dev environment setup and dependency management for Megatron-LM. Covers acquiring and launching the CI container, uv package management, and updating uv.lock.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2670,2673,2676],{"name":2671,"slug":2672,"type":15},"Containers","containers",{"name":2674,"slug":2675,"type":15},"Deployment","deployment",{"name":2677,"slug":1364,"type":15},"Python",17049,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FMegatron-LM","2026-07-27T06:06:11.249662",{"slug":2682,"name":2682,"fn":2683,"description":2684,"org":2685,"tags":2686,"stars":2678,"repoUrl":2679,"updatedAt":2691},"mcore-bump-base-image","update NVIDIA PyTorch base images","Bump the NVIDIA PyTorch base image (`nvcr.io\u002Fnvidia\u002Fpytorch:YY.MM-py3`) used by Megatron-LM CI. Covers the two pin sites (GitHub CI in `docker\u002F.ngc_version.dev` and GitLab CI in `.gitlab\u002Fstages\u002F01.build.yml`), the post-bump CI loop (re-run functional tests, refresh golden values, mark broken tests), and the gotchas that bit PRs",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2687,2690],{"name":2688,"slug":2689,"type":15},"CI\u002FCD","ci-cd",{"name":2674,"slug":2675,"type":15},"2026-07-14T05:25:59.97109",{"slug":2693,"name":2693,"fn":2694,"description":2695,"org":2696,"tags":2697,"stars":2678,"repoUrl":2679,"updatedAt":2703},"mcore-cicd","manage CI\u002FCD pipelines for Megatron-LM","CI\u002FCD reference for Megatron-LM. Covers CI pipeline structure, PR scope labels, triggering internal GitLab CI (which force-pushes the current branch to a pull-request\u002FBRANCH ref — always dry-run and verify the destination first; never run against shared or protected branches), and CI failure investigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2698,2699,2700],{"name":2688,"slug":2689,"type":15},{"name":2674,"slug":2675,"type":15},{"name":2701,"slug":2702,"type":15},"GitHub","github","2026-07-27T06:06:12.278222",{"slug":2705,"name":2705,"fn":2706,"description":2707,"org":2708,"tags":2709,"stars":2678,"repoUrl":2679,"updatedAt":2717},"mcore-create-issue","investigate CI failures and create issues","Investigate a failing GitHub Actions run or job and create a GitHub issue for the failure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2710,2713,2714],{"name":2711,"slug":2712,"type":15},"Debugging","debugging",{"name":2701,"slug":2702,"type":15},{"name":2715,"slug":2716,"type":15},"Triage","triage","2026-07-14T05:25:57.442089",{"slug":2719,"name":2719,"fn":2720,"description":2721,"org":2722,"tags":2723,"stars":2678,"repoUrl":2679,"updatedAt":2730},"mcore-linting-and-formatting","lint and format Megatron-LM code","Linting and formatting for Megatron-LM. Covers running autoformat.sh, tools (ruff, black, isort, pylint, mypy), and code style rules.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2724,2727],{"name":2725,"slug":2726,"type":15},"Best Practices","best-practices",{"name":2728,"slug":2729,"type":15},"Code Analysis","code-analysis","2026-07-14T05:25:56.18433",{"slug":2732,"name":2732,"fn":2733,"description":2734,"org":2735,"tags":2736,"stars":2678,"repoUrl":2679,"updatedAt":2744},"mcore-migrate-gpt-to-hybrid","migrate Megatron-LM models to HybridModel","Migration guide for moving Megatron Core GPTModel checkpoints, model providers, training commands, and layer mappings to HybridModel.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2737,2740,2743],{"name":2738,"slug":2739,"type":15},"Machine Learning","machine-learning",{"name":2741,"slug":2742,"type":15},"Migration","migration",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:11.777011",{"slug":2746,"name":2746,"fn":2747,"description":2748,"org":2749,"tags":2750,"stars":2678,"repoUrl":2679,"updatedAt":2757},"mcore-onboard-gb200-1node-tests","onboard functional tests for GB200","Onboard 1-node GitHub MR functional tests for GB200 from existing mr-scoped 2-node tests.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2751,2754],{"name":2752,"slug":2753,"type":15},"QA","qa",{"name":2755,"slug":2756,"type":15},"Testing","testing","2026-07-14T05:25:53.673039",{"slug":2759,"name":2759,"fn":2760,"description":2761,"org":2762,"tags":2763,"stars":2678,"repoUrl":2679,"updatedAt":2768},"mcore-run-on-slurm","launch distributed training jobs on SLURM","How to launch distributed Megatron-LM training jobs on a SLURM cluster. Covers a minimal sbatch skeleton, environment-variable setup for torch.distributed.run, CUDA_DEVICE_MAX_CONNECTIONS rules across hardware and parallelism modes, container conventions, monitoring, and per-rank failure diagnosis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2764,2765],{"name":2674,"slug":2675,"type":15},{"name":2766,"slug":2767,"type":15},"Infrastructure","infrastructure","2026-07-14T05:25:49.362534",{"slug":2770,"name":2770,"fn":2771,"description":2772,"org":2773,"tags":2774,"stars":2678,"repoUrl":2679,"updatedAt":2782},"mcore-split-pr","split pull requests to reduce review load","Split a PR into multiple PRs to reduce the number of required CODEOWNERS reviewer groups.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2775,2778,2779],{"name":2776,"slug":2777,"type":15},"Code Review","code-review",{"name":2701,"slug":2702,"type":15},{"name":2780,"slug":2781,"type":15},"Pull Requests","pull-requests","2026-07-14T05:26:01.226578",{"slug":2784,"name":2784,"fn":2785,"description":2786,"org":2787,"tags":2788,"stars":2678,"repoUrl":2679,"updatedAt":2791},"mcore-testing","run and manage Megatron-LM tests","Test system for Megatron-LM. Covers test layout, recipe YAML structure, adding and running unit and functional tests, golden values, marker filters, and CI parity.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2789,2790],{"name":2752,"slug":2753,"type":15},{"name":2755,"slug":2756,"type":15},"2026-07-14T05:25:54.928983",{"slug":2793,"name":2793,"fn":2794,"description":2795,"org":2796,"tags":2797,"stars":2678,"repoUrl":2679,"updatedAt":2802},"nightly-sync","manage nightly main-to-dev sync workflows","Domain knowledge for the nightly main-to-dev sync workflow. Covers merge strategy, CI architecture, failure investigation, and known issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2798,2801],{"name":2799,"slug":2800,"type":15},"Automation","automation",{"name":2688,"slug":2689,"type":15},"2026-07-30T05:29:03.275638",496,{"items":2805,"total":2901},[2806,2823,2833,2847,2857,2872,2887],{"slug":2807,"name":2807,"fn":2808,"description":2809,"org":2810,"tags":2811,"stars":23,"repoUrl":24,"updatedAt":2822},"accelerated-computing-cudf","accelerate data processing with cuDF","Official NVIDIA-authored guidance for NVIDIA cuDF GPU DataFrames, pandas acceleration, dask-cuDF, ETL, joins, groupby, CSV\u002FParquet I\u002FO, nullable semantics, and multi-GPU DataFrame workloads.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2812,2815,2818,2819],{"name":2813,"slug":2814,"type":15},"Data Analysis","data-analysis",{"name":2816,"slug":2817,"type":15},"Data Engineering","data-engineering",{"name":9,"slug":8,"type":15},{"name":2820,"slug":2821,"type":15},"Performance","performance","2026-07-14T05:28:43.176466",{"slug":2824,"name":2824,"fn":2825,"description":2826,"org":2827,"tags":2828,"stars":23,"repoUrl":24,"updatedAt":2832},"aiq-deploy","deploy and manage NVIDIA AI-Q infrastructure","Use when asked to install, deploy, run, validate, troubleshoot, or stop NVIDIA AI-Q Blueprint infrastructure.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2829,2830,2831],{"name":2674,"slug":2675,"type":15},{"name":2766,"slug":2767,"type":15},{"name":9,"slug":8,"type":15},"2026-07-14T05:29:06.667109",{"slug":2834,"name":2834,"fn":2835,"description":2836,"org":2837,"tags":2838,"stars":23,"repoUrl":24,"updatedAt":2846},"aiq-research","conduct deep research with AI-Q","Use when asked to run deep research or AI-Q research through a reachable NVIDIA AI-Q Blueprint backend.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2839,2842,2843],{"name":2840,"slug":2841,"type":15},"Agents","agents",{"name":9,"slug":8,"type":15},{"name":2844,"slug":2845,"type":15},"Research","research","2026-07-14T05:28:06.816956",{"slug":2848,"name":2848,"fn":2849,"description":2850,"org":2851,"tags":2852,"stars":23,"repoUrl":24,"updatedAt":2856},"amc-run-sample-calibration","run AMC sample dataset calibration","Run end-to-end calibration on the shipped sample dataset (sdg_08_2_sample_data_010926.zip) against a running AMC microservice. Use when user says 'test sample dataset', 'run sample calibration', 'verify AMC install', or 'launch and test'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2853,2854,2855],{"name":2813,"slug":2814,"type":15},{"name":9,"slug":8,"type":15},{"name":2755,"slug":2756,"type":15},"2026-07-17T05:29:03.913266",{"slug":2858,"name":2858,"fn":2859,"description":2860,"org":2861,"tags":2862,"stars":23,"repoUrl":24,"updatedAt":2871},"amc-run-video-calibration","calibrate video datasets with AutoMagicCalib","Calibrate a new dataset from pre-recorded video files via the AutoMagicCalib REST API. Use when user has local MP4s and says 'calibrate my videos', 'run AMC on these videos', or similar. For RTSP\u002Flive streams, use amc-run-rtsp-calibration instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2863,2864,2867,2868],{"name":2799,"slug":2800,"type":15},{"name":2865,"slug":2866,"type":15},"Imaging","imaging",{"name":9,"slug":8,"type":15},{"name":2869,"slug":2870,"type":15},"Video","video","2026-07-17T05:28:53.905004",{"slug":2873,"name":2873,"fn":2874,"description":2875,"org":2876,"tags":2877,"stars":23,"repoUrl":24,"updatedAt":2886},"amc-setup-calibration-stack","deploy AutoMagicCalib microservice with Docker","Launch AutoMagicCalib microservice and web UI from NGC release images via Docker Compose. Use when user says 'deploy auto calibration', 'launch auto calibration', 'launch AMC', 'start MS+UI', or 'set up auto-magic-calib'. Requires NGC API key.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2878,2879,2882,2883],{"name":2674,"slug":2675,"type":15},{"name":2880,"slug":2881,"type":15},"Docker","docker",{"name":9,"slug":8,"type":15},{"name":2884,"slug":2885,"type":15},"Operations","operations","2026-07-17T05:28:56.913999",{"slug":2888,"name":2888,"fn":2889,"description":2890,"org":2891,"tags":2892,"stars":23,"repoUrl":24,"updatedAt":2900},"cudaq-guide","develop quantum applications with CUDA-Q","CUDA-Q onboarding guide for installation, test programs, GPU simulation, QPU hardware, and quantum applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2893,2894,2897],{"name":9,"slug":8,"type":15},{"name":2895,"slug":2896,"type":15},"Quantum Computing","quantum-computing",{"name":2898,"slug":2899,"type":15},"Simulation","simulation","2026-07-14T05:26:58.898253",305]