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 { 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 { api } from '#/api/request';
@@ -502,10 +503,22 @@ function handleTryout() {
function handleCloseTryout() {
selectBase();
}
function handleBack() {
router.push(AGENT_TAB_PAGE_KEY);
}
</script>
<template>
<div v-loading="pageLoading" class="agent-designer">
<ElButton
class="agent-designer__back"
:icon="ArrowLeft"
aria-label="返回智能体列表"
@click="handleBack"
>
返回智能体列表
</ElButton>
<template v-if="contentReady">
<AgentStudioCanvas
:active="canvasActive"
@@ -566,4 +579,13 @@ function handleCloseTryout() {
),
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>

View File

@@ -82,11 +82,14 @@ const selectedMcpToolCount = computed(() => selectedMcpTools.value.length);
const asyncExecutionEnabled = computed({
get() {
return String(props.binding.optionsJson?.executionMode || '').toUpperCase() === 'ASYNC';
return (
String(props.binding.optionsJson?.executionMode || '').toUpperCase() ===
'ASYNC'
);
},
set(value: boolean) {
props.binding.optionsJson = {
...(props.binding.optionsJson || {}),
...props.binding.optionsJson,
executionMode: value ? 'ASYNC' : 'SYNC',
};
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);
}
function tokenOnlyCompressionParameter(
parameter?: Record<string, any>,
): Record<string, any> {
const normalized = { ...parameter };
delete normalized.msgThreshold;
return normalized;
}
export function createEmptyAgent(): AgentInfo {
return {
name: '未命名智能体',
@@ -88,7 +96,6 @@ export function createEmptyAgent(): AgentInfo {
memoryConfigJson: {
compressionParameter: {
enabled: true,
msgThreshold: 12,
lastKeep: 8,
minCompressionTokenThreshold: 6000,
},
@@ -101,10 +108,11 @@ export function createEmptyAgent(): AgentInfo {
function normalizeAgent(agent?: AgentInfo): AgentInfo {
const source = agent || {};
const memoryConfig = source.memoryConfigJson || {};
const compressionParameter = memoryConfig.compressionParameter || {};
const compressionParameter = tokenOnlyCompressionParameter(
memoryConfig.compressionParameter,
);
const defaultCompressionParameter =
createEmptyAgent().memoryConfigJson?.compressionParameter || {};
const legacyMsgThreshold = memoryConfig.maxAttachedMessageCount;
return {
...createEmptyAgent(),
...source,
@@ -121,10 +129,6 @@ function normalizeAgent(agent?: AgentInfo): AgentInfo {
compressionParameter: {
enabled: true,
...compressionParameter,
msgThreshold:
compressionParameter.msgThreshold ??
legacyMsgThreshold ??
defaultCompressionParameter.msgThreshold,
lastKeep:
compressionParameter.lastKeep ?? defaultCompressionParameter.lastKeep,
minCompressionTokenThreshold:
@@ -353,9 +357,13 @@ export function useAgentDesignerState() {
function buildPayloadAgent(): AgentInfo {
const memoryConfigJson = state.agent.memoryConfigJson || {};
const compressionParameter = memoryConfigJson.compressionParameter || {};
const { maxAttachedMessageCount, ...restMemoryConfigJson } =
memoryConfigJson;
const compressionParameter = tokenOnlyCompressionParameter(
memoryConfigJson.compressionParameter,
);
const {
maxAttachedMessageCount: _maxAttachedMessageCount,
...restMemoryConfigJson
} = memoryConfigJson;
return {
...state.agent,
interactionConfigJson: buildInteractionConfigPayload(