sound-broken / OPENCODE_PROMPT.md
mitvho09's picture
Upload Space app
edb671a verified
|
Raw
History Blame Contribute Delete
5.44 kB

A newer version of the Gradio SDK is available: 6.20.0

Upgrade

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.py must 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 use nvidia/Nemotron-3-Nano-4B-Instruct β€” it 404s.
  • Architecture: Modal-only compute. The HF Space (app.py) is a THIN Gradio client that depends on only gradio + modal. ALL heavy work (librosa feature extraction + rule ranking + the 4B model) runs inside the Modal container defined in modal_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, use tokenizer.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:

  1. pip install -r requirements.txt.
  2. python assets/generate_samples.py to create the 4 test WAVs.
  3. 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. Fix audio_analyzer.py / fault_rules.py if any fail.
  4. SOUNDBROKEN_MOCK=1 python app.py and 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.
  5. Review the CSS renders the industrial amber-on-charcoal theme; tighten if the verdict card or urgency colors look off. Verify mobile (single column).
  6. If a GPU is available, unset MOCK and confirm a real diagnosis returns valid grounded JSON. If the model OOMs, switch MODEL_ID to the -FP8 variant.
  7. Verify README.md frontmatter (sdk gradio, hardware zero-gpu, correct model tag). Add real screenshots once the UI runs.
  8. Expand fault_rules.RULES to cover the remaining appliances in app.APPLIANCES (Tumble dryer, Refrigerator/Freezer, Air conditioner, Vacuum cleaner, Dishwasher, Microwave, Bicycle, Power drill). 2–4 rules each, same Rule(name, urgency, weight, when, evidence) shape, weights 0.6–0.9, evidence templates that reference real feature fields. Keep when lambdas defensive (no exceptions on edge values).

Definition of done: tests green; python app.py runs 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.