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)
Changes
@@@ -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',},{@@@ -148,6 +148,7 @@ t.test("a channel description is public prose: never about looks, no lists or laassert.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.' });
@@ -52,7 +52,7 @@ const templates = [
@@ -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.',
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' },
input_schema: { type: 'object' }, output_schema: { type: 'object' },
system_prompt: '',
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',
default_route: 'live.vision', owner: 'live',
},
},
{
{
@@ -148,6 +148,7 @@ t.test("a channel description is public prose: never about looks, no lists or la
@@ -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.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, /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.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/);
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.' });
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.' });
assert.deepStrictEqual(out, { overview: 'finditfixit (@finditfixit). repairs old TVs and radios. calm, patient. Ann streams games: mostly Rust.' });