feat: Add reasoning UI

This commit is contained in:
n4ze3m
2025-01-24 22:29:18 +05:30
parent b39d60fc3c
commit 97daaf9dc2
31 changed files with 461 additions and 72 deletions

View File

@@ -36,6 +36,7 @@ import { humanMessageFormatter } from "@/utils/human-message"
import { pageAssistEmbeddingModel } from "@/models/embedding"
import { PAMemoryVectorStore } from "@/libs/PAMemoryVectorStore"
import { getScreenshotFromCurrentTab } from "@/libs/get-screenshot"
import { isReasoningEnded, isReasoningStarted, removeReasoning } from "@/libs/reasoning"
export const useMessage = () => {
const {
@@ -55,14 +56,9 @@ export const useMessage = () => {
setWebSearch,
isSearchingInternet
} = useStoreMessageOption()
const [defaultInternetSearchOn, ] = useStorage(
"defaultInternetSearchOn",
false
)
const [defaultInternetSearchOn] = useStorage("defaultInternetSearchOn", false)
const [
defaultChatWithWebsite,
] = useStorage("defaultChatWithWebsite", false)
const [defaultChatWithWebsite] = useStorage("defaultChatWithWebsite", false)
const [chatWithWebsiteEmbedding] = useStorage(
"chatWithWebsiteEmbedding",
@@ -115,10 +111,10 @@ export const useMessage = () => {
setIsProcessing(false)
setStreaming(false)
currentChatModelSettings.reset()
if(defaultInternetSearchOn) {
if (defaultInternetSearchOn) {
setWebSearch(true)
}
if(defaultChatWithWebsite) {
if (defaultChatWithWebsite) {
setChatMode("rag")
}
}
@@ -329,6 +325,7 @@ export const useMessage = () => {
})
const response = await questionOllama.invoke(promptForQuestion)
query = response.content.toString()
query = removeReasoning(query)
}
let context: string = ""
@@ -413,18 +410,36 @@ export const useMessage = () => {
}
)
let count = 0
let reasoningStartTime: Date | null = null
let reasoningEndTime: Date | null = null
let timetaken = 0
for await (const chunk of chunks) {
contentToSave += chunk?.content
fullText += chunk?.content
if (count === 0) {
setIsProcessing(true)
}
if (isReasoningStarted(fullText) && !reasoningStartTime) {
reasoningStartTime = new Date()
}
if (
reasoningStartTime &&
!reasoningEndTime &&
isReasoningEnded(fullText)
) {
reasoningEndTime = new Date()
const reasoningTime =
reasoningEndTime.getTime() - reasoningStartTime.getTime()
timetaken = reasoningTime
}
setMessages((prev) => {
return prev.map((message) => {
if (message.id === generateMessageId) {
return {
...message,
message: fullText + "▋"
message: fullText + "▋",
reasoning_time_taken: timetaken
}
}
return message
@@ -440,7 +455,8 @@ export const useMessage = () => {
...message,
message: fullText,
sources: source,
generationInfo
generationInfo,
reasoning_time_taken: timetaken
}
}
return message
@@ -470,7 +486,8 @@ export const useMessage = () => {
fullText,
source,
message_source: "copilot",
generationInfo
generationInfo,
reasoning_time_taken: timetaken
})
setIsProcessing(false)
@@ -664,18 +681,36 @@ export const useMessage = () => {
}
)
let count = 0
let reasoningStartTime: Date | undefined = undefined
let reasoningEndTime: Date | undefined = undefined
let timetaken = 0
for await (const chunk of chunks) {
contentToSave += chunk?.content
fullText += chunk?.content
if (count === 0) {
setIsProcessing(true)
}
if (isReasoningStarted(fullText) && !reasoningStartTime) {
reasoningStartTime = new Date()
}
if (
reasoningStartTime &&
!reasoningEndTime &&
isReasoningEnded(fullText)
) {
reasoningEndTime = new Date()
const reasoningTime =
reasoningEndTime.getTime() - reasoningStartTime.getTime()
timetaken = reasoningTime
}
setMessages((prev) => {
return prev.map((message) => {
if (message.id === generateMessageId) {
return {
...message,
message: fullText + "▋"
message: fullText + "▋",
reasoning_time_taken: timetaken
}
}
return message
@@ -689,7 +724,8 @@ export const useMessage = () => {
return {
...message,
message: fullText,
generationInfo
generationInfo,
reasoning_time_taken: timetaken
}
}
return message
@@ -718,7 +754,8 @@ export const useMessage = () => {
fullText,
source: [],
message_source: "copilot",
generationInfo
generationInfo,
reasoning_time_taken: timetaken
})
setIsProcessing(false)
@@ -914,18 +951,37 @@ export const useMessage = () => {
}
)
let count = 0
let reasoningStartTime: Date | null = null
let reasoningEndTime: Date | null = null
let timetaken = 0
for await (const chunk of chunks) {
contentToSave += chunk?.content
fullText += chunk?.content
if (count === 0) {
setIsProcessing(true)
}
if (isReasoningStarted(fullText) && !reasoningStartTime) {
reasoningStartTime = new Date()
}
if (
reasoningStartTime &&
!reasoningEndTime &&
isReasoningEnded(fullText)
) {
reasoningEndTime = new Date()
const reasoningTime =
reasoningEndTime.getTime() - reasoningStartTime.getTime()
timetaken = reasoningTime
}
setMessages((prev) => {
return prev.map((message) => {
if (message.id === generateMessageId) {
return {
...message,
message: fullText + "▋"
message: fullText + "▋",
reasoning_time_taken: timetaken
}
}
return message
@@ -940,7 +996,8 @@ export const useMessage = () => {
return {
...message,
message: fullText,
generationInfo
generationInfo,
reasoning_time_taken: timetaken
}
}
return message
@@ -970,7 +1027,8 @@ export const useMessage = () => {
fullText,
source: [],
message_source: "copilot",
generationInfo
generationInfo,
reasoning_time_taken: timetaken
})
setIsProcessing(false)
@@ -1158,6 +1216,7 @@ export const useMessage = () => {
})
const response = await questionOllama.invoke(promptForQuestion)
query = response.content.toString()
query = removeReasoning(query)
}
const { prompt, source } = await getSystemPromptForWeb(query)
@@ -1221,18 +1280,37 @@ export const useMessage = () => {
}
)
let count = 0
let timetaken = 0
let reasoningStartTime: Date | undefined = undefined
let reasoningEndTime: Date | undefined = undefined
for await (const chunk of chunks) {
contentToSave += chunk?.content
fullText += chunk?.content
if (count === 0) {
setIsProcessing(true)
}
if (isReasoningStarted(fullText) && !reasoningStartTime) {
reasoningStartTime = new Date()
}
if (
reasoningStartTime &&
!reasoningEndTime &&
isReasoningEnded(fullText)
) {
reasoningEndTime = new Date()
const reasoningTime =
reasoningEndTime.getTime() - reasoningStartTime.getTime()
timetaken = reasoningTime
}
setMessages((prev) => {
return prev.map((message) => {
if (message.id === generateMessageId) {
return {
...message,
message: fullText + "▋"
message: fullText + "▋",
reasoning_time_taken: timetaken
}
}
return message
@@ -1248,7 +1326,8 @@ export const useMessage = () => {
...message,
message: fullText,
sources: source,
generationInfo
generationInfo,
reasoning_time_taken: timetaken
}
}
return message
@@ -1277,7 +1356,8 @@ export const useMessage = () => {
image,
fullText,
source,
generationInfo
generationInfo,
reasoning_time_taken: timetaken
})
setIsProcessing(false)
@@ -1448,18 +1528,36 @@ export const useMessage = () => {
]
})
let count = 0
let reasoningStartTime: Date | null = null
let reasoningEndTime: Date | null = null
let timetaken = 0
for await (const chunk of chunks) {
contentToSave += chunk?.content
fullText += chunk?.content
if (count === 0) {
setIsProcessing(true)
}
if (isReasoningStarted(fullText) && !reasoningStartTime) {
reasoningStartTime = new Date()
}
if (
reasoningStartTime &&
!reasoningEndTime &&
isReasoningEnded(fullText)
) {
reasoningEndTime = new Date()
const reasoningTime =
reasoningEndTime.getTime() - reasoningStartTime.getTime()
timetaken = reasoningTime
}
setMessages((prev) => {
return prev.map((message) => {
if (message.id === generateMessageId) {
return {
...message,
message: fullText + "▋"
message: fullText + "▋",
reasoning_time_taken: timetaken
}
}
return message
@@ -1474,7 +1572,8 @@ export const useMessage = () => {
return {
...message,
message: fullText,
generationInfo
generationInfo,
reasoning_time_taken: timetaken
}
}
return message
@@ -1506,7 +1605,8 @@ export const useMessage = () => {
source: [],
message_source: "copilot",
message_type: messageType,
generationInfo
generationInfo,
reasoning_time_taken: timetaken
})
setIsProcessing(false)