openvibers/openvibe.ai Commits

AI: Live's home hero copy never mentions anyone's looks, body, clothing or age (production printed "ara007 shirtless thoughts, comfy takes") (#105)

OP OpenVibers committed 28 days ago · 6f7337a247 · 2 files, +2 −1

Changes

ddiff --git a/server/workflows/live.js b/server/workflows/live.js
iindex 9ea48db..e855aed 100644
---- a/server/workflows/live.js
++++ b/server/workflows/live.js
@@@ -211,7 +211,7 @@ const templates = [
input_schema: { type: 'object' },
output_schema: {"type": "object", "additionalProperties": false, "required": ["audiences", "quips"], "properties": {"audiences": {"type": "array", "items": {"type": "string"}}, "quips": {"type": "array", "items": {"type": "string"}}}},
system_prompt: '',
-- user_prompt: "You write the rotating hero copy for OpenVibe.Live — a scrappy, open-source, community-run live-streaming site at the heart of the OpenVibe network (\"Open Live Streaming\" — good vibes, no suits). Never call anything \"free\", \"$0\" or \"no cost\". Voice: witty, warm, self-aware, anti-corporate, meme-literate, a little unhinged — but ALWAYS kind, never punching down.\n\nEverything below is REAL data about THIS community right now. Lean into it hard: reference the actual people, running jokes, recurring topics, and memes so the copy feels like an inside joke the community is in on. Reference usernames by name in good fun (no @), and NEVER mock or embarrass anyone.\n\n=== GLOBAL CHAT VIBE (overview + memory + timeline) ===\n{{global}}\n\n=== PER-USER CHAT ANALYSIS (running jokes / personalities) ===\n{{users}}\n\n=== STREAMERS (what they stream) ===\n{{streamers}}\n\n=== RECENT VODS (what's been on) ===\n{{vods}}\n\n=== ACTIVE USERNAMES you may reference kindly ===\n{{usernames}}\n\n=== TASK ===\nProduce STRICT JSON, exactly this shape and nothing else:\n{\n \"audiences\": [ {{target}} noun phrases naming WHO the site is for. The page prints the fixed headline \"Live streaming for {phrase}\" — you supply ONLY {phrase}. The words \"live\", \"streaming\", \"stream\", \"streamers\" and \"for\" must NOT appear anywhere in a phrase. Good: \"van-dwelling coders\", \"goosely's loyal 3 viewers\", \"crouton connoisseurs\". Bad: \"live streaming for coders\", \"coders live streaming\", \"for coders\". 1-5 words, lowercase (keep usernames' casing), plural people-nouns, no trailing punctuation. Mix on-theme audiences with community in-jokes drawn from the data. ],\n \"quips\": [ {{target}} standalone one-liner taglines, punchy, <= 75 chars. Several should be clear references/memes about the real streamers, VODs, running jokes, or usernames above. ]\n}\nReturn ONLY the JSON object.",
++ user_prompt: "You write the rotating hero copy for OpenVibe.Live — a scrappy, open-source, community-run live-streaming site at the heart of the OpenVibe network (\"Open Live Streaming\" — good vibes, no suits). Never call anything \"free\", \"$0\" or \"no cost\". Voice: witty, warm, self-aware, anti-corporate, meme-literate, a little unhinged — but ALWAYS kind, never punching down.\n\nEverything below is REAL data about THIS community right now. Lean into it hard: reference the actual people, running jokes, recurring topics, and memes so the copy feels like an inside joke the community is in on. Reference usernames by name in good fun (no @), and NEVER mock or embarrass anyone. Never mention anyone's looks, body, clothing or age (no \"shirtless\", no \"young\"): talk about what they stream and say.\n\n=== GLOBAL CHAT VIBE (overview + memory + timeline) ===\n{{global}}\n\n=== PER-USER CHAT ANALYSIS (running jokes / personalities) ===\n{{users}}\n\n=== STREAMERS (what they stream) ===\n{{streamers}}\n\n=== RECENT VODS (what's been on) ===\n{{vods}}\n\n=== ACTIVE USERNAMES you may reference kindly ===\n{{usernames}}\n\n=== TASK ===\nProduce STRICT JSON, exactly this shape and nothing else:\n{\n \"audiences\": [ {{target}} noun phrases naming WHO the site is for. The page prints the fixed headline \"Live streaming for {phrase}\" — you supply ONLY {phrase}. The words \"live\", \"streaming\", \"stream\", \"streamers\" and \"for\" must NOT appear anywhere in a phrase. Good: \"van-dwelling coders\", \"goosely's loyal 3 viewers\", \"crouton connoisseurs\". Bad: \"live streaming for coders\", \"coders live streaming\", \"for coders\". 1-5 words, lowercase (keep usernames' casing), plural people-nouns, no trailing punctuation. Mix on-theme audiences with community in-jokes drawn from the data. ],\n \"quips\": [ {{target}} standalone one-liner taglines, punchy, <= 75 chars. Several should be clear references/memes about the real streamers, VODs, running jokes, or usernames above. ]\n}\nReturn ONLY the JSON object.",
default_route: 'live.legacy', owner: 'live', metadata: { json_name: 'hero_slogans' },
},
{
ddiff --git a/test/live-templates.test.js b/test/live-templates.test.js
iindex 71dd5ee..778fba0 100644
---- a/test/live-templates.test.js
++++ b/test/live-templates.test.js
@@@ -146,6 +146,7 @@ t.test("a channel description is public prose: never about looks, no lists or la
assert.match(tp('live.stream.summarize').user_prompt, /never about what people look like/);
assert.match(tp('live.moments.pick').user_prompt, /never about what people look like/);
assert.match(tp('live.stream.recap').system_prompt, /Never describe anyone's looks/);
++ assert.match(tp('live.hero.slogans') ? tp('live.hero.slogans').user_prompt : live.templates.find((x) => /rotating hero copy/.test(x.user_prompt)).user_prompt, /Never mention anyone's looks, body, clothing or age/);
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.strictEqual(POSTPROCESS['live.streamer.overview']({ text: '## Overview\n' }), null, 'nothing but a heading is no overview');