发布 v1.10 #5
@@ -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>
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user