feat: add IoD search

This commit is contained in:
Nex Zhu
2025-02-14 18:17:12 +08:00
parent 691575e449
commit e8471f1802
33 changed files with 524 additions and 104 deletions

View File

@@ -62,6 +62,7 @@ export const saveMessageOnError = async ({
userMessage,
[image],
[],
[],
1,
message_type
)
@@ -73,6 +74,7 @@ export const saveMessageOnError = async ({
botMessage,
[],
[],
[],
2,
message_type
)
@@ -91,6 +93,7 @@ export const saveMessageOnError = async ({
userMessage,
[image],
[],
[],
1,
message_type
)
@@ -102,6 +105,7 @@ export const saveMessageOnError = async ({
botMessage,
[],
[],
[],
2,
message_type
)
@@ -126,7 +130,8 @@ export const saveMessageOnSuccess = async ({
message,
image,
fullText,
source,
webSources,
iodSources,
message_source = "web-ui",
message_type, generationInfo,
prompt_id,
@@ -140,7 +145,8 @@ export const saveMessageOnSuccess = async ({
message: string
image: string
fullText: string
source: any[]
webSources: any[]
iodSources: any[]
message_source?: "copilot" | "web-ui",
message_type?: string
generationInfo?: any
@@ -157,6 +163,7 @@ export const saveMessageOnSuccess = async ({
message,
[image],
[],
[],
1,
message_type,
generationInfo,
@@ -169,7 +176,8 @@ export const saveMessageOnSuccess = async ({
"assistant",
fullText,
[],
source,
webSources,
iodSources,
2,
message_type,
generationInfo,
@@ -189,6 +197,7 @@ export const saveMessageOnSuccess = async ({
message,
[image],
[],
[],
1,
message_type,
generationInfo,
@@ -200,7 +209,8 @@ export const saveMessageOnSuccess = async ({
"assistant",
fullText,
[],
source,
webSources,
iodSources,
2,
message_type,
generationInfo,

View File

@@ -59,6 +59,8 @@ export const useMessage = () => {
setIsSearchingInternet,
webSearch,
setWebSearch,
iodSearch,
setIodSearch,
isSearchingInternet
} = useStoreMessageOption()
const [defaultInternetSearchOn] = useStorage("defaultInternetSearchOn", false)
@@ -185,14 +187,16 @@ export const useMessage = () => {
isBot: false,
name: "You",
message,
sources: [],
webSources: [],
iodSources: [],
images: []
},
{
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -203,7 +207,8 @@ export const useMessage = () => {
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -334,7 +339,16 @@ export const useMessage = () => {
}
let context: string = ""
let source: {
let webSources: {
name: any
type: any
mode: string
url: string
pageContent: string
metadata: Record<string, any>
}[] = []
// TODO: update type
let iodSources: {
name: any
type: any
mode: string
@@ -346,7 +360,7 @@ export const useMessage = () => {
if (chatWithWebsiteEmbedding) {
const docs = await vectorstore.similaritySearch(query, 4)
context = formatDocs(docs)
source = docs.map((doc) => {
webSources = docs.map((doc) => {
return {
...doc,
name: doc?.metadata?.source || "untitled",
@@ -365,7 +379,7 @@ export const useMessage = () => {
.slice(0, maxWebsiteContext)
}
source = [
webSources = [
{
name: embedURL,
type: type,
@@ -476,7 +490,8 @@ export const useMessage = () => {
return {
...message,
message: fullText,
sources: source,
webSources,
iodSources,
generationInfo,
reasoning_time_taken: timetaken
}
@@ -506,7 +521,8 @@ export const useMessage = () => {
message,
image,
fullText,
source,
webSources,
iodSources,
message_source: "copilot",
generationInfo,
reasoning_time_taken: timetaken
@@ -606,14 +622,16 @@ export const useMessage = () => {
isBot: false,
name: "You",
message,
sources: [],
webSources: [],
iodSources: [],
images: []
},
{
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -624,7 +642,8 @@ export const useMessage = () => {
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -787,7 +806,8 @@ export const useMessage = () => {
message,
image,
fullText,
source: [],
webSources: [],
iodSources: [],
message_source: "copilot",
generationInfo,
reasoning_time_taken: timetaken
@@ -891,14 +911,16 @@ export const useMessage = () => {
isBot: false,
name: "You",
message,
sources: [],
webSources: [],
iodSources: [],
images: [image]
},
{
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -909,7 +931,8 @@ export const useMessage = () => {
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -1077,7 +1100,8 @@ export const useMessage = () => {
message,
image,
fullText,
source: [],
webSources: [],
iodSources: [],
message_source: "copilot",
generationInfo,
reasoning_time_taken: timetaken
@@ -1114,12 +1138,14 @@ export const useMessage = () => {
}
const searchChatMode = async (
webSearch: boolean,
iodSearch,
message: string,
image: string,
isRegenerate: boolean,
messages: Message[],
history: ChatHistory,
signal: AbortSignal
signal: AbortSignal,
) => {
const url = await getOllamaURL()
setStreaming(true)
@@ -1176,14 +1202,16 @@ export const useMessage = () => {
isBot: false,
name: "You",
message,
sources: [],
webSources: [],
iodSources: [],
images: [image]
},
{
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -1194,7 +1222,8 @@ export const useMessage = () => {
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -1271,7 +1300,8 @@ export const useMessage = () => {
query = removeReasoning(query)
}
const { prompt, source } = await getSystemPromptForWeb(query)
const { prompt, webSources, iodSources } =
await getSystemPromptForWeb(query, [], webSearch, iodSearch)
setIsSearchingInternet(false)
// message = message.trim().replaceAll("\n", " ")
@@ -1394,7 +1424,8 @@ export const useMessage = () => {
return {
...message,
message: fullText,
sources: source,
webSources,
iodSources,
generationInfo,
reasoning_time_taken: timetaken
}
@@ -1424,7 +1455,8 @@ export const useMessage = () => {
message,
image,
fullText,
source,
webSources,
iodSources,
generationInfo,
reasoning_time_taken: timetaken
})
@@ -1523,7 +1555,8 @@ export const useMessage = () => {
isBot: false,
name: "You",
message,
sources: [],
webSources: [],
iodSources: [],
images: [image],
messageType: messageType
},
@@ -1531,7 +1564,8 @@ export const useMessage = () => {
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -1542,7 +1576,8 @@ export const useMessage = () => {
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -1688,7 +1723,8 @@ export const useMessage = () => {
message,
image,
fullText,
source: [],
webSources: [],
iodSources: [],
message_source: "copilot",
message_type: messageType,
generationInfo,
@@ -1766,14 +1802,16 @@ export const useMessage = () => {
)
} else {
if (chatMode === "normal") {
if (webSearch) {
if (webSearch || iodSearch) {
await searchChatMode(
webSearch,
iodSearch,
message,
image,
isRegenerate || false,
messages,
memory || history,
signal
signal,
)
} else {
await normalChatMode(
@@ -1906,6 +1944,8 @@ export const useMessage = () => {
regenerateLastMessage,
webSearch,
setWebSearch,
iodSearch,
setIodSearch,
isSearchingInternet,
selectedQuickPrompt,
setSelectedQuickPrompt,

View File

@@ -3,6 +3,7 @@ import { cleanUrl } from "~/libs/clean-url"
import {
defaultEmbeddingModelForRag,
geWebSearchFollowUpPrompt,
geWebSearchKeywordsPrompt,
getOllamaURL,
promptForRag,
systemPromptForNonRagOption
@@ -67,6 +68,8 @@ export const useMessageOption = () => {
setChatMode,
webSearch,
setWebSearch,
iodSearch,
setIodSearch,
isSearchingInternet,
setIsSearchingInternet,
selectedQuickPrompt,
@@ -111,6 +114,8 @@ export const useMessageOption = () => {
}
const searchChatMode = async (
webSearch: boolean,
iodSearch: boolean,
message: string,
image: string,
isRegenerate: boolean,
@@ -172,14 +177,16 @@ export const useMessageOption = () => {
isBot: false,
name: "You",
message,
sources: [],
webSources: [],
iodSources: [],
images: [image]
},
{
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -190,7 +197,8 @@ export const useMessageOption = () => {
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -204,6 +212,7 @@ export const useMessageOption = () => {
setIsSearchingInternet(true)
let query = message
let keywords: string[] = []
if (newMessage.length > 2) {
let questionPrompt = await geWebSearchFollowUpPrompt()
@@ -268,7 +277,23 @@ export const useMessageOption = () => {
query = removeReasoning(query)
}
const { prompt, source } = await getSystemPromptForWeb(query)
// Currently only IoD search use keywords
if (iodSearch) {
// Extract keywords
const questionPrompt = await geWebSearchKeywordsPrompt()
const promptForQuestion = questionPrompt.replaceAll("{query}", query)
const response = await ollama.invoke(promptForQuestion)
let res = response.content.toString()
res = removeReasoning(res)
keywords = res.replace(/^Keywords:/i, '').split(', ').map(k => k.trim())
}
const { prompt, webSources, iodSources } = await getSystemPromptForWeb(
query,
keywords,
webSearch,
iodSearch,
)
setIsSearchingInternet(false)
// message = message.trim().replaceAll("\n", " ")
@@ -390,7 +415,8 @@ export const useMessageOption = () => {
return {
...message,
message: fullText,
sources: source,
webSources,
iodSources,
generationInfo,
reasoning_time_taken: timetaken
}
@@ -420,7 +446,8 @@ export const useMessageOption = () => {
message,
image,
fullText,
source,
webSources,
iodSources,
generationInfo,
reasoning_time_taken: timetaken
})
@@ -552,14 +579,16 @@ export const useMessageOption = () => {
isBot: false,
name: "You",
message,
sources: [],
webSources: [],
iodSources: [],
images: [image]
},
{
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -570,7 +599,8 @@ export const useMessageOption = () => {
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -855,14 +885,16 @@ export const useMessageOption = () => {
isBot: false,
name: "You",
message,
sources: [],
webSources: [],
iodSources: [],
images: []
},
{
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -873,7 +905,8 @@ export const useMessageOption = () => {
isBot: true,
name: selectedModel,
message: "▋",
sources: [],
webSources: [],
iodSources: [],
id: generateMessageId
}
]
@@ -1076,7 +1109,7 @@ export const useMessageOption = () => {
return {
...message,
message: fullText,
sources: source,
webSources: source,
generationInfo,
reasoning_time_taken: timetaken
}
@@ -1175,8 +1208,10 @@ export const useMessageOption = () => {
signal
)
} else {
if (webSearch) {
if (webSearch || iodSearch) {
await searchChatMode(
webSearch,
iodSearch,
message,
image,
isRegenerate,
@@ -1311,6 +1346,8 @@ export const useMessageOption = () => {
regenerateLastMessage,
webSearch,
setWebSearch,
iodSearch,
setIodSearch,
isSearchingInternet,
setIsSearchingInternet,
selectedQuickPrompt,