sensor-humor comedy sidekick for LLMs.
Mood-based personality, session-aware callbacks, running gags, roasts, heckles, and catchphrases — with Piper TTS voice integration.
Set mood
mood.set(style: "roast")
Roast
roast(target: "800-line god function")
Speak
voice_speak(mood: "roast") // Piper TTS
Features
Comedy engineering, not joke vending.
6 Moods
Dry, roast, chaotic, cheeky, cynic, zoomer — each with distinct voice, pacing, and personality anchor.
Session Memory
Running gags, recent bits ring buffer, catchphrase persistence. Callbacks to turn-47 bits still land on turn-120.
Voice Prosody
Piper TTS with 4 knobs per mood: length_scale, noise_scale, noise_w_scale, volume. Deadpan sounds flat. Chaotic sounds like a news anchor delivering nonsense.
Deterministic + honest
JSON schema enforcement, a deterministic safety floor (homoglyph/leetspeak-normalized harsh + simile filters as a terminal gate on every tool), and a typed degraded signal a consuming agent can branch on — a real joke is never confused with a fallback. Comedy with guardrails.
9 Tools
mood.set/get, comic_timing, roast, heckle, catchphrase.generate/callback, debug_status, session_reset — all inherit active mood.
Prompt stability
v1 mood prompts are frozen; a form + safety regression scorecard (Wilson interval, three-valued PASS/FAIL/INCONCLUSIVE, SPRT) catches prompt drift before it ships. Versioned prompts load alongside v1. It measures conformance + safety, not "funniness".
Local-first
Ollama + qwen2.5:7b-instruct for comedy generation. Piper ONNX for voice. No cloud, no API keys, no latency.
Usage
Start Ollama
ollama run qwen2.5:7b-instruct Start MCP server
SENSOR_HUMOR_DEBUG=true npm start Set the mood
mood.set(style: "dry")
// -> { mood: "dry", description: "Deadpan, minimalist..." } Roast some code
roast(target: "global mutable state", context: "code")
// -> { roast: "Verdict: Shared hallucination.", severity: 4 } Rewrite with timing
comic_timing(text: "Build failed after 47 attempts", technique: "escalation")
// -> { rewrite: "Forty-seven builds. A new personal record." } Voice it
voice_speak({ text: result.roast, mood: "roast" })
// -> am_eric @ 1.05x, confident sarcastic energy