Skip to content

Commit 67fc31f

Browse files
perf: long-term memory translation
1 parent 73933f4 commit 67fc31f

8 files changed

Lines changed: 72 additions & 56 deletions

File tree

ui/src/components/dynamics-form/constructor/items/TreeSelectConstructor.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@
2828
:props="treeProps"
2929
class="option-tree"
3030
>
31-
<template #default="{ data }">
31+
<template #default="{ data, node }">
3232
<div class="flex-between w-full">
3333
<div class="ellipsis" :title="`${data.label}-${data.value}`" style="max-width: 350px">
3434
<span>{{ data.label }}-{{ data.value }}</span>
3535
</div>
3636

3737
<div>
38-
<span class="mr-4">
38+
<span class="mr-4" v-if="node.level < 5">
3939
<el-button link @click.stop="openAddChildDialog(data)">
4040
<AppIcon iconName="app-add-outlined" class="color-secondary"></AppIcon>
4141
</el-button>

ui/src/locales/lang/zh-CN/views/application.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,20 @@ export default {
3232
confirmUse: '确定使用',
3333
overwrite: '覆盖当前工作流',
3434
},
35+
longTermMemory: {
36+
title: '长期记忆',
37+
setting: '长期记忆设置',
38+
triggerType: '触发方式',
39+
roundTrigger: '按轮次触发',
40+
roundTriggerTip: '累计到N轮后,自动提炼N轮对话,生成记忆',
41+
triggerInterval: '触发间隔',
42+
scheduledTrigger: '按时间触发',
43+
scheduledTriggerTip: '到设定时间后,自动提炼周期内所有对话,生成记忆',
44+
cronExpressionInvalid: 'Cron表达式不合法',
45+
tips1: `开启后,从开启时间记录新对话并按周期生成记忆,可通过`,
46+
tips2: `变量在系统提示词中调用。
47+
关闭后,将清空对话用户的长期记忆,再次开启将重新从开启时点开始累积。`,
48+
},
3549
form: {
3650
appName: {
3751
placeholder: '请输入智能体名称',

ui/src/views/application/ApplicationSetting.vue

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,10 @@
196196
<template #label>
197197
<div class="flex-between">
198198
<div class="flex align-center">
199-
<span class="mr-4">长期记忆</span>
199+
<span class="mr-4">{{ $t('views.application.longTermMemory.title') }}</span>
200200
<el-tooltip
201201
effect="dark"
202-
:content="$t('{memory} 为长期记忆的占位符,开启后可以在系统提示词中引用')"
202+
:content="longTermPrompt"
203203
placement="right"
204204
popper-class="max-w-350"
205205
>
@@ -242,7 +242,7 @@
242242
@refreshForm="refreshParam"
243243
>
244244
<el-icon>
245-
<Operation/>
245+
<Operation />
246246
</el-icon>
247247
</el-button>
248248
</div>
@@ -898,7 +898,10 @@
898898
</el-card>
899899

900900
<AIModeParamSettingDialog ref="AIModeParamSettingDialogRef" @refresh="refreshForm" />
901-
<AIModeParamSettingDialog ref="LongTermModeParamSettingDialogRef" @refresh="refreshLongTermForm" />
901+
<AIModeParamSettingDialog
902+
ref="LongTermModeParamSettingDialogRef"
903+
@refresh="refreshLongTermForm"
904+
/>
902905
<GeneratePromptDialog @replace="replace" ref="GeneratePromptDialogRef" />
903906
<TTSModeParamSettingDialog ref="TTSModeParamSettingDialogRef" @refresh="refreshTTSForm" />
904907
<STTModeParamSettingDialog ref="STTModeParamSettingDialogRef" @refresh="refreshSTTForm" />
@@ -917,7 +920,7 @@
917920
<ToolDialog ref="toolDialogRef" @refresh="submitToolDialog" tool_type="CUSTOM,WORKFLOW" />
918921
<ToolDialog ref="skillToolDialogRef" @refresh="submitSkillToolDialog" tool_type="SKILL" />
919922
<ApplicationDialog ref="applicationDialogRef" @refresh="submitApplicationDialog" />
920-
<LongTermSettingDialog ref="LongTermSettingDialogRef" @refresh="submitLongTermSettingDialog"/>
923+
<LongTermSettingDialog ref="LongTermSettingDialogRef" @refresh="submitLongTermSettingDialog" />
921924
</div>
922925
</template>
923926
<script setup lang="ts">
@@ -945,8 +948,8 @@ import McpServersDialog from '@/views/application/component/McpServersDialog.vue
945948
import ToolDialog from '@/views/application/component/ToolDialog.vue'
946949
import ApplicationDialog from '@/views/application/component/ApplicationDialog.vue'
947950
import useStore from '@/stores'
948-
import AppIcon from "@/components/app-icon/AppIcon.vue";
949-
import LongTermSettingDialog from "@/views/application/component/LongTermSettingDialog.vue";
951+
import AppIcon from '@/components/app-icon/AppIcon.vue'
952+
import LongTermSettingDialog from '@/views/application/component/LongTermSettingDialog.vue'
950953
const route = useRoute()
951954
const router = useRouter()
952955
const {
@@ -980,11 +983,10 @@ const optimizationPrompt =
980983
'<data></data>' +
981984
t('views.application.dialog.defaultPrompt2')
982985
983-
const longTermPrompt = `=======长期记忆========
984-
{memory}
985-
=======================
986-
请根据以上长期记忆回答用户问题
987-
`
986+
const longTermPrompt =
987+
t('views.application.longTermMemory.tips1') +
988+
'{{memory}}' +
989+
t('views.application.longTermMemory.tips2')
988990
989991
const collapseData = reactive({
990992
prompt: true,
@@ -1055,7 +1057,7 @@ const applicationForm = ref<ApplicationFormType>({
10551057
long_term_model_id: '',
10561058
long_term_model_params_setting: {},
10571059
long_term_trigger_setting: {},
1058-
long_term_trigger_type: 'ROUND'
1060+
long_term_trigger_type: 'ROUND',
10591061
})
10601062
10611063
const rules = reactive<FormRules<ApplicationFormType>>({
@@ -1196,12 +1198,16 @@ const openParamSettingDialog = () => {
11961198
}
11971199
11981200
function openLongTermConfigDialog() {
1199-
LongTermSettingDialogRef.value?.open(applicationForm.value.long_term_trigger_type, applicationForm.value.long_term_trigger_setting)
1201+
LongTermSettingDialogRef.value?.open(
1202+
applicationForm.value.long_term_trigger_type,
1203+
applicationForm.value.long_term_trigger_setting,
1204+
)
12001205
}
12011206
12021207
function switchLongTerm() {
12031208
if (applicationForm.value.long_term_enable) {
1204-
applicationForm.value.model_setting.system = applicationForm.value.model_setting.system || longTermPrompt
1209+
applicationForm.value.model_setting.system =
1210+
applicationForm.value.model_setting.system || longTermPrompt
12051211
}
12061212
}
12071213

ui/src/views/application/component/LongTermSettingDialog.vue

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<el-dialog
33
align-center
4-
:title="$t('长期记忆设置')"
4+
:title="$t('views.application.longTermMemory.setting')"
55
v-model="dialogVisible"
66
style="width: 550px"
77
append-to-body
@@ -13,11 +13,10 @@
1313
ref="paramFormRef"
1414
:model="form"
1515
require-asterisk-position="right"
16-
hide-required-asterisk
1716
@submit.prevent
1817
>
1918
<el-form-item
20-
:label="$t('触发方式')"
19+
:label="$t('views.application.longTermMemory.triggerType')"
2120
prop="trigger_type"
2221
:rules="{
2322
message: $t('common.selectPlaceholder'),
@@ -33,19 +32,23 @@
3332
>
3433
<div class="flex align-center line-height-22">
3534
<el-avatar shape="square" class="avatar-orange" :size="32">
36-
<img src="@/assets/trigger/icon_event.svg" style="width: 58%" alt=""/>
35+
<img src="@/assets/trigger/icon_event.svg" style="width: 58%" alt="" />
3736
</el-avatar>
3837
<div class="ml-12">
39-
<h5>{{ $t('按轮次触发') }}</h5>
40-
<el-text type="info" class="color-secondary font-small">{{
41-
$t('累计到N轮后,自动提炼N轮对话,生成记忆')
42-
}}
38+
<h5>{{ $t('views.application.longTermMemory.roundTrigger') }}</h5>
39+
<el-text type="info" class="color-secondary font-small"
40+
>{{ $t('views.application.longTermMemory.roundTriggerTip') }}
4341
</el-text>
4442
</div>
4543
</div>
4644
<el-card v-if="form.trigger_type === 'ROUND'" shadow="never" class="card-never mt-16">
47-
<el-form-item :label="$t('触发间隔')">
48-
<el-input-number v-model="form.trigger_setting.rounds"/>
45+
<el-form-item :label="$t('views.application.longTermMemory.triggerInterval')" required>
46+
<el-input-number
47+
v-model="form.trigger_setting.rounds"
48+
:value-on-clear="0"
49+
:min="5"
50+
:max="100"
51+
/>
4952
</el-form-item>
5053
</el-card>
5154
</el-card>
@@ -57,13 +60,12 @@
5760
>
5861
<div class="flex align-center line-height-22">
5962
<el-avatar shape="square" :size="32">
60-
<img src="@/assets/trigger/icon_scheduled.svg" style="width: 58%" alt=""/>
63+
<img src="@/assets/trigger/icon_scheduled.svg" style="width: 58%" alt="" />
6164
</el-avatar>
6265
<div class="ml-12">
63-
<h5>{{ $t('按时间触发') }}</h5>
64-
<el-text type="info" class="color-secondary font-small">{{
65-
$t('到设定时间后,自动提炼周期内所有对话,生成记忆')
66-
}}
66+
<h5>{{ $t('views.application.longTermMemory.scheduledTrigger') }}</h5>
67+
<el-text type="info" class="color-secondary font-small"
68+
>{{ $t('views.application.longTermMemory.scheduledTriggerTip') }}
6769
</el-text>
6870
</div>
6971
</div>
@@ -92,7 +94,7 @@
9294
>
9395
<el-button text @click.stop="switchScheduleType">
9496
<el-icon>
95-
<Switch/>
97+
<Switch />
9698
</el-icon>
9799
</el-button>
98100
</el-tooltip>
@@ -127,18 +129,15 @@
127129
</el-button>
128130
</span>
129131
</template>
130-
131132
</el-dialog>
132133
</template>
133134

134135
<script setup lang="ts">
135-
136-
137-
import { computed, ref } from "vue";
138-
import { triggerCycleOptions } from "@/utils/trigger.ts";
139-
import { t } from "@/locales";
140-
import { cloneDeep } from "lodash";
141-
import { isValidCron } from "cron-validator";
136+
import { computed, ref } from 'vue'
137+
import { triggerCycleOptions } from '@/utils/trigger.ts'
138+
import { t } from '@/locales'
139+
import { cloneDeep } from 'lodash'
140+
import { isValidCron } from 'cron-validator'
142141
143142
const emit = defineEmits(['refresh'])
144143
const dialogVisible = ref(false)
@@ -147,7 +146,7 @@ const loading = ref(false)
147146
const form = ref<any>({
148147
trigger_type: 'ROUND',
149148
trigger_setting: {
150-
rounds: 10
149+
rounds: 10,
151150
},
152151
})
153152
@@ -166,7 +165,7 @@ const validateCron = () => {
166165
}
167166
const fields = cron.split(/\s+/)
168167
if (fields.length !== 5 || !isValidCron(cron)) {
169-
cronError.value = 'Cron表达式不合法'
168+
cronError.value = t('views.application.longTermMemory.cronExpressionInvalid')
170169
} else {
171170
cronError.value = ''
172171
}
@@ -247,7 +246,7 @@ const scheduled = computed({
247246
248247
const open = (trigger_type: any, trigger_setting: any) => {
249248
dialogVisible.value = true
250-
form.value.trigger_setting = trigger_setting ?? {rounds: 10}
249+
form.value.trigger_setting = trigger_setting ?? { rounds: 10 }
251250
form.value.trigger_type = trigger_type ?? 'ROUND'
252251
}
253252
@@ -260,7 +259,7 @@ const submit = () => {
260259
})
261260
}
262261
263-
defineExpose({open})
262+
defineExpose({ open })
264263
</script>
265264

266265
<style lang="scss" scoped></style>

ui/src/views/trigger/TriggerDrawer.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ const validateCron = () => {
619619
}
620620
const fields = cron.split(/\s+/)
621621
if (fields.length !== 5 || !isValidCron(cron)) {
622-
cronError.value = 'Cron表达式不合法'
622+
cronError.value = t('views.application.longTermMemory.cronExpressionInvalid')
623623
} else {
624624
cronError.value = ''
625625
}

ui/src/workflow/nodes/ai-chat-node/index.vue

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -604,11 +604,10 @@ const defaultPrompt = `${t('workflow.nodes.aiChatNode.defaultPrompt')}:
604604
${t('views.problem.title')}:
605605
{{${t('workflow.nodes.startNode.label')}.question}}`
606606
607-
const longTermPrompt = `=======长期记忆========
608-
{{${t('workflow.nodes.startNode.label')}.memory}}
609-
=======================
610-
请根据以上长期记忆回答用户问题
611-
`
607+
const longTermPrompt =
608+
t('views.application.longTermMemory.tips1') +
609+
'{{memory}}' +
610+
t('views.application.longTermMemory.tips2')
612611
613612
const collapseData = reactive({
614613
MCP: true,

ui/src/workflow/nodes/base-node/index.vue

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
<template #label>
5050
<div class="flex-between">
5151
<div class="flex align-center">
52-
<span class="mr-4">长期记忆</span>
52+
<span class="mr-4">{{$t('views.application.longTermMemory.title')}}</span>
5353
<el-tooltip
5454
effect="dark"
5555
:content="longTermTips"
@@ -267,9 +267,7 @@ const form = {
267267
prologue: t('views.application.form.defaultPrologue'),
268268
}
269269
270-
const longTermTips = `
271-
{{${t('workflow.nodes.startNode.label')}.memory}} 为长期记忆占位符,开启后可以在系统提示词中引用
272-
`
270+
const longTermTips = t('views.application.longTermMemory.tips1') + '{{memory}}' + t('views.application.longTermMemory.tips2')
273271
274272
const wheel = (e: any) => {
275273
if (e.ctrlKey === true) {

ui/src/workflow/nodes/start-node/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ const refreshLongTermConfig = () => {
172172
return
173173
}
174174
if (form_data[0]) {
175-
set(props.nodeModel.properties.config, 'fields', [...fields, { label: t('长期记忆'), value: 'memory' }])
175+
set(props.nodeModel.properties.config, 'fields', [...fields, { label: t('views.application.longTermMemory.title'), value: 'memory' }])
176176
}
177177
}
178178

0 commit comments

Comments
 (0)