diff --git a/dashboard/src/components/shared/PersonaForm.vue b/dashboard/src/components/shared/PersonaForm.vue index 7df250db2..c3994831d 100644 --- a/dashboard/src/components/shared/PersonaForm.vue +++ b/dashboard/src/components/shared/PersonaForm.vue @@ -578,16 +578,26 @@ export default { } this.saving = true; - try { - const url = this.editingPersona ? '/api/persona/update' : '/api/persona/create'; - const response = await axios.post(url, this.personaForm); - - if (response.data.status === 'ok') { - this.$emit('saved', response.data.message || this.tm('messages.saveSuccess')); - this.closeDialog(); - } else { - this.$emit('error', response.data.message || this.tm('messages.saveError')); + try { + const url = this.editingPersona ? '/api/persona/update' : '/api/persona/create'; + + // 白名单过滤字段 + const allowedFields = ['persona_id', 'system_prompt', 'begin_dialogs', 'tools']; + const filteredData = {}; + allowedFields.forEach(field => { + if (this.personaForm.hasOwnProperty(field)) { + filteredData[field] = this.personaForm[field]; } + }); + + const response = await axios.post(url, filteredData); + + if (response.data.status === 'ok') { + this.$emit('saved', response.data.message || this.tm('messages.saveSuccess')); + this.closeDialog(); + } else { + this.$emit('error', response.data.message || this.tm('messages.saveError')); + } } catch (error) { this.$emit('error', error.response?.data?.message || this.tm('messages.saveError')); } diff --git a/dashboard/src/i18n/locales/en-US/features/persona.json b/dashboard/src/i18n/locales/en-US/features/persona.json index 9a091e80a..f7c85502e 100644 --- a/dashboard/src/i18n/locales/en-US/features/persona.json +++ b/dashboard/src/i18n/locales/en-US/features/persona.json @@ -10,7 +10,8 @@ "cancel": "Cancel", "save": "Save", "move": "Move", - "addDialogPair": "Add Dialog Pair" + "addDialogPair": "Add Dialog Pair", + "import": "Import" }, "labels": { "presetDialogs": "Preset Dialogs ({count} pairs)", @@ -80,18 +81,23 @@ "saveError": "Save failed", "deleteConfirm": "Are you sure you want to delete persona \"{id}\"? This action cannot be undone.", "deleteSuccess": "Deleted successfully", - "deleteError": "Delete failed" + "deleteError": "Delete failed", + "importExists": "Persona with ID {id} already exists." }, "persona": { "personasTitle": "Personas", "toolsCount": "tools", "skillsCount": "skills", "contextMenu": { - "moveTo": "Move to..." + "moveTo": "Move to...", + "export": "Export" }, "messages": { "moveSuccess": "Persona moved successfully", - "moveError": "Failed to move persona" + "moveError": "Failed to move persona", + "exportSuccess": "Exported successfully(excluding skills and tools)", + "importSuccess": "Imported successfully", + "importError": "Failed to import persona" } }, "folder": { diff --git a/dashboard/src/i18n/locales/zh-CN/features/persona.json b/dashboard/src/i18n/locales/zh-CN/features/persona.json index ac1f9f146..a4155aeb5 100644 --- a/dashboard/src/i18n/locales/zh-CN/features/persona.json +++ b/dashboard/src/i18n/locales/zh-CN/features/persona.json @@ -10,7 +10,8 @@ "cancel": "取消", "save": "保存", "move": "移动", - "addDialogPair": "添加对话对" + "addDialogPair": "添加对话对", + "import": "导入" }, "labels": { "presetDialogs": "预设对话 ({count} 对)", @@ -80,18 +81,23 @@ "saveError": "保存失败", "deleteConfirm": "确定要删除人格 \"{id}\" 吗?此操作不可撤销。", "deleteSuccess": "删除成功", - "deleteError": "删除失败" + "deleteError": "删除失败", + "importExists": "人格 ID {id} 已存在" }, "persona": { "personasTitle": "人格", "toolsCount": "个工具", "skillsCount": "个 Skills", "contextMenu": { - "moveTo": "移动到..." + "moveTo": "移动到...", + "export": "导出" }, "messages": { "moveSuccess": "人格移动成功", - "moveError": "移动人格失败" + "moveError": "移动人格失败", + "exportSuccess": "导出成功(不包含 Skills 和工具)", + "importSuccess": "导入成功", + "importError": "导入失败" } }, "folder": { diff --git a/dashboard/src/stores/personaStore.ts b/dashboard/src/stores/personaStore.ts index aa60339f8..1e0110eeb 100644 --- a/dashboard/src/stores/personaStore.ts +++ b/dashboard/src/stores/personaStore.ts @@ -330,5 +330,27 @@ export const usePersonaStore = defineStore({ }; return findNode(this.folderTree); }, + + /** + * 导入人格数据 + */ + async importPersona(data: Partial): Promise { + const response = await axios.post('/api/persona/create', { + persona_id: data.persona_id, + system_prompt: data.system_prompt, + begin_dialogs: data.begin_dialogs || [], + tools: data.tools, + skills: data.skills, + }); + + if (response.data.status !== 'ok') { + throw new Error(response.data.message || '导入人格失败'); + } + + // 刷新当前文件夹内容 + await this.refreshCurrentFolder(); + + return response.data.data.persona; + }, } }); diff --git a/dashboard/src/views/persona/PersonaCard.vue b/dashboard/src/views/persona/PersonaCard.vue index 135514bbf..25b6cd94c 100644 --- a/dashboard/src/views/persona/PersonaCard.vue +++ b/dashboard/src/views/persona/PersonaCard.vue @@ -14,12 +14,18 @@ {{ tm('buttons.edit') }} - + {{ tm('persona.contextMenu.moveTo') }} + + + {{ tm('persona.contextMenu.export') }} +