diff --git a/src/hooks/useMessageOption.tsx b/src/hooks/useMessageOption.tsx index 322ed31..bfdb588 100644 --- a/src/hooks/useMessageOption.tsx +++ b/src/hooks/useMessageOption.tsx @@ -8,7 +8,7 @@ import { promptForRag, systemPromptForNonRagOption } from "~/services/ollama" -import { type ChatHistory, type Message } from "~/store/option" +import { type ChatHistory, ChatMessage, type Message } from "~/store/option" import { SystemMessage } from "@langchain/core/messages" import { useStoreMessageOption } from "~/store/option" import { @@ -55,6 +55,8 @@ export const useMessageOption = () => { const { history, setHistory, + chatMessages, + setChatMessages, setStreaming, streaming, setIsFirstMessage, @@ -112,6 +114,26 @@ export const useMessageOption = () => { setWebSearch(true) } } + // 从最后的结果中解析出 思维链 和 结果 + const responseResolver = (msg: string) => { + const thinkStart = msg.indexOf("") + const thinkEnd = msg.indexOf("") + let think = "" + let content = "" + if (thinkStart > -1 && thinkEnd > -1) { + think = msg.substring(thinkStart + 7, thinkEnd) + content = msg.substring(thinkEnd + 8) + } else { + content = msg + } + // 去掉换行符 + think = think.replace(/\n/g, "") + content = content.replace(/\n/g, "") + return { + think, + content + } + } const searchChatMode = async ( webSearch: boolean, @@ -166,9 +188,12 @@ export const useMessageOption = () => { useMlock: currentChatModelSettings?.useMlock ?? userDefaultModelSettings?.useMlock }) - let newMessage: Message[] = [] let generateMessageId = generateID() + const chatMessage: ChatMessage = { + id: generateMessageId, + queryContent: message + } as ChatMessage if (!isRegenerate) { newMessage = [ @@ -285,17 +310,21 @@ export const useMessageOption = () => { const response = await ollama.invoke(promptForQuestion) let res = response.content.toString() res = removeReasoning(res) - keywords = res.replace(/^Keywords:/i, '').split(', ').map(k => k.trim()) + keywords = res + .replace(/^Keywords:/i, "") + .split(", ") + .map((k) => k.trim()) } const { prompt, webSources, iodSources } = await getSystemPromptForWeb( query, keywords, webSearch, - iodSearch, + iodSearch ) - console.log("prompt:\n"+prompt); + console.log("prompt:\n" + prompt) setIsSearchingInternet(false) + chatMessage.prompt = prompt // message = message.trim().replaceAll("\n", " ") @@ -455,6 +484,14 @@ export const useMessageOption = () => { setIsProcessing(false) setStreaming(false) + + chatMessage.relatedDataCount = keywords.length + chatMessage.timeTaken = timetaken + chatMessage.date = reasoningStartTime + const { think, content } = responseResolver(fullText) + chatMessage.thinkingChain = think + chatMessage.responseContent = content + setChatMessages([...chatMessages, chatMessage]) } catch (e) { const errorSave = await saveMessageOnError({ e, @@ -567,7 +604,7 @@ export const useMessageOption = () => { currentChatModelSettings?.numThread ?? userDefaultModelSettings?.numThread, useMlock: - currentChatModelSettings?.useMlock ?? userDefaultModelSettings?.useMlock + currentChatModelSettings?.useMlock ?? userDefaultModelSettings?.useMlock, }) let newMessage: Message[] = [] diff --git a/src/store/option.tsx b/src/store/option.tsx index 28dd41c..9266c59 100644 --- a/src/store/option.tsx +++ b/src/store/option.tsx @@ -26,15 +26,43 @@ export type Message = { export type ChatHistory = { role: "user" | "assistant" | "system" content: string - image?: string, + image?: string messageType?: string }[] +export type ChatMessage = { + id: string + // 问题 + queryContent: string + // 提示词全文 + prompt: string + // 思维链(只有深度思考时有) + thinkingChain?: string + // 回答 + responseContent: string + // 关联数据个数 + relatedDataCount: number + // 数联网输入token + iodInputToken: string + // 数联网输出token + iodOutputToken: string + // 大模型输入token + modelInputToken: string + // 大模型输出token + modelOutputToken: string + // 日期 + date: Date + // 耗时 + timeTaken: number +} + type State = { messages: Message[] setMessages: (messages: Message[]) => void history: ChatHistory setHistory: (history: ChatHistory) => void + chatMessages: ChatMessage[] + setChatMessages: (chatMessages: ChatMessage[]) => void streaming: boolean setStreaming: (streaming: boolean) => void isFirstMessage: boolean @@ -82,6 +110,8 @@ export const useStoreMessageOption = create((set) => ({ setMessages: (messages) => set({ messages }), history: [], setHistory: (history) => set({ history }), + chatMessages: [], + setChatMessages: (chatMessages) => set({ chatMessages }), streaming: false, setStreaming: (streaming) => set({ streaming }), isFirstMessage: true, @@ -120,5 +150,5 @@ export const useStoreMessageOption = create((set) => ({ setTemporaryChat: (temporaryChat) => set({ temporaryChat }), useOCR: false, - setUseOCR: (useOCR) => set({ useOCR }), + setUseOCR: (useOCR) => set({ useOCR }) }))