openvibers/openvibe.ai Commits
The room's line says its vibe first, then the specifics; never counts (#528)
Changes
@@@ -166,7 +166,7 @@ const templates = [input_schema: { type: 'object' },output_schema: {"type": "object", "additionalProperties": false, "required": ["recent_overview", "memory", "timeline"], "properties": {"recent_overview": {"type": "string"}, "memory": {"type": "string"}, "timeline": {"type": "array", "items": {"type": "object", "additionalProperties": false, "required": ["label", "detail", "mins_ago"], "properties": {"label": {"type": "string"}, "detail": {"type": "string"}, "mins_ago": {"type": "integer"}}}}}},system_prompt: "",-- user_prompt: "You write the line a person reads when they arrive in this chat room (roughly the {{window_label}}). Work only from the RECENT chat below: never invent a topic, a person or an event. A room with nothing worth saying is quiet, and you say so by leaving the overview empty.\n\nReturn ONLY a JSON object, no prose, with exactly these keys:\n{\n \"recent_overview\": \"TWO sentences, plain prose, no label or preamble: what the room is talking about right now, who is here, and anything that was decided or asked. Concrete and specific, in the room's own words. If there is nothing worth saying, leave it empty — the room is quiet; never invent a topic, a person or an event.\",\n \"memory\": \"Condensed running notes about this community carried forward: recurring topics, regulars, running jokes, ongoing events/dramas. Update the PRIOR notes with anything new; keep it under ~1400 chars.\",\n \"timeline\": [ {\"label\":\"short title\",\"detail\":\"one sentence\",\"mins_ago\": <integer: minutes before now this happened, read from the [Xm ago] markers on the messages>} ] // 0-3 genuinely NOTABLE moments from THIS window (raids, milestones, big drama, memorable bits). Use [] if nothing stands out — do not invent.\n}\n\nPRIOR running notes (may be empty):\n\"\"\"{{prior_memory}}\"\"\"\n\nRecent timeline entries already recorded (avoid duplicating these):\n{{recent_labels}}\n\nRECENT CHAT ({{count}} messages, oldest first):\n{{messages}}",++ user_prompt: "You write the line a person reads when they arrive in this chat room (roughly the {{window_label}}). Work only from the RECENT chat below: never invent a topic, a person or an event. A room with nothing worth saying is quiet, and you say so by leaving the overview empty.\n\nReturn ONLY a JSON object, no prose, with exactly these keys:\n{\n \"recent_overview\": \"TWO short sentences, plain prose, no label or preamble. The FIRST says the room's vibe in a few words and what it is about right now (for example: Playful and hyped: everyone is guessing what the robot does next.). The SECOND gives the specifics: who is driving the talk, and anything decided, asked or happening, in the room's own words. Never lead with how many messages, people or rooms there were: the page shows those. If there is nothing worth saying, leave it empty: the room is quiet; never invent a topic, a person or an event.\",\n \"memory\": \"Condensed running notes about this community carried forward: recurring topics, regulars, running jokes, ongoing events/dramas. Update the PRIOR notes with anything new; keep it under ~1400 chars.\",\n \"timeline\": [ {\"label\":\"short title\",\"detail\":\"one sentence\",\"mins_ago\": <integer: minutes before now this happened, read from the [Xm ago] markers on the messages>} ] // 0-3 genuinely NOTABLE moments from THIS window (raids, milestones, big drama, memorable bits). Use [] if nothing stands out — do not invent.\n}\n\nPRIOR running notes (may be empty):\n\"\"\"{{prior_memory}}\"\"\"\n\nRecent timeline entries already recorded (avoid duplicating these):\n{{recent_labels}}\n\nRECENT CHAT ({{count}} messages, oldest first):\n{{messages}}",default_route: 'live.legacy', owner: 'live', metadata: { json_name: 'chat_global' },},{@@@ -145,7 +145,7 @@ t.test('chat analysis, person overviews, session titles and VOD ranking render aconst tp = (k) => live.templates.find((x) => x.key === k).user_prompt;const g = render(tp('live.chat.global'), PREPARE['live.chat.global']({ window_label: 'past 3 hours', prior_memory: 'notes', recent_labels: ['a', 'b'], messages: [{ mins_ago: 12, where: 'global', author: 'goosely', text: ' hi ' }, { mins_ago: 3, where: '#ann', author: 'bob', kind: 'emote', text: 'waves' }] }).vars);assert.match(g, /roughly the past 3 hours\)\. Work only/);-- assert.match(g, /TWO sentences/);++ assert.match(g, /TWO short sentences, plain prose, no label or preamble\. The FIRST says the room.s vibe/);assert.match(g, /never invent a topic, a person or an event/);assert.match(g, /"""notes"""/);assert.match(g, /avoid duplicating these\):\n- a\n- b\n/);
@@ -166,7 +166,7 @@ const templates = [
@@ -166,7 +166,7 @@ const templates = [
input_schema: { type: 'object' },
input_schema: { type: 'object' },
output_schema: {"type": "object", "additionalProperties": false, "required": ["recent_overview", "memory", "timeline"], "properties": {"recent_overview": {"type": "string"}, "memory": {"type": "string"}, "timeline": {"type": "array", "items": {"type": "object", "additionalProperties": false, "required": ["label", "detail", "mins_ago"], "properties": {"label": {"type": "string"}, "detail": {"type": "string"}, "mins_ago": {"type": "integer"}}}}}},
output_schema: {"type": "object", "additionalProperties": false, "required": ["recent_overview", "memory", "timeline"], "properties": {"recent_overview": {"type": "string"}, "memory": {"type": "string"}, "timeline": {"type": "array", "items": {"type": "object", "additionalProperties": false, "required": ["label", "detail", "mins_ago"], "properties": {"label": {"type": "string"}, "detail": {"type": "string"}, "mins_ago": {"type": "integer"}}}}}},
system_prompt: "",
system_prompt: "",
- user_prompt: "You write the line a person reads when they arrive in this chat room (roughly the {{window_label}}). Work only from the RECENT chat below: never invent a topic, a person or an event. A room with nothing worth saying is quiet, and you say so by leaving the overview empty.\n\nReturn ONLY a JSON object, no prose, with exactly these keys:\n{\n \"recent_overview\": \"TWO sentences, plain prose, no label or preamble: what the room is talking about right now, who is here, and anything that was decided or asked. Concrete and specific, in the room's own words. If there is nothing worth saying, leave it empty — the room is quiet; never invent a topic, a person or an event.\",\n \"memory\": \"Condensed running notes about this community carried forward: recurring topics, regulars, running jokes, ongoing events/dramas. Update the PRIOR notes with anything new; keep it under ~1400 chars.\",\n \"timeline\": [ {\"label\":\"short title\",\"detail\":\"one sentence\",\"mins_ago\": <integer: minutes before now this happened, read from the [Xm ago] markers on the messages>} ] // 0-3 genuinely NOTABLE moments from THIS window (raids, milestones, big drama, memorable bits). Use [] if nothing stands out — do not invent.\n}\n\nPRIOR running notes (may be empty):\n\"\"\"{{prior_memory}}\"\"\"\n\nRecent timeline entries already recorded (avoid duplicating these):\n{{recent_labels}}\n\nRECENT CHAT ({{count}} messages, oldest first):\n{{messages}}",
+ user_prompt: "You write the line a person reads when they arrive in this chat room (roughly the {{window_label}}). Work only from the RECENT chat below: never invent a topic, a person or an event. A room with nothing worth saying is quiet, and you say so by leaving the overview empty.\n\nReturn ONLY a JSON object, no prose, with exactly these keys:\n{\n \"recent_overview\": \"TWO short sentences, plain prose, no label or preamble. The FIRST says the room's vibe in a few words and what it is about right now (for example: Playful and hyped: everyone is guessing what the robot does next.). The SECOND gives the specifics: who is driving the talk, and anything decided, asked or happening, in the room's own words. Never lead with how many messages, people or rooms there were: the page shows those. If there is nothing worth saying, leave it empty: the room is quiet; never invent a topic, a person or an event.\",\n \"memory\": \"Condensed running notes about this community carried forward: recurring topics, regulars, running jokes, ongoing events/dramas. Update the PRIOR notes with anything new; keep it under ~1400 chars.\",\n \"timeline\": [ {\"label\":\"short title\",\"detail\":\"one sentence\",\"mins_ago\": <integer: minutes before now this happened, read from the [Xm ago] markers on the messages>} ] // 0-3 genuinely NOTABLE moments from THIS window (raids, milestones, big drama, memorable bits). Use [] if nothing stands out — do not invent.\n}\n\nPRIOR running notes (may be empty):\n\"\"\"{{prior_memory}}\"\"\"\n\nRecent timeline entries already recorded (avoid duplicating these):\n{{recent_labels}}\n\nRECENT CHAT ({{count}} messages, oldest first):\n{{messages}}",
default_route: 'live.legacy', owner: 'live', metadata: { json_name: 'chat_global' },
default_route: 'live.legacy', owner: 'live', metadata: { json_name: 'chat_global' },
},
},
{
{
@@ -145,7 +145,7 @@ t.test('chat analysis, person overviews, session titles and VOD ranking render a
@@ -145,7 +145,7 @@ t.test('chat analysis, person overviews, session titles and VOD ranking render a
const tp = (k) => live.templates.find((x) => x.key === k).user_prompt;
const tp = (k) => live.templates.find((x) => x.key === k).user_prompt;
const g = render(tp('live.chat.global'), PREPARE['live.chat.global']({ window_label: 'past 3 hours', prior_memory: 'notes', recent_labels: ['a', 'b'], messages: [{ mins_ago: 12, where: 'global', author: 'goosely', text: ' hi ' }, { mins_ago: 3, where: '#ann', author: 'bob', kind: 'emote', text: 'waves' }] }).vars);
const g = render(tp('live.chat.global'), PREPARE['live.chat.global']({ window_label: 'past 3 hours', prior_memory: 'notes', recent_labels: ['a', 'b'], messages: [{ mins_ago: 12, where: 'global', author: 'goosely', text: ' hi ' }, { mins_ago: 3, where: '#ann', author: 'bob', kind: 'emote', text: 'waves' }] }).vars);
assert.match(g, /roughly the past 3 hours\)\. Work only/);
assert.match(g, /roughly the past 3 hours\)\. Work only/);
- assert.match(g, /TWO sentences/);
+ assert.match(g, /TWO short sentences, plain prose, no label or preamble\. The FIRST says the room.s vibe/);
assert.match(g, /never invent a topic, a person or an event/);
assert.match(g, /never invent a topic, a person or an event/);
assert.match(g, /"""notes"""/);
assert.match(g, /"""notes"""/);
assert.match(g, /avoid duplicating these\):\n- a\n- b\n/);
assert.match(g, /avoid duplicating these\):\n- a\n- b\n/);