From f331df36b00ea300e09be62491f13e1a34154311 Mon Sep 17 00:00:00 2001 From: Ethan-Zhang Date: Thu, 6 Nov 2025 15:53:23 +0800 Subject: [PATCH] =?UTF-8?q?Fix:=20=E7=94=A8=E6=88=B7=E5=81=8F=E5=A5=BD?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8F=90=E5=89=8D=E5=88=B0=E9=A1=B6=E5=B1=82?= =?UTF-8?q?&=E6=9C=80=E6=96=B0=E5=AF=B9=E8=AF=9D=E5=8F=AF=E8=AF=84?= =?UTF-8?q?=E4=BB=B7&=E6=B6=88=E6=81=AF=E4=B8=AD=E5=BF=83=E5=86=97?= =?UTF-8?q?=E4=BD=99=E9=87=8D=E6=9F=A5=E9=81=BF=E5=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 9 ++- src/apis/paths/account.ts | 12 ++++ src/store/conversation.ts | 26 +++++++++ src/store/userPreferences.ts | 58 +++++++++++++++++++ .../dialogue/components/MessageDetail.vue | 5 -- src/views/settings/Model.vue | 40 +------------ 6 files changed, 105 insertions(+), 45 deletions(-) diff --git a/src/App.vue b/src/App.vue index cc38a157..b7d445bf 100644 --- a/src/App.vue +++ b/src/App.vue @@ -3,11 +3,15 @@ import { ref, onMounted } from 'vue'; import LinuxTitleBar from '@/components/LinuxTitleBar.vue'; import '@vue-flow/core/dist/style.css'; import '@vue-flow/core/dist/theme-default.css'; +import { useUserPreferencesStore } from '@/store/userPreferences'; // 平台检测 const isLinuxPlatform = ref(false); -onMounted(() => { +// 用户偏好设置 store +const userPreferencesStore = useUserPreferencesStore(); + +onMounted(async () => { // 检测平台 if (window.electronProcess?.platform === 'linux') { isLinuxPlatform.value = true; @@ -15,6 +19,9 @@ onMounted(() => { if (window.electronProcess?.platform) { document.body.classList.add('electron-env'); } + + // 初始化用户偏好设置(同步到 localStorage) + await userPreferencesStore.getUserPreferences(); }); diff --git a/src/apis/paths/account.ts b/src/apis/paths/account.ts index 55ef3f65..b7d80e6f 100644 --- a/src/apis/paths/account.ts +++ b/src/apis/paths/account.ts @@ -169,6 +169,16 @@ export const getUserPreferences = (): Promise< apiKey?: string; name?: string; }; + functionCallModelPreference?: { + llmId: string; + icon?: string; + openaiBaseUrl: string; + openaiApiKey: string; + modelName: string; + maxTokens: number; + isEditable?: boolean; + }; + searchMethodPreference?: string; chainOfThoughtPreference?: boolean; autoExecutePreference?: boolean; }> @@ -188,6 +198,8 @@ export const updateUserPreferences = (preferences: { reasoningModelPreference?: any; embeddingModelPreference?: any; rerankerPreference?: any; + functionCallModelPreference?: any; + searchMethodPreference?: string; chainOfThoughtPreference?: boolean; autoExecutePreference?: boolean; }): Promise<[any, FcResponse | undefined]> => { diff --git a/src/store/conversation.ts b/src/store/conversation.ts index c015c668..3570c8ff 100644 --- a/src/store/conversation.ts +++ b/src/store/conversation.ts @@ -306,6 +306,32 @@ export const useSessionStore = defineStore('conversation', () => { conversationItem: RobotConversationItem, ) => { const rawMsgData = msgData.data as string; + + // 处理 [RECORD_ID] 事件 - 格式: data: [RECORD_ID]{record_id} + if (rawMsgData && rawMsgData.includes('[RECORD_ID]')) { + try { + // 提取 [RECORD_ID] 后面的内容,格式为 {record_id} + const match = rawMsgData.match(/\[RECORD_ID\](.+)/); + if (match && match[1]) { + const recordIdStr = match[1].trim(); + // 移除花括号提取 record_id + const recordId = recordIdStr.replace(/[{}]/g, ''); + if (recordId && conversationItem.messageList) { + // 更新当前回答的 record_id + const items = conversationItem.messageList.getAllItems(); + if (items && items[conversationItem.currentInd]) { + items[conversationItem.currentInd].record_id = recordId; + } + // 同时更新 recordId 字段 + conversationItem.recordId = recordId; + } + } + } catch (error) { + console.error('Failed to parse [RECORD_ID] event:', error); + } + return; + } + if (rawMsgData === '[DONE]') { dataTransfers.dataDone(conversationItem, !!params.type); return; diff --git a/src/store/userPreferences.ts b/src/store/userPreferences.ts index 47dd8fab..8ce3aaaf 100644 --- a/src/store/userPreferences.ts +++ b/src/store/userPreferences.ts @@ -10,6 +10,7 @@ import { defineStore } from 'pinia'; import { reactive, ref } from 'vue'; import { api } from 'src/apis'; +import { saveUserPreferences, type UserPreferences as LocalUserPreferences } from '@/utils/userPreferences'; export interface ReasoningModelPreference { llmId: string; @@ -44,6 +45,8 @@ export interface UserPreferences { reasoningModelPreference?: ReasoningModelPreference; embeddingModelPreference?: EmbeddingModelPreference; rerankerPreference?: RerankerModelPreference; + functionCallModelPreference?: ReasoningModelPreference; + searchMethodPreference?: string; chainOfThoughtPreference?: boolean; autoExecutePreference?: boolean; } @@ -54,6 +57,8 @@ export const useUserPreferencesStore = defineStore('userPreferences', () => { reasoningModelPreference: undefined, embeddingModelPreference: undefined, rerankerPreference: undefined, + functionCallModelPreference: undefined, + searchMethodPreference: undefined, chainOfThoughtPreference: undefined, autoExecutePreference: undefined, }); @@ -70,6 +75,57 @@ export const useUserPreferencesStore = defineStore('userPreferences', () => { const [_, res] = await api.getUserPreferences(); if (!_ && res) { Object.assign(preferences, res.result); + + // 同步到 localStorage,供 iframe 中的应用使用 + const serverPrefs = res.result; + const localPreferences: LocalUserPreferences = {}; + + if (serverPrefs?.reasoningModelPreference) { + localPreferences.reasoningModelPreference = { + llmId: serverPrefs.reasoningModelPreference.llmId, + modelName: serverPrefs.reasoningModelPreference.modelName, + icon: serverPrefs.reasoningModelPreference.icon + }; + } + + if (serverPrefs?.embeddingModelPreference) { + localPreferences.embeddingModelPreference = { + llmId: serverPrefs.embeddingModelPreference.llmId, + modelName: serverPrefs.embeddingModelPreference.modelName, + icon: serverPrefs.embeddingModelPreference.icon + }; + } + + if (serverPrefs?.rerankerPreference) { + localPreferences.rerankerPreference = { + llmId: serverPrefs.rerankerPreference.llmId, + modelName: serverPrefs.rerankerPreference.modelName, + icon: serverPrefs.rerankerPreference.icon + }; + } + + if (serverPrefs?.functionCallModelPreference) { + localPreferences.functionCallModelPreference = { + llmId: serverPrefs.functionCallModelPreference.llmId, + modelName: serverPrefs.functionCallModelPreference.modelName, + icon: serverPrefs.functionCallModelPreference.icon + }; + } + + if (serverPrefs?.searchMethodPreference) { + localPreferences.searchMethodPreference = serverPrefs.searchMethodPreference; + } + + if (serverPrefs?.chainOfThoughtPreference !== undefined) { + localPreferences.chainOfThoughtPreference = serverPrefs.chainOfThoughtPreference; + } + + if (serverPrefs?.autoExecutePreference !== undefined) { + localPreferences.autoExecutePreference = serverPrefs.autoExecutePreference; + } + + saveUserPreferences(localPreferences); + return true; } return false; @@ -102,6 +158,8 @@ export const useUserPreferencesStore = defineStore('userPreferences', () => { preferences.reasoningModelPreference = undefined; preferences.embeddingModelPreference = undefined; preferences.rerankerPreference = undefined; + preferences.functionCallModelPreference = undefined; + preferences.searchMethodPreference = undefined; preferences.chainOfThoughtPreference = undefined; preferences.autoExecutePreference = undefined; }; diff --git a/src/views/dialogue/components/MessageDetail.vue b/src/views/dialogue/components/MessageDetail.vue index 3ab758af..891aacc9 100644 --- a/src/views/dialogue/components/MessageDetail.vue +++ b/src/views/dialogue/components/MessageDetail.vue @@ -293,11 +293,6 @@ const handleMessageUpdate = async () => { emit('message-updated'); }; -// 监听tab切换,重新获取对应类型的消息 -watch(activeTab, (newTab) => { - fetchMessages(newTab as UserMessageType); -}); - // 监听用户登录状态变化 watch(isUserLoggedIn, (loggedIn) => { if (loggedIn) { diff --git a/src/views/settings/Model.vue b/src/views/settings/Model.vue index 180ef822..6e74398a 100644 --- a/src/views/settings/Model.vue +++ b/src/views/settings/Model.vue @@ -188,45 +188,7 @@ async function queryUserPreferences() { if (res) { userPreferences.value = res.result || {}; - // 同步到localStorage,确保前端组件能够获取到最新的偏好设置 - const localPreferences: LocalUserPreferences = {}; - const serverPrefs = res.result; - - if (serverPrefs?.reasoningModelPreference) { - localPreferences.reasoningModelPreference = { - llmId: serverPrefs.reasoningModelPreference.llmId, - modelName: serverPrefs.reasoningModelPreference.modelName, - icon: serverPrefs.reasoningModelPreference.icon - }; - } - - if (serverPrefs?.embeddingModelPreference) { - localPreferences.embeddingModelPreference = { - llmId: serverPrefs.embeddingModelPreference.llmId, - modelName: serverPrefs.embeddingModelPreference.modelName, - icon: serverPrefs.embeddingModelPreference.icon - }; - } - - if (serverPrefs?.rerankerPreference) { - localPreferences.rerankerPreference = { - llmId: serverPrefs.rerankerPreference.llmId, - modelName: serverPrefs.rerankerPreference.modelName, - icon: serverPrefs.rerankerPreference.icon - }; - } - - if (serverPrefs?.chainOfThoughtPreference !== undefined) { - localPreferences.chainOfThoughtPreference = serverPrefs.chainOfThoughtPreference; - } - - if (serverPrefs?.autoExecutePreference !== undefined) { - localPreferences.autoExecutePreference = serverPrefs.autoExecutePreference; - } - - saveUserPreferences(localPreferences); - - // 同时更新Pinia store,确保其他组件能获取到最新数据 + // 同时更新Pinia store(会自动同步到 localStorage) await userPreferencesStore.getUserPreferences(); } } -- Gitee