@strands-agents/sdk 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/src/__fixtures__/agent-helpers.d.ts +16 -1
- package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/agent-helpers.js +42 -0
- package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.d.ts +2 -1
- package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
- package/dist/src/__fixtures__/tool-helpers.js +20 -3
- package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
- package/dist/src/__tests__/interrupt.test.d.ts +2 -0
- package/dist/src/__tests__/interrupt.test.d.ts.map +1 -0
- package/dist/src/__tests__/interrupt.test.js +264 -0
- package/dist/src/__tests__/interrupt.test.js.map +1 -0
- package/dist/src/__tests__/mcp.test.js +447 -7
- package/dist/src/__tests__/mcp.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.hook.test.js +551 -1
- package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
- package/dist/src/agent/__tests__/agent.interrupt.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.interrupt.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.interrupt.test.js +779 -0
- package/dist/src/agent/__tests__/agent.interrupt.test.js.map +1 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.d.ts +2 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.d.ts.map +1 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.js +161 -0
- package/dist/src/agent/__tests__/agent.model-retry.test.js.map +1 -0
- package/dist/src/agent/__tests__/agent.test.js +174 -0
- package/dist/src/agent/__tests__/agent.test.js.map +1 -1
- package/dist/src/agent/__tests__/snapshot.test.js +148 -4
- package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
- package/dist/src/agent/agent-as-tool.d.ts.map +1 -1
- package/dist/src/agent/agent-as-tool.js +2 -3
- package/dist/src/agent/agent-as-tool.js.map +1 -1
- package/dist/src/agent/agent.d.ts +94 -4
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +625 -223
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/agent/snapshot.d.ts +11 -19
- package/dist/src/agent/snapshot.d.ts.map +1 -1
- package/dist/src/agent/snapshot.js +23 -19
- package/dist/src/agent/snapshot.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +230 -9
- package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +19 -6
- package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +422 -41
- package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +75 -1
- package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
- package/dist/src/conversation-manager/conversation-manager.d.ts +67 -22
- package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/conversation-manager.js +65 -13
- package/dist/src/conversation-manager/conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/index.d.ts +1 -1
- package/dist/src/conversation-manager/index.d.ts.map +1 -1
- package/dist/src/conversation-manager/index.js +1 -1
- package/dist/src/conversation-manager/index.js.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +43 -10
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js +202 -45
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts +23 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/summarizing-conversation-manager.js +39 -17
- package/dist/src/conversation-manager/summarizing-conversation-manager.js.map +1 -1
- package/dist/src/hooks/__tests__/events.test.js +99 -12
- package/dist/src/hooks/__tests__/events.test.js.map +1 -1
- package/dist/src/hooks/__tests__/registry.test.js +166 -2
- package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
- package/dist/src/hooks/events.d.ts +125 -32
- package/dist/src/hooks/events.d.ts.map +1 -1
- package/dist/src/hooks/events.js +111 -8
- package/dist/src/hooks/events.js.map +1 -1
- package/dist/src/hooks/index.d.ts +4 -3
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/index.js +2 -1
- package/dist/src/hooks/index.js.map +1 -1
- package/dist/src/hooks/registry.d.ts +12 -12
- package/dist/src/hooks/registry.d.ts.map +1 -1
- package/dist/src/hooks/registry.js +55 -15
- package/dist/src/hooks/registry.js.map +1 -1
- package/dist/src/hooks/types.d.ts +23 -0
- package/dist/src/hooks/types.d.ts.map +1 -1
- package/dist/src/hooks/types.js +17 -1
- package/dist/src/hooks/types.js.map +1 -1
- package/dist/src/index.d.ts +12 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/interrupt.d.ts +247 -0
- package/dist/src/interrupt.d.ts.map +1 -0
- package/dist/src/interrupt.js +316 -0
- package/dist/src/interrupt.js.map +1 -0
- package/dist/src/mcp.d.ts +61 -4
- package/dist/src/mcp.d.ts.map +1 -1
- package/dist/src/mcp.js +161 -25
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/models/__tests__/anthropic.test.js +78 -8
- package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
- package/dist/src/models/__tests__/bedrock.test.js +156 -18
- package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
- package/dist/src/models/__tests__/defaults.test.d.ts +2 -0
- package/dist/src/models/__tests__/defaults.test.d.ts.map +1 -0
- package/dist/src/models/__tests__/defaults.test.js +36 -0
- package/dist/src/models/__tests__/defaults.test.js.map +1 -0
- package/dist/src/models/__tests__/google.test.js +72 -6
- package/dist/src/models/__tests__/google.test.js.map +1 -1
- package/dist/src/models/anthropic.d.ts +10 -0
- package/dist/src/models/anthropic.d.ts.map +1 -1
- package/dist/src/models/anthropic.js +14 -4
- package/dist/src/models/anthropic.js.map +1 -1
- package/dist/src/models/bedrock.d.ts +17 -3
- package/dist/src/models/bedrock.d.ts.map +1 -1
- package/dist/src/models/bedrock.js +80 -13
- package/dist/src/models/bedrock.js.map +1 -1
- package/dist/src/models/defaults.d.ts +10 -0
- package/dist/src/models/defaults.d.ts.map +1 -1
- package/dist/src/models/defaults.js +129 -0
- package/dist/src/models/defaults.js.map +1 -1
- package/dist/src/models/google/model.d.ts.map +1 -1
- package/dist/src/models/google/model.js +4 -2
- package/dist/src/models/google/model.js.map +1 -1
- package/dist/src/models/google/types.d.ts +10 -0
- package/dist/src/models/google/types.d.ts.map +1 -1
- package/dist/src/models/model.d.ts +15 -0
- package/dist/src/models/model.d.ts.map +1 -1
- package/dist/src/models/model.js +18 -0
- package/dist/src/models/model.js.map +1 -1
- package/dist/src/models/openai/__tests__/chat.test.js +55 -2
- package/dist/src/models/openai/__tests__/chat.test.js.map +1 -1
- package/dist/src/models/openai/__tests__/responses.test.js +19 -0
- package/dist/src/models/openai/__tests__/responses.test.js.map +1 -1
- package/dist/src/models/openai/errors.d.ts.map +1 -1
- package/dist/src/models/openai/errors.js +7 -4
- package/dist/src/models/openai/errors.js.map +1 -1
- package/dist/src/models/openai/model.d.ts.map +1 -1
- package/dist/src/models/openai/model.js +2 -2
- package/dist/src/models/openai/model.js.map +1 -1
- package/dist/src/multiagent/__tests__/graph.test.js +69 -0
- package/dist/src/multiagent/__tests__/graph.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/graph.tracer.test.js +14 -0
- package/dist/src/multiagent/__tests__/graph.tracer.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/interrupts.test.d.ts +2 -0
- package/dist/src/multiagent/__tests__/interrupts.test.d.ts.map +1 -0
- package/dist/src/multiagent/__tests__/interrupts.test.js +390 -0
- package/dist/src/multiagent/__tests__/interrupts.test.js.map +1 -0
- package/dist/src/multiagent/__tests__/nodes.test.js +13 -0
- package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/state.test.js +139 -1
- package/dist/src/multiagent/__tests__/state.test.js.map +1 -1
- package/dist/src/multiagent/__tests__/swarm.test.js +77 -0
- package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -1
- package/dist/src/multiagent/events.d.ts +15 -1
- package/dist/src/multiagent/events.d.ts.map +1 -1
- package/dist/src/multiagent/events.js +18 -0
- package/dist/src/multiagent/events.js.map +1 -1
- package/dist/src/multiagent/graph.d.ts +59 -3
- package/dist/src/multiagent/graph.d.ts.map +1 -1
- package/dist/src/multiagent/graph.js +201 -34
- package/dist/src/multiagent/graph.js.map +1 -1
- package/dist/src/multiagent/multiagent.d.ts +77 -3
- package/dist/src/multiagent/multiagent.d.ts.map +1 -1
- package/dist/src/multiagent/multiagent.js +115 -1
- package/dist/src/multiagent/multiagent.js.map +1 -1
- package/dist/src/multiagent/nodes.d.ts +18 -0
- package/dist/src/multiagent/nodes.d.ts.map +1 -1
- package/dist/src/multiagent/nodes.js +69 -22
- package/dist/src/multiagent/nodes.js.map +1 -1
- package/dist/src/multiagent/state.d.ts +39 -3
- package/dist/src/multiagent/state.d.ts.map +1 -1
- package/dist/src/multiagent/state.js +80 -1
- package/dist/src/multiagent/state.js.map +1 -1
- package/dist/src/multiagent/swarm.d.ts +30 -1
- package/dist/src/multiagent/swarm.d.ts.map +1 -1
- package/dist/src/multiagent/swarm.js +166 -33
- package/dist/src/multiagent/swarm.js.map +1 -1
- package/dist/src/registry/__tests__/tool-registry.test.js +37 -0
- package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -1
- package/dist/src/registry/tool-registry.d.ts +13 -7
- package/dist/src/registry/tool-registry.d.ts.map +1 -1
- package/dist/src/registry/tool-registry.js +35 -10
- package/dist/src/registry/tool-registry.js.map +1 -1
- package/dist/src/retry/__tests__/backoff-strategy.test.d.ts +2 -0
- package/dist/src/retry/__tests__/backoff-strategy.test.d.ts.map +1 -0
- package/dist/src/retry/__tests__/backoff-strategy.test.js +116 -0
- package/dist/src/retry/__tests__/backoff-strategy.test.js.map +1 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts +2 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts.map +1 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.js +225 -0
- package/dist/src/retry/__tests__/default-model-retry-strategy.test.js.map +1 -0
- package/dist/src/retry/backoff-strategy.d.ts +108 -0
- package/dist/src/retry/backoff-strategy.d.ts.map +1 -0
- package/dist/src/retry/backoff-strategy.js +86 -0
- package/dist/src/retry/backoff-strategy.js.map +1 -0
- package/dist/src/retry/default-model-retry-strategy.d.ts +76 -0
- package/dist/src/retry/default-model-retry-strategy.d.ts.map +1 -0
- package/dist/src/retry/default-model-retry-strategy.js +104 -0
- package/dist/src/retry/default-model-retry-strategy.js.map +1 -0
- package/dist/src/retry/index.d.ts +8 -0
- package/dist/src/retry/index.d.ts.map +1 -0
- package/dist/src/retry/index.js +7 -0
- package/dist/src/retry/index.js.map +1 -0
- package/dist/src/retry/model-retry-strategy.d.ts +80 -0
- package/dist/src/retry/model-retry-strategy.d.ts.map +1 -0
- package/dist/src/retry/model-retry-strategy.js +85 -0
- package/dist/src/retry/model-retry-strategy.js.map +1 -0
- package/dist/src/retry/retry-strategy.d.ts +34 -0
- package/dist/src/retry/retry-strategy.d.ts.map +1 -0
- package/dist/src/retry/retry-strategy.js +25 -0
- package/dist/src/retry/retry-strategy.js.map +1 -0
- package/dist/src/session/__tests__/session-manager.test.js +84 -3
- package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
- package/dist/src/session/session-manager.d.ts +11 -2
- package/dist/src/session/session-manager.d.ts.map +1 -1
- package/dist/src/session/session-manager.js +17 -6
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/telemetry/__tests__/meter.test.js +5 -27
- package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
- package/dist/src/telemetry/meter.d.ts +12 -4
- package/dist/src/telemetry/meter.d.ts.map +1 -1
- package/dist/src/telemetry/meter.js +13 -8
- package/dist/src/telemetry/meter.js.map +1 -1
- package/dist/src/tools/__tests__/tool.test.js +24 -1
- package/dist/src/tools/__tests__/tool.test.js.map +1 -1
- package/dist/src/tools/function-tool.d.ts.map +1 -1
- package/dist/src/tools/function-tool.js +6 -1
- package/dist/src/tools/function-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts.map +1 -1
- package/dist/src/tools/mcp-tool.js +3 -2
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/tool.d.ts +10 -1
- package/dist/src/tools/tool.d.ts.map +1 -1
- package/dist/src/tools/tool.js +12 -0
- package/dist/src/tools/tool.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/types/__tests__/agent.test.js +97 -0
- package/dist/src/types/__tests__/agent.test.js.map +1 -1
- package/dist/src/types/agent.d.ts +48 -8
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js +28 -3
- package/dist/src/types/agent.js.map +1 -1
- package/dist/src/types/interrupt.d.ts +103 -0
- package/dist/src/types/interrupt.d.ts.map +1 -0
- package/dist/src/types/interrupt.js +63 -0
- package/dist/src/types/interrupt.js.map +1 -0
- package/dist/src/types/messages.d.ts +2 -1
- package/dist/src/types/messages.d.ts.map +1 -1
- package/dist/src/types/messages.js.map +1 -1
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +292 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +148 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts +2 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js +78 -0
- package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/index.d.ts +23 -0
- package/dist/src/vended-plugins/context-offloader/index.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/index.js +21 -0
- package/dist/src/vended-plugins/context-offloader/index.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/plugin.d.ts +48 -0
- package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/plugin.js +244 -0
- package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -0
- package/dist/src/vended-plugins/context-offloader/storage.d.ts +114 -0
- package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -0
- package/dist/src/vended-plugins/context-offloader/storage.js +204 -0
- package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -0
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +12 -0
- package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +1 -1
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +3 -0
- package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
- package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
- package/dist/src/vended-tools/bash/bash.js +0 -3
- package/dist/src/vended-tools/bash/bash.js.map +1 -1
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +3 -0
- package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -1
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +3 -0
- package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
- package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
- package/package.json +9 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/conversation-manager/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/conversation-manager/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,GAIpB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EACL,gCAAgC,GAEjC,MAAM,0CAA0C,CAAA;AACjD,OAAO,EACL,8BAA8B,GAE/B,MAAM,uCAAuC,CAAA"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* that preserves tool usage pairs and avoids invalid window states.
|
|
6
6
|
*/
|
|
7
7
|
import type { LocalAgent } from '../types/agent.js';
|
|
8
|
-
import { ConversationManager, type ConversationManagerReduceOptions } from './conversation-manager.js';
|
|
8
|
+
import { ConversationManager, type ProactiveCompressionConfig, type ConversationManagerReduceOptions } from './conversation-manager.js';
|
|
9
9
|
/**
|
|
10
10
|
* Configuration for the sliding window conversation manager.
|
|
11
11
|
*/
|
|
@@ -20,6 +20,14 @@ export type SlidingWindowConversationManagerConfig = {
|
|
|
20
20
|
* Defaults to true.
|
|
21
21
|
*/
|
|
22
22
|
shouldTruncateResults?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Enable proactive context compression before the model call.
|
|
25
|
+
*
|
|
26
|
+
* - `true`: compress when 70% of the context window is used (default threshold).
|
|
27
|
+
* - `{ compressionThreshold: number }`: compress at the specified ratio (0, 1].
|
|
28
|
+
* - `false` or omitted: disabled, only reactive overflow recovery is used.
|
|
29
|
+
*/
|
|
30
|
+
proactiveCompression?: boolean | ProactiveCompressionConfig;
|
|
23
31
|
};
|
|
24
32
|
/**
|
|
25
33
|
* Implements a sliding window strategy for managing conversation history.
|
|
@@ -32,6 +40,7 @@ export type SlidingWindowConversationManagerConfig = {
|
|
|
32
40
|
* Registers hooks for:
|
|
33
41
|
* - AfterInvocationEvent: Applies sliding window management after each invocation
|
|
34
42
|
* - AfterModelCallEvent: Reduces context on overflow errors and requests retry (via super)
|
|
43
|
+
* - BeforeModelCallEvent: Proactive compression when threshold is exceeded (via super)
|
|
35
44
|
*/
|
|
36
45
|
export declare class SlidingWindowConversationManager extends ConversationManager {
|
|
37
46
|
private readonly _windowSize;
|
|
@@ -52,14 +61,19 @@ export declare class SlidingWindowConversationManager extends ConversationManage
|
|
|
52
61
|
* Registers:
|
|
53
62
|
* - AfterInvocationEvent callback to apply sliding window management
|
|
54
63
|
* - AfterModelCallEvent callback to handle context overflow and request retry (via super)
|
|
64
|
+
* - BeforeModelCallEvent callback for proactive compression (via super)
|
|
55
65
|
*
|
|
56
66
|
* @param agent - The agent to register hooks with
|
|
57
67
|
*/
|
|
58
68
|
initAgent(agent: LocalAgent): void;
|
|
59
69
|
/**
|
|
60
|
-
* Reduce the conversation history
|
|
70
|
+
* Reduce the conversation history.
|
|
71
|
+
*
|
|
72
|
+
* When `error` is set (reactive overflow recovery), attempts to truncate large tool results
|
|
73
|
+
* first before falling back to message trimming.
|
|
61
74
|
*
|
|
62
|
-
*
|
|
75
|
+
* When `error` is undefined (proactive compression), only trims messages without attempting
|
|
76
|
+
* tool result truncation.
|
|
63
77
|
*
|
|
64
78
|
* @param options - The reduction options
|
|
65
79
|
* @returns `true` if the history was reduced, `false` otherwise
|
|
@@ -91,10 +105,28 @@ export declare class SlidingWindowConversationManager extends ConversationManage
|
|
|
91
105
|
*/
|
|
92
106
|
private _reduceContext;
|
|
93
107
|
/**
|
|
94
|
-
*
|
|
108
|
+
* Apply head/tail truncation to a string if it exceeds the size threshold.
|
|
109
|
+
*
|
|
110
|
+
* Returns the truncated form (first {@link PRESERVE_CHARS} + marker + last
|
|
111
|
+
* {@link PRESERVE_CHARS}) when the input exceeds {@link TRUNCATION_THRESHOLD},
|
|
112
|
+
* otherwise `undefined`.
|
|
113
|
+
*/
|
|
114
|
+
private _truncateLongText;
|
|
115
|
+
/**
|
|
116
|
+
* Truncate tool result content in a message to reduce context size.
|
|
117
|
+
*
|
|
118
|
+
* Rule: preserve head/tail when the payload is plain-text-shaped; replace
|
|
119
|
+
* wholesale when it's binary or remote. Specifically:
|
|
120
|
+
* - Text blocks: partial head/tail truncation if over threshold.
|
|
121
|
+
* - Image, Video blocks: wholesale replacement with a textual placeholder.
|
|
122
|
+
* - Document blocks with bytes/s3 source: wholesale replacement.
|
|
123
|
+
* - Document blocks with text source: partial truncation of the inner text.
|
|
124
|
+
* - Document blocks with content source (TextBlock[]): partial truncation of
|
|
125
|
+
* each nested block.
|
|
126
|
+
* - JSON blocks: wholesale replacement if serialized length is over threshold;
|
|
127
|
+
* mid-structure truncation would produce invalid JSON.
|
|
95
128
|
*
|
|
96
|
-
*
|
|
97
|
-
* this function replaces the content of those tool results with a simple error message.
|
|
129
|
+
* The tool result `status` and `error` fields are preserved.
|
|
98
130
|
*
|
|
99
131
|
* @param messages - The conversation message history.
|
|
100
132
|
* @param msgIdx - Index of the message containing tool results to truncate.
|
|
@@ -102,13 +134,14 @@ export declare class SlidingWindowConversationManager extends ConversationManage
|
|
|
102
134
|
*/
|
|
103
135
|
private _truncateToolResults;
|
|
104
136
|
/**
|
|
105
|
-
* Find the index of the
|
|
137
|
+
* Find the index of the oldest message containing tool results.
|
|
106
138
|
*
|
|
107
|
-
*
|
|
139
|
+
* Truncation targets the least-recent tool result first so the most relevant
|
|
140
|
+
* recent context is preserved as long as possible.
|
|
108
141
|
*
|
|
109
142
|
* @param messages - The conversation message history.
|
|
110
|
-
* @returns Index of the
|
|
143
|
+
* @returns Index of the oldest message with tool results, or undefined if no such message exists.
|
|
111
144
|
*/
|
|
112
|
-
private
|
|
145
|
+
private _findOldestMessageWithToolResults;
|
|
113
146
|
}
|
|
114
147
|
//# sourceMappingURL=sliding-window-conversation-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sliding-window-conversation-manager.d.ts","sourceRoot":"","sources":["../../../src/conversation-manager/sliding-window-conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"sliding-window-conversation-manager.d.ts","sourceRoot":"","sources":["../../../src/conversation-manager/sliding-window-conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,EACtC,MAAM,2BAA2B,CAAA;AAkElC;;GAEG;AACH,MAAM,MAAM,sCAAsC,GAAG;IACnD;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAE/B;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,GAAG,0BAA0B,CAAA;CAC5D,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,gCAAiC,SAAQ,mBAAmB;IACvE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAEhD;;OAEG;IACH,QAAQ,CAAC,IAAI,iDAAgD;IAE7D;;;;OAIG;gBACS,MAAM,CAAC,EAAE,sCAAsC;IAM3D;;;;;;;;;OASG;IACa,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQlD;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gCAAgC,GAAG,OAAO;IAInE;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,cAAc;IAkEtB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,oBAAoB;IAoI5B;;;;;;;;OAQG;IACH,OAAO,CAAC,iCAAiC;CAa1C"}
|
|
@@ -5,9 +5,68 @@
|
|
|
5
5
|
* that preserves tool usage pairs and avoids invalid window states.
|
|
6
6
|
*/
|
|
7
7
|
import { Message, TextBlock, ToolResultBlock } from '../types/messages.js';
|
|
8
|
+
import { DocumentBlock, ImageBlock, VideoBlock } from '../types/media.js';
|
|
8
9
|
import { AfterInvocationEvent } from '../hooks/events.js';
|
|
9
|
-
import { ConversationManager } from './conversation-manager.js';
|
|
10
|
+
import { ConversationManager, } from './conversation-manager.js';
|
|
10
11
|
import { logger } from '../logging/logger.js';
|
|
12
|
+
const PRESERVE_CHARS = 200;
|
|
13
|
+
// Max plausible marker length, including newlines. Used as the minimum reduction
|
|
14
|
+
// a re-truncation would need to produce in order to be worth running.
|
|
15
|
+
const MIN_TRUNCATION_GAIN = 50;
|
|
16
|
+
// Text payloads at or below this length aren't worth truncating: the savings
|
|
17
|
+
// would be smaller than the marker itself, and already-truncated output (which
|
|
18
|
+
// lands just above `2 * PRESERVE_CHARS`) falls under this threshold so a
|
|
19
|
+
// second pass is a natural no-op.
|
|
20
|
+
const TRUNCATION_THRESHOLD = 2 * PRESERVE_CHARS + MIN_TRUNCATION_GAIN;
|
|
21
|
+
/**
|
|
22
|
+
* Build a short textual stand-in for an image block, used when truncating tool
|
|
23
|
+
* results. The placeholder identifies the image format and its source kind
|
|
24
|
+
* (bytes/url/s3) so the model can reason about what was dropped. For inline
|
|
25
|
+
* bytes the size is included; URL and S3 sources only report the kind since
|
|
26
|
+
* their byte count isn't known locally.
|
|
27
|
+
*/
|
|
28
|
+
function imagePlaceholder(image) {
|
|
29
|
+
const source = image.source;
|
|
30
|
+
if (source.type === 'imageSourceBytes') {
|
|
31
|
+
return `[image: ${image.format}, source: bytes, ${source.bytes.byteLength} bytes]`;
|
|
32
|
+
}
|
|
33
|
+
if (source.type === 'imageSourceUrl') {
|
|
34
|
+
return `[image: ${image.format}, source: url]`;
|
|
35
|
+
}
|
|
36
|
+
return `[image: ${image.format}, source: s3]`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Build a short textual stand-in for a video block. Binary payloads can't be
|
|
40
|
+
* partially inspected, so videos are replaced wholesale. The placeholder
|
|
41
|
+
* reports format and source kind; byte count is included for inline bytes.
|
|
42
|
+
*/
|
|
43
|
+
function videoPlaceholder(video) {
|
|
44
|
+
const source = video.source;
|
|
45
|
+
if (source.type === 'videoSourceBytes') {
|
|
46
|
+
return `[video: ${video.format}, source: bytes, ${source.bytes.byteLength} bytes]`;
|
|
47
|
+
}
|
|
48
|
+
return `[video: ${video.format}, source: s3]`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build a short textual stand-in for a document block with a binary or remote
|
|
52
|
+
* source. Text-based document sources (text / content) are truncated in place
|
|
53
|
+
* instead of replaced, so this is only called for bytes / s3.
|
|
54
|
+
*/
|
|
55
|
+
function documentPlaceholder(doc) {
|
|
56
|
+
const source = doc.source;
|
|
57
|
+
if (source.type === 'documentSourceBytes') {
|
|
58
|
+
return `[document: ${doc.name}, ${doc.format}, source: bytes, ${source.bytes.byteLength} bytes]`;
|
|
59
|
+
}
|
|
60
|
+
return `[document: ${doc.name}, ${doc.format}, source: s3]`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Build a short textual stand-in for a JSON block. The serialized length is
|
|
64
|
+
* reported so the model knows how much was dropped; truncating JSON
|
|
65
|
+
* mid-structure would produce invalid output, so the whole block is replaced.
|
|
66
|
+
*/
|
|
67
|
+
function jsonPlaceholder(serializedLength) {
|
|
68
|
+
return `[json: ${serializedLength} chars]`;
|
|
69
|
+
}
|
|
11
70
|
/**
|
|
12
71
|
* Implements a sliding window strategy for managing conversation history.
|
|
13
72
|
*
|
|
@@ -19,6 +78,7 @@ import { logger } from '../logging/logger.js';
|
|
|
19
78
|
* Registers hooks for:
|
|
20
79
|
* - AfterInvocationEvent: Applies sliding window management after each invocation
|
|
21
80
|
* - AfterModelCallEvent: Reduces context on overflow errors and requests retry (via super)
|
|
81
|
+
* - BeforeModelCallEvent: Proactive compression when threshold is exceeded (via super)
|
|
22
82
|
*/
|
|
23
83
|
export class SlidingWindowConversationManager extends ConversationManager {
|
|
24
84
|
_windowSize;
|
|
@@ -33,7 +93,7 @@ export class SlidingWindowConversationManager extends ConversationManager {
|
|
|
33
93
|
* @param config - Configuration options for the sliding window manager.
|
|
34
94
|
*/
|
|
35
95
|
constructor(config) {
|
|
36
|
-
super();
|
|
96
|
+
super(config);
|
|
37
97
|
this._windowSize = config?.windowSize ?? 40;
|
|
38
98
|
this._shouldTruncateResults = config?.shouldTruncateResults ?? true;
|
|
39
99
|
}
|
|
@@ -43,6 +103,7 @@ export class SlidingWindowConversationManager extends ConversationManager {
|
|
|
43
103
|
* Registers:
|
|
44
104
|
* - AfterInvocationEvent callback to apply sliding window management
|
|
45
105
|
* - AfterModelCallEvent callback to handle context overflow and request retry (via super)
|
|
106
|
+
* - BeforeModelCallEvent callback for proactive compression (via super)
|
|
46
107
|
*
|
|
47
108
|
* @param agent - The agent to register hooks with
|
|
48
109
|
*/
|
|
@@ -53,9 +114,13 @@ export class SlidingWindowConversationManager extends ConversationManager {
|
|
|
53
114
|
});
|
|
54
115
|
}
|
|
55
116
|
/**
|
|
56
|
-
* Reduce the conversation history
|
|
117
|
+
* Reduce the conversation history.
|
|
118
|
+
*
|
|
119
|
+
* When `error` is set (reactive overflow recovery), attempts to truncate large tool results
|
|
120
|
+
* first before falling back to message trimming.
|
|
57
121
|
*
|
|
58
|
-
*
|
|
122
|
+
* When `error` is undefined (proactive compression), only trims messages without attempting
|
|
123
|
+
* tool result truncation.
|
|
59
124
|
*
|
|
60
125
|
* @param options - The reduction options
|
|
61
126
|
* @returns `true` if the history was reduced, `false` otherwise
|
|
@@ -94,9 +159,9 @@ export class SlidingWindowConversationManager extends ConversationManager {
|
|
|
94
159
|
*/
|
|
95
160
|
_reduceContext(messages, _error) {
|
|
96
161
|
// Only truncate tool results when handling a context overflow error, not for window size enforcement
|
|
97
|
-
const
|
|
98
|
-
if (_error &&
|
|
99
|
-
const resultsTruncated = this._truncateToolResults(messages,
|
|
162
|
+
const oldestMessageIdxWithToolResults = this._findOldestMessageWithToolResults(messages);
|
|
163
|
+
if (_error && oldestMessageIdxWithToolResults !== undefined && this._shouldTruncateResults) {
|
|
164
|
+
const resultsTruncated = this._truncateToolResults(messages, oldestMessageIdxWithToolResults);
|
|
100
165
|
if (resultsTruncated) {
|
|
101
166
|
return true;
|
|
102
167
|
}
|
|
@@ -148,10 +213,36 @@ export class SlidingWindowConversationManager extends ConversationManager {
|
|
|
148
213
|
return true;
|
|
149
214
|
}
|
|
150
215
|
/**
|
|
151
|
-
*
|
|
216
|
+
* Apply head/tail truncation to a string if it exceeds the size threshold.
|
|
217
|
+
*
|
|
218
|
+
* Returns the truncated form (first {@link PRESERVE_CHARS} + marker + last
|
|
219
|
+
* {@link PRESERVE_CHARS}) when the input exceeds {@link TRUNCATION_THRESHOLD},
|
|
220
|
+
* otherwise `undefined`.
|
|
221
|
+
*/
|
|
222
|
+
_truncateLongText(text) {
|
|
223
|
+
if (text.length <= TRUNCATION_THRESHOLD) {
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
const prefix = text.slice(0, PRESERVE_CHARS);
|
|
227
|
+
const suffix = text.slice(-PRESERVE_CHARS);
|
|
228
|
+
const removed = text.length - 2 * PRESERVE_CHARS;
|
|
229
|
+
return `${prefix}\n<truncated chars="${removed}"/>\n${suffix}`;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Truncate tool result content in a message to reduce context size.
|
|
233
|
+
*
|
|
234
|
+
* Rule: preserve head/tail when the payload is plain-text-shaped; replace
|
|
235
|
+
* wholesale when it's binary or remote. Specifically:
|
|
236
|
+
* - Text blocks: partial head/tail truncation if over threshold.
|
|
237
|
+
* - Image, Video blocks: wholesale replacement with a textual placeholder.
|
|
238
|
+
* - Document blocks with bytes/s3 source: wholesale replacement.
|
|
239
|
+
* - Document blocks with text source: partial truncation of the inner text.
|
|
240
|
+
* - Document blocks with content source (TextBlock[]): partial truncation of
|
|
241
|
+
* each nested block.
|
|
242
|
+
* - JSON blocks: wholesale replacement if serialized length is over threshold;
|
|
243
|
+
* mid-structure truncation would produce invalid JSON.
|
|
152
244
|
*
|
|
153
|
-
*
|
|
154
|
-
* this function replaces the content of those tool results with a simple error message.
|
|
245
|
+
* The tool result `status` and `error` fields are preserved.
|
|
155
246
|
*
|
|
156
247
|
* @param messages - The conversation message history.
|
|
157
248
|
* @param msgIdx - Index of the message containing tool results to truncate.
|
|
@@ -165,39 +256,105 @@ export class SlidingWindowConversationManager extends ConversationManager {
|
|
|
165
256
|
if (!message) {
|
|
166
257
|
return false;
|
|
167
258
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
if (
|
|
178
|
-
|
|
259
|
+
let changesMade = false;
|
|
260
|
+
const newContent = message.content.map((block) => {
|
|
261
|
+
if (block.type !== 'toolResultBlock') {
|
|
262
|
+
return block;
|
|
263
|
+
}
|
|
264
|
+
const toolResultBlock = block;
|
|
265
|
+
const newItems = [];
|
|
266
|
+
let itemChanged = false;
|
|
267
|
+
for (const item of toolResultBlock.content) {
|
|
268
|
+
if (item.type === 'imageBlock') {
|
|
269
|
+
newItems.push(new TextBlock(imagePlaceholder(item)));
|
|
270
|
+
itemChanged = true;
|
|
271
|
+
continue;
|
|
179
272
|
}
|
|
180
|
-
|
|
181
|
-
|
|
273
|
+
if (item.type === 'videoBlock') {
|
|
274
|
+
newItems.push(new TextBlock(videoPlaceholder(item)));
|
|
275
|
+
itemChanged = true;
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
if (item.type === 'documentBlock') {
|
|
279
|
+
const source = item.source;
|
|
280
|
+
if (source.type === 'documentSourceBytes' || source.type === 'documentSourceS3Location') {
|
|
281
|
+
newItems.push(new TextBlock(documentPlaceholder(item)));
|
|
282
|
+
itemChanged = true;
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
if (source.type === 'documentSourceText') {
|
|
286
|
+
const truncated = this._truncateLongText(source.text);
|
|
287
|
+
if (truncated !== undefined) {
|
|
288
|
+
newItems.push(new DocumentBlock({
|
|
289
|
+
name: item.name,
|
|
290
|
+
format: item.format,
|
|
291
|
+
source: { text: truncated },
|
|
292
|
+
...(item.citations !== undefined ? { citations: item.citations } : {}),
|
|
293
|
+
...(item.context !== undefined ? { context: item.context } : {}),
|
|
294
|
+
}));
|
|
295
|
+
itemChanged = true;
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (source.type === 'documentSourceContentBlock') {
|
|
300
|
+
let nestedChanged = false;
|
|
301
|
+
const newContentBlocks = source.content.map((nested) => {
|
|
302
|
+
const truncated = this._truncateLongText(nested.text);
|
|
303
|
+
if (truncated !== undefined) {
|
|
304
|
+
nestedChanged = true;
|
|
305
|
+
return new TextBlock(truncated);
|
|
306
|
+
}
|
|
307
|
+
return nested;
|
|
308
|
+
});
|
|
309
|
+
if (nestedChanged) {
|
|
310
|
+
newItems.push(new DocumentBlock({
|
|
311
|
+
name: item.name,
|
|
312
|
+
format: item.format,
|
|
313
|
+
source: { content: newContentBlocks },
|
|
314
|
+
...(item.citations !== undefined ? { citations: item.citations } : {}),
|
|
315
|
+
...(item.context !== undefined ? { context: item.context } : {}),
|
|
316
|
+
}));
|
|
317
|
+
itemChanged = true;
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
newItems.push(item);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
if (item.type === 'jsonBlock') {
|
|
325
|
+
const serializedLength = JSON.stringify(item.json).length;
|
|
326
|
+
if (serializedLength > TRUNCATION_THRESHOLD) {
|
|
327
|
+
newItems.push(new TextBlock(jsonPlaceholder(serializedLength)));
|
|
328
|
+
itemChanged = true;
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
newItems.push(item);
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
if (item.type === 'textBlock') {
|
|
335
|
+
const truncated = this._truncateLongText(item.text);
|
|
336
|
+
if (truncated !== undefined) {
|
|
337
|
+
newItems.push(new TextBlock(truncated));
|
|
338
|
+
itemChanged = true;
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
newItems.push(item);
|
|
182
343
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
return false;
|
|
186
|
-
}
|
|
187
|
-
// Create new content array with truncated tool results
|
|
188
|
-
const newContent = message.content.map((block) => {
|
|
189
|
-
if (block.type === 'toolResultBlock') {
|
|
190
|
-
const toolResultBlock = block;
|
|
191
|
-
// Create new ToolResultBlock with truncated content
|
|
192
|
-
return new ToolResultBlock({
|
|
193
|
-
toolUseId: toolResultBlock.toolUseId,
|
|
194
|
-
status: 'error',
|
|
195
|
-
content: [new TextBlock(toolResultTooLargeMessage)],
|
|
196
|
-
});
|
|
344
|
+
if (!itemChanged) {
|
|
345
|
+
return block;
|
|
197
346
|
}
|
|
198
|
-
|
|
347
|
+
changesMade = true;
|
|
348
|
+
return new ToolResultBlock({
|
|
349
|
+
toolUseId: toolResultBlock.toolUseId,
|
|
350
|
+
status: toolResultBlock.status,
|
|
351
|
+
content: newItems,
|
|
352
|
+
...(toolResultBlock.error !== undefined ? { error: toolResultBlock.error } : {}),
|
|
353
|
+
});
|
|
199
354
|
});
|
|
200
|
-
|
|
355
|
+
if (!changesMade) {
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
201
358
|
messages[msgIdx] = new Message({
|
|
202
359
|
role: message.role,
|
|
203
360
|
content: newContent,
|
|
@@ -205,16 +362,16 @@ export class SlidingWindowConversationManager extends ConversationManager {
|
|
|
205
362
|
return true;
|
|
206
363
|
}
|
|
207
364
|
/**
|
|
208
|
-
* Find the index of the
|
|
365
|
+
* Find the index of the oldest message containing tool results.
|
|
209
366
|
*
|
|
210
|
-
*
|
|
367
|
+
* Truncation targets the least-recent tool result first so the most relevant
|
|
368
|
+
* recent context is preserved as long as possible.
|
|
211
369
|
*
|
|
212
370
|
* @param messages - The conversation message history.
|
|
213
|
-
* @returns Index of the
|
|
371
|
+
* @returns Index of the oldest message with tool results, or undefined if no such message exists.
|
|
214
372
|
*/
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
for (let idx = messages.length - 1; idx >= 0; idx--) {
|
|
373
|
+
_findOldestMessageWithToolResults(messages) {
|
|
374
|
+
for (let idx = 0; idx < messages.length; idx++) {
|
|
218
375
|
const currentMessage = messages[idx];
|
|
219
376
|
const hasToolResult = currentMessage.content.some((block) => block.type === 'toolResultBlock');
|
|
220
377
|
if (hasToolResult) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sliding-window-conversation-manager.js","sourceRoot":"","sources":["../../../src/conversation-manager/sliding-window-conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"sliding-window-conversation-manager.js","sourceRoot":"","sources":["../../../src/conversation-manager/sliding-window-conversation-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* when the context window overflows, preserving important information rather
|
|
6
6
|
* than simply discarding it.
|
|
7
7
|
*/
|
|
8
|
-
import { ConversationManager, type ConversationManagerReduceOptions } from './conversation-manager.js';
|
|
8
|
+
import { ConversationManager, type ProactiveCompressionConfig, type ConversationManagerReduceOptions } from './conversation-manager.js';
|
|
9
9
|
import type { Model } from '../models/model.js';
|
|
10
10
|
/**
|
|
11
11
|
* Configuration for the summarization conversation manager.
|
|
@@ -32,6 +32,14 @@ export type SummarizingConversationManagerConfig = {
|
|
|
32
32
|
* prompt that produces structured bullet-point summaries.
|
|
33
33
|
*/
|
|
34
34
|
summarizationSystemPrompt?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Enable proactive context compression before the model call.
|
|
37
|
+
*
|
|
38
|
+
* - `true`: compress when 70% of the context window is used (default threshold).
|
|
39
|
+
* - `{ compressionThreshold: number }`: compress at the specified ratio (0, 1].
|
|
40
|
+
* - `false` or omitted: disabled, only reactive overflow recovery is used.
|
|
41
|
+
*/
|
|
42
|
+
proactiveCompression?: boolean | ProactiveCompressionConfig;
|
|
35
43
|
};
|
|
36
44
|
/**
|
|
37
45
|
* Implements a summarization strategy for managing conversation history.
|
|
@@ -50,10 +58,24 @@ export declare class SummarizingConversationManager extends ConversationManager
|
|
|
50
58
|
/**
|
|
51
59
|
* Reduce the conversation history by summarizing older messages.
|
|
52
60
|
*
|
|
61
|
+
* When `error` is set (reactive overflow recovery), summarization failure is rethrown
|
|
62
|
+
* with the original error as cause — the agent loop must not proceed with an overflow.
|
|
63
|
+
*
|
|
64
|
+
* When `error` is undefined (proactive compression), summarization failure is logged
|
|
65
|
+
* and returns `false` — the model call proceeds regardless.
|
|
66
|
+
*
|
|
53
67
|
* @param options - The reduction options
|
|
54
68
|
* @returns `true` if the history was reduced, `false` otherwise
|
|
55
69
|
*/
|
|
56
70
|
reduce({ agent, model, error }: ConversationManagerReduceOptions): Promise<boolean>;
|
|
71
|
+
/**
|
|
72
|
+
* Summarize the oldest messages and replace them with a summary.
|
|
73
|
+
*
|
|
74
|
+
* @param agent - The agent instance
|
|
75
|
+
* @param model - The model to use for summarization
|
|
76
|
+
* @returns `true` if the history was reduced, `false` otherwise
|
|
77
|
+
*/
|
|
78
|
+
private _summarizeOldest;
|
|
57
79
|
/**
|
|
58
80
|
* Generate a summary of the provided messages by calling the model directly.
|
|
59
81
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarizing-conversation-manager.d.ts","sourceRoot":"","sources":["../../../src/conversation-manager/summarizing-conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"summarizing-conversation-manager.d.ts","sourceRoot":"","sources":["../../../src/conversation-manager/summarizing-conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,EACtC,MAAM,2BAA2B,CAAA;AAGlC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AA+B/C;;GAEG;AACH,MAAM,MAAM,oCAAoC,GAAG;IACjD;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAE/B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAElC;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,GAAG,0BAA0B,CAAA;CAC5D,CAAA;AAED;;;;;;GAMG;AACH,qBAAa,8BAA+B,SAAQ,mBAAmB;IACrE,QAAQ,CAAC,IAAI,8CAA6C;IAE1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAQ;IAChD,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAQ;gBAEvC,MAAM,CAAC,EAAE,oCAAoC;IASzD;;;;;;;;;;;OAWG;IACG,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,gCAAgC,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBzF;;;;;;OAMG;YACW,gBAAgB;IA8B9B;;;;;OAKG;YACW,gBAAgB;IAgC9B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,6BAA6B;CAoCtC"}
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
* than simply discarding it.
|
|
7
7
|
*/
|
|
8
8
|
import { Message, TextBlock } from '../types/messages.js';
|
|
9
|
-
import { ConversationManager } from './conversation-manager.js';
|
|
9
|
+
import { ConversationManager, } from './conversation-manager.js';
|
|
10
10
|
import { logger } from '../logging/logger.js';
|
|
11
|
+
import { normalizeError } from '../errors.js';
|
|
11
12
|
const DEFAULT_SUMMARIZATION_PROMPT = `You are a conversation summarizer. Provide a concise summary of the conversation \
|
|
12
13
|
history.
|
|
13
14
|
|
|
@@ -50,7 +51,7 @@ export class SummarizingConversationManager extends ConversationManager {
|
|
|
50
51
|
_preserveRecentMessages;
|
|
51
52
|
_summarizationSystemPrompt;
|
|
52
53
|
constructor(config) {
|
|
53
|
-
super();
|
|
54
|
+
super(config);
|
|
54
55
|
this._model = config?.model;
|
|
55
56
|
// clamped [0.1, 0.8]
|
|
56
57
|
this._summaryRatio = Math.max(0.1, Math.min(0.8, config?.summaryRatio ?? 0.3));
|
|
@@ -60,11 +61,40 @@ export class SummarizingConversationManager extends ConversationManager {
|
|
|
60
61
|
/**
|
|
61
62
|
* Reduce the conversation history by summarizing older messages.
|
|
62
63
|
*
|
|
64
|
+
* When `error` is set (reactive overflow recovery), summarization failure is rethrown
|
|
65
|
+
* with the original error as cause — the agent loop must not proceed with an overflow.
|
|
66
|
+
*
|
|
67
|
+
* When `error` is undefined (proactive compression), summarization failure is logged
|
|
68
|
+
* and returns `false` — the model call proceeds regardless.
|
|
69
|
+
*
|
|
63
70
|
* @param options - The reduction options
|
|
64
71
|
* @returns `true` if the history was reduced, `false` otherwise
|
|
65
72
|
*/
|
|
66
73
|
async reduce({ agent, model, error }) {
|
|
67
|
-
|
|
74
|
+
try {
|
|
75
|
+
return await this._summarizeOldest(agent, this._model ?? model);
|
|
76
|
+
}
|
|
77
|
+
catch (summarizationError) {
|
|
78
|
+
if (error) {
|
|
79
|
+
// Reactive: rethrow so the ContextWindowOverflowError propagates
|
|
80
|
+
logger.error(`error=<${summarizationError}> | summarization failed`);
|
|
81
|
+
const wrapped = normalizeError(summarizationError);
|
|
82
|
+
wrapped.cause = error;
|
|
83
|
+
throw wrapped;
|
|
84
|
+
}
|
|
85
|
+
// Proactive: best-effort, swallow errors so the model call can still proceed.
|
|
86
|
+
logger.warn(`error=<${summarizationError}> | proactive summarization failed, continuing`);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Summarize the oldest messages and replace them with a summary.
|
|
92
|
+
*
|
|
93
|
+
* @param agent - The agent instance
|
|
94
|
+
* @param model - The model to use for summarization
|
|
95
|
+
* @returns `true` if the history was reduced, `false` otherwise
|
|
96
|
+
*/
|
|
97
|
+
async _summarizeOldest(agent, model) {
|
|
68
98
|
const messages = agent.messages;
|
|
69
99
|
// Calculate how many messages to summarize
|
|
70
100
|
let messagesToSummarizeCount = Math.max(1, Math.floor(messages.length * this._summaryRatio));
|
|
@@ -76,20 +106,12 @@ export class SummarizingConversationManager extends ConversationManager {
|
|
|
76
106
|
}
|
|
77
107
|
// Adjust split point to avoid breaking tool use/result pairs
|
|
78
108
|
messagesToSummarizeCount = this._adjustSplitPointForToolPairs(messages, messagesToSummarizeCount);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
catch (summarizationError) {
|
|
88
|
-
logger.error(`error=<${summarizationError}> | summarization failed`);
|
|
89
|
-
const wrapped = summarizationError instanceof Error ? summarizationError : new Error(String(summarizationError));
|
|
90
|
-
wrapped.cause = error;
|
|
91
|
-
throw wrapped;
|
|
92
|
-
}
|
|
109
|
+
const messagesToSummarize = messages.slice(0, messagesToSummarizeCount);
|
|
110
|
+
// Generate summary via model call
|
|
111
|
+
const summaryMessage = await this._generateSummary(messagesToSummarize, model);
|
|
112
|
+
// Replace summarized messages with the summary
|
|
113
|
+
messages.splice(0, messagesToSummarizeCount, summaryMessage);
|
|
114
|
+
return true;
|
|
93
115
|
}
|
|
94
116
|
/**
|
|
95
117
|
* Generate a summary of the provided messages by calling the model directly.
|