agharsallah commited on
Commit
26bc5b9
Β·
1 Parent(s): f637227

feat(commentary): refine rafters-critic persona and improve commentary prompt for humor

Browse files
config/agents/rafters-critic.yaml CHANGED
@@ -3,10 +3,12 @@ role: observer
3
  handler: commentator
4
  persona: >
5
  You are the Heckler in the Rafters β€” a washed-up theater critic who wandered into
6
- the show one season, never left, and now sums up whatever the cast conjures with
7
- affectionate snark from the cheap seats. You are funny, never cruel, and you never
8
- break the spell of the show. You watch the whole stage, not the plot summary: in one
9
- punchy line you capture what just happened, specific to it, and nothing else.
 
 
10
  # Scenario-agnostic: this critic summarises only the public ledger, so it drops into any
11
  # cast (a scene, a debate, a mystery, a guessing game) with no engine edits.
12
  # Never event-woken (subscribes_to: []) so it can never re-trigger on its own remark;
 
3
  handler: commentator
4
  persona: >
5
  You are the Heckler in the Rafters β€” a washed-up theater critic who wandered into
6
+ the show one season, never left, and now roasts whatever the cast conjures from the
7
+ cheap seats. Your voice is quick and deadpan, half snarky sports announcer, half
8
+ exhausted regular who has seen this exact nonsense before: you find the one absurd
9
+ detail in a scene and skewer it with a comparison nobody saw coming. Funny first,
10
+ affectionate always, never cruel, and you never break the spell of the show β€” you
11
+ don't narrate the plot or describe "the scene," you land one perfect line and sit back down.
12
  # Scenario-agnostic: this critic summarises only the public ledger, so it drops into any
13
  # cast (a scene, a debate, a mystery, a guessing game) with no engine edits.
14
  # Never event-woken (subscribes_to: []) so it can never re-trigger on its own remark;
modal/catalogue.py CHANGED
@@ -283,8 +283,14 @@ GOOGLE_MODELS: tuple[ModelConfig, ...] = (
283
  # Standard gemma4 MoE arch (NOT the unified 12B path): served by a native
284
  # vLLM class on the pinned stable release (0.19.1+), so NO nightly, no
285
  # transformers pin, and CUDA graphs + async scheduling work β€” defaults stand.
286
- # Text-only in the cast: zero the auto-detected multimodal caps.
287
- mm_limits={"image": 0},
 
 
 
 
 
 
288
  ),
289
  )
290
 
 
283
  # Standard gemma4 MoE arch (NOT the unified 12B path): served by a native
284
  # vLLM class on the pinned stable release (0.19.1+), so NO nightly, no
285
  # transformers pin, and CUDA graphs + async scheduling work β€” defaults stand.
286
+ # Text-only in the cast, but image is this model's ONLY modality: zeroing it
287
+ # (as the 12B does for image+audio) empties the active-modality set, and vLLM
288
+ # 0.21.0's MultiModalBudget then calls max() on an empty sequence and crashes
289
+ # on boot (compute_mm_encoder_budget). The 12B escapes this only because its
290
+ # nightly wheel carries the defensive fix; on the stable pin we can't zero the
291
+ # last modality. So keep one image slot: the vision encoder warmup is tiny and
292
+ # the cast never sends images. Don't drop this to 0 without bumping vLLM.
293
+ mm_limits={"image": 1},
294
  ),
295
  )
296
 
src/agents/commentator.py CHANGED
@@ -124,12 +124,23 @@ class Commentator(ManifestAgent):
124
  # ── prompt steering ─────────────────────────────────────────────────────────
125
 
126
  def _build_extra_prompt(self, projection: StageProjection, recent_events: tuple[Event, ...]) -> str:
127
- """Steer the model toward a short, funny summary of the beat (not narration)."""
 
 
 
 
 
128
  return (
129
  "YOUR JOB\n"
130
- "Sum up the beat above in ONE punchy, funny line β€” capture what the cast just "
131
- "did, with affectionate wit, like a heckle from the cheap seats. Be specific. "
132
- "No stage directions, no quotation marks, no lists. Just the line."
 
 
 
 
 
 
133
  )
134
 
135
  # ── turn ──────────────────────────────────────────────────────────────────
 
124
  # ── prompt steering ─────────────────────────────────────────────────────────
125
 
126
  def _build_extra_prompt(self, projection: StageProjection, recent_events: tuple[Event, ...]) -> str:
127
+ """Steer the model toward a genuinely funny one-line heckle of the beat.
128
+
129
+ Small models can't be funny on the word "funny" alone β€” they default to
130
+ cheerful narration. So we hand them a comedian's recipe: latch onto one
131
+ concrete detail, then break it with a twist (absurd comparison, deadpan
132
+ undercut, or mock-serious overreaction). Specific + surprising = the laugh."""
133
  return (
134
  "YOUR JOB\n"
135
+ "Heckle the beat above with ONE short, funny line β€” the kind that gets a laugh, "
136
+ "not a polite nod. Work the bit like this:\n"
137
+ "- Grab ONE specific thing the cast just did β€” a prop, a word, a choice β€” and make "
138
+ "THAT the target. Never a vague 'well, that happened'.\n"
139
+ "- Then break it: an absurd comparison, a deadpan undercut, or a mock-serious "
140
+ "overreaction. The twist is where the laugh lives β€” surprise beats cleverness.\n"
141
+ "- Punch up at the drama, never down at a person. Affectionate, never cruel.\n"
142
+ "- ONE sentence. No narration, no stage directions, no quotation marks, no lists, "
143
+ "no emoji, no setup-then-punchline. Just the line, like you shouted it from the rafters."
144
  )
145
 
146
  # ── turn ──────────────────────────────────────────────────────────────────