openvibers/openvibe.ai Commits

live.stream.describe_frame: a live paste's caption names what happens, never what someone looks like or wears ('Red Beanie Moment', 'Glasses Adjustment Tension', 'Face Reveal Frenzy' were written as public titles) (#119)

OP OpenVibers committed 27 days ago · cc39c9092d · 2 files, +2 −1

Changes

ddiff --git a/server/workflows/live.js b/server/workflows/live.js
iindex f94ac80..218feb9 100644
---- a/server/workflows/live.js
++++ b/server/workflows/live.js
@@@ -52,7 +52,7 @@ const templates = [
description: 'From ai-analysis.analyzeStreamFrame (stream_memory): memory description, tags, and a screenshot-worthiness verdict + caption for live pastes, in one vision call.',
input_schema: { type: 'object' }, output_schema: { type: 'object' },
system_prompt: '',
-- user_prompt: 'This is a frame from a live stream. Describe what is happening (the game, the activity, the scene, text on screen), not what people look like: never mention anyone\'s body, clothing, age, ethnicity or perceived gender, and call a person "the streamer". Reply ONLY with compact JSON: {"description":"one concise sentence describing what is happening on screen right now","tags":["2-5","short","tags"],"worthy":<true only if this exact frame is genuinely screenshot-worthy on its own: a face/reaction, a visual gag, something unusual or funny on screen — false for ordinary gameplay/desktop/chat/talking-head frames>,"title":"<if worthy: a punchy, funny 3-7 word caption for it, else empty>"}.',
++ user_prompt: 'This is a frame from a live stream. Describe what is happening (the game, the activity, the scene, text on screen), not what people look like: never mention anyone\'s body, clothing, age, ethnicity or perceived gender, and call a person "the streamer". Reply ONLY with compact JSON: {"description":"one concise sentence describing what is happening on screen right now","tags":["2-5","short","tags"],"worthy":<true only if this exact frame is genuinely screenshot-worthy on its own: a big reaction, a visual gag, something unusual or funny on screen — false for ordinary gameplay/desktop/chat/talking-head frames>,"title":"<if worthy: a punchy, funny 3-7 word caption naming what happens, never what someone looks like or wears (no hats, beanies, shirts, glasses, faces or hair), else empty>"}.',
default_route: 'live.vision', owner: 'live',
},
{
ddiff --git a/test/live-templates.test.js b/test/live-templates.test.js
iindex 67ba2e9..22eda94 100644
---- a/test/live-templates.test.js
++++ b/test/live-templates.test.js
@@@ -148,6 +148,7 @@ t.test("a channel description is public prose: never about looks, no lists or la
assert.match(tp('live.stream.recap').system_prompt, /Never describe anyone's looks/);
assert.match(tp('live.hero.slogans').user_prompt, /Never mention anyone's looks, body, clothing or age/);
assert.match(tp('live.hero.slogans').user_prompt, /nothing crude or sexual, even when chat jokes that way, and skip usernames that look like keyboard mashes/);
++ assert.match(tp('live.stream.describe_frame').user_prompt, /caption naming what happens, never what someone looks like or wears/);
assert.match(tp('live.arena.drama').system_prompt, /never guess a pronoun/);
const out = POSTPROCESS['live.streamer.overview']({ text: '## Overview\n- Streamer handle: finditfixit (@finditfixit).\n- **Content:** repairs old TVs and radios\n- Tone: calm, patient\n\nAnn streams games: mostly Rust.' });
assert.deepStrictEqual(out, { overview: 'finditfixit (@finditfixit). repairs old TVs and radios. calm, patient. Ann streams games: mostly Rust.' });