overseer v2 4

This commit is contained in:
legop3
2026-05-03 23:41:08 -04:00
parent 5b48b10971
commit 7eb33c9af2
2 changed files with 24 additions and 11 deletions
@@ -26,21 +26,29 @@ function buildToolState({ mode, homeAssistantState, neatoState, liftState }) {
} }
function buildConversation({ recentMessages, name }) { function buildConversation({ recentMessages, name }) {
const rows = []; const messages = [];
(recentMessages || []).forEach((entry) => { (recentMessages || []).forEach((entry) => {
const text = String(entry?.text || '').trim(); const text = String(entry?.text || '').trim();
if (!text) return; if (!text) return;
const who = entry?.system ? (entry?.nickname || name || 'Overseer') : (entry?.nickname || 'user'); const isAssistant = Boolean(entry?.bot || entry?.system);
rows.push(`${who}: ${text}`); const nickname = String(entry?.nickname || (isAssistant ? name || 'Overseer' : 'user')).trim();
if (isAssistant) {
messages.push({ role: 'assistant', content: text });
return;
}
messages.push({ role: 'user', content: `${nickname}: ${text}` });
}); });
return rows; return messages;
} }
function buildModelMessages({ systemPrompt, stateUpdate, transcriptRows, availableTools, blockedTools }) { function buildModelMessages({ systemPrompt, stateUpdate, conversationMessages, availableTools, blockedTools }) {
const messages = []; const messages = [];
messages.push({ role: 'system', content: systemPrompt }); messages.push({ role: 'system', content: systemPrompt });
messages.push({ role: 'user', content: `STATE_UPDATE\n${stateUpdate}` }); messages.push({ role: 'user', content: `STATE_UPDATE\n${stateUpdate}` });
transcriptRows.forEach((row) => messages.push({ role: 'user', content: row })); (conversationMessages || []).forEach((message) => {
if (!message || !message.role || !message.content) return;
messages.push(message);
});
messages.push({ messages.push({
role: 'user', role: 'user',
content: `available_tools:\n${availableTools.map((tool) => `- ${tool}`).join('\n') || '- none'}`, content: `available_tools:\n${availableTools.map((tool) => `- ${tool}`).join('\n') || '- none'}`,
@@ -144,18 +144,23 @@ async function runDecision(triggerReason) {
const stateUpdate = toStateUpdate({ mode, homeAssistantState, neatoState, liftState, roster, triggerReason }); const stateUpdate = toStateUpdate({ mode, homeAssistantState, neatoState, liftState, roster, triggerReason });
const toolState = buildToolState({ mode, homeAssistantState, neatoState, liftState }); const toolState = buildToolState({ mode, homeAssistantState, neatoState, liftState });
const human = getRecentMessages(MAX_CHAT_CONTEXT, { includeSystem: false }); const recentConversation = getRecentMessages(MAX_CHAT_CONTEXT + MAX_BOT_CONTEXT, { includeSystem: true });
const bots = getRecentMessages(100, { includeSystem: true }).filter((entry) => entry?.system).slice(-MAX_BOT_CONTEXT); const conversationMessages = buildConversation({ recentMessages: recentConversation, name });
const transcriptRows = buildConversation({ recentMessages: [...human, ...bots].slice(-(MAX_CHAT_CONTEXT + MAX_BOT_CONTEXT)), name });
const systemPrompt = await readPrompt(); const systemPrompt = await readPrompt();
const modelMessages = buildModelMessages({ systemPrompt, stateUpdate, transcriptRows, availableTools: toolState.available, blockedTools: toolState.blocked }); const modelMessages = buildModelMessages({
systemPrompt,
stateUpdate,
conversationMessages,
availableTools: toolState.available,
blockedTools: toolState.blocked,
});
updateStatus({ updateStatus({
phase: 'awaiting_model', phase: 'awaiting_model',
lastSystemPrompt: systemPrompt, lastSystemPrompt: systemPrompt,
lastStateUpdate: stateUpdate, lastStateUpdate: stateUpdate,
lastTranscript: transcriptRows, lastTranscript: conversationMessages,
lastAvailableTools: toolState.available, lastAvailableTools: toolState.available,
lastBlockedTools: toolState.blocked, lastBlockedTools: toolState.blocked,
lastModelMessages: modelMessages, lastModelMessages: modelMessages,