mirror of
https://github.com/khoj-ai/khoj.git
synced 2025-02-17 08:04:21 +00:00
Fix, Improve rendering images in Obsidian, Desktop, Web clients (#659)
- Improve render of inferred query in image chat messages in Web, Desktop apps - Add inferred queries to image chat responses in Obsidian client - Fix rendering images from Khoj response in Obsidian client
This commit is contained in:
commit
170bce2c02
3 changed files with 39 additions and 24 deletions
|
@ -199,10 +199,9 @@
|
||||||
function renderMessageWithReference(message, by, context=null, dt=null, onlineContext=null, intentType=null, inferredQueries=null) {
|
function renderMessageWithReference(message, by, context=null, dt=null, onlineContext=null, intentType=null, inferredQueries=null) {
|
||||||
if (intentType === "text-to-image") {
|
if (intentType === "text-to-image") {
|
||||||
let imageMarkdown = `![](data:image/png;base64,${message})`;
|
let imageMarkdown = `![](data:image/png;base64,${message})`;
|
||||||
imageMarkdown += "\n\n";
|
const inferredQuery = inferredQueries?.[0];
|
||||||
if (inferredQueries) {
|
if (inferredQuery) {
|
||||||
const inferredQuery = inferredQueries?.[0];
|
imageMarkdown += `\n\n**Inferred Query**:\n\n${inferredQuery}`;
|
||||||
imageMarkdown += `**Inferred Query**: ${inferredQuery}`;
|
|
||||||
}
|
}
|
||||||
renderMessage(imageMarkdown, by, dt);
|
renderMessage(imageMarkdown, by, dt);
|
||||||
return;
|
return;
|
||||||
|
@ -392,10 +391,9 @@
|
||||||
if (responseAsJson.image) {
|
if (responseAsJson.image) {
|
||||||
// If response has image field, response is a generated image.
|
// If response has image field, response is a generated image.
|
||||||
rawResponse += `![${query}](data:image/png;base64,${responseAsJson.image})`;
|
rawResponse += `![${query}](data:image/png;base64,${responseAsJson.image})`;
|
||||||
rawResponse += "\n\n";
|
|
||||||
const inferredQueries = responseAsJson.inferredQueries?.[0];
|
const inferredQueries = responseAsJson.inferredQueries?.[0];
|
||||||
if (inferredQueries) {
|
if (inferredQueries) {
|
||||||
rawResponse += `**Inferred Query**: ${inferredQueries}`;
|
rawResponse += `\n\n**Inferred Query**:\n\n${inferredQueries}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (responseAsJson.detail) {
|
if (responseAsJson.detail) {
|
||||||
|
@ -496,10 +494,9 @@
|
||||||
if (responseAsJson.image) {
|
if (responseAsJson.image) {
|
||||||
// If response has image field, response is a generated image.
|
// If response has image field, response is a generated image.
|
||||||
rawResponse += `![${query}](data:image/png;base64,${responseAsJson.image})`;
|
rawResponse += `![${query}](data:image/png;base64,${responseAsJson.image})`;
|
||||||
rawResponse += "\n\n";
|
const inferredQuery = responseAsJson.inferredQueries?.[0];
|
||||||
const inferredQueries = responseAsJson.inferredQueries?.[0];
|
if (inferredQuery) {
|
||||||
if (inferredQueries) {
|
rawResponse += `\n\n**Inferred Query**:\n\n${inferredQuery}`;
|
||||||
rawResponse += `**Inferred Query**: ${inferredQueries}`;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (responseAsJson.detail) {
|
if (responseAsJson.detail) {
|
||||||
|
|
|
@ -4,6 +4,8 @@ import { KhojSetting } from 'src/settings';
|
||||||
export interface ChatJsonResult {
|
export interface ChatJsonResult {
|
||||||
image?: string;
|
image?: string;
|
||||||
detail?: string;
|
detail?: string;
|
||||||
|
intentType?: string;
|
||||||
|
inferredQueries?: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -145,11 +147,17 @@ export class KhojChatModal extends Modal {
|
||||||
return referenceButton;
|
return referenceButton;
|
||||||
}
|
}
|
||||||
|
|
||||||
renderMessageWithReferences(chatEl: Element, message: string, sender: string, context?: string[], dt?: Date, intentType?: string) {
|
renderMessageWithReferences(chatEl: Element, message: string, sender: string, context?: string[], dt?: Date, intentType?: string, inferredQueries?: string) {
|
||||||
if (!message) {
|
if (!message) {
|
||||||
return;
|
return;
|
||||||
} else if (intentType === "text-to-image") {
|
} else if (intentType === "text-to-image") {
|
||||||
let imageMarkdown = `![](data:image/png;base64,${message})`;
|
let imageMarkdown = `![](data:image/png;base64,${message})`;
|
||||||
|
if (inferredQueries) {
|
||||||
|
imageMarkdown += "\n\n**Inferred Query**:";
|
||||||
|
for (let inferredQuery of inferredQueries) {
|
||||||
|
imageMarkdown += `\n\n${inferredQuery}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
this.renderMessage(chatEl, imageMarkdown, sender, dt);
|
this.renderMessage(chatEl, imageMarkdown, sender, dt);
|
||||||
return;
|
return;
|
||||||
} else if (!context) {
|
} else if (!context) {
|
||||||
|
@ -287,7 +295,15 @@ export class KhojChatModal extends Modal {
|
||||||
} else if (responseJson.response) {
|
} else if (responseJson.response) {
|
||||||
let chatLogs = responseJson.response?.conversation_id ? responseJson.response.chat ?? [] : responseJson.response;
|
let chatLogs = responseJson.response?.conversation_id ? responseJson.response.chat ?? [] : responseJson.response;
|
||||||
chatLogs.forEach((chatLog: any) => {
|
chatLogs.forEach((chatLog: any) => {
|
||||||
this.renderMessageWithReferences(chatBodyEl, chatLog.message, chatLog.by, chatLog.context, new Date(chatLog.created), chatLog.intent?.type);
|
this.renderMessageWithReferences(
|
||||||
|
chatBodyEl,
|
||||||
|
chatLog.message,
|
||||||
|
chatLog.by,
|
||||||
|
chatLog.context,
|
||||||
|
new Date(chatLog.created),
|
||||||
|
chatLog.intent?.type,
|
||||||
|
chatLog.intent?.["inferred-queries"],
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -398,12 +414,16 @@ export class KhojChatModal extends Modal {
|
||||||
// Reset collated chat result to empty string
|
// Reset collated chat result to empty string
|
||||||
this.result = "";
|
this.result = "";
|
||||||
responseElement.innerHTML = "";
|
responseElement.innerHTML = "";
|
||||||
if (response.headers.get("content-type") == "application/json") {
|
if (response.headers.get("content-type") === "application/json") {
|
||||||
let responseText = ""
|
let responseText = ""
|
||||||
try {
|
try {
|
||||||
const responseAsJson = await response.json() as ChatJsonResult;
|
const responseAsJson = await response.json() as ChatJsonResult;
|
||||||
if (responseAsJson.image) {
|
if (responseAsJson.image) {
|
||||||
responseText = `![${query}](data:image/png;base64,${responseAsJson.image})`;
|
responseText = `![${query}](data:image/png;base64,${responseAsJson.image})`;
|
||||||
|
const inferredQuery = responseAsJson.inferredQueries?.[0];
|
||||||
|
if (inferredQuery) {
|
||||||
|
responseText += `\n\n**Inferred Query**:\n\n${inferredQuery}`;
|
||||||
|
}
|
||||||
} else if (responseAsJson.detail) {
|
} else if (responseAsJson.detail) {
|
||||||
responseText = responseAsJson.detail;
|
responseText = responseAsJson.detail;
|
||||||
}
|
}
|
||||||
|
@ -413,10 +433,10 @@ export class KhojChatModal extends Modal {
|
||||||
} finally {
|
} finally {
|
||||||
await this.renderIncrementalMessage(responseElement, responseText);
|
await this.renderIncrementalMessage(responseElement, responseText);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// Stream and render chat response
|
||||||
|
await this.readChatStream(response, responseElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stream and render chat response
|
|
||||||
await this.readChatStream(response, responseElement);
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(`Khoj chat response failed with\n${err}`);
|
console.log(`Khoj chat response failed with\n${err}`);
|
||||||
let errorMsg = "Sorry, unable to get response from Khoj backend ❤️🩹. Retry or contact developers for help at <a href=mailto:'team@khoj.dev'>team@khoj.dev</a> or <a href='https://discord.gg/BDgyabRM6e'>on Discord</a>";
|
let errorMsg = "Sorry, unable to get response from Khoj backend ❤️🩹. Retry or contact developers for help at <a href=mailto:'team@khoj.dev'>team@khoj.dev</a> or <a href='https://discord.gg/BDgyabRM6e'>on Discord</a>";
|
||||||
|
|
|
@ -211,10 +211,9 @@ To get started, just start typing below. You can also type / to see a list of co
|
||||||
function renderMessageWithReference(message, by, context=null, dt=null, onlineContext=null, intentType=null, inferredQueries=null) {
|
function renderMessageWithReference(message, by, context=null, dt=null, onlineContext=null, intentType=null, inferredQueries=null) {
|
||||||
if (intentType === "text-to-image") {
|
if (intentType === "text-to-image") {
|
||||||
let imageMarkdown = `![](data:image/png;base64,${message})`;
|
let imageMarkdown = `![](data:image/png;base64,${message})`;
|
||||||
imageMarkdown += "\n\n";
|
const inferredQuery = inferredQueries?.[0];
|
||||||
if (inferredQueries) {
|
if (inferredQuery) {
|
||||||
const inferredQuery = inferredQueries?.[0];
|
imageMarkdown += `\n\n**Inferred Query**:\n\n${inferredQuery}`;
|
||||||
imageMarkdown += `**Inferred Query**: ${inferredQuery}`;
|
|
||||||
}
|
}
|
||||||
renderMessage(imageMarkdown, by, dt);
|
renderMessage(imageMarkdown, by, dt);
|
||||||
return;
|
return;
|
||||||
|
@ -400,10 +399,9 @@ To get started, just start typing below. You can also type / to see a list of co
|
||||||
if (responseAsJson.image) {
|
if (responseAsJson.image) {
|
||||||
// If response has image field, response is a generated image.
|
// If response has image field, response is a generated image.
|
||||||
rawResponse += `![${query}](data:image/png;base64,${responseAsJson.image})`;
|
rawResponse += `![${query}](data:image/png;base64,${responseAsJson.image})`;
|
||||||
rawResponse += "\n\n";
|
const inferredQuery = responseAsJson.inferredQueries?.[0];
|
||||||
const inferredQueries = responseAsJson.inferredQueries?.[0];
|
if (inferredQuery) {
|
||||||
if (inferredQueries) {
|
rawResponse += `\n\n**Inferred Query**:\n\n${inferredQuery}`;
|
||||||
rawResponse += `**Inferred Query**: ${inferredQueries}`;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (responseAsJson.detail) {
|
if (responseAsJson.detail) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue