@strands-agents/sdk 1.0.0 → 1.1.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/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 +259 -0
- package/dist/src/__tests__/interrupt.test.js.map +1 -0
- package/dist/src/__tests__/mcp.test.js +226 -0
- 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 +730 -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 +118 -0
- package/dist/src/agent/__tests__/agent.test.js.map +1 -1
- package/dist/src/agent/__tests__/snapshot.test.js +50 -4
- package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
- package/dist/src/agent/agent.d.ts +35 -4
- package/dist/src/agent/agent.d.ts.map +1 -1
- package/dist/src/agent/agent.js +548 -222
- package/dist/src/agent/agent.js.map +1 -1
- package/dist/src/agent/snapshot.d.ts +2 -2
- package/dist/src/agent/snapshot.d.ts.map +1 -1
- package/dist/src/agent/snapshot.js +14 -2
- 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 +51 -2
- 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 +17 -3
- package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
- package/dist/src/conversation-manager/sliding-window-conversation-manager.js +10 -4
- 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 +102 -30
- package/dist/src/hooks/events.d.ts.map +1 -1
- package/dist/src/hooks/events.js +87 -6
- package/dist/src/hooks/events.js.map +1 -1
- package/dist/src/hooks/index.d.ts +3 -2
- package/dist/src/hooks/index.d.ts.map +1 -1
- package/dist/src/hooks/index.js +1 -0
- 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 +9 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/interrupt.d.ts +220 -0
- package/dist/src/interrupt.d.ts.map +1 -0
- package/dist/src/interrupt.js +274 -0
- package/dist/src/interrupt.js.map +1 -0
- package/dist/src/mcp.d.ts +23 -2
- package/dist/src/mcp.d.ts.map +1 -1
- package/dist/src/mcp.js +77 -18
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/models/__tests__/anthropic.test.js +55 -0
- package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
- package/dist/src/models/__tests__/bedrock.test.js +115 -0
- 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 +58 -0
- package/dist/src/models/__tests__/google.test.js.map +1 -1
- package/dist/src/models/anthropic.d.ts +8 -0
- package/dist/src/models/anthropic.d.ts.map +1 -1
- package/dist/src/models/anthropic.js +4 -2
- package/dist/src/models/anthropic.js.map +1 -1
- package/dist/src/models/bedrock.d.ts +15 -0
- package/dist/src/models/bedrock.d.ts.map +1 -1
- package/dist/src/models/bedrock.js +58 -4
- 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 +8 -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 +45 -0
- package/dist/src/models/openai/__tests__/chat.test.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__/nodes.test.js +13 -0
- package/dist/src/multiagent/__tests__/nodes.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/graph.d.ts +22 -2
- package/dist/src/multiagent/graph.d.ts.map +1 -1
- package/dist/src/multiagent/graph.js +42 -3
- package/dist/src/multiagent/graph.js.map +1 -1
- package/dist/src/multiagent/multiagent.d.ts +5 -3
- package/dist/src/multiagent/multiagent.d.ts.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 +14 -1
- package/dist/src/multiagent/nodes.js.map +1 -1
- package/dist/src/multiagent/swarm.d.ts +15 -1
- package/dist/src/multiagent/swarm.d.ts.map +1 -1
- package/dist/src/multiagent/swarm.js +46 -3
- package/dist/src/multiagent/swarm.js.map +1 -1
- package/dist/src/registry/__tests__/tool-registry.test.js +11 -0
- package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -1
- package/dist/src/registry/tool-registry.d.ts +4 -0
- package/dist/src/registry/tool-registry.d.ts.map +1 -1
- package/dist/src/registry/tool-registry.js +6 -0
- 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 +39 -0
- package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
- package/dist/src/session/session-manager.d.ts +6 -0
- package/dist/src/session/session-manager.d.ts.map +1 -1
- package/dist/src/session/session-manager.js +8 -0
- package/dist/src/session/session-manager.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/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/agent.d.ts +22 -3
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/agent.js +8 -0
- 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/package.json +9 -5
|
@@ -4,21 +4,28 @@
|
|
|
4
4
|
* This module defines the ConversationManager abstraction, which provides a
|
|
5
5
|
* domain-specific interface for managing an agent's conversation context.
|
|
6
6
|
*/
|
|
7
|
-
import { AfterModelCallEvent } from '../hooks/events.js';
|
|
7
|
+
import { AfterModelCallEvent, BeforeModelCallEvent } from '../hooks/events.js';
|
|
8
8
|
import { ContextWindowOverflowError } from '../errors.js';
|
|
9
|
+
import { logger } from '../logging/logger.js';
|
|
10
|
+
import { warnOnce } from '../logging/warn-once.js';
|
|
11
|
+
/** Default compression threshold ratio. */
|
|
12
|
+
const DEFAULT_COMPRESSION_THRESHOLD = 0.7;
|
|
13
|
+
/** Default context window limit fallback when the model doesn't report one. */
|
|
14
|
+
const DEFAULT_CONTEXT_WINDOW_LIMIT = 200_000;
|
|
9
15
|
/**
|
|
10
16
|
* Abstract base class for conversation history management strategies.
|
|
11
17
|
*
|
|
12
18
|
* The primary responsibility of a ConversationManager is overflow recovery: when the
|
|
13
19
|
* model returns a {@link ContextWindowOverflowError}, {@link ConversationManager.reduce}
|
|
14
|
-
* is called and MUST reduce the history enough for the next model call
|
|
15
|
-
* If `reduce` returns `false` (no reduction performed), the error propagates
|
|
16
|
-
* the agent loop uncaught. This makes `reduce` a critical operation —
|
|
17
|
-
* must be able to make meaningful progress when called with `error` set.
|
|
20
|
+
* is called with `error` set and MUST reduce the history enough for the next model call
|
|
21
|
+
* to succeed. If `reduce` returns `false` (no reduction performed), the error propagates
|
|
22
|
+
* out of the agent loop uncaught. This makes `reduce` a critical operation —
|
|
23
|
+
* implementations must be able to make meaningful progress when called with `error` set.
|
|
18
24
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* `
|
|
25
|
+
* Subclasses can enable proactive compression by passing `proactiveCompression` in the
|
|
26
|
+
* options object to the base constructor. When enabled, the base class registers a
|
|
27
|
+
* `BeforeModelCallEvent` hook that checks projected input tokens against the model's
|
|
28
|
+
* context window limit and calls `reduce` (without `error`) when the threshold is exceeded.
|
|
22
29
|
*
|
|
23
30
|
* @example
|
|
24
31
|
* ```typescript
|
|
@@ -34,19 +41,39 @@ import { ContextWindowOverflowError } from '../errors.js';
|
|
|
34
41
|
* ```
|
|
35
42
|
*/
|
|
36
43
|
export class ConversationManager {
|
|
44
|
+
_compressionThreshold;
|
|
45
|
+
/**
|
|
46
|
+
* @param options - Configuration options for the conversation manager.
|
|
47
|
+
*/
|
|
48
|
+
constructor(options) {
|
|
49
|
+
const proactiveCompression = options?.proactiveCompression;
|
|
50
|
+
const threshold = proactiveCompression === true
|
|
51
|
+
? DEFAULT_COMPRESSION_THRESHOLD
|
|
52
|
+
: proactiveCompression
|
|
53
|
+
? proactiveCompression.compressionThreshold
|
|
54
|
+
: undefined;
|
|
55
|
+
if (threshold !== undefined && (threshold <= 0 || threshold > 1)) {
|
|
56
|
+
throw new Error(`compressionThreshold must be between 0 (exclusive) and 1 (inclusive), got ${threshold}`);
|
|
57
|
+
}
|
|
58
|
+
this._compressionThreshold = threshold;
|
|
59
|
+
}
|
|
37
60
|
/**
|
|
38
61
|
* Initialize the conversation manager with the agent instance.
|
|
39
62
|
*
|
|
40
|
-
* Registers
|
|
41
|
-
*
|
|
42
|
-
*
|
|
63
|
+
* Registers two hooks:
|
|
64
|
+
* 1. `AfterModelCallEvent`: Overflow recovery — when a {@link ContextWindowOverflowError} occurs,
|
|
65
|
+
* calls {@link ConversationManager.reduce} with `error` set and retries if reduction succeeded.
|
|
66
|
+
* 2. `BeforeModelCallEvent`: Proactive compression — when projected input tokens exceed the
|
|
67
|
+
* configured compression threshold, calls {@link ConversationManager.reduce} without `error`.
|
|
68
|
+
* The hook is always registered but only acts when proactive compression is enabled.
|
|
43
69
|
*
|
|
44
|
-
* Subclasses that
|
|
45
|
-
* preserve
|
|
70
|
+
* Subclasses that override `initAgent` MUST call `super.initAgent(agent)` to
|
|
71
|
+
* preserve overflow recovery and proactive compression behavior.
|
|
46
72
|
*
|
|
47
73
|
* @param agent - The agent to register hooks with
|
|
48
74
|
*/
|
|
49
75
|
initAgent(agent) {
|
|
76
|
+
// Reactive overflow recovery
|
|
50
77
|
agent.addHook(AfterModelCallEvent, async (event) => {
|
|
51
78
|
if (event.error instanceof ContextWindowOverflowError) {
|
|
52
79
|
if (await this.reduce({ agent: event.agent, model: event.model, error: event.error })) {
|
|
@@ -54,6 +81,31 @@ export class ConversationManager {
|
|
|
54
81
|
}
|
|
55
82
|
}
|
|
56
83
|
});
|
|
84
|
+
// Proactive compression — always subscribe, check threshold in the handler
|
|
85
|
+
agent.addHook(BeforeModelCallEvent, async (event) => {
|
|
86
|
+
if (this._compressionThreshold === undefined) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
let contextWindowLimit = event.model.getConfig().contextWindowLimit;
|
|
90
|
+
if (contextWindowLimit === undefined) {
|
|
91
|
+
contextWindowLimit = DEFAULT_CONTEXT_WINDOW_LIMIT;
|
|
92
|
+
warnOnce(logger, `conversation_manager=<${this.name}> | contextWindowLimit is not set on the model, using default of ${DEFAULT_CONTEXT_WINDOW_LIMIT} | set contextWindowLimit in your model config for accurate proactive compression`);
|
|
93
|
+
}
|
|
94
|
+
if (event.projectedInputTokens === undefined) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const ratio = event.projectedInputTokens / contextWindowLimit;
|
|
98
|
+
if (ratio >= this._compressionThreshold) {
|
|
99
|
+
logger.debug(`projected_tokens=<${event.projectedInputTokens}>, limit=<${contextWindowLimit}>, ratio=<${ratio.toFixed(2)}>, compression_threshold=<${this._compressionThreshold}> | compression threshold exceeded, reducing context`);
|
|
100
|
+
// Proactive compression is best-effort: swallow errors so the model call can still proceed.
|
|
101
|
+
try {
|
|
102
|
+
await this.reduce({ agent: event.agent, model: event.model });
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
logger.warn(`conversation_manager=<${this.name}> | proactive compression failed, continuing | error=<${e}>`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
57
109
|
}
|
|
58
110
|
}
|
|
59
111
|
//# sourceMappingURL=conversation-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-manager.js","sourceRoot":"","sources":["../../../src/conversation-manager/conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"conversation-manager.js","sourceRoot":"","sources":["../../../src/conversation-manager/conversation-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This module exports conversation manager implementations.
|
|
5
5
|
*/
|
|
6
|
-
export { ConversationManager, type ConversationManagerReduceOptions as ReduceOptions } from './conversation-manager.js';
|
|
6
|
+
export { ConversationManager, type ProactiveCompressionConfig, type ConversationManagerReduceOptions as ReduceOptions, type ConversationManagerOptions, } from './conversation-manager.js';
|
|
7
7
|
export { NullConversationManager } from './null-conversation-manager.js';
|
|
8
8
|
export { SlidingWindowConversationManager, type SlidingWindowConversationManagerConfig, } from './sliding-window-conversation-manager.js';
|
|
9
9
|
export { SummarizingConversationManager, type SummarizingConversationManagerConfig, } from './summarizing-conversation-manager.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/conversation-manager/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/conversation-manager/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,IAAI,aAAa,EACtD,KAAK,0BAA0B,GAChC,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EACL,gCAAgC,EAChC,KAAK,sCAAsC,GAC5C,MAAM,0CAA0C,CAAA;AACjD,OAAO,EACL,8BAA8B,EAC9B,KAAK,oCAAoC,GAC1C,MAAM,uCAAuC,CAAA"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This module exports conversation manager implementations.
|
|
5
5
|
*/
|
|
6
|
-
export { ConversationManager } from './conversation-manager.js';
|
|
6
|
+
export { ConversationManager, } from './conversation-manager.js';
|
|
7
7
|
export { NullConversationManager } from './null-conversation-manager.js';
|
|
8
8
|
export { SlidingWindowConversationManager, } from './sliding-window-conversation-manager.js';
|
|
9
9
|
export { SummarizingConversationManager, } from './summarizing-conversation-manager.js';
|
|
@@ -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
|
|
@@ -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;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,
|
|
1
|
+
{"version":3,"file":"sliding-window-conversation-manager.d.ts","sourceRoot":"","sources":["../../../src/conversation-manager/sliding-window-conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,EACtC,MAAM,2BAA2B,CAAA;AAGlC;;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;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;IA0D5B;;;;;;;OAOG;IACH,OAAO,CAAC,+BAA+B;CAcxC"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { Message, TextBlock, ToolResultBlock } from '../types/messages.js';
|
|
8
8
|
import { AfterInvocationEvent } from '../hooks/events.js';
|
|
9
|
-
import { ConversationManager } from './conversation-manager.js';
|
|
9
|
+
import { ConversationManager, } from './conversation-manager.js';
|
|
10
10
|
import { logger } from '../logging/logger.js';
|
|
11
11
|
/**
|
|
12
12
|
* Implements a sliding window strategy for managing conversation history.
|
|
@@ -19,6 +19,7 @@ import { logger } from '../logging/logger.js';
|
|
|
19
19
|
* Registers hooks for:
|
|
20
20
|
* - AfterInvocationEvent: Applies sliding window management after each invocation
|
|
21
21
|
* - AfterModelCallEvent: Reduces context on overflow errors and requests retry (via super)
|
|
22
|
+
* - BeforeModelCallEvent: Proactive compression when threshold is exceeded (via super)
|
|
22
23
|
*/
|
|
23
24
|
export class SlidingWindowConversationManager extends ConversationManager {
|
|
24
25
|
_windowSize;
|
|
@@ -33,7 +34,7 @@ export class SlidingWindowConversationManager extends ConversationManager {
|
|
|
33
34
|
* @param config - Configuration options for the sliding window manager.
|
|
34
35
|
*/
|
|
35
36
|
constructor(config) {
|
|
36
|
-
super();
|
|
37
|
+
super(config);
|
|
37
38
|
this._windowSize = config?.windowSize ?? 40;
|
|
38
39
|
this._shouldTruncateResults = config?.shouldTruncateResults ?? true;
|
|
39
40
|
}
|
|
@@ -43,6 +44,7 @@ export class SlidingWindowConversationManager extends ConversationManager {
|
|
|
43
44
|
* Registers:
|
|
44
45
|
* - AfterInvocationEvent callback to apply sliding window management
|
|
45
46
|
* - AfterModelCallEvent callback to handle context overflow and request retry (via super)
|
|
47
|
+
* - BeforeModelCallEvent callback for proactive compression (via super)
|
|
46
48
|
*
|
|
47
49
|
* @param agent - The agent to register hooks with
|
|
48
50
|
*/
|
|
@@ -53,9 +55,13 @@ export class SlidingWindowConversationManager extends ConversationManager {
|
|
|
53
55
|
});
|
|
54
56
|
}
|
|
55
57
|
/**
|
|
56
|
-
* Reduce the conversation history
|
|
58
|
+
* Reduce the conversation history.
|
|
57
59
|
*
|
|
58
|
-
*
|
|
60
|
+
* When `error` is set (reactive overflow recovery), attempts to truncate large tool results
|
|
61
|
+
* first before falling back to message trimming.
|
|
62
|
+
*
|
|
63
|
+
* When `error` is undefined (proactive compression), only trims messages without attempting
|
|
64
|
+
* tool result truncation.
|
|
59
65
|
*
|
|
60
66
|
* @param options - The reduction options
|
|
61
67
|
* @returns `true` if the history was reduced, `false` otherwise
|
|
@@ -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,EAAE,MAAM,sBAAsB,CAAA;AAE1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,
|
|
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.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarizing-conversation-manager.js","sourceRoot":"","sources":["../../../src/conversation-manager/summarizing-conversation-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"summarizing-conversation-manager.js","sourceRoot":"","sources":["../../../src/conversation-manager/summarizing-conversation-manager.ts"],"names":[],"mappings":"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"}
|