Skip to content

Commit dc51838

Browse files
authored
šŸ› fix: fixed compressed group message & open the switch config to control compression config enabled (#11901)
* fix: fixed the compressed cause the parentid not found problem * feat: add the compressionConfig config as switch * fix: slove the onboarding modelSelect Crash error * fix: rollback the modelSelectChange
1 parent 888c907 commit dc51838

11 files changed

Lines changed: 83 additions & 24 deletions

File tree

ā€Žlocales/en-US/setting.jsonā€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,8 @@
446446
"settingImage.defaultCount.desc": "Set the default number of images generated when creating a new task in the image generation panel.",
447447
"settingImage.defaultCount.label": "Default Image Count",
448448
"settingImage.defaultCount.title": "AI Art",
449+
"settingModel.enableContextCompression.desc": "Automatically compress historical messages into summaries when conversation exceeds 64,000 tokens, saving 60-80% token usage",
450+
"settingModel.enableContextCompression.title": "Enable Auto Context Compression",
449451
"settingModel.enableMaxTokens.title": "Enable Max Tokens Limit",
450452
"settingModel.enableReasoningEffort.title": "Enable Reasoning Effort Adjustment",
451453
"settingModel.frequencyPenalty.desc": "The higher the value, the more diverse and rich the vocabulary; the lower the value, the simpler and more straightforward the language.",

ā€Žlocales/zh-CN/setting.jsonā€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,8 @@
446446
"settingImage.defaultCount.desc": "č®¾ē½®å›¾åƒē”Ÿęˆé¢ęæåœØåˆ›å»ŗę–°ä»»åŠ”ę—¶ēš„é»˜č®¤å›¾ē‰‡ę•°é‡ć€‚",
447447
"settingImage.defaultCount.label": "é»˜č®¤å›¾ē‰‡ę•°é‡",
448448
"settingImage.defaultCount.title": "AI ē»˜ē”»č®¾ē½®",
449+
"settingModel.enableContextCompression.desc": "å½“åÆ¹čÆę¶ˆęÆč¶…čæ‡ 64,000 tokens ę—¶ļ¼Œč‡ŖåŠØå°†åŽ†å²ę¶ˆęÆåŽ‹ē¼©äøŗę‘˜č¦ļ¼ŒčŠ‚ēœ 60-80% ēš„ token ē”Øé‡",
450+
"settingModel.enableContextCompression.title": "å¼€åÆč‡ŖåŠØäøŠäø‹ę–‡åŽ‹ē¼©",
449451
"settingModel.enableMaxTokens.title": "å¼€åÆå•ę¬”å›žå¤é™åˆ¶",
450452
"settingModel.enableReasoningEffort.title": "å¼€åÆęŽØē†å¼ŗåŗ¦č°ƒę•“",
451453
"settingModel.frequencyPenalty.desc": "å€¼č¶Šå¤§ļ¼Œē”ØčÆč¶Šäø°åÆŒå¤šę ·ļ¼›å€¼č¶Šä½Žļ¼Œē”ØčÆę›“ęœ“å®žē®€å•",

ā€Žpackage.jsonā€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@
328328
"remark-gfm": "^4.0.1",
329329
"remark-html": "^16.0.1",
330330
"remove-markdown": "^0.6.3",
331-
"resend": "^6.8.0",
331+
"resend": "6.8.0",
332332
"resolve-accept-language": "^3.1.15",
333333
"rtl-detect": "^1.1.2",
334334
"semver": "^7.7.3",

ā€Žpackages/agent-runtime/src/agents/GeneralChatAgent.tsā€Ž

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -283,21 +283,25 @@ export class GeneralChatAgent implements Agent {
283283
switch (context.phase) {
284284
case 'init':
285285
case 'user_input': {
286-
// Check if context compression is needed before calling LLM
287-
const compressionCheck = shouldCompress(state.messages, {
288-
maxWindowToken: this.config.compressionConfig?.maxWindowToken,
289-
});
286+
// Check if context compression is enabled and needed before calling LLM
287+
const compressionEnabled = this.config.compressionConfig?.enabled ?? true; // Default to enabled
290288

291-
if (compressionCheck.needsCompression) {
292-
// Context exceeds threshold, compress ALL messages into a single summary
293-
return {
294-
payload: {
295-
currentTokenCount: compressionCheck.currentTokenCount,
296-
existingSummary: this.findExistingSummary(state.messages),
297-
messages: state.messages,
298-
},
299-
type: 'compress_context',
300-
} as AgentInstructionCompressContext;
289+
if (compressionEnabled) {
290+
const compressionCheck = shouldCompress(state.messages, {
291+
maxWindowToken: this.config.compressionConfig?.maxWindowToken,
292+
});
293+
294+
if (compressionCheck.needsCompression) {
295+
// Context exceeds threshold, compress ALL messages into a single summary
296+
return {
297+
payload: {
298+
currentTokenCount: compressionCheck.currentTokenCount,
299+
existingSummary: this.findExistingSummary(state.messages),
300+
messages: state.messages,
301+
},
302+
type: 'compress_context',
303+
} as AgentInstructionCompressContext;
304+
}
301305
}
302306

303307
// User input received, call LLM to generate response

ā€Žpackages/agent-runtime/src/types/generalAgent.tsā€Ž

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,15 @@ export interface GeneralAgentConfig {
6969
};
7070
/**
7171
* Context compression configuration
72-
* Note: Compression checking is always enabled to prevent context overflow.
73-
* When triggered, ALL messages are compressed into a single MessageGroup summary.
72+
* When enabled and triggered, ALL messages are compressed into a single MessageGroup summary.
7473
*/
7574
compressionConfig?: {
75+
/** Whether context compression is enabled (default: true) */
76+
enabled?: boolean;
7677
/** Model's max context window token count (default: 128k) */
7778
maxWindowToken?: number;
7879
};
7980
modelRuntimeConfig?: {
80-
model: string;
81-
provider: string;
8281
/**
8382
* Compression model configuration
8483
* Used for context compression tasks
@@ -87,6 +86,8 @@ export interface GeneralAgentConfig {
8786
model: string;
8887
provider: string;
8988
};
89+
model: string;
90+
provider: string;
9091
};
9192
operationId: string;
9293
userId?: string;

ā€Žsrc/features/ChatInput/ActionBar/Params/Controls.tsxā€Ž

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,23 @@ const Controls = memo<ControlsProps>(({ setUpdating }) => {
320320
: []),
321321
];
322322

323-
const allItems = [...baseItems, ...maxTokensItems];
323+
// Context Compression items
324+
const contextCompressionItems: FormItemProps[] = [
325+
{
326+
children: <Switch />,
327+
label: (
328+
<Flexbox align={'center'} className={styles.label} gap={8} horizontal>
329+
{t('settingModel.enableContextCompression.title')}
330+
<InfoTooltip title={t('settingModel.enableContextCompression.desc')} />
331+
</Flexbox>
332+
),
333+
name: ['chatConfig', 'enableContextCompression'],
334+
tag: 'compression',
335+
valuePropName: 'checked',
336+
},
337+
];
338+
339+
const allItems = [...baseItems, ...maxTokensItems, ...contextCompressionItems];
324340

325341
return (
326342
<Form

ā€Žsrc/locales/default/setting.tsā€Ž

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,9 @@ export default {
501501
'Set the default number of images generated when creating a new task in the image generation panel.',
502502
'settingImage.defaultCount.label': 'Default Image Count',
503503
'settingImage.defaultCount.title': 'AI Art',
504+
'settingModel.enableContextCompression.desc':
505+
'Automatically compress historical messages into summaries when conversation exceeds 64,000 tokens, saving 60-80% token usage',
506+
'settingModel.enableContextCompression.title': 'Enable Auto Context Compression',
504507
'settingModel.enableMaxTokens.title': 'Enable Max Tokens Limit',
505508
'settingModel.enableReasoningEffort.title': 'Enable Reasoning Effort Adjustment',
506509
'settingModel.frequencyPenalty.desc':

ā€Žsrc/server/services/agentRuntime/AgentRuntimeService.tsā€Ž

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,7 @@ export class AgentRuntimeService {
126126
*/
127127
private stepCallbacks: Map<string, StepLifecycleCallbacks> = new Map();
128128
private get baseURL() {
129-
const baseUrl =
130-
process.env.AGENT_RUNTIME_BASE_URL || appEnv.APP_URL || 'http://localhost:3010';
129+
const baseUrl = process.env.AGENT_RUNTIME_BASE_URL || appEnv.APP_URL || 'http://localhost:3010';
131130

132131
return urlJoin(baseUrl, '/api/agent');
133132
}
@@ -840,6 +839,9 @@ export class AgentRuntimeService {
840839
// Create Durable Agent instance
841840
const agent = new GeneralChatAgent({
842841
agentConfig: metadata?.agentConfig,
842+
compressionConfig: {
843+
enabled: metadata?.agentConfig?.chatConfig?.enableContextCompression ?? true,
844+
},
843845
modelRuntimeConfig: metadata?.modelRuntimeConfig,
844846
operationId,
845847
userId: metadata?.userId,

ā€Žsrc/store/chat/slices/aiChat/actions/streamingExecutor.tsā€Ž

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,9 @@ export const streamingExecutor: StateCreator<
702702

703703
const agent = new GeneralChatAgent({
704704
agentConfig: { maxSteps: 1000 },
705+
compressionConfig: {
706+
enabled: agentConfigData.chatConfig?.enableContextCompression ?? true, // Default to enabled
707+
},
705708
operationId: `${messageKey}/${params.parentMessageId}`,
706709
modelRuntimeConfig,
707710
});

ā€Žsrc/store/chat/slices/message/selectors/displayMessage.test.tsā€Ž

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -833,5 +833,26 @@ describe('displayMessageSelectors', () => {
833833
const result = displayMessageSelectors.findLastMessageId('msg-1')(state as ChatStore);
834834
expect(result).toBe('tool-result-id');
835835
});
836+
837+
it('should return lastMessageId for compressedGroup instead of group id', () => {
838+
const compressedGroupMessage = {
839+
id: 'mg_123456',
840+
role: 'compressedGroup',
841+
content: 'Compressed summary',
842+
lastMessageId: 'msg-999',
843+
compressedMessages: [],
844+
pinnedMessages: [],
845+
} as unknown as UIChatMessage;
846+
847+
const state: Partial<ChatStore> = {
848+
activeAgentId: 'test-id',
849+
messagesMap: {
850+
[messageMapKey({ agentId: 'test-id' })]: [compressedGroupMessage],
851+
},
852+
};
853+
854+
const result = displayMessageSelectors.findLastMessageId('mg_123456')(state as ChatStore);
855+
expect(result).toBe('msg-999');
856+
});
836857
});
837858
});

0 commit comments

Comments
Ā (0)