diff --git a/src/App.vue b/src/App.vue index cc38a15707d4e24c892e286d6c5b5fdd7b488aaf..b7d445bf9f1a386a738db3f378c57fc434477f5a 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 55ef3f65a53ce27638e83162a945b6797a787480..b7d80e6f7dc4a13073862fdbc198e659dc58b821 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 c015c6686761dd330a0e83ac49e9d2a6804d9703..3570c8ff664f4b6b3e203d88d46de6b48cd22c41 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 47dd8fabb2f864695c96e1db1fcc60fa15513d5a..8ce3aaaf33fb0d9bf61c55a3d13353fa5048d898 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 3ab758af792e7a9f842bb8771f6a4b86681c3889..891aacc931e25c56977687c0501b7cf52b847811 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 180ef822c17fb2ad59cde726d55f592f9d9a21bb..6e74398a0c3db99aea97e6931fc0eaadf9b85ce0 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(); } }