From: igardev Date: Tue, 18 Feb 2025 22:01:44 +0000 (+0200) Subject: server : (webui) Enable communication with parent html (if webui is in iframe) (... X-Git-Tag: upstream/0.0.4853~113 X-Git-Url: https://git.djapps.eu/?a=commitdiff_plain;h=b58934c1836b5ea51dbacbe899eee125775e77c9;p=pkg%2Fggml%2Fsources%2Fllama.cpp server : (webui) Enable communication with parent html (if webui is in iframe) (#11940) * Webui: Enable communication with parent html (if webui is in iframe): - Listens for "setText" command from parent with "text" and "context" fields. "text" is set in inputMsg, "context" is used as hidden context on the following requests to the llama.cpp server - On pressing na Escape button sends command "escapePressed" to the parent Example handling from the parent html side: - Send command "setText" from parent html to webui in iframe: const iframe = document.getElementById('askAiIframe'); if (iframe) { iframe.contentWindow.postMessage({ command: 'setText', text: text, context: context }, '*'); } - Listen for Escape key from webui on parent html: // Listen for escape key event in the iframe window.addEventListener('keydown', (event) => { if (event.key === 'Escape') { // Process case when Escape is pressed inside webui } }); * Move the extraContext from storage to app.context. * Fix formatting. * add Message.extra * format + build * MessageExtraContext * build * fix display * rm console.log --------- Co-authored-by: igardev Co-authored-by: Xuan Son Nguyen --- diff --git a/examples/server/public/index.html.gz b/examples/server/public/index.html.gz index 1925b334..3acd603a 100644 Binary files a/examples/server/public/index.html.gz and b/examples/server/public/index.html.gz differ diff --git a/examples/server/webui/src/components/ChatMessage.tsx b/examples/server/webui/src/components/ChatMessage.tsx index 68be7c75..40ea7471 100644 --- a/examples/server/webui/src/components/ChatMessage.tsx +++ b/examples/server/webui/src/components/ChatMessage.tsx @@ -159,6 +159,35 @@ export default function ChatMessage({ )} + + {msg.extra && msg.extra.length > 0 && ( +
+ + Extra content + +
+ {msg.extra.map( + (extra, i) => + extra.type === 'textFile' ? ( +
+ {extra.name} +
{extra.content}
+
+ ) : extra.type === 'context' ? ( +
+
{extra.content}
+
+ ) : null // TODO: support other extra types + )} +
+
+ )} + (null); + + const { extraContext, clearExtraContext } = useVSCodeContext( + inputRef, + setInputMsg + ); + // TODO: improve this when we have "upload file" feature + const currExtra: Message['extra'] = extraContext ? [extraContext] : undefined; // keep track of leaf node for rendering const [currNodeId, setCurrNodeId] = useState(-1); @@ -115,10 +124,20 @@ export default function ChatScreen() { setCurrNodeId(-1); // get the last message node const lastMsgNodeId = messages.at(-1)?.msg.id ?? null; - if (!(await sendMessage(currConvId, lastMsgNodeId, inputMsg, onChunk))) { + if ( + !(await sendMessage( + currConvId, + lastMsgNodeId, + inputMsg, + currExtra, + onChunk + )) + ) { // restore the input message if failed setInputMsg(lastInpMsg); } + // OK + clearExtraContext(); }; const handleEditMessage = async (msg: Message, content: string) => { @@ -129,6 +148,7 @@ export default function ChatScreen() { viewingChat.conv.id, msg.parent, content, + msg.extra, onChunk ); setCurrNodeId(-1); @@ -143,6 +163,7 @@ export default function ChatScreen() { viewingChat.conv.id, msg.parent, null, + msg.extra, onChunk ); setCurrNodeId(-1); @@ -203,6 +224,7 @@ export default function ChatScreen() {