openvibers/openvibe.ai Commits

chat.global and chat.profile workflows under Chat's own namespace (plan T3): OpenVibe.Chat runs the chat summaries now, with its own token (ai.run.* on chat.*), so it never needs Live's namespace. Same templates, schemas and post-processing as live.chat.global/live.chat.profile.

OP OpenVibers committed 29 Sept 2026 · ad7be2aa9f · 2 files, +13 −1


Changes

ddiff --git a/server/workflows/live.js b/server/workflows/live.js
iindex 0aa8473..4afa385 100644
---- a/server/workflows/live.js
++++ b/server/workflows/live.js
@@@ -601,4 +601,13 @@ const KIND_TO_WORKFLOW = {
status_check: 'live.status_check',
};
--module.exports = { templates, workflows: [...structured, ...passthrough], KIND_TO_WORKFLOW, ROLES, PASSTHROUGH_INPUT, PASSTHROUGH_OUTPUT };
++// OpenVibe.Chat runs the chat summaries itself (plan T3): the same two workflows under Chat's own namespace, so Chat's
++// token (ai.run.* on chat.*) never needs Live's. Same templates, schemas and post-processing; only the key and
++// namespace differ.
++const CHAT_OWNED = [['live.chat.global', 'chat.global'], ['live.chat.profile', 'chat.profile']].map(([from, key]) => {
++ const w = structured.find((x) => x.key === from);
++ if (!w) throw new Error(`workflows/live.js: ${from} is missing`);
++ return { ...w, key, namespace: 'chat', description: `${w.description} Run by OpenVibe.Chat under its own namespace.` };
++});
++
++module.exports = { templates, workflows: [...structured, ...CHAT_OWNED, ...passthrough], KIND_TO_WORKFLOW, ROLES, PASSTHROUGH_INPUT, PASSTHROUGH_OUTPUT };
ddiff --git a/test/workflows.test.js b/test/workflows.test.js
iindex 03dbd5d..cfb4027 100644
---- a/test/workflows.test.js
++++ b/test/workflows.test.js
@@@ -58,6 +58,9 @@ EXAMPLES['live.arena.headline'] = { kind: 'open', a: 'ann', b: 'bob', line: 'bob
EXAMPLES['live.clips.confirm'] = { scene: ['streamer jumps up cheering'], transcript: [{ t: 94, text: 'IT COMPILES' }], sounds: [{ t: 95, label: 'Cheering', confidence: 0.8 }], chat: ['LETS GO', 'poggers'] };
EXAMPLES['live.chat.global'] = { window_label: 'past 3 hours', prior_memory: 'croutons are a running joke', recent_labels: ['the crouton war'], messages: [{ mins_ago: 12, where: 'global', author: 'goosely', kind: null, text: 'croutons are soup confetti' }, { mins_ago: 3, where: '#ann', author: 'bob', kind: 'emote', text: 'waves' }] };
EXAMPLES['live.chat.profile'] = { subject_kind: 'relay', name: 'KickFan', platform: 'kick', recent_24h: false, seen: 0, prior_memory: '', messages: [{ mins_ago: 2000, author: 'KickFan', text: 'hello from kick' }] };
++// Chat runs the same two workflows under its own namespace (plan T3).
++EXAMPLES['chat.global'] = EXAMPLES['live.chat.global'];
++EXAMPLES['chat.profile'] = EXAMPLES['live.chat.profile'];
EXAMPLES['live.person.overview'] = { as_streamer: 'Codes rust late at night.', as_chatter: 'Jokes about croutons.' };
EXAMPLES['live.stream.titles'] = { summaries: ['Fixed a borrow checker bug live', 'Built a robot arm and it waved'] };
EXAMPLES['live.moments.rank'] = { vods: [{ title: 'Rust night', overview: 'the build finally compiles', views: 30, clips: 2, peak_viewers: 5 }, { title: 'Chill', overview: 'sitting at a desk', views: 3, clips: 0, peak_viewers: 1 }], want: 2 };