diff --git a/src/interface/desktop/chat.html b/src/interface/desktop/chat.html
index e039c6cb..279397bd 100644
--- a/src/interface/desktop/chat.html
+++ b/src/interface/desktop/chat.html
@@ -346,115 +346,113 @@
chatInput.classList.remove("option-enabled");
// Call specified Khoj API which returns a streamed response of type text/plain
- fetch(url, { headers })
- .then(response => {
- const reader = response.body.getReader();
- const decoder = new TextDecoder();
- let rawResponse = "";
- let references = null;
+ let response = await fetch(url, { headers });
+ const reader = response.body.getReader();
+ const decoder = new TextDecoder();
+ let rawResponse = "";
+ let references = null;
- function readStream() {
- reader.read().then(({ done, value }) => {
- if (done) {
- // Append any references after all the data has been streamed
- if (references != null) {
- newResponseText.appendChild(references);
- }
- document.getElementById("chat-body").scrollTop = document.getElementById("chat-body").scrollHeight;
- document.getElementById("chat-input").removeAttribute("disabled");
- return;
+ function readStream() {
+ reader.read().then(({ done, value }) => {
+ if (done) {
+ // Append any references after all the data has been streamed
+ if (references != null) {
+ newResponseText.appendChild(references);
+ }
+ document.getElementById("chat-body").scrollTop = document.getElementById("chat-body").scrollHeight;
+ document.getElementById("chat-input").removeAttribute("disabled");
+ return;
+ }
+
+ // Decode message chunk from stream
+ const chunk = decoder.decode(value, { stream: true });
+
+ if (chunk.includes("### compiled references:")) {
+ const additionalResponse = chunk.split("### compiled references:")[0];
+ rawResponse += additionalResponse;
+ newResponseText.innerHTML = "";
+ newResponseText.appendChild(formatHTMLMessage(rawResponse));
+
+ const rawReference = chunk.split("### compiled references:")[1];
+ const rawReferenceAsJson = JSON.parse(rawReference);
+ references = document.createElement('div');
+ references.classList.add("references");
+
+ let referenceExpandButton = document.createElement('button');
+ referenceExpandButton.classList.add("reference-expand-button");
+
+ let referenceSection = document.createElement('div');
+ referenceSection.classList.add("reference-section");
+ referenceSection.classList.add("collapsed");
+
+ let numReferences = 0;
+
+ // If rawReferenceAsJson is a list, then count the length
+ if (Array.isArray(rawReferenceAsJson)) {
+ numReferences = rawReferenceAsJson.length;
+
+ rawReferenceAsJson.forEach((reference, index) => {
+ let polishedReference = generateReference(reference, index);
+ referenceSection.appendChild(polishedReference);
+ });
+ } else {
+ numReferences += processOnlineReferences(referenceSection, rawReferenceAsJson);
+ }
+
+ references.appendChild(referenceExpandButton);
+
+ referenceExpandButton.addEventListener('click', function() {
+ if (referenceSection.classList.contains("collapsed")) {
+ referenceSection.classList.remove("collapsed");
+ referenceSection.classList.add("expanded");
+ } else {
+ referenceSection.classList.add("collapsed");
+ referenceSection.classList.remove("expanded");
}
+ });
- // Decode message chunk from stream
- const chunk = decoder.decode(value, { stream: true });
+ let expandButtonText = numReferences == 1 ? "1 reference" : `${numReferences} references`;
+ referenceExpandButton.innerHTML = expandButtonText;
+ references.appendChild(referenceSection);
+ readStream();
+ } else {
+ // Display response from Khoj
+ if (newResponseText.getElementsByClassName("spinner").length > 0) {
+ newResponseText.removeChild(loadingSpinner);
+ }
- if (chunk.includes("### compiled references:")) {
- const additionalResponse = chunk.split("### compiled references:")[0];
- rawResponse += additionalResponse;
+ // Try to parse the chunk as a JSON object. It will be a JSON object if there is an error.
+ if (chunk.startsWith("{") && chunk.endsWith("}")) {
+ try {
+ const responseAsJson = JSON.parse(chunk);
+ if (responseAsJson.image) {
+ rawResponse += ``;
+ }
+ if (responseAsJson.detail) {
+ rawResponse += responseAsJson.detail;
+ }
+ } catch (error) {
+ // If the chunk is not a JSON object, just display it as is
+ rawResponse += chunk;
+ } finally {
newResponseText.innerHTML = "";
newResponseText.appendChild(formatHTMLMessage(rawResponse));
-
- const rawReference = chunk.split("### compiled references:")[1];
- const rawReferenceAsJson = JSON.parse(rawReference);
- references = document.createElement('div');
- references.classList.add("references");
-
- let referenceExpandButton = document.createElement('button');
- referenceExpandButton.classList.add("reference-expand-button");
-
- let referenceSection = document.createElement('div');
- referenceSection.classList.add("reference-section");
- referenceSection.classList.add("collapsed");
-
- let numReferences = 0;
-
- // If rawReferenceAsJson is a list, then count the length
- if (Array.isArray(rawReferenceAsJson)) {
- numReferences = rawReferenceAsJson.length;
-
- rawReferenceAsJson.forEach((reference, index) => {
- let polishedReference = generateReference(reference, index);
- referenceSection.appendChild(polishedReference);
- });
- } else {
- numReferences += processOnlineReferences(referenceSection, rawReferenceAsJson);
- }
-
- references.appendChild(referenceExpandButton);
-
- referenceExpandButton.addEventListener('click', function() {
- if (referenceSection.classList.contains("collapsed")) {
- referenceSection.classList.remove("collapsed");
- referenceSection.classList.add("expanded");
- } else {
- referenceSection.classList.add("collapsed");
- referenceSection.classList.remove("expanded");
- }
- });
-
- let expandButtonText = numReferences == 1 ? "1 reference" : `${numReferences} references`;
- referenceExpandButton.innerHTML = expandButtonText;
- references.appendChild(referenceSection);
- readStream();
- } else {
- // Display response from Khoj
- if (newResponseText.getElementsByClassName("spinner").length > 0) {
- newResponseText.removeChild(loadingSpinner);
- }
-
- // Try to parse the chunk as a JSON object. It will be a JSON object if there is an error.
- if (chunk.startsWith("{") && chunk.endsWith("}")) {
- try {
- const responseAsJson = JSON.parse(chunk);
- if (responseAsJson.image) {
- rawResponse += ``;
- }
- if (responseAsJson.detail) {
- rawResponse += responseAsJson.detail;
- }
- } catch (error) {
- // If the chunk is not a JSON object, just display it as is
- rawResponse += chunk;
- } finally {
- newResponseText.innerHTML = "";
- newResponseText.appendChild(formatHTMLMessage(rawResponse));
- }
- } else {
- // If the chunk is not a JSON object, just display it as is
- rawResponse += chunk;
- newResponseText.innerHTML = "";
- newResponseText.appendChild(formatHTMLMessage(rawResponse));
-
- readStream();
- }
}
+ } else {
+ // If the chunk is not a JSON object, just display it as is
+ rawResponse += chunk;
+ newResponseText.innerHTML = "";
+ newResponseText.appendChild(formatHTMLMessage(rawResponse));
- // Scroll to bottom of chat window as chat response is streamed
- document.getElementById("chat-body").scrollTop = document.getElementById("chat-body").scrollHeight;
- });
+ readStream();
+ }
}
- readStream();
+
+ // Scroll to bottom of chat window as chat response is streamed
+ document.getElementById("chat-body").scrollTop = document.getElementById("chat-body").scrollHeight;
});
+ }
+ readStream();
}
function incrementalChat(event) {
diff --git a/src/khoj/interface/web/chat.html b/src/khoj/interface/web/chat.html
index 97fdbebb..4a406a6b 100644
--- a/src/khoj/interface/web/chat.html
+++ b/src/khoj/interface/web/chat.html
@@ -309,7 +309,7 @@ To get started, just start typing below. You can also type / to see a list of co
return element
}
- function chat() {
+ async function chat() {
// Extract required fields for search from form
let query = document.getElementById("chat-input").value.trim();
let resultsCount = localStorage.getItem("khojResultsCount") || 5;
@@ -351,115 +351,113 @@ To get started, just start typing below. You can also type / to see a list of co
chatInput.classList.remove("option-enabled");
// Call specified Khoj API which returns a streamed response of type text/plain
- fetch(url)
- .then(response => {
- const reader = response.body.getReader();
- const decoder = new TextDecoder();
- let rawResponse = "";
- let references = null;
+ let response = await fetch(url);
+ const reader = response.body.getReader();
+ const decoder = new TextDecoder();
+ let rawResponse = "";
+ let references = null;
- function readStream() {
- reader.read().then(({ done, value }) => {
- if (done) {
- // Append any references after all the data has been streamed
- if (references != null) {
- newResponseText.appendChild(references);
- }
- document.getElementById("chat-body").scrollTop = document.getElementById("chat-body").scrollHeight;
- document.getElementById("chat-input").removeAttribute("disabled");
- return;
+ function readStream() {
+ reader.read().then(({ done, value }) => {
+ if (done) {
+ // Append any references after all the data has been streamed
+ if (references != null) {
+ newResponseText.appendChild(references);
+ }
+ document.getElementById("chat-body").scrollTop = document.getElementById("chat-body").scrollHeight;
+ document.getElementById("chat-input").removeAttribute("disabled");
+ return;
+ }
+
+ // Decode message chunk from stream
+ const chunk = decoder.decode(value, { stream: true });
+
+ if (chunk.includes("### compiled references:")) {
+ const additionalResponse = chunk.split("### compiled references:")[0];
+ rawResponse += additionalResponse;
+ newResponseText.innerHTML = "";
+ newResponseText.appendChild(formatHTMLMessage(rawResponse));
+
+ const rawReference = chunk.split("### compiled references:")[1];
+ const rawReferenceAsJson = JSON.parse(rawReference);
+ references = document.createElement('div');
+ references.classList.add("references");
+
+ let referenceExpandButton = document.createElement('button');
+ referenceExpandButton.classList.add("reference-expand-button");
+
+ let referenceSection = document.createElement('div');
+ referenceSection.classList.add("reference-section");
+ referenceSection.classList.add("collapsed");
+
+ let numReferences = 0;
+
+ // If rawReferenceAsJson is a list, then count the length
+ if (Array.isArray(rawReferenceAsJson)) {
+ numReferences = rawReferenceAsJson.length;
+
+ rawReferenceAsJson.forEach((reference, index) => {
+ let polishedReference = generateReference(reference, index);
+ referenceSection.appendChild(polishedReference);
+ });
+ } else {
+ numReferences += processOnlineReferences(referenceSection, rawReferenceAsJson);
+ }
+
+ references.appendChild(referenceExpandButton);
+
+ referenceExpandButton.addEventListener('click', function() {
+ if (referenceSection.classList.contains("collapsed")) {
+ referenceSection.classList.remove("collapsed");
+ referenceSection.classList.add("expanded");
+ } else {
+ referenceSection.classList.add("collapsed");
+ referenceSection.classList.remove("expanded");
}
+ });
- // Decode message chunk from stream
- const chunk = decoder.decode(value, { stream: true });
+ let expandButtonText = numReferences == 1 ? "1 reference" : `${numReferences} references`;
+ referenceExpandButton.innerHTML = expandButtonText;
+ references.appendChild(referenceSection);
+ readStream();
+ } else {
+ // Display response from Khoj
+ if (newResponseText.getElementsByClassName("spinner").length > 0) {
+ newResponseText.removeChild(loadingSpinner);
+ }
- if (chunk.includes("### compiled references:")) {
- const additionalResponse = chunk.split("### compiled references:")[0];
- rawResponse += additionalResponse;
+ // Try to parse the chunk as a JSON object. It will be a JSON object if there is an error.
+ if (chunk.startsWith("{") && chunk.endsWith("}")) {
+ try {
+ const responseAsJson = JSON.parse(chunk);
+ if (responseAsJson.image) {
+ rawResponse += ``;
+ }
+ if (responseAsJson.detail) {
+ rawResponse += responseAsJson.detail;
+ }
+ } catch (error) {
+ // If the chunk is not a JSON object, just display it as is
+ rawResponse += chunk;
+ } finally {
newResponseText.innerHTML = "";
newResponseText.appendChild(formatHTMLMessage(rawResponse));
-
- const rawReference = chunk.split("### compiled references:")[1];
- const rawReferenceAsJson = JSON.parse(rawReference);
- references = document.createElement('div');
- references.classList.add("references");
-
- let referenceExpandButton = document.createElement('button');
- referenceExpandButton.classList.add("reference-expand-button");
-
- let referenceSection = document.createElement('div');
- referenceSection.classList.add("reference-section");
- referenceSection.classList.add("collapsed");
-
- let numReferences = 0;
-
- // If rawReferenceAsJson is a list, then count the length
- if (Array.isArray(rawReferenceAsJson)) {
- numReferences = rawReferenceAsJson.length;
-
- rawReferenceAsJson.forEach((reference, index) => {
- let polishedReference = generateReference(reference, index);
- referenceSection.appendChild(polishedReference);
- });
- } else {
- numReferences += processOnlineReferences(referenceSection, rawReferenceAsJson);
- }
-
- references.appendChild(referenceExpandButton);
-
- referenceExpandButton.addEventListener('click', function() {
- if (referenceSection.classList.contains("collapsed")) {
- referenceSection.classList.remove("collapsed");
- referenceSection.classList.add("expanded");
- } else {
- referenceSection.classList.add("collapsed");
- referenceSection.classList.remove("expanded");
- }
- });
-
- let expandButtonText = numReferences == 1 ? "1 reference" : `${numReferences} references`;
- referenceExpandButton.innerHTML = expandButtonText;
- references.appendChild(referenceSection);
- readStream();
- } else {
- // Display response from Khoj
- if (newResponseText.getElementsByClassName("spinner").length > 0) {
- newResponseText.removeChild(loadingSpinner);
- }
-
- // Try to parse the chunk as a JSON object. It will be a JSON object if there is an error.
- if (chunk.startsWith("{") && chunk.endsWith("}")) {
- try {
- const responseAsJson = JSON.parse(chunk);
- if (responseAsJson.image) {
- rawResponse += ``;
- }
- if (responseAsJson.detail) {
- rawResponse += responseAsJson.detail;
- }
- } catch (error) {
- // If the chunk is not a JSON object, just display it as is
- rawResponse += chunk;
- } finally {
- newResponseText.innerHTML = "";
- newResponseText.appendChild(formatHTMLMessage(rawResponse));
- }
- } else {
- // If the chunk is not a JSON object, just display it as is
- rawResponse += chunk;
- newResponseText.innerHTML = "";
- newResponseText.appendChild(formatHTMLMessage(rawResponse));
- readStream();
- }
}
-
- // Scroll to bottom of chat window as chat response is streamed
- document.getElementById("chat-body").scrollTop = document.getElementById("chat-body").scrollHeight;
- });
+ } else {
+ // If the chunk is not a JSON object, just display it as is
+ rawResponse += chunk;
+ newResponseText.innerHTML = "";
+ newResponseText.appendChild(formatHTMLMessage(rawResponse));
+ readStream();
+ }
}
- readStream();
+
+ // Scroll to bottom of chat window as chat response is streamed
+ document.getElementById("chat-body").scrollTop = document.getElementById("chat-body").scrollHeight;
});
- }
+ }
+ readStream();
+ };
function incrementalChat(event) {
if (!event.shiftKey && event.key === 'Enter') {