feat: Update useMessage hook with website embedding options and improvements

This commit is contained in:
n4ze3m 2024-07-22 00:36:27 +05:30
parent 498f4a02d2
commit 9521707160

View File

@ -44,8 +44,16 @@ export const useMessage = () => {
const { t } = useTranslation("option") const { t } = useTranslation("option")
const [selectedModel, setSelectedModel] = useStorage("selectedModel") const [selectedModel, setSelectedModel] = useStorage("selectedModel")
const currentChatModelSettings = useStoreChatModelSettings() const currentChatModelSettings = useStoreChatModelSettings()
const { setIsSearchingInternet, webSearch, setWebSearch, isSearchingInternet } = const {
useStoreMessageOption() setIsSearchingInternet,
webSearch,
setWebSearch,
isSearchingInternet
} = useStoreMessageOption()
const [chatWithWebsiteEmbedding] = useStorage("chatWithWebsiteEmbedding", true)
const [maxWebsiteContext] = useStorage("maxWebsiteContext", 4028)
const { const {
history, history,
@ -150,35 +158,34 @@ export const useMessage = () => {
setMessages(newMessage) setMessages(newMessage)
let fullText = "" let fullText = ""
let contentToSave = "" let contentToSave = ""
let isAlreadyExistEmbedding: MemoryVectorStore
let embedURL: string, embedHTML: string, embedType: string let embedURL: string, embedHTML: string, embedType: string
let embedPDF: { content: string; page: number }[] = [] let embedPDF: { content: string; page: number }[] = []
let isAlreadyExistEmbedding: MemoryVectorStore
const {
content: html,
url: websiteUrl,
type,
pdf
} = await getDataFromCurrentTab()
embedHTML = html
embedURL = websiteUrl
embedType = type
embedPDF = pdf
console.log(embedHTML)
if (messages.length === 0) { if (messages.length === 0) {
const { content: html, url, type, pdf } = await getDataFromCurrentTab() setCurrentURL(websiteUrl)
embedHTML = html
embedURL = url
embedType = type
embedPDF = pdf
setCurrentURL(url)
isAlreadyExistEmbedding = keepTrackOfEmbedding[currentURL] isAlreadyExistEmbedding = keepTrackOfEmbedding[currentURL]
} else { } else {
const { content: html, url, type, pdf } = await getDataFromCurrentTab() if (currentURL !== websiteUrl) {
if (currentURL !== url) { setCurrentURL(websiteUrl)
embedHTML = html
embedURL = url
embedType = type
embedPDF = pdf
setCurrentURL(url)
} else { } else {
embedHTML = html
embedURL = currentURL embedURL = currentURL
embedType = type
embedPDF = pdf
} }
isAlreadyExistEmbedding = keepTrackOfEmbedding[url] isAlreadyExistEmbedding = keepTrackOfEmbedding[websiteUrl]
} }
setMessages(newMessage) setMessages(newMessage)
const ollamaUrl = await getOllamaURL() const ollamaUrl = await getOllamaURL()
const embeddingModle = await defaultEmbeddingModelForRag() const embeddingModle = await defaultEmbeddingModelForRag()
@ -198,17 +205,18 @@ export const useMessage = () => {
vectorstore = isAlreadyExistEmbedding vectorstore = isAlreadyExistEmbedding
console.log("Embedding already exist") console.log("Embedding already exist")
} else { } else {
vectorstore = await memoryEmbedding({ if (chatWithWebsiteEmbedding) {
html: embedHTML, vectorstore = await memoryEmbedding({
keepTrackOfEmbedding: keepTrackOfEmbedding, html: embedHTML,
ollamaEmbedding: ollamaEmbedding, keepTrackOfEmbedding: keepTrackOfEmbedding,
pdf: embedPDF, ollamaEmbedding: ollamaEmbedding,
setIsEmbedding: setIsEmbedding, pdf: embedPDF,
setKeepTrackOfEmbedding: setKeepTrackOfEmbedding, setIsEmbedding: setIsEmbedding,
type: embedType, setKeepTrackOfEmbedding: setKeepTrackOfEmbedding,
url: embedURL type: embedType,
}) url: embedURL
})
}
console.log("Embedding created") console.log("Embedding created")
} }
let query = message let query = message
@ -247,25 +255,59 @@ export const useMessage = () => {
query = response.content.toString() query = response.content.toString()
} }
const docs = await vectorstore.similaritySearch(query, 4) let context: string = ""
const context = formatDocs(docs) let source: {
const source = docs.map((doc) => { name: any
return { type: any
...doc, mode: string
name: doc?.metadata?.source || "untitled", url: string
type: doc?.metadata?.type || "unknown", pageContent: string
mode: "chat", metadata: Record<string, any>
url: "" }[] = []
if (chatWithWebsiteEmbedding) {
const docs = await vectorstore.similaritySearch(query, 4)
context = formatDocs(docs)
source = docs.map((doc) => {
return {
...doc,
name: doc?.metadata?.source || "untitled",
type: doc?.metadata?.type || "unknown",
mode: "chat",
url: ""
}
})
} else {
if (type === "html") {
context = embedHTML.slice(0, maxWebsiteContext)
} else {
context = embedPDF
.map((pdf) => pdf.content)
.join(" ")
.slice(0, maxWebsiteContext)
} }
})
// message = message.trim().replaceAll("\n", " ") source = [
{
name: embedURL,
type: type,
mode: "chat",
url: embedURL,
pageContent: context,
metadata: {
source: embedURL,
url: embedURL
}
}
]
}
let humanMessage = new HumanMessage({ let humanMessage = new HumanMessage({
content: [ content: [
{ {
text: systemPrompt text: systemPrompt
.replace("{context}", context) .replace("{context}", context)
.replace("{question}", message), .replace("{question}", query),
type: "text" type: "text"
} }
] ]
@ -299,7 +341,7 @@ export const useMessage = () => {
}) })
count++ count++
} }
// update the message with the full text
setMessages((prev) => { setMessages((prev) => {
return prev.map((message) => { return prev.map((message) => {
if (message.id === generateMessageId) { if (message.id === generateMessageId) {
@ -976,6 +1018,6 @@ export const useMessage = () => {
regenerateLastMessage, regenerateLastMessage,
webSearch, webSearch,
setWebSearch, setWebSearch,
isSearchingInternet, isSearchingInternet
} }
} }