A newer version of the Gradio SDK is available: 6.20.0
OpenCode Master Prompt β "Does It Sound Broken?"
Paste the block below into OpenCode (or Codex/Cursor) from inside the
sound-broken/ folder. The project is already scaffolded β your job is to
verify it, fill the remaining gaps, get it running, and deploy. A from-scratch
fallback is included at the end in case you start in an empty folder.
PROMPT TO PASTE
You are finishing a Hugging Face Gradio hackathon project in the current folder. The architecture is already implemented across these files:
app.py,audio_analyzer.py,fault_rules.py,feature_prompt.py,json_guard.py,requirements.txt,README.md,assets/custom.css,assets/generate_samples.py,tests/test_pipeline.py.Concept (do not change it): audio β deterministic librosa features (CPU) β transparent rule engine ranks candidate faults (CPU) β Nemotron-3-Nano-4B picks + explains the best-supported one (GPU) β validated JSON β UI. The model NEVER hears raw audio; it only reasons over measured features and rule-derived candidates. The rule layer is the floor β
json_guard.pymust snap any ungrounded model output back to the top deterministic candidate.Hard constraints (keep these):
- Model id:
nvidia/NVIDIA-Nemotron-3-Nano-4B-BF16(or-FP8). NEVER usenvidia/Nemotron-3-Nano-4B-Instructβ it 404s.- Architecture: Modal-only compute. The HF Space (
app.py) is a THIN Gradio client that depends on onlygradio+modal. ALL heavy work (librosa feature extraction + rule ranking + the 4B model) runs inside the Modal container defined inmodal_backend.py(@app.cls(gpu="A10G")with@modal.enter()to load the model and a@modal.method()pipeline). Do NOT put librosa/torch/transformers in the Space's requirements.txt or import them in app.py. Do NOT use HF ZeroGPU/spaces.GPU.- The Space looks the backend up with
modal.Cls.from_name("sound-broken", "Diagnoser")and calls.run.remote(audio_bytes, suffix, appliance), which returns a JSON-serializable dict{ok, error, features, candidates, result}.- Appliance type is a REQUIRED input. Greedy decoding (
do_sample=False),max_new_tokens=384, usetokenizer.apply_chat_template.- Robustness is non-negotiable: every handler returns a friendly result and never raises; all model-derived text is
html.escaped before rendering.Do these tasks in order, and report (don't guess) on any blocker:
pip install -r requirements.txt.python assets/generate_samples.pyto create the 4 test WAVs.python -m pytest tests/ -qβ all tests must pass. The bearing sample MUST trigger a bearing candidate; the good sample MUST stay calm; empty audio MUST NOT crash. Fixaudio_analyzer.py/fault_rules.pyif any fail.SOUNDBROKEN_MOCK=1 python app.pyand confirm the UI loads, both tabs work, Examples render an urgency banner + evidence panel, and Compare shows a before/after delta. Fix any Gradio wiring issues.- Review the CSS renders the industrial amber-on-charcoal theme; tighten if the verdict card or urgency colors look off. Verify mobile (single column).
- If a GPU is available, unset MOCK and confirm a real diagnosis returns valid grounded JSON. If the model OOMs, switch
MODEL_IDto the-FP8variant.- Verify
README.mdfrontmatter (sdk gradio, hardware zero-gpu, correct model tag). Add real screenshots once the UI runs.- Expand
fault_rules.RULESto cover the remaining appliances inapp.APPLIANCES(Tumble dryer, Refrigerator/Freezer, Air conditioner, Vacuum cleaner, Dishwasher, Microwave, Bicycle, Power drill). 2β4 rules each, sameRule(name, urgency, weight, when, evidence)shape, weights 0.6β0.9, evidence templates that reference real feature fields. Keepwhenlambdas defensive (no exceptions on edge values).Definition of done: tests green;
python app.pyruns end-to-end; all 4 examples produce grounded reproducible diagnoses with a visible evidence chain; Compare tab shows a numeric delta; no unhandled exception on empty/garbage audio; README renders on a Space. Work incrementally and run the tests after each change.Stretch (only if time remains): add
finetune/train.pyβ a LoRA fine-tune of the 4B model on ~200β300 (feature-description β known-fault) pairs derived from the MIMII dataset; document uploading the adapter to the Hub for the Well-Tuned badge. Do not let this block the core submission.
FROM-SCRATCH FALLBACK (only if the folder is empty)
If the scaffold is missing, build it module by module in this exact order, running
a quick check after each: (1) audio_analyzer.py with the AudioFeatures
dataclass + NaN-guarded extract_features; (2) fault_rules.py with Rule,
Candidate, RULES tables and rank_candidates (always returns β₯1 candidate);
(3) feature_prompt.py build_diagnosis_prompt(features, candidates, appliance)
demanding strict JSON; (4) json_guard.py validate() with rule fallback;
(5) app.py Gradio Blocks with @spaces.GPU, mock mode via SOUNDBROKEN_MOCK,
Diagnose + Compare tabs, evidence accordion; (6) assets/generate_samples.py,
assets/custom.css, tests/, requirements.txt, README.md with the
frontmatter above. Use the constraints listed in the main prompt verbatim.