diff --git a/lydia.js b/lydia.js index bdc5af2..f87e1fd 100644 --- a/lydia.js +++ b/lydia.js @@ -72,6 +72,7 @@ screen.append(inputBox); inputBox.focus(); let chatHistory = []; +let conversationHistory = []; let currentStreamMessage = ""; function addMessage(role, content) { @@ -152,12 +153,21 @@ function finalizeStreamMessage() { } } + let assistantMessage; if (letterIndex !== -1) { - const messageContent = currentStreamMessage.substring(letterIndex).trim(); - addMessage(assistantname, messageContent); + assistantMessage = currentStreamMessage.substring(letterIndex).trim(); + addMessage(assistantname, assistantMessage); } else { + assistantMessage = currentStreamMessage; addMessage(assistantname, currentStreamMessage); } + + // Add assistant message to conversation history + conversationHistory.push({ + role: "assistant", + content: assistantMessage, + }); + currentStreamMessage = ""; } } @@ -176,67 +186,40 @@ function setFaceBoxContent(content) { async function sendMessage(message) { if (!message.trim()) return; - //if (message.startsWith("!")) { - if (message.trim().startsWith("l!")) { - // command handler (if command, dont tell ollama about it, just handle it right here) -- THIS DOES NOT WORK AS OF NOW - const commandParts = message.slice(2).split(" "); - const command = commandParts[0]; - const args = commandParts.slice(1).join(" "); - switch (command) { - case "help": - chatBox.setContent( - "available commands:\nl!help - show this help message\nl!face - set face to text", - ); - break; - case "clear": - chatHistory = []; - chatBox.setContent(""); - break; - case "face": - if (args.trim()) { - setFaceBoxContent(args.trim()); - } else { - setFaceBoxContent("=w="); - } - break; - default: - chatBox.setContent(`unknown command: ${command}`); - break; - } - } else { - // if not command, pass to ollama - addMessage(username, message); + addMessage(username, message); - try { - currentStreamMessage = ""; + // Add user message to conversation history + conversationHistory.push({ + role: "user", + content: message, + }); - const response = await ollama.chat({ - model: assistantmodel, - messages: [ - { - role: "system", - content: systemprompt, - }, - { - role: "user", - content: message, - }, - ], - stream: true, - }); + try { + currentStreamMessage = ""; - for await (const part of response) { - if (part.message && part.message.content) { - currentStreamMessage += part.message.content; - updateStreamMessage(currentStreamMessage); - } + const response = await ollama.chat({ + model: assistantmodel, + messages: [ + { + role: "system", + content: systemprompt, + }, + ...conversationHistory, + ], + stream: true, + }); + + for await (const part of response) { + if (part.message && part.message.content) { + currentStreamMessage += part.message.content; + updateStreamMessage(currentStreamMessage); } - - finalizeStreamMessage(); - } catch (error) { - addMessage(assistantname, `Failed to get response: ${error.message}`); } + + finalizeStreamMessage(); + } catch (error) { + addMessage(assistantname, `Failed to get response: ${error.message}`); } } @@ -244,7 +227,41 @@ inputBox.on("submit", async (text) => { if (text.trim()) { inputBox.clearValue(); inputBox.focus(); - await sendMessage(text); + + // Handle commands + if (text.trim().startsWith("l!")) { + const commandParts = text.trim().slice(2).split(" "); + const command = commandParts[0]; + const args = commandParts.slice(1).join(" "); + + switch (command) { + case "help": + addMessage( + assistantname, + "available commands:\nl!help - if you wanna know what i can do, run this\nl!clear - clear chat history, if you want me to forget everything, just run this!\nl!face - if you want to force my expression, here you go! not sure i'll be too happy about it though.", + ); + break; + case "clear": + chatHistory = []; + conversationHistory = []; + chatBox.setContent(""); + screen.render(); + break; + case "face": + if (args.trim()) { + setFaceBoxContent(args.trim()); + } else { + setFaceBoxContent("=w="); + } + break; + default: + addMessage(assistantname, `unknown command: ${command}`); + break; + } + } else { + // Regular message - send to ollama + await sendMessage(text); + } } });