fix: 收敛 Agent 设计器导航与记忆配置

- 增加返回智能体列表入口

- 移除旧消息数压缩参数并保持令牌阈值配置
This commit is contained in:
2026-07-27 19:41:24 +08:00
parent b08eb009bb
commit b0ed512e97
4 changed files with 85 additions and 13 deletions

View File

@@ -9,7 +9,8 @@ import type {
import { computed, onActivated, onDeactivated, onMounted, ref } from 'vue'; import { computed, onActivated, onDeactivated, onMounted, ref } from 'vue';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { ElMessage, ElMessageBox } from 'element-plus'; import { ArrowLeft } from '@element-plus/icons-vue';
import { ElButton, ElMessage, ElMessageBox } from 'element-plus';
import { tryit } from 'radash'; import { tryit } from 'radash';
import { api } from '#/api/request'; import { api } from '#/api/request';
@@ -502,10 +503,22 @@ function handleTryout() {
function handleCloseTryout() { function handleCloseTryout() {
selectBase(); selectBase();
} }
function handleBack() {
router.push(AGENT_TAB_PAGE_KEY);
}
</script> </script>
<template> <template>
<div v-loading="pageLoading" class="agent-designer"> <div v-loading="pageLoading" class="agent-designer">
<ElButton
class="agent-designer__back"
:icon="ArrowLeft"
aria-label="返回智能体列表"
@click="handleBack"
>
返回智能体列表
</ElButton>
<template v-if="contentReady"> <template v-if="contentReady">
<AgentStudioCanvas <AgentStudioCanvas
:active="canvasActive" :active="canvasActive"
@@ -566,4 +579,13 @@ function handleCloseTryout() {
), ),
var(--el-fill-color-extra-light); var(--el-fill-color-extra-light);
} }
.agent-designer__back {
position: absolute;
top: var(--space-6);
left: var(--space-6);
z-index: 10;
border-radius: var(--radius-control);
box-shadow: var(--shadow-subtle);
}
</style> </style>

View File

@@ -82,11 +82,14 @@ const selectedMcpToolCount = computed(() => selectedMcpTools.value.length);
const asyncExecutionEnabled = computed({ const asyncExecutionEnabled = computed({
get() { get() {
return String(props.binding.optionsJson?.executionMode || '').toUpperCase() === 'ASYNC'; return (
String(props.binding.optionsJson?.executionMode || '').toUpperCase() ===
'ASYNC'
);
}, },
set(value: boolean) { set(value: boolean) {
props.binding.optionsJson = { props.binding.optionsJson = {
...(props.binding.optionsJson || {}), ...props.binding.optionsJson,
executionMode: value ? 'ASYNC' : 'SYNC', executionMode: value ? 'ASYNC' : 'SYNC',
}; };
emit('change'); emit('change');

View File

@@ -31,3 +31,42 @@ describe('useAgentDesignerState generation stream', () => {
); );
}); });
}); });
describe('useAgentDesignerState memory compression', () => {
it('keeps only token-based compression settings in state and payload', () => {
expect(
createEmptyAgent().memoryConfigJson?.compressionParameter,
).not.toHaveProperty('msgThreshold');
const designer = useAgentDesignerState();
designer.reset({
name: '旧压缩配置智能体',
memoryConfigJson: {
maxAttachedMessageCount: 12,
compressionParameter: {
enabled: true,
msgThreshold: 12,
lastKeep: 6,
minCompressionTokenThreshold: 128_000,
},
},
});
const stateCompressionParameter =
designer.state.agent.memoryConfigJson?.compressionParameter;
expect(stateCompressionParameter).not.toHaveProperty('msgThreshold');
expect(stateCompressionParameter?.lastKeep).toBe(6);
expect(stateCompressionParameter?.minCompressionTokenThreshold).toBe(
128_000,
);
const payloadMemoryConfig = designer.buildPayloadAgent().memoryConfigJson;
expect(payloadMemoryConfig).not.toHaveProperty('maxAttachedMessageCount');
expect(payloadMemoryConfig?.compressionParameter).not.toHaveProperty(
'msgThreshold',
);
expect(
payloadMemoryConfig?.compressionParameter.minCompressionTokenThreshold,
).toBe(128_000);
});
});

View File

@@ -76,6 +76,14 @@ function normalizeBindingToolName(binding: AgentToolBinding) {
return resolveToolName(kind, resource); return resolveToolName(kind, resource);
} }
function tokenOnlyCompressionParameter(
parameter?: Record<string, any>,
): Record<string, any> {
const normalized = { ...parameter };
delete normalized.msgThreshold;
return normalized;
}
export function createEmptyAgent(): AgentInfo { export function createEmptyAgent(): AgentInfo {
return { return {
name: '未命名智能体', name: '未命名智能体',
@@ -88,7 +96,6 @@ export function createEmptyAgent(): AgentInfo {
memoryConfigJson: { memoryConfigJson: {
compressionParameter: { compressionParameter: {
enabled: true, enabled: true,
msgThreshold: 12,
lastKeep: 8, lastKeep: 8,
minCompressionTokenThreshold: 6000, minCompressionTokenThreshold: 6000,
}, },
@@ -101,10 +108,11 @@ export function createEmptyAgent(): AgentInfo {
function normalizeAgent(agent?: AgentInfo): AgentInfo { function normalizeAgent(agent?: AgentInfo): AgentInfo {
const source = agent || {}; const source = agent || {};
const memoryConfig = source.memoryConfigJson || {}; const memoryConfig = source.memoryConfigJson || {};
const compressionParameter = memoryConfig.compressionParameter || {}; const compressionParameter = tokenOnlyCompressionParameter(
memoryConfig.compressionParameter,
);
const defaultCompressionParameter = const defaultCompressionParameter =
createEmptyAgent().memoryConfigJson?.compressionParameter || {}; createEmptyAgent().memoryConfigJson?.compressionParameter || {};
const legacyMsgThreshold = memoryConfig.maxAttachedMessageCount;
return { return {
...createEmptyAgent(), ...createEmptyAgent(),
...source, ...source,
@@ -121,10 +129,6 @@ function normalizeAgent(agent?: AgentInfo): AgentInfo {
compressionParameter: { compressionParameter: {
enabled: true, enabled: true,
...compressionParameter, ...compressionParameter,
msgThreshold:
compressionParameter.msgThreshold ??
legacyMsgThreshold ??
defaultCompressionParameter.msgThreshold,
lastKeep: lastKeep:
compressionParameter.lastKeep ?? defaultCompressionParameter.lastKeep, compressionParameter.lastKeep ?? defaultCompressionParameter.lastKeep,
minCompressionTokenThreshold: minCompressionTokenThreshold:
@@ -353,9 +357,13 @@ export function useAgentDesignerState() {
function buildPayloadAgent(): AgentInfo { function buildPayloadAgent(): AgentInfo {
const memoryConfigJson = state.agent.memoryConfigJson || {}; const memoryConfigJson = state.agent.memoryConfigJson || {};
const compressionParameter = memoryConfigJson.compressionParameter || {}; const compressionParameter = tokenOnlyCompressionParameter(
const { maxAttachedMessageCount, ...restMemoryConfigJson } = memoryConfigJson.compressionParameter,
memoryConfigJson; );
const {
maxAttachedMessageCount: _maxAttachedMessageCount,
...restMemoryConfigJson
} = memoryConfigJson;
return { return {
...state.agent, ...state.agent,
interactionConfigJson: buildInteractionConfigPayload( interactionConfigJson: buildInteractionConfigPayload(