WitGym / README.md
akshay4's picture
Upload folder using huggingface_hub
8aa8075 verified
|
Raw
History Blame Contribute Delete
5.69 kB
---
title: WitGym
emoji: 🎭
colorFrom: green
colorTo: yellow
sdk: gradio
sdk_version: "6.17.3"
python_version: "3.12"
app_file: app.py
pinned: false
license: apache-2.0
short_description: Paste awkward. Get one sharp wit line + coach drills.
tags:
- build-small-hackathon
- track:wood
- thousand-token-wood
- comedy
- rag
- case-based-reasoning
- qwen
- achievement:offbrand
- achievement:sharing
- achievement:fieldnotes
- sponsor:openai
---
# 🎭 WitGym
**One sharp line, grounded in human precedent — then drills to sharpen it.**
WitGym is a comedy coaching engine for awkward real‑life moments. Paste what happened and it returns **one usable line** (not a paragraph), grounded in structurally similar precedent from *The Office* — then lets you iterate with drills: **sharpen it**, **different angle**, **explain why it works**.
**Live Space**: [build-small-hackathon/WitGym](https://huggingface.co/spaces/build-small-hackathon/WitGym)
### Why I built this (and why it’s not “just prompt it to be funny”)
Comedy has always been a personal interest — not just watching it, but reverse‑engineering why a line lands. Most “be funny” apps are vibes: you get a wall of text and no way to improve it.
WitGym treats wit like a skill you can train:
- **Extract the mechanism** (status games, tension, violation distance, subtext)
- **Retrieve precedent by structure** (not by topic keywords)
- **Draft a few constrained options**
- **Pick a winner with an explicit rubric**
- **Polish to one sharp line**
### Try it in 10 seconds
- Paste any awkward moment (or tap a starter chip in the sidebar).
- You’ll see the phases stream live: extract → retrieve → draft → rank → polish.
- Then iterate with drills: **sharpen it**, **different angle**, **explain why it works**.
### What makes it different
- **CBR‑RAG on comedy mechanics**: retrieval is driven by archetype, tension, violation distance, and subtext — not by copying jokes or matching keywords.
- **Small‑model friendly by design**: the intelligence is in the pipeline and the precedent index, not “bigger weights.”
- **Tournament ranking (not one-shot generation)**: the best line is selected by a fixed rubric (domain anchoring + final-clause punchline quality + sharpness).
- **Inspectable traces**: the UI shows what the system did (progressive disclosure), plus a sanitized public trace export.
### System overview (high-level)
```mermaid
flowchart TD
UserInput["User: paste awkward moment"] --> Router{"Route?"}
Router -->|banter| Banter["One-sentence banter reply"]
Router -->|coaching| CoachAsk["Ask one clarifying question"]
Router -->|quick_wit| Pipeline["CBR-RAG wit pipeline"]
CoachAsk --> Pipeline
Pipeline --> Extract["Pass 1: Extract ComedyMetadata via Qwen3.5-27B"]
Extract --> Retrieve["Retrieve top precedent scenes via bge-small"]
Retrieve --> Generate["Pass 2: Draft persona candidates"]
Generate --> Rank["Pass 3: Rank by explicit rubric"]
Rank --> Compress["Pass 4: Compress to one sharp line"]
Compress --> Output["Final line + sharpen or explain drills"]
```
### Algorithm sketch (pipeline-level)
```mermaid
sequenceDiagram
participant UI as Gradio UI
participant Engine as WitGym Engine
participant LLM as Qwen 3.5 27B
participant Embed as BGE Small
participant Index as Office Index
UI->>Engine: respond_stream
Engine->>LLM: extract ComedyMetadata
LLM-->>Engine: metadata JSON
Engine->>Embed: encode metadata query
Embed-->>Engine: query embedding
Engine->>Index: cosine search and rerank
Index-->>Engine: precedent scenes
Engine->>LLM: draft persona candidates
LLM-->>Engine: candidates
Engine->>LLM: rank candidates
LLM-->>Engine: winner
Engine->>LLM: compress winner
LLM-->>Engine: final line
Engine-->>UI: stream all phases
```
### Evidence / badges
- **Sharing is Caring** (`achievement:sharing`): [public pipeline traces](https://github.com/akshay-babbar/witgym/blob/main/data/public_traces.jsonl) — sanitized JSONL (metadata, scene IDs, candidate stats, execution log; no Office dialogue text). Regenerate with `uv run python scripts/export_public_traces.py`.
- **Field Notes** (`achievement:fieldnotes`): [docs/field-notes.md](docs/field-notes.md).
- **Off‑Brand UI** (`achievement:offbrand`): custom Gradio UI + streaming trace disclosure.
### Submission links
- **Source code**: [GitHub — https://github.com/akshay-babbar/witgym](https://github.com/akshay-babbar/witgym)
- **Demo video**: [YouTube — https://youtu.be/enb5ua65RZM](https://youtu.be/enb5ua65RZM)
- **Social post**: [LinkedIn — https://www.linkedin.com/posts/akshay4b_happy-to-share-a-project-ive-been-building-ugcPost-7472401282822111232-Q_nt/](https://www.linkedin.com/posts/akshay4b_happy-to-share-a-project-ive-been-building-ugcPost-7472401282822111232-Q_nt/)
- **Validate README**: [Build Small validator](https://build-small-hackathon-field-guide.hf.space/submit)
### Technical details (grounded in the repo)
- **Engine entrypoint**: `witgym/engine.py` (`respond()` + `respond_stream()`).
- **Pass 1 extraction**: `witgym/extractor.py``ComedyMetadata` (JSON).
- **Retrieval**: `witgym/retriever.py` (cosine over an indexed embedding matrix; optional cross-encoder rerank).
- **Pass 2 generation + ranking**: `witgym/generator.py` (persona candidates + rubric ranker).
- **UI**: `app.py` (Gradio; streaming phases + progressive disclosure).
### Run locally
```bash
uv sync
witgym-index
export LLM_BACKEND=hf_api
export HF_TOKEN=hf_...
uv run python app.py
```
Built for the [Build Small Hackathon 2026](https://huggingface.co/build-small-hackathon) — Thousand Token Wood.