@zooique/memora 0.1.0 → 0.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/dist/agent/agent.d.ts +155 -23
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +386 -124
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +8 -2
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +17 -6
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +1 -1
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +5 -3
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/builtinTools.d.ts +1 -1
- package/dist/agent/builtinTools.js +2 -2
- package/dist/agent/builtinTools.js.map +1 -1
- package/dist/agent/constants.d.ts +27 -6
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +27 -6
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +35 -9
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +138 -25
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/loop.d.ts +41 -11
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +143 -61
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +100 -0
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -0
- package/dist/agent/managers/archiveCoordinator.js +127 -0
- package/dist/agent/managers/archiveCoordinator.js.map +1 -0
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.js +1 -1
- package/dist/agent/managers/autoConfigRefiner.js.map +1 -1
- package/dist/agent/managers/configManager.d.ts +13 -2
- package/dist/agent/managers/configManager.d.ts.map +1 -1
- package/dist/agent/managers/configManager.js +13 -5
- package/dist/agent/managers/configManager.js.map +1 -1
- package/dist/agent/managers/insightExtractor.d.ts +36 -3
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
- package/dist/agent/managers/insightExtractor.js +48 -11
- package/dist/agent/managers/insightExtractor.js.map +1 -1
- package/dist/agent/managers/memoryAdvisor.d.ts +4 -2
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +6 -4
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +113 -0
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -0
- package/dist/agent/managers/memoryDecayScheduler.js +134 -0
- package/dist/agent/managers/memoryDecayScheduler.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +70 -10
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +97 -23
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/sessionArchiver.d.ts +77 -0
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -0
- package/dist/agent/managers/sessionArchiver.js +175 -0
- package/dist/agent/managers/sessionArchiver.js.map +1 -0
- package/dist/agent/managers/sessionManager.d.ts +10 -0
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +26 -5
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/workProjection.d.ts +1 -1
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +13 -10
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/messageHistory.d.ts +1 -22
- package/dist/agent/messageHistory.d.ts.map +1 -1
- package/dist/agent/messageHistory.js +3 -19
- package/dist/agent/messageHistory.js.map +1 -1
- package/dist/agent/toolExecutor.d.ts +5 -18
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +7 -7
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/tracer.d.ts +8 -1
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +8 -1
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +29 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/{managers/userFactExtractor.d.ts → userFactExtractor.d.ts} +2 -2
- package/dist/agent/userFactExtractor.d.ts.map +1 -0
- package/dist/agent/userFactExtractor.js.map +1 -0
- package/dist/config/loader.d.ts +4 -4
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +11 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/eval/evalTypes.js +1 -1
- package/dist/eval/evalTypes.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/embedding.d.ts.map +1 -1
- package/dist/llm/embedding.js +8 -6
- package/dist/llm/embedding.js.map +1 -1
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +2 -1
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts +9 -0
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +77 -33
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/llm/provider.d.ts +17 -3
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +6 -2
- package/dist/llm/provider.js.map +1 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +25 -9
- package/dist/logging/logger.js.map +1 -1
- package/dist/memory/hybridMerge.d.ts +54 -0
- package/dist/memory/hybridMerge.d.ts.map +1 -0
- package/dist/memory/hybridMerge.js +36 -0
- package/dist/memory/hybridMerge.js.map +1 -0
- package/dist/memory/inMemoryStorage.d.ts +90 -15
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +179 -28
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/loader.js +1 -1
- package/dist/memory/loader.js.map +1 -1
- package/dist/memory/projectManager.d.ts +34 -5
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +98 -62
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/recall.d.ts +7 -18
- package/dist/memory/recall.d.ts.map +1 -1
- package/dist/memory/recall.js +14 -19
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +81 -14
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/store.js +1 -1
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.d.ts +7 -1
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +5 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/userProfile.d.ts +6 -6
- package/dist/memory/userProfile.d.ts.map +1 -1
- package/dist/memory/userProfile.js +20 -15
- package/dist/memory/userProfile.js.map +1 -1
- package/dist/memory/vectorStore.d.ts +35 -0
- package/dist/memory/vectorStore.d.ts.map +1 -1
- package/dist/memory/vectorStore.js +111 -2
- package/dist/memory/vectorStore.js.map +1 -1
- package/dist/persona/personaManager.d.ts +17 -4
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +44 -12
- package/dist/persona/personaManager.js.map +1 -1
- package/dist/security/pathGuard.d.ts +29 -7
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +148 -81
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/skill/skillManager.d.ts +15 -0
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +25 -3
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/types.d.ts +7 -1
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/utils/errors.d.ts +26 -7
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +10 -18
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +9 -2
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +1 -1
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +8 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +14 -3
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/path.d.ts +5 -1
- package/dist/utils/path.d.ts.map +1 -1
- package/dist/utils/path.js +5 -1
- package/dist/utils/path.js.map +1 -1
- package/dist/utils/safeTimer.d.ts +19 -0
- package/dist/utils/safeTimer.d.ts.map +1 -1
- package/dist/utils/safeTimer.js +27 -0
- package/dist/utils/safeTimer.js.map +1 -1
- package/dist/utils/segmenter.d.ts +0 -12
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +8 -3
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +1 -1
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +4 -2
- package/dist/utils/strings.js.map +1 -1
- package/package.json +1 -1
- package/dist/agent/managers/userFactExtractor.d.ts.map +0 -1
- package/dist/agent/managers/userFactExtractor.js.map +0 -1
- /package/dist/agent/{managers/userFactExtractor.js → userFactExtractor.js} +0 -0
|
@@ -8,21 +8,28 @@
|
|
|
8
8
|
* 4. 上下文摘要生成(generateContextSummary)—— LLM 生成"遗忘补偿"
|
|
9
9
|
* 5. 摘要缓存管理(getOrCreateSummary)—— 缓存 TTL + 过期重生成
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* 设计理由:AgentLoop 1151 行超阈值,上下文管理是独立职责,
|
|
12
12
|
* 拆分后 AgentLoop 聚焦对话循环,ContextManager 聚焦上下文窗口管理。
|
|
13
13
|
*
|
|
14
14
|
* 自然生长原则:ContextManager 不持有 messages 引用(避免与 AgentLoop 状态耦合),
|
|
15
15
|
* 所有方法接收 messages 作为参数,是无状态的纯计算 + 缓存。
|
|
16
16
|
*/
|
|
17
17
|
import type { LlmProvider, Message } from '../llm/provider.js';
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
import { type ITracer } from '../agent/tracer.js';
|
|
19
|
+
/** ContextManager 构造选项(模块私有,0 外部 import) */
|
|
20
|
+
interface ContextManagerOptions {
|
|
20
21
|
/** 上下文窗口 token 上限 */
|
|
21
22
|
readonly maxContextTokens: number;
|
|
22
23
|
/** LLM Provider(用于生成上下文摘要) */
|
|
23
24
|
readonly provider: LlmProvider;
|
|
24
25
|
/** 截断时生成占位消息的文案函数(来自 UIMessages.contextTruncated) */
|
|
25
26
|
readonly contextTruncatedFn: (skipped: number, kept: number) => string;
|
|
27
|
+
/**
|
|
28
|
+
* 可观测性 Tracer(用于 generateContextSummary span 埋点)
|
|
29
|
+
*
|
|
30
|
+
* 未注入时降级为 NOOP_TRACER(静默丢弃所有 span,零开销)。
|
|
31
|
+
*/
|
|
32
|
+
readonly tracer?: ITracer;
|
|
26
33
|
}
|
|
27
34
|
/**
|
|
28
35
|
* 上下文窗口管理器
|
|
@@ -37,6 +44,8 @@ export declare class ContextManager {
|
|
|
37
44
|
private readonly provider;
|
|
38
45
|
/** 截断占位消息文案函数 */
|
|
39
46
|
private readonly contextTruncatedFn;
|
|
47
|
+
/** 可观测性 Tracer(用于 generateContextSummary span 埋点,默认 NOOP) */
|
|
48
|
+
private readonly tracer;
|
|
40
49
|
/** 上下文摘要缓存(首次截断后生成,后续截断复用) */
|
|
41
50
|
private contextSummary;
|
|
42
51
|
/** 摘要缓存生成时的消息数量,用于判断缓存是否过期 */
|
|
@@ -47,10 +56,14 @@ export declare class ContextManager {
|
|
|
47
56
|
/** 截断次数(供 AgentLoop.getMetrics 读取) */
|
|
48
57
|
get truncationCount(): number;
|
|
49
58
|
/**
|
|
50
|
-
* 估算消息数组的 token
|
|
59
|
+
* 估算消息数组的 token 数(CJK 中文适配)
|
|
60
|
+
*
|
|
61
|
+
* 区分 CJK 与非 CJK 字符分别估算:
|
|
62
|
+
* - CJK 字符(中文/日文/韩文):cjkChars / CJK_CHARS_PER_TOKEN(1.5)
|
|
63
|
+
* - 非 CJK 字符(英文/数字/符号):otherChars / CHARS_PER_TOKEN(3)
|
|
64
|
+
* 统一字符估算会严重低估中文(4 字符 ≈ 1.3 token,实际约 4-8 token)。
|
|
51
65
|
*
|
|
52
|
-
*
|
|
53
|
-
* toolCalls 的 JSON 序列化字符数也计入。
|
|
66
|
+
* toolCalls 的 JSON 序列化字符数也计入(同样区分 CJK/非 CJK)。
|
|
54
67
|
*
|
|
55
68
|
* @param messages 消息数组
|
|
56
69
|
* @returns 估算的 token 数
|
|
@@ -112,19 +125,32 @@ export declare class ContextManager {
|
|
|
112
125
|
* 缓存 TTL:消息数增长超过 SUMMARY_CACHE_TTL_MSGS 时缓存过期,需重新生成。
|
|
113
126
|
* 首次调用时生成摘要并缓存,后续调用复用缓存直到过期。
|
|
114
127
|
*
|
|
128
|
+
* signal 参数让摘要生成可被用户取消中断,
|
|
129
|
+
* 避免摘要 LLM 调用卡住时 generator 永久挂起(与 executeToolCalls 同源问题)。
|
|
130
|
+
*
|
|
115
131
|
* @param messages 当前消息数组(用于生成摘要和判断缓存过期)
|
|
116
|
-
* @
|
|
132
|
+
* @param signal 可选的 AbortSignal,中断摘要生成
|
|
133
|
+
* @returns 摘要字符串(失败/中断时返回空字符串,降级为无摘要)
|
|
117
134
|
*/
|
|
118
|
-
getOrCreateSummary(messages: readonly Message[]): Promise<string>;
|
|
135
|
+
getOrCreateSummary(messages: readonly Message[], signal?: AbortSignal): Promise<string>;
|
|
119
136
|
/**
|
|
120
137
|
* 生成上下文摘要(enableContextSummary 时调用)
|
|
121
138
|
*
|
|
122
139
|
* 在首次截断时,提取即将被裁剪的消息中最近几条用户/助手对话,
|
|
123
140
|
* 调用 provider 生成一句摘要,作为"遗忘补偿"注入到 system prompt 中。
|
|
124
141
|
*
|
|
142
|
+
* 通过 tracer span 埋点(TRACE_SPANS.CONTEXT_SUMMARY),
|
|
143
|
+
* 让宿主监控面板能观察截断频率、摘要生成耗时与失败率。
|
|
144
|
+
*
|
|
145
|
+
* signal 参数传入 provider.chat 的 ChatOptions,
|
|
146
|
+
* 让 fetch 请求和 SSE 流读取都能被 abort 中断;
|
|
147
|
+
* for await 循环中也检查 signal.aborted 提前退出。
|
|
148
|
+
*
|
|
125
149
|
* @param messages 当前消息数组
|
|
126
|
-
* @
|
|
150
|
+
* @param signal 可选的 AbortSignal
|
|
151
|
+
* @returns 摘要字符串(失败/中断时返回空字符串,降级为无摘要)
|
|
127
152
|
*/
|
|
128
153
|
private generateContextSummary;
|
|
129
154
|
}
|
|
155
|
+
export {};
|
|
130
156
|
//# sourceMappingURL=contextManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextManager.d.ts","sourceRoot":"","sources":["../../src/agent/contextManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"contextManager.d.ts","sourceRoot":"","sources":["../../src/agent/contextManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,EAA4B,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE3E,4CAA4C;AAC5C,UAAU,qBAAqB;IAC7B,qBAAqB;IACrB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACvE;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAiDD;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,iBAAiB;IACjB,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4C;IAC/E,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IAEjC,8BAA8B;IAC9B,OAAO,CAAC,cAAc,CAAuB;IAC7C,8BAA8B;IAC9B,OAAO,CAAC,sBAAsB,CAAa;IAC3C,yDAAyD;IACzD,OAAO,CAAC,gBAAgB,CAAa;gBAEzB,IAAI,EAAE,qBAAqB;IAQvC,sCAAsC;IACtC,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM;IAsBpD;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO;IAIrD;;;;;;;;;;;;;;;;;;OAkBG;IACH,gBAAgB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE;IA8FpF;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;;;;;;;;;;OAYG;IACG,kBAAkB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB7F;;;;;;;;;;;;;;;;OAgBG;YACW,sBAAsB;CAiFrC"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* 4. 上下文摘要生成(generateContextSummary)—— LLM 生成"遗忘补偿"
|
|
9
9
|
* 5. 摘要缓存管理(getOrCreateSummary)—— 缓存 TTL + 过期重生成
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* 设计理由:AgentLoop 1151 行超阈值,上下文管理是独立职责,
|
|
12
12
|
* 拆分后 AgentLoop 聚焦对话循环,ContextManager 聚焦上下文窗口管理。
|
|
13
13
|
*
|
|
14
14
|
* 自然生长原则:ContextManager 不持有 messages 引用(避免与 AgentLoop 状态耦合),
|
|
@@ -16,6 +16,52 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { LOOP_CONSTANTS } from '../agent/constants.js';
|
|
18
18
|
import { logger } from '../logging/logger.js';
|
|
19
|
+
import { NOOP_TRACER, TRACE_SPANS } from '../agent/tracer.js';
|
|
20
|
+
/**
|
|
21
|
+
* 判断字符是否为 CJK 字符(中文适配)
|
|
22
|
+
*
|
|
23
|
+
* CJK 字符在 LLM tokenizer 中 token 密度更高(约 1-2 token/字符),
|
|
24
|
+
* 需要与英文/数字/符号分开估算。
|
|
25
|
+
*
|
|
26
|
+
* 覆盖范围:
|
|
27
|
+
* - U+3400-U+4DBF:CJK 统一表意文字扩展A
|
|
28
|
+
* - U+4E00-U+9FFF:CJK 统一表意文字(常用中文)
|
|
29
|
+
* - U+3040-U+30FF:日文平假名 + 片假名
|
|
30
|
+
* - U+AC00-U+D7AF:韩文音节
|
|
31
|
+
*
|
|
32
|
+
* @param code 字符的 Unicode code point
|
|
33
|
+
* @returns 是否为 CJK 字符
|
|
34
|
+
*/
|
|
35
|
+
function isCjkChar(code) {
|
|
36
|
+
return ((code >= 0x4e00 && code <= 0x9fff) || // CJK 统一表意文字
|
|
37
|
+
(code >= 0x3400 && code <= 0x4dbf) || // CJK 扩展A
|
|
38
|
+
(code >= 0x3040 && code <= 0x30ff) || // 日文平假名 + 片假名
|
|
39
|
+
(code >= 0xac00 && code <= 0xd7af) // 韩文音节
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 统计字符串中 CJK 与非 CJK 字符数(中文适配)
|
|
44
|
+
*
|
|
45
|
+
* 用 for...of 遍历字符串以正确处理代理对(emoji 等),
|
|
46
|
+
* codePointAt(0) 获取首个 code point。
|
|
47
|
+
*
|
|
48
|
+
* @param str 待统计的字符串
|
|
49
|
+
* @returns { cjkChars, otherChars } CJK 字符数与非 CJK 字符数
|
|
50
|
+
*/
|
|
51
|
+
function countCjkAndOther(str) {
|
|
52
|
+
let cjkChars = 0;
|
|
53
|
+
let otherChars = 0;
|
|
54
|
+
for (const ch of str) {
|
|
55
|
+
const code = ch.codePointAt(0);
|
|
56
|
+
if (code !== undefined && isCjkChar(code)) {
|
|
57
|
+
cjkChars++;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
otherChars++;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { cjkChars, otherChars };
|
|
64
|
+
}
|
|
19
65
|
/**
|
|
20
66
|
* 上下文窗口管理器
|
|
21
67
|
*
|
|
@@ -29,6 +75,8 @@ export class ContextManager {
|
|
|
29
75
|
provider;
|
|
30
76
|
/** 截断占位消息文案函数 */
|
|
31
77
|
contextTruncatedFn;
|
|
78
|
+
/** 可观测性 Tracer(用于 generateContextSummary span 埋点,默认 NOOP) */
|
|
79
|
+
tracer;
|
|
32
80
|
/** 上下文摘要缓存(首次截断后生成,后续截断复用) */
|
|
33
81
|
contextSummary = null;
|
|
34
82
|
/** 摘要缓存生成时的消息数量,用于判断缓存是否过期 */
|
|
@@ -39,31 +87,44 @@ export class ContextManager {
|
|
|
39
87
|
this.maxContextTokens = opts.maxContextTokens;
|
|
40
88
|
this.provider = opts.provider;
|
|
41
89
|
this.contextTruncatedFn = opts.contextTruncatedFn;
|
|
90
|
+
// 未注入 tracer 时降级为 NOOP_TRACER(零开销)
|
|
91
|
+
this.tracer = opts.tracer ?? NOOP_TRACER;
|
|
42
92
|
}
|
|
43
93
|
/** 截断次数(供 AgentLoop.getMetrics 读取) */
|
|
44
94
|
get truncationCount() {
|
|
45
95
|
return this._truncationCount;
|
|
46
96
|
}
|
|
47
97
|
/**
|
|
48
|
-
* 估算消息数组的 token
|
|
98
|
+
* 估算消息数组的 token 数(CJK 中文适配)
|
|
99
|
+
*
|
|
100
|
+
* 区分 CJK 与非 CJK 字符分别估算:
|
|
101
|
+
* - CJK 字符(中文/日文/韩文):cjkChars / CJK_CHARS_PER_TOKEN(1.5)
|
|
102
|
+
* - 非 CJK 字符(英文/数字/符号):otherChars / CHARS_PER_TOKEN(3)
|
|
103
|
+
* 统一字符估算会严重低估中文(4 字符 ≈ 1.3 token,实际约 4-8 token)。
|
|
49
104
|
*
|
|
50
|
-
*
|
|
51
|
-
* toolCalls 的 JSON 序列化字符数也计入。
|
|
105
|
+
* toolCalls 的 JSON 序列化字符数也计入(同样区分 CJK/非 CJK)。
|
|
52
106
|
*
|
|
53
107
|
* @param messages 消息数组
|
|
54
108
|
* @returns 估算的 token 数
|
|
55
109
|
*/
|
|
56
110
|
estimateTokens(messages) {
|
|
57
|
-
let
|
|
111
|
+
let cjkChars = 0;
|
|
112
|
+
let otherChars = 0;
|
|
58
113
|
for (const m of messages) {
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
|
|
114
|
+
// 消息内容:区分 CJK 与非 CJK 字符
|
|
115
|
+
const contentCounts = countCjkAndOther(m.content);
|
|
116
|
+
cjkChars += contentCounts.cjkChars;
|
|
117
|
+
otherChars += contentCounts.otherChars;
|
|
118
|
+
// toolCalls 的 JSON 序列化字符数(同样区分 CJK/非 CJK)
|
|
62
119
|
if (m.toolCalls) {
|
|
63
|
-
|
|
120
|
+
const toolCallsCounts = countCjkAndOther(JSON.stringify(m.toolCalls));
|
|
121
|
+
cjkChars += toolCallsCounts.cjkChars;
|
|
122
|
+
otherChars += toolCallsCounts.otherChars;
|
|
64
123
|
}
|
|
65
124
|
}
|
|
66
|
-
|
|
125
|
+
// CJK 与非 CJK 分别按各自密度估算后求和
|
|
126
|
+
return Math.ceil(cjkChars / LOOP_CONSTANTS.CJK_CHARS_PER_TOKEN +
|
|
127
|
+
otherChars / LOOP_CONSTANTS.CHARS_PER_TOKEN);
|
|
67
128
|
}
|
|
68
129
|
/**
|
|
69
130
|
* 检查是否需要截断(token 超阈值 + 消息数 > 3)
|
|
@@ -228,18 +289,22 @@ export class ContextManager {
|
|
|
228
289
|
* 缓存 TTL:消息数增长超过 SUMMARY_CACHE_TTL_MSGS 时缓存过期,需重新生成。
|
|
229
290
|
* 首次调用时生成摘要并缓存,后续调用复用缓存直到过期。
|
|
230
291
|
*
|
|
292
|
+
* signal 参数让摘要生成可被用户取消中断,
|
|
293
|
+
* 避免摘要 LLM 调用卡住时 generator 永久挂起(与 executeToolCalls 同源问题)。
|
|
294
|
+
*
|
|
231
295
|
* @param messages 当前消息数组(用于生成摘要和判断缓存过期)
|
|
232
|
-
* @
|
|
296
|
+
* @param signal 可选的 AbortSignal,中断摘要生成
|
|
297
|
+
* @returns 摘要字符串(失败/中断时返回空字符串,降级为无摘要)
|
|
233
298
|
*/
|
|
234
|
-
async getOrCreateSummary(messages) {
|
|
299
|
+
async getOrCreateSummary(messages, signal) {
|
|
235
300
|
// 检查缓存是否有效
|
|
236
301
|
const summaryExpired = this.contextSummary !== null &&
|
|
237
302
|
messages.length - this.contextSummaryMsgCount > LOOP_CONSTANTS.SUMMARY_CACHE_TTL_MSGS;
|
|
238
303
|
if (this.contextSummary && !summaryExpired) {
|
|
239
304
|
return this.contextSummary;
|
|
240
305
|
}
|
|
241
|
-
//
|
|
242
|
-
const summary = await this.generateContextSummary(messages);
|
|
306
|
+
// 生成新摘要(传入 signal 支持中断)
|
|
307
|
+
const summary = await this.generateContextSummary(messages, signal);
|
|
243
308
|
this.contextSummary = summary;
|
|
244
309
|
this.contextSummaryMsgCount = messages.length;
|
|
245
310
|
return summary;
|
|
@@ -250,38 +315,86 @@ export class ContextManager {
|
|
|
250
315
|
* 在首次截断时,提取即将被裁剪的消息中最近几条用户/助手对话,
|
|
251
316
|
* 调用 provider 生成一句摘要,作为"遗忘补偿"注入到 system prompt 中。
|
|
252
317
|
*
|
|
318
|
+
* 通过 tracer span 埋点(TRACE_SPANS.CONTEXT_SUMMARY),
|
|
319
|
+
* 让宿主监控面板能观察截断频率、摘要生成耗时与失败率。
|
|
320
|
+
*
|
|
321
|
+
* signal 参数传入 provider.chat 的 ChatOptions,
|
|
322
|
+
* 让 fetch 请求和 SSE 流读取都能被 abort 中断;
|
|
323
|
+
* for await 循环中也检查 signal.aborted 提前退出。
|
|
324
|
+
*
|
|
253
325
|
* @param messages 当前消息数组
|
|
254
|
-
* @
|
|
326
|
+
* @param signal 可选的 AbortSignal
|
|
327
|
+
* @returns 摘要字符串(失败/中断时返回空字符串,降级为无摘要)
|
|
255
328
|
*/
|
|
256
|
-
async generateContextSummary(messages) {
|
|
257
|
-
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
.
|
|
261
|
-
|
|
262
|
-
.join('\n');
|
|
263
|
-
if (!recentMessages)
|
|
264
|
-
return '';
|
|
329
|
+
async generateContextSummary(messages, signal) {
|
|
330
|
+
// 启动 CONTEXT_SUMMARY span,记录摘要生成的耗时与异常
|
|
331
|
+
const summarySpan = this.tracer.startSpan(TRACE_SPANS.CONTEXT_SUMMARY, {
|
|
332
|
+
messageCount: messages.length,
|
|
333
|
+
summarizingMessages: Math.min(messages.length - 1, LOOP_CONSTANTS.SUMMARY_MSG_COUNT),
|
|
334
|
+
});
|
|
265
335
|
try {
|
|
336
|
+
// signal 已 abort 时直接返回空,不发起 LLM 调用
|
|
337
|
+
if (signal?.aborted) {
|
|
338
|
+
summarySpan.setAttribute('aborted', true);
|
|
339
|
+
return '';
|
|
340
|
+
}
|
|
341
|
+
const messagesToSummarize = messages.slice(1);
|
|
342
|
+
const recentMessages = messagesToSummarize
|
|
343
|
+
.filter((m) => m.role === 'user' || (m.role === 'assistant' && typeof m.content === 'string'))
|
|
344
|
+
.slice(-LOOP_CONSTANTS.SUMMARY_MSG_COUNT)
|
|
345
|
+
.map((m) => `${m.role}: ${typeof m.content === 'string' ? m.content.substring(0, LOOP_CONSTANTS.SUMMARY_CONTENT_SLICE) : '[tool]'}`)
|
|
346
|
+
.join('\n');
|
|
347
|
+
if (!recentMessages) {
|
|
348
|
+
summarySpan.setAttribute('skipped', true);
|
|
349
|
+
return '';
|
|
350
|
+
}
|
|
351
|
+
// 将 signal 注入 ChatOptions,让 provider 的 fetch/SSE 能被 abort 中断
|
|
266
352
|
const stream = this.provider.chat([
|
|
267
353
|
{
|
|
268
354
|
role: 'system',
|
|
269
355
|
content: 'Summarize the following conversation excerpt in 1-2 sentences. Focus on key facts, decisions, and user preferences. Be concise.',
|
|
270
356
|
},
|
|
271
357
|
{ role: 'user', content: recentMessages },
|
|
272
|
-
], {
|
|
358
|
+
], {
|
|
359
|
+
maxTokens: LOOP_CONSTANTS.SUMMARY_MAX_TOKENS,
|
|
360
|
+
temperature: 0,
|
|
361
|
+
signal,
|
|
362
|
+
});
|
|
273
363
|
let summary = '';
|
|
274
364
|
for await (const chunk of stream) {
|
|
365
|
+
// 流读取过程中检查 abort,提前退出(provider 收到 abort 会抛 AbortError 进入 catch)
|
|
366
|
+
if (signal?.aborted) {
|
|
367
|
+
summarySpan.setAttribute('aborted', true);
|
|
368
|
+
break;
|
|
369
|
+
}
|
|
275
370
|
if (chunk.content)
|
|
276
371
|
summary += chunk.content;
|
|
277
372
|
}
|
|
373
|
+
// 被中断时返回空字符串(降级为无摘要),不缓存
|
|
374
|
+
if (signal?.aborted) {
|
|
375
|
+
return '';
|
|
376
|
+
}
|
|
377
|
+
summarySpan.setAttribute('summaryLength', summary.length);
|
|
278
378
|
logger.info({ summaryLength: summary.length }, '上下文摘要已生成');
|
|
279
379
|
return `[Context summary of earlier conversation]\n${summary}`;
|
|
280
380
|
}
|
|
281
381
|
catch (err) {
|
|
382
|
+
// AbortError 是用户主动取消,降级为无摘要,不当作错误
|
|
383
|
+
const isAbort = err instanceof Error && err.name === 'AbortError';
|
|
384
|
+
if (isAbort) {
|
|
385
|
+
summarySpan.setAttribute('aborted', true);
|
|
386
|
+
logger.debug('上下文摘要生成被中断,降级为无摘要');
|
|
387
|
+
return '';
|
|
388
|
+
}
|
|
389
|
+
// 记录异常到 span(不中断 span,标记错误状态)
|
|
390
|
+
summarySpan.recordException(err instanceof Error ? err : new Error(String(err)));
|
|
282
391
|
logger.warn({ err }, '上下文摘要生成失败,降级为无摘要');
|
|
283
392
|
return '';
|
|
284
393
|
}
|
|
394
|
+
finally {
|
|
395
|
+
// 无论成功/失败都结束 span
|
|
396
|
+
summarySpan.end();
|
|
397
|
+
}
|
|
285
398
|
}
|
|
286
399
|
}
|
|
287
400
|
//# sourceMappingURL=contextManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextManager.js","sourceRoot":"","sources":["../../src/agent/contextManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"contextManager.js","sourceRoot":"","sources":["../../src/agent/contextManager.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/loop.d.ts
CHANGED
|
@@ -30,13 +30,13 @@ export interface AgentLoopOptions {
|
|
|
30
30
|
/** v4.0:工具定义列表(内置 + 自定义),用于 system prompt 追加工具描述 */
|
|
31
31
|
toolDefinitions?: ToolDefinition[];
|
|
32
32
|
/**
|
|
33
|
-
* 上下文窗口 token 上限(默认
|
|
33
|
+
* 上下文窗口 token 上限(默认 32000)
|
|
34
34
|
*
|
|
35
35
|
* 桌面精灵等长运行场景下,messages 数组随对话轮次无限增长会爆 LLM 上下文窗口。
|
|
36
36
|
* 当估算 token 数超过此阈值时,保留 system prompt + 最近 N 条消息,
|
|
37
37
|
* 裁剪中间段,确保 LLM 请求不因上下文溢出而失败。
|
|
38
38
|
*
|
|
39
|
-
* 保守默认值
|
|
39
|
+
* 保守默认值 32000 token 对多数模型安全(DeepSeek 128K / GPT-4o 128K / 豆包 8K),
|
|
40
40
|
* 宿主可通过 AgentLoopOptions 覆盖。
|
|
41
41
|
*/
|
|
42
42
|
maxContextTokens?: number;
|
|
@@ -61,7 +61,7 @@ export interface AgentLoopOptions {
|
|
|
61
61
|
/** 宿主可覆盖的 UI 消息文本(默认英文) */
|
|
62
62
|
messages?: UIMessages;
|
|
63
63
|
/**
|
|
64
|
-
* 上下文超限时是否自动生成摘要(默认
|
|
64
|
+
* 上下文超限时是否自动生成摘要(默认 true)
|
|
65
65
|
*
|
|
66
66
|
* 开启后,当消息历史超过 maxContextTokens 时,
|
|
67
67
|
* 会对被裁剪的消息调用 provider 生成一段摘要注入到系统提示中,
|
|
@@ -73,7 +73,7 @@ export declare class AgentLoop {
|
|
|
73
73
|
private readonly opts;
|
|
74
74
|
private messages;
|
|
75
75
|
private readonly maxIterations;
|
|
76
|
-
/** 上下文窗口 token 上限(默认
|
|
76
|
+
/** 上下文窗口 token 上限(默认 32000,约 96K 中文字符) */
|
|
77
77
|
private readonly maxContextTokens;
|
|
78
78
|
/** 可观测性 Tracer(默认 NOOP_TRACER 零开销) */
|
|
79
79
|
private readonly tracer;
|
|
@@ -85,7 +85,7 @@ export declare class AgentLoop {
|
|
|
85
85
|
private readonly ui;
|
|
86
86
|
/** 上下文超限时是否自动生成摘要 */
|
|
87
87
|
private readonly enableContextSummary;
|
|
88
|
-
/**
|
|
88
|
+
/** 上下文管理器(从 loop 提取的 token 估算 + 截断 + 摘要职责) */
|
|
89
89
|
private readonly contextManager;
|
|
90
90
|
/** LLM 调用总次数(含重试,每次 provider.chat 调用 +1) */
|
|
91
91
|
private metricLlmCallCount;
|
|
@@ -108,7 +108,7 @@ export declare class AgentLoop {
|
|
|
108
108
|
* @param userInput - 用户原始输入
|
|
109
109
|
* @param recalledMemories - 记忆召回结果(Agent.memory.search() 产出),
|
|
110
110
|
* 可选。传入时自动注入到上下文,实现"Agent 记忆召回结果"层
|
|
111
|
-
* @param signal - 可选的 AbortSignal
|
|
111
|
+
* @param signal - 可选的 AbortSignal,用于取消正在进行的对话
|
|
112
112
|
* 泊文等宿主 UI 传入 AbortController.signal,用户点击"取消"时触发 abort
|
|
113
113
|
*/
|
|
114
114
|
processUserInput(userInput: string, recalledMemories?: readonly Memory[], signal?: AbortSignal): AsyncGenerator<AgentChunk, void, unknown>;
|
|
@@ -140,6 +140,30 @@ export declare class AgentLoop {
|
|
|
140
140
|
* @returns 执行结果(aborted 状态)
|
|
141
141
|
*/
|
|
142
142
|
private executeToolCalls;
|
|
143
|
+
/**
|
|
144
|
+
* 工具执行与 signal abort 的竞争包裹
|
|
145
|
+
*
|
|
146
|
+
* 背景:toolExecutor 签名 (name, args) => Promise<string> 不接受 signal 参数,
|
|
147
|
+
* 无法真正中断正在执行的工具。原代码直接 await toolExecutor(...),
|
|
148
|
+
* 工具卡住时 generator 永久挂起,导致 _chatBusy 锁泄漏、UI 全阻塞。
|
|
149
|
+
*
|
|
150
|
+
* 方案:用 Promise.race 让 toolExecutor 与 signal abort 监听竞争
|
|
151
|
+
* - 工具先完成:返回工具结果字符串(原行为)
|
|
152
|
+
* - signal 先 abort:返回 [ERR:TOOL:ABORTED] 错误字符串,
|
|
153
|
+
* 让 executeToolCalls 不再 await 工具(工具仍在后台运行,但 generator 解除阻塞)
|
|
154
|
+
*
|
|
155
|
+
* 设计权衡:
|
|
156
|
+
* - 不改 toolExecutor 签名(82 处测试用例依赖此签名,保持向后兼容)
|
|
157
|
+
* - 不抛 AbortError(避免破坏 executeToolCalls 的 try/catch 错误回传 LLM 契约)
|
|
158
|
+
* - 返回错误字符串符合现有"工具失败回传 LLM"契约([ERR:TOOL:code] 前缀)
|
|
159
|
+
* - ABORTED 不进入 ToolErrorCode 体系(用户主动取消非工具失败,不触发 Reflection)
|
|
160
|
+
*
|
|
161
|
+
* @param name 工具名称
|
|
162
|
+
* @param args 工具参数 JSON 字符串
|
|
163
|
+
* @param signal 可选的 AbortSignal
|
|
164
|
+
* @returns 工具结果字符串,或 [ERR:TOOL:ABORTED] 表示被中断
|
|
165
|
+
*/
|
|
166
|
+
private raceToolWithSignal;
|
|
143
167
|
/**
|
|
144
168
|
* 构建 system prompt(注入人格 + 规则 + 领域 + 工具描述)
|
|
145
169
|
*/
|
|
@@ -162,14 +186,20 @@ export declare class AgentLoop {
|
|
|
162
186
|
*/
|
|
163
187
|
private injectRecallAsSystem;
|
|
164
188
|
/**
|
|
165
|
-
* 构建 LLM
|
|
189
|
+
* 构建 LLM 调用选项(包含工具定义)
|
|
166
190
|
*
|
|
167
191
|
* 将 toolDefinitions 转换为 OpenAI Function Calling 格式,
|
|
168
192
|
* 让 LLM 能通过标准协议发起 tool_call,而非文本模拟。
|
|
169
193
|
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
194
|
+
* 设计说明:
|
|
195
|
+
* `response_format` 约束的是最终响应体,而 `tool_calls` 是通过
|
|
196
|
+
* `tools` 参数触发的独立流式协议(SSE delta),两者不能并存
|
|
197
|
+
* (同时传入会导致 API 报错或行为未定义)。因此本方法只透传 tools
|
|
198
|
+
* 参数,不生成 `response_format: json_schema`。
|
|
199
|
+
*
|
|
200
|
+
* `supportsStructuredOutput` 字段 + `ChatOptions.response_format`
|
|
201
|
+
* 类型保留,供未来非 tool_call 场景的结构化输出使用(如归档摘要
|
|
202
|
+
* 强制 JSON、配置建议提取等),由调用方显式传入 response_format。
|
|
173
203
|
*/
|
|
174
204
|
private buildChatOptions;
|
|
175
205
|
/**
|
|
@@ -221,7 +251,7 @@ export declare class AgentLoop {
|
|
|
221
251
|
*/
|
|
222
252
|
getMessages(): readonly Message[];
|
|
223
253
|
/**
|
|
224
|
-
* 获取 AgentLoop
|
|
254
|
+
* 获取 AgentLoop 运行时指标快照(可观测性增强)
|
|
225
255
|
*
|
|
226
256
|
* 返回 LLM 调用、记忆召回、工具调用、上下文管理四个维度的累计指标。
|
|
227
257
|
* 衰减指标(decay)由 Agent 层填充,此处返回 null。
|
package/dist/agent/loop.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAe,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/agent/loop.ts"],"names":[],"mappings":"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"}
|