@zooique/memora 2.0.0 → 2.0.3
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.en.md +272 -0
- package/README.md +150 -38
- package/dist/agent/agent.d.ts +233 -58
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +651 -359
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +29 -13
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +79 -44
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +26 -1
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +73 -1
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/constants.d.ts +4 -0
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +4 -0
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +8 -0
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +7 -2
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/guardrail.d.ts +4 -2
- package/dist/agent/guardrail.d.ts.map +1 -1
- package/dist/agent/guardrail.js +13 -5
- package/dist/agent/guardrail.js.map +1 -1
- package/dist/agent/loop.d.ts +58 -14
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +184 -131
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +126 -22
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +239 -44
- package/dist/agent/managers/archiveCoordinator.js.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.js +4 -8
- package/dist/agent/managers/autoConfigRefiner.js.map +1 -1
- package/dist/agent/managers/configManager.d.ts +87 -3
- package/dist/agent/managers/configManager.d.ts.map +1 -1
- package/dist/agent/managers/configManager.js +139 -2
- package/dist/agent/managers/configManager.js.map +1 -1
- package/dist/agent/managers/dedupManager.d.ts +169 -0
- package/dist/agent/managers/dedupManager.d.ts.map +1 -0
- package/dist/agent/managers/dedupManager.js +336 -0
- package/dist/agent/managers/dedupManager.js.map +1 -0
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
- package/dist/agent/managers/insightExtractor.js +11 -11
- package/dist/agent/managers/insightExtractor.js.map +1 -1
- package/dist/agent/managers/llmJudgeHelper.d.ts +38 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.js +49 -0
- package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
- package/dist/agent/managers/memoryAdvisor.d.ts +3 -3
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +53 -67
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +46 -5
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.js +127 -63
- package/dist/agent/managers/memoryDecayScheduler.js.map +1 -1
- package/dist/agent/managers/memoryGovernance.d.ts +56 -0
- package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
- package/dist/agent/managers/memoryGovernance.js +63 -0
- package/dist/agent/managers/memoryGovernance.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +32 -157
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +70 -363
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/relationBuilder.js +2 -2
- package/dist/agent/managers/relationBuilder.js.map +1 -1
- package/dist/agent/managers/sessionArchiver.d.ts +6 -1
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +19 -22
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/streamAccumulator.d.ts +45 -0
- package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
- package/dist/agent/managers/streamAccumulator.js +40 -0
- package/dist/agent/managers/streamAccumulator.js.map +1 -0
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
- package/dist/agent/managers/textPolishManager.js +4 -7
- package/dist/agent/managers/textPolishManager.js.map +1 -1
- package/dist/agent/managers/workProjection.d.ts +16 -1
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +48 -24
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/toolExecutor.d.ts +22 -2
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +28 -3
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/types.d.ts +10 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/userFactExtractor.d.ts.map +1 -1
- package/dist/agent/userFactExtractor.js +7 -0
- package/dist/agent/userFactExtractor.js.map +1 -1
- package/dist/config/loader.d.ts +124 -236
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +273 -117
- package/dist/config/loader.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/llm/embedding.d.ts +13 -1
- package/dist/llm/embedding.d.ts.map +1 -1
- package/dist/llm/embedding.js.map +1 -1
- package/dist/llm/factory.d.ts +19 -5
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +19 -37
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +2 -9
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/logging/logger.d.ts +3 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +47 -50
- package/dist/logging/logger.js.map +1 -1
- package/dist/memory/governance.d.ts +50 -0
- package/dist/memory/governance.d.ts.map +1 -0
- package/dist/memory/governance.js +70 -0
- package/dist/memory/governance.js.map +1 -0
- package/dist/memory/hybridMerge.d.ts +0 -4
- package/dist/memory/hybridMerge.d.ts.map +1 -1
- package/dist/memory/hybridMerge.js +19 -4
- package/dist/memory/hybridMerge.js.map +1 -1
- package/dist/memory/inMemoryRelationStore.d.ts +7 -0
- package/dist/memory/inMemoryRelationStore.d.ts.map +1 -1
- package/dist/memory/inMemoryRelationStore.js +15 -0
- package/dist/memory/inMemoryRelationStore.js.map +1 -1
- package/dist/memory/inMemoryStorage.d.ts +36 -1
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +66 -16
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/loader.d.ts +2 -0
- package/dist/memory/loader.d.ts.map +1 -1
- package/dist/memory/loader.js +8 -1
- package/dist/memory/loader.js.map +1 -1
- package/dist/memory/lockManager.d.ts +7 -2
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +31 -5
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +2 -1
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +21 -3
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +34 -1
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +99 -22
- package/dist/memory/projectRegistry.js.map +1 -1
- package/dist/memory/recall.d.ts +16 -0
- package/dist/memory/recall.d.ts.map +1 -1
- package/dist/memory/recall.js +33 -18
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/relationStore.d.ts +20 -3
- package/dist/memory/relationStore.d.ts.map +1 -1
- package/dist/memory/sourceValidation.d.ts +11 -0
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +24 -2
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +26 -1
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/store.d.ts +22 -1
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +58 -20
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.d.ts +44 -31
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +63 -24
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/userProfile.d.ts +32 -8
- package/dist/memory/userProfile.d.ts.map +1 -1
- package/dist/memory/userProfile.js +105 -44
- package/dist/memory/userProfile.js.map +1 -1
- package/dist/memory/vectorStore.d.ts +16 -22
- package/dist/memory/vectorStore.d.ts.map +1 -1
- package/dist/memory/vectorStore.js +49 -22
- package/dist/memory/vectorStore.js.map +1 -1
- package/dist/persona/personaManager.d.ts +36 -87
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +131 -230
- package/dist/persona/personaManager.js.map +1 -1
- package/dist/skill/skillManager.d.ts +11 -57
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +46 -142
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/types.d.ts +2 -3
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/utils/configResourceManager.d.ts +111 -0
- package/dist/utils/configResourceManager.d.ts.map +1 -0
- package/dist/utils/configResourceManager.js +148 -0
- package/dist/utils/configResourceManager.js.map +1 -0
- package/dist/utils/errors.d.ts +17 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +19 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +83 -6
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +23 -0
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +4 -2
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/math.d.ts +11 -0
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +17 -0
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/segmenter.d.ts +0 -10
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +10 -1
- package/dist/utils/segmenter.js.map +1 -1
- package/docs/memora-api-reference.md +1235 -0
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +808 -0
- package/package.json +39 -22
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
// LLM judge 三件套高阶函数(流式累积 + parseLlmJson + configError 异常封装)
|
|
2
|
+
import { judgeWithLlm } from '../../agent/managers/llmJudgeHelper.js';
|
|
3
|
+
// LLM 治理共享常量(v2 REPEAT-1/2 闭环,消除 5 处独立维护的治理源列表 + 2 处 score 常量重复)
|
|
4
|
+
import { GOVERNANCE_SOURCES } from '../../memory/governance.js';
|
|
5
|
+
// levenshtein 用于名称相似度计算(复用 sourceValidation 中的实现,避免重复造轮子)
|
|
6
|
+
import { levenshtein } from '../../memory/sourceValidation.js';
|
|
7
|
+
// 按 score 降序排序(与 MemoryInspector 共享,避免重复造轮子)
|
|
8
|
+
import { byScoreDesc } from '../../utils/array.js';
|
|
9
|
+
// 时间戳生成(降级时更新 accessedAt)
|
|
10
|
+
import { nowIso } from '../../utils/time.js';
|
|
11
|
+
// 内容截断(送入 LLM 前控制 token 消耗)
|
|
12
|
+
import { truncate } from '../../utils/strings.js';
|
|
13
|
+
// 日志(治理审计 + 失败降级记录)
|
|
14
|
+
import { logger } from '../../logging/logger.js';
|
|
15
|
+
// ─── L1 语义去重常量 ────────────────────────────────────
|
|
16
|
+
/** 单次去重扫描的候选记忆条数上限(控制内存和 LLM 调用量) */
|
|
17
|
+
const DEDUP_CANDIDATE_LIMIT = 50;
|
|
18
|
+
/** 单次 LLM 判断的候选对数上限(每对约 200 tokens,10 对 ≈ 2000 tokens) */
|
|
19
|
+
const DEDUP_PAIR_LIMIT = 10;
|
|
20
|
+
/** 名称相似度阈值(归一化 Levenshtein 距离 ≤ 此值视为名称高度相似,进入 LLM 判断) */
|
|
21
|
+
const DEDUP_NAME_SIMILARITY_THRESHOLD = 0.3;
|
|
22
|
+
/** LLM 去重判断超时(ms),与 TextPolishManager 一致 */
|
|
23
|
+
const DEDUP_TIMEOUT_MS = 15_000;
|
|
24
|
+
/** 被判定为重复的记忆降级到此 score(接近 0 但保留可恢复性,不物理删除) */
|
|
25
|
+
const DEDUP_LOW_SCORE = 0.1;
|
|
26
|
+
/** 候选记忆内容预览长度(截断后送入 LLM,控制 token 消耗) */
|
|
27
|
+
const DEDUP_CONTENT_PREVIEW_LEN = 200;
|
|
28
|
+
// ─── 类 ──────────────────────────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* 语义去重管理器
|
|
31
|
+
*
|
|
32
|
+
* 扫描名称高度相似的记忆对,调用 LLM 判断语义等价性,降级低分记忆。
|
|
33
|
+
*
|
|
34
|
+
* 装配:由 assembler.ts 在组合根创建,backgroundProvider 可选注入。
|
|
35
|
+
* 调用:Agent.deduplicateMemories() 透传至本类。
|
|
36
|
+
*/
|
|
37
|
+
export class DedupManager {
|
|
38
|
+
index;
|
|
39
|
+
onCompleted;
|
|
40
|
+
/** 后台 LLM Provider(可选,用于语义去重等异步治理任务,未注入时降级跳过) */
|
|
41
|
+
backgroundProvider;
|
|
42
|
+
/**
|
|
43
|
+
* @param index - 记忆存储(用于读写候选记忆)
|
|
44
|
+
* @param backgroundProvider - 后台 LLM Provider(可选,用于语义去重,未注入时降级跳过)
|
|
45
|
+
*/
|
|
46
|
+
constructor(index, backgroundProvider = null,
|
|
47
|
+
/** 去重完成回调(宿主可据此发射事件通知用户) */
|
|
48
|
+
onCompleted) {
|
|
49
|
+
this.index = index;
|
|
50
|
+
this.onCompleted = onCompleted;
|
|
51
|
+
this.backgroundProvider = backgroundProvider;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 语义去重:扫描名称高度相似的记忆对,调用 LLM 判断语义等价性
|
|
55
|
+
*
|
|
56
|
+
* 流程:
|
|
57
|
+
* 1. 从 insight/profile/work-projection 加载候选记忆(上限 50 条)
|
|
58
|
+
* 2. 按名称归一化 Levenshtein 距离筛选相似对(上限 10 对)
|
|
59
|
+
* 3. 对每对调用 LLM 判断语义等价性(结构化 JSON 输出)
|
|
60
|
+
* 4. 等价则降级低分记忆(score → 0.1,不物理删除,保留可恢复性)
|
|
61
|
+
* 5. 返回去重报告
|
|
62
|
+
*
|
|
63
|
+
* 安全设计:
|
|
64
|
+
* - 不物理删除——仅降级 score,用户可通过宿主 UI 手动恢复
|
|
65
|
+
* - LLM 失败降级——返回已处理的报告,不阻塞调用方
|
|
66
|
+
* - 异步执行——不阻塞主对话热路径(由宿主定时任务或用户手动触发)
|
|
67
|
+
* - backgroundProvider 未注入时静默跳过(返回 skippedReason)
|
|
68
|
+
*
|
|
69
|
+
* @param signal 可选的 AbortSignal(取消正在进行的 LLM 判断)
|
|
70
|
+
* @returns 去重报告
|
|
71
|
+
*/
|
|
72
|
+
async deduplicateMemories(signal) {
|
|
73
|
+
// backgroundProvider 未注入时静默降级(向后兼容)
|
|
74
|
+
if (!this.backgroundProvider) {
|
|
75
|
+
return {
|
|
76
|
+
scannedCount: 0,
|
|
77
|
+
pairCount: 0,
|
|
78
|
+
deduplicatedCount: 0,
|
|
79
|
+
demotedIds: [],
|
|
80
|
+
skippedReason: 'backgroundProvider 未注入',
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// ── 步骤 1:加载候选记忆(按 score 降序,取前 50 条) ──
|
|
84
|
+
const candidates = [];
|
|
85
|
+
for (const source of GOVERNANCE_SOURCES) {
|
|
86
|
+
const memories = this.index.getBySource(source);
|
|
87
|
+
candidates.push(...memories);
|
|
88
|
+
}
|
|
89
|
+
// 按 score 降序排列,优先处理高分记忆(更可能产生重复)
|
|
90
|
+
candidates.sort(byScoreDesc);
|
|
91
|
+
const limited = candidates.slice(0, DEDUP_CANDIDATE_LIMIT);
|
|
92
|
+
// ── 步骤 2:筛选名称高度相似的记忆对 ──
|
|
93
|
+
const pairs = this.findNameOverlapPairs(limited);
|
|
94
|
+
if (pairs.length === 0) {
|
|
95
|
+
return {
|
|
96
|
+
scannedCount: limited.length,
|
|
97
|
+
pairCount: 0,
|
|
98
|
+
deduplicatedCount: 0,
|
|
99
|
+
demotedIds: [],
|
|
100
|
+
skippedReason: '未发现名称相似的记忆对',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// ── 步骤 3:逐对调用 LLM 判断语义等价性 ──
|
|
104
|
+
const demotedIds = [];
|
|
105
|
+
const verdicts = [];
|
|
106
|
+
let deduplicatedCount = 0;
|
|
107
|
+
for (const pair of pairs) {
|
|
108
|
+
try {
|
|
109
|
+
const verdict = await this.judgeDuplicate(pair, signal);
|
|
110
|
+
if (verdict.isDuplicate) {
|
|
111
|
+
// 先写合并内容再降级 b:确保合并写入失败时不破坏 b 的原始状态(原子性)
|
|
112
|
+
if (verdict.mergedContent) {
|
|
113
|
+
this.keepMerged(pair.a, verdict.mergedContent);
|
|
114
|
+
}
|
|
115
|
+
// 降级低分记忆(b 的 score ≤ a 的 score,因 candidates 已按 score 降序)
|
|
116
|
+
this.demoteMemory(pair.b);
|
|
117
|
+
demotedIds.push(pair.b.id);
|
|
118
|
+
// 收集审计详情(供 UI 展示"为什么降级"和"合并后保留了什么")
|
|
119
|
+
verdicts.push({
|
|
120
|
+
demotedId: pair.b.id,
|
|
121
|
+
reason: verdict.reason,
|
|
122
|
+
mergedContent: verdict.mergedContent,
|
|
123
|
+
});
|
|
124
|
+
deduplicatedCount++;
|
|
125
|
+
logger.info({ demotedId: pair.b.id, keptId: pair.a.id, reason: verdict.reason }, '语义去重:降级重复记忆并合并内容到保留方');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
// 单对 LLM 判断失败不阻塞后续对,记录警告继续
|
|
130
|
+
logger.warn({ err, pairId: `${pair.a.id}↔${pair.b.id}` }, '语义去重:LLM 判断失败,跳过此对');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
this.onCompleted?.({ scannedCount: limited.length, pairCount: pairs.length, deduplicatedCount, demotedIds });
|
|
134
|
+
return {
|
|
135
|
+
scannedCount: limited.length,
|
|
136
|
+
pairCount: pairs.length,
|
|
137
|
+
deduplicatedCount,
|
|
138
|
+
demotedIds,
|
|
139
|
+
verdicts,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 筛选名称高度相似的候选记忆对
|
|
144
|
+
*
|
|
145
|
+
* 判定规则(满足任一即视为名称相似):
|
|
146
|
+
* 1. 归一化 Levenshtein 距离 ≤ 0.3(如 "用户偏好" vs "用户偏爱")
|
|
147
|
+
* 2. 一个名称包含另一个(如 "用户偏好" vs "用户偏好设置")
|
|
148
|
+
*
|
|
149
|
+
* 去重设计:
|
|
150
|
+
* - 已配对的记忆不再参与后续配对(避免 A-B-C 三元组产生 A-B + A-C + B-C 三对)
|
|
151
|
+
* - 候选对按相似度升序排列(越相似越优先),取前 10 对
|
|
152
|
+
*
|
|
153
|
+
* @param candidates 候选记忆列表(已按 score 降序)
|
|
154
|
+
* @returns 名称相似的记忆对列表(a.score ≥ b.score)
|
|
155
|
+
*/
|
|
156
|
+
findNameOverlapPairs(candidates) {
|
|
157
|
+
const pairs = [];
|
|
158
|
+
const usedIds = new Set();
|
|
159
|
+
// 双重循环生成所有可能的对,按相似度排序后贪心选取
|
|
160
|
+
const allPairs = [];
|
|
161
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
162
|
+
for (let j = i + 1; j < candidates.length; j++) {
|
|
163
|
+
const a = candidates[i]; // i 循环内,score 较高
|
|
164
|
+
const b = candidates[j]; // j > i,score 较低或相等
|
|
165
|
+
const similarity = DedupManager.computeNameSimilarity(a.name, b.name);
|
|
166
|
+
if (similarity <= DEDUP_NAME_SIMILARITY_THRESHOLD) {
|
|
167
|
+
allPairs.push({ a, b, nameSimilarity: similarity });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// 按相似度升序排列(越相似越优先处理)
|
|
172
|
+
allPairs.sort((x, y) => x.nameSimilarity - y.nameSimilarity);
|
|
173
|
+
// 贪心选取:已配对的记忆不再参与后续配对
|
|
174
|
+
for (const { a, b, nameSimilarity } of allPairs) {
|
|
175
|
+
if (usedIds.has(a.id) || usedIds.has(b.id))
|
|
176
|
+
continue;
|
|
177
|
+
pairs.push({ a, b, nameSimilarity });
|
|
178
|
+
usedIds.add(a.id);
|
|
179
|
+
usedIds.add(b.id);
|
|
180
|
+
if (pairs.length >= DEDUP_PAIR_LIMIT)
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
return pairs;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* 计算两个名称的归一化相似度(0-1,越小越相似)
|
|
187
|
+
*
|
|
188
|
+
* 综合两种规则取较小值:
|
|
189
|
+
* 1. 归一化 Levenshtein 距离 = distance / max(len_a, len_b)
|
|
190
|
+
* 2. 包含关系:若一个名称包含另一个,相似度 = 0(完全相似)
|
|
191
|
+
*
|
|
192
|
+
* @param nameA 名称 A
|
|
193
|
+
* @param nameB 名称 B
|
|
194
|
+
* @returns 相似度(0=完全相似,1=完全不同)
|
|
195
|
+
*/
|
|
196
|
+
static computeNameSimilarity(nameA, nameB) {
|
|
197
|
+
// 边界条件:空字符串防御
|
|
198
|
+
// 空名称会导致 includes("") 恒为 true 返回 0(完全相似),
|
|
199
|
+
// 让空名称记忆与所有记忆被判高度相似,浪费 LLM 调用并可能误降级。
|
|
200
|
+
// 此处前置拒绝,空名称与任何名称都视为完全不同(1.0)。
|
|
201
|
+
if (!nameA || !nameB) {
|
|
202
|
+
return 1;
|
|
203
|
+
}
|
|
204
|
+
// 规则 2:包含关系(如 "用户偏好" vs "用户偏好设置")
|
|
205
|
+
if (nameA.includes(nameB) || nameB.includes(nameA)) {
|
|
206
|
+
return 0;
|
|
207
|
+
}
|
|
208
|
+
// 规则 1:归一化 Levenshtein 距离
|
|
209
|
+
const maxLen = Math.max(nameA.length, nameB.length);
|
|
210
|
+
if (maxLen === 0)
|
|
211
|
+
return 0; // 两个空字符串视为完全相似(已被上面拦截,此处防御)
|
|
212
|
+
const distance = levenshtein(nameA, nameB);
|
|
213
|
+
return distance / maxLen;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* 调用 LLM 判断单对记忆的语义等价性
|
|
217
|
+
*
|
|
218
|
+
* 使用结构化 JSON 输出(isDuplicate + mergedContent + reason),
|
|
219
|
+
* 流式累积 + parseLlmJson + 异常封装委托给 llmJudgeHelper.judgeWithLlm。
|
|
220
|
+
*
|
|
221
|
+
* LLM 失败时抛出 MemoraError(由 deduplicateMemories 捕获并降级跳过此对)。
|
|
222
|
+
*
|
|
223
|
+
* @param pair 候选记忆对
|
|
224
|
+
* @param signal 可选的 AbortSignal
|
|
225
|
+
* @returns LLM 判断结果
|
|
226
|
+
*/
|
|
227
|
+
async judgeDuplicate(pair, signal) {
|
|
228
|
+
const messages = buildDedupMessages(pair);
|
|
229
|
+
const parsed = await judgeWithLlm(this.backgroundProvider, messages, { maxTokens: 300, timeoutMs: DEDUP_TIMEOUT_MS, signal }, 'LLM 去重判断返回非法 JSON');
|
|
230
|
+
return {
|
|
231
|
+
isDuplicate: parsed.isDuplicate === true,
|
|
232
|
+
mergedContent: typeof parsed.mergedContent === 'string' ? parsed.mergedContent : undefined,
|
|
233
|
+
reason: typeof parsed.reason === 'string' ? parsed.reason : '(LLM 未提供理由)',
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* 降级重复记忆(score → DEDUP_LOW_SCORE)
|
|
238
|
+
*
|
|
239
|
+
* 安全设计:
|
|
240
|
+
* - 不物理删除,仅降低 score,保留可恢复性
|
|
241
|
+
* - 合并内容由 keepMerged() 单独写回保留方 a(职责清晰:本方法只降级低分方)
|
|
242
|
+
*
|
|
243
|
+
* @param memory 待降级的记忆(低分方)
|
|
244
|
+
*/
|
|
245
|
+
demoteMemory(memory) {
|
|
246
|
+
// MIND2-L3:改用 setScore 原子操作,消除 spread 旧快照覆盖其他字段的隐性 bug
|
|
247
|
+
// 原模式用 candidates 旧快照 spread 后整条 upsert,会覆盖期间被 boost/decay 改的 content 等字段
|
|
248
|
+
this.index.setScore(memory.id, DEDUP_LOW_SCORE, nowIso());
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* 将合并内容写回保留方(高分记忆 a)
|
|
252
|
+
*
|
|
253
|
+
* 保持 a 的 id/source/name/score/createdAt 不变,仅更新 content 为合并后内容并刷新
|
|
254
|
+
* accessedAt,使"两条重复记忆合并为一条更完整记忆"的语义真正落库(M6 修复)。
|
|
255
|
+
*
|
|
256
|
+
* @param memory 保留方记忆(高分方)
|
|
257
|
+
* @param mergedContent LLM 生成的合并后完整内容
|
|
258
|
+
*/
|
|
259
|
+
keepMerged(memory, mergedContent) {
|
|
260
|
+
const updated = {
|
|
261
|
+
...memory,
|
|
262
|
+
content: mergedContent,
|
|
263
|
+
accessedAt: nowIso(),
|
|
264
|
+
};
|
|
265
|
+
this.index.upsert(updated);
|
|
266
|
+
logger.info({ keptId: memory.id }, '语义去重:保留方已合并对方内容');
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// ─── L1 语义去重 Prompt 模板(模块级函数,与 TextPolishManager.buildPolishMessages 同模式) ───
|
|
270
|
+
/**
|
|
271
|
+
* 构建语义去重判断的 LLM 消息
|
|
272
|
+
*
|
|
273
|
+
* 设计要点:
|
|
274
|
+
* - system 消息定义判断规则(语义等价 = 表达同一事实/偏好/洞察)
|
|
275
|
+
* - user 消息携带候选对的内容预览(截断到 200 字符)
|
|
276
|
+
* - 要求输出结构化 JSON(isDuplicate + mergedContent + reason)
|
|
277
|
+
* - few-shot 示例降低 LLM 误判率
|
|
278
|
+
*
|
|
279
|
+
* @param pair 候选记忆对
|
|
280
|
+
* @returns system + user 消息数组
|
|
281
|
+
*/
|
|
282
|
+
function buildDedupMessages(pair) {
|
|
283
|
+
const contentA = pair.a.content.length > DEDUP_CONTENT_PREVIEW_LEN
|
|
284
|
+
? truncate(pair.a.content, DEDUP_CONTENT_PREVIEW_LEN, '…[截断]')
|
|
285
|
+
: pair.a.content;
|
|
286
|
+
const contentB = pair.b.content.length > DEDUP_CONTENT_PREVIEW_LEN
|
|
287
|
+
? truncate(pair.b.content, DEDUP_CONTENT_PREVIEW_LEN, '…[截断]')
|
|
288
|
+
: pair.b.content;
|
|
289
|
+
return [
|
|
290
|
+
{
|
|
291
|
+
role: 'system',
|
|
292
|
+
content: `你是记忆去重助手。判断给定的两条记忆是否语义等价(表达同一事实/偏好/洞察)。
|
|
293
|
+
|
|
294
|
+
判断规则:
|
|
295
|
+
- 语义等价 = 核心信息相同,仅措辞/格式/细节程度不同
|
|
296
|
+
- 语义不等价 = 核心信息不同,或一条是另一条的补充/细化(非等价)
|
|
297
|
+
- 忽略时间戳、ID 等元数据差异
|
|
298
|
+
- 忽略措辞风格差异(如"喜欢"vs"偏爱")
|
|
299
|
+
|
|
300
|
+
输出 JSON 格式:
|
|
301
|
+
{
|
|
302
|
+
"isDuplicate": true/false,
|
|
303
|
+
"mergedContent": "合并后的内容(仅 isDuplicate=true 时提供,保留两条记忆的完整信息)",
|
|
304
|
+
"reason": "判断理由(简短说明)"
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
示例:
|
|
308
|
+
输入 A: "用户偏好简洁的 UI 设计"
|
|
309
|
+
输入 B: "用户喜欢简洁的界面风格"
|
|
310
|
+
输出: {"isDuplicate": true, "mergedContent": "用户偏好简洁的 UI/界面设计风格", "reason": "核心偏好相同,仅措辞差异"}
|
|
311
|
+
|
|
312
|
+
输入 A: "用户是 TypeScript 开发者"
|
|
313
|
+
输入 B: "用户偏好使用 TypeScript 进行后端开发"
|
|
314
|
+
输出: {"isDuplicate": false, "reason": "B 是 A 的细化(限定后端),非语义等价"}`,
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
role: 'user',
|
|
318
|
+
content: `请判断以下两条记忆是否语义等价:
|
|
319
|
+
|
|
320
|
+
记忆 A(score: ${pair.a.score},保留候选):
|
|
321
|
+
- 名称:${pair.a.name}
|
|
322
|
+
- 来源:${pair.a.source}
|
|
323
|
+
- 内容:${contentA}
|
|
324
|
+
|
|
325
|
+
记忆 B(score: ${pair.b.score},降级候选):
|
|
326
|
+
- 名称:${pair.b.name}
|
|
327
|
+
- 来源:${pair.b.source}
|
|
328
|
+
- 内容:${contentB}
|
|
329
|
+
|
|
330
|
+
名称相似度:${pair.nameSimilarity.toFixed(2)}(0=完全相同,1=完全不同)
|
|
331
|
+
|
|
332
|
+
请输出 JSON 判断结果。`,
|
|
333
|
+
},
|
|
334
|
+
];
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=dedupManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupManager.js","sourceRoot":"","sources":["../../../src/agent/managers/dedupManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insightExtractor.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/insightExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"insightExtractor.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/insightExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAkCzF;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAsFD,qBAAa,gBAAgB;IAoBzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IApBxB,iCAAiC;IACjC,OAAO,CAAC,YAAY,CAA+B;IAEnD,+BAA+B;IACxB,eAAe,EAAE,eAAe,GAAG,IAAI,CAAQ;IAEtD;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IAEzD;;;;;OAKG;gBAEgB,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,cAAc,EACtC,eAAe,GAAE,eAAe,GAAG,IAAW;IAOhD,8DAA8D;IAC9D,OAAO,CAAC,iBAAiB,CAA6E;IAEtG;;OAEG;IACH,oBAAoB,CAClB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GAC7E,IAAI;IAIP;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAM/D;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAQ3C;;OAEG;IACH,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAOrD;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe3C;;;;;;;OAOG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA2I7E;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAQtB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,oBAAoB;IAyB5B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;CAU/B"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { SOURCE_LABELS } from '../../memory/types.js';
|
|
2
|
-
import {
|
|
2
|
+
import { escapeLikeSnippet } from '../../memory/sourceValidation.js';
|
|
3
3
|
import { logger } from '../../logging/logger.js';
|
|
4
4
|
import { parseLlmJson } from '../../utils/json.js';
|
|
5
5
|
import { segmentLower } from '../../utils/segmenter.js';
|
|
6
6
|
import { nowIso } from '../../utils/time.js';
|
|
7
7
|
import { truncate } from '../../utils/strings.js';
|
|
8
|
+
import { accumulateStream } from '../../agent/managers/streamAccumulator.js';
|
|
8
9
|
// ─── 常量 ────────────────────────────────────────────────
|
|
9
10
|
/** extractInsight 默认 score 值 */
|
|
10
11
|
const DEFAULT_INSIGHT_SCORE = 0.5;
|
|
@@ -190,7 +191,7 @@ export class InsightExtractor {
|
|
|
190
191
|
: assistantContent;
|
|
191
192
|
// 预检去重:LLM 调用前先检查用户输入是否与已有 insight 高度相似
|
|
192
193
|
// 避免对重复内容浪费 LLM 调用
|
|
193
|
-
const precheckSnippet =
|
|
194
|
+
const precheckSnippet = escapeLikeSnippet(safeUserInput);
|
|
194
195
|
const precheckExisting = this.index.search(precheckSnippet, 3);
|
|
195
196
|
const precheckDuplicate = precheckExisting.find((m) => {
|
|
196
197
|
const sim = this.jaccardSimilarity(safeUserInput, m.content);
|
|
@@ -223,11 +224,8 @@ export class InsightExtractor {
|
|
|
223
224
|
relationsPrompt,
|
|
224
225
|
});
|
|
225
226
|
const messages = [{ role: 'user', content: extractionPrompt }];
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
if (chunk.content)
|
|
229
|
-
llmResponse += chunk.content;
|
|
230
|
-
}
|
|
227
|
+
// 流式累积(复用 accumulateStream 工具函数)
|
|
228
|
+
const llmResponse = await accumulateStream(this.provider, messages);
|
|
231
229
|
// 解析 LLM 响应
|
|
232
230
|
const trimmedResponse = llmResponse.trim();
|
|
233
231
|
if (trimmedResponse === 'null' || !trimmedResponse) {
|
|
@@ -247,7 +245,7 @@ export class InsightExtractor {
|
|
|
247
245
|
const quality = parsed?.quality ?? 'medium';
|
|
248
246
|
const score = this.scoreByQuality(quality);
|
|
249
247
|
// Step 2: 去重检查(使用 Jaccard 相似度)
|
|
250
|
-
const snippet =
|
|
248
|
+
const snippet = escapeLikeSnippet(insight);
|
|
251
249
|
const existing = this.index.search(snippet, 3);
|
|
252
250
|
const existingMemory = existing.find((m) => {
|
|
253
251
|
const similarity = this.jaccardSimilarity(insight, m.content);
|
|
@@ -345,13 +343,15 @@ export class InsightExtractor {
|
|
|
345
343
|
* @returns 语义化 name 字符串
|
|
346
344
|
*/
|
|
347
345
|
generateSemanticName(tagsRaw, insightId) {
|
|
346
|
+
// 三种回退分支共用同一兜底名称(逻辑分叉但结果收敛,提取常量消除 3 处重复字面量)
|
|
347
|
+
const fallbackName = `insight-${insightId.slice(0, 8)}`;
|
|
348
348
|
// 运行时校验:tags 必须是非空数组,且第一个元素为非空字符串
|
|
349
349
|
if (!Array.isArray(tagsRaw) || tagsRaw.length === 0) {
|
|
350
|
-
return
|
|
350
|
+
return fallbackName;
|
|
351
351
|
}
|
|
352
352
|
const firstTag = tagsRaw[0];
|
|
353
353
|
if (typeof firstTag !== 'string' || !firstTag.trim()) {
|
|
354
|
-
return
|
|
354
|
+
return fallbackName;
|
|
355
355
|
}
|
|
356
356
|
// 清洗 tag:保留中文/字母/数字/连字符,移除其他字符(防止注入和特殊字符)
|
|
357
357
|
const cleanedTag = firstTag
|
|
@@ -360,7 +360,7 @@ export class InsightExtractor {
|
|
|
360
360
|
.slice(0, 8);
|
|
361
361
|
// 清洗后为空(如 tag 全是特殊字符),回退到 UUID 方案
|
|
362
362
|
if (!cleanedTag) {
|
|
363
|
-
return
|
|
363
|
+
return fallbackName;
|
|
364
364
|
}
|
|
365
365
|
return `${cleanedTag}-${insightId.slice(0, 6)}`;
|
|
366
366
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insightExtractor.js","sourceRoot":"","sources":["../../../src/agent/managers/insightExtractor.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"insightExtractor.js","sourceRoot":"","sources":["../../../src/agent/managers/insightExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Judge 高阶辅助函数
|
|
3
|
+
*
|
|
4
|
+
* 抽象"流式累积 → parseLlmJson → 判 null → 抛 configError"三件套模式。
|
|
5
|
+
* 用于 memoryInspector / memoryDecayScheduler / memoryAdvisor 三个 Manager 的 LLM 判断流程,
|
|
6
|
+
* 消除 3 处重复模式(ADR-017 枝叶层 2 次提取原则)。
|
|
7
|
+
*
|
|
8
|
+
* 设计要点:
|
|
9
|
+
* - 流式累积:与 TextPolishManager / SessionArchiver 同模式
|
|
10
|
+
* - 统一异常:parseLlmJson 返回 null 时抛 configError(统一 MemoraError 体系,避免裸 throw Error)
|
|
11
|
+
* - 类型参数化:调用方传入期望的返回类型 T
|
|
12
|
+
*/
|
|
13
|
+
import type { LlmProvider, Message } from '../../llm/provider.js';
|
|
14
|
+
/** LLM Judge 调用选项(流式 + 超时 + 取消信号) */
|
|
15
|
+
export interface LlmJudgeOptions {
|
|
16
|
+
/** 流式响应的最大 token 数(控制单次调用成本) */
|
|
17
|
+
maxTokens: number;
|
|
18
|
+
/** LLM 调用超时(ms),超时后中止请求 */
|
|
19
|
+
timeoutMs: number;
|
|
20
|
+
/** 可选的取消信号(与 timeoutMs 互相独立,任一触发即中止) */
|
|
21
|
+
signal?: AbortSignal;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 调用 LLM 流式累积响应并解析为 JSON 对象
|
|
25
|
+
*
|
|
26
|
+
* 三件套模式封装:
|
|
27
|
+
* 1. 流式累积 LLM 响应(chunk.content 拼接)
|
|
28
|
+
* 2. parseLlmJson 解析为对象 T(容错:剥离代码块、修复常见错误、正则兜底)
|
|
29
|
+
* 3. 解析失败抛 configError(统一 MemoraError 体系,附带排查建议)
|
|
30
|
+
*
|
|
31
|
+
* @param provider LLM Provider 实例(通常为 backgroundProvider)
|
|
32
|
+
* @param messages LLM 消息数组(system + user)
|
|
33
|
+
* @param options 调用选项(maxTokens / timeoutMs / signal)
|
|
34
|
+
* @param errorTitle 解析失败时抛出 configError 的标题(中文简短)
|
|
35
|
+
* @returns 解析后的对象(类型由调用方指定)
|
|
36
|
+
*/
|
|
37
|
+
export declare function judgeWithLlm<T extends object>(provider: LlmProvider, messages: Message[], options: LlmJudgeOptions, errorTitle: string): Promise<T>;
|
|
38
|
+
//# sourceMappingURL=llmJudgeHelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llmJudgeHelper.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/llmJudgeHelper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAK9D,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,EACjD,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CAwBZ"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Judge 高阶辅助函数
|
|
3
|
+
*
|
|
4
|
+
* 抽象"流式累积 → parseLlmJson → 判 null → 抛 configError"三件套模式。
|
|
5
|
+
* 用于 memoryInspector / memoryDecayScheduler / memoryAdvisor 三个 Manager 的 LLM 判断流程,
|
|
6
|
+
* 消除 3 处重复模式(ADR-017 枝叶层 2 次提取原则)。
|
|
7
|
+
*
|
|
8
|
+
* 设计要点:
|
|
9
|
+
* - 流式累积:与 TextPolishManager / SessionArchiver 同模式
|
|
10
|
+
* - 统一异常:parseLlmJson 返回 null 时抛 configError(统一 MemoraError 体系,避免裸 throw Error)
|
|
11
|
+
* - 类型参数化:调用方传入期望的返回类型 T
|
|
12
|
+
*/
|
|
13
|
+
import { parseLlmJson } from '../../utils/json.js';
|
|
14
|
+
import { configError } from '../../utils/errors.js';
|
|
15
|
+
import { accumulateStream } from '../../agent/managers/streamAccumulator.js';
|
|
16
|
+
/**
|
|
17
|
+
* 调用 LLM 流式累积响应并解析为 JSON 对象
|
|
18
|
+
*
|
|
19
|
+
* 三件套模式封装:
|
|
20
|
+
* 1. 流式累积 LLM 响应(chunk.content 拼接)
|
|
21
|
+
* 2. parseLlmJson 解析为对象 T(容错:剥离代码块、修复常见错误、正则兜底)
|
|
22
|
+
* 3. 解析失败抛 configError(统一 MemoraError 体系,附带排查建议)
|
|
23
|
+
*
|
|
24
|
+
* @param provider LLM Provider 实例(通常为 backgroundProvider)
|
|
25
|
+
* @param messages LLM 消息数组(system + user)
|
|
26
|
+
* @param options 调用选项(maxTokens / timeoutMs / signal)
|
|
27
|
+
* @param errorTitle 解析失败时抛出 configError 的标题(中文简短)
|
|
28
|
+
* @returns 解析后的对象(类型由调用方指定)
|
|
29
|
+
*/
|
|
30
|
+
export async function judgeWithLlm(provider, messages, options, errorTitle) {
|
|
31
|
+
// 流式累积(复用 accumulateStream 工具函数,消除重复模式)
|
|
32
|
+
const llmResponse = await accumulateStream(provider, messages, {
|
|
33
|
+
maxTokens: options.maxTokens,
|
|
34
|
+
temperature: 0,
|
|
35
|
+
timeoutMs: options.timeoutMs,
|
|
36
|
+
signal: options.signal,
|
|
37
|
+
});
|
|
38
|
+
// 解析 LLM 响应(JSON 格式),失败则抛 configError(统一 MemoraError 体系)
|
|
39
|
+
const parsed = parseLlmJson(llmResponse.trim());
|
|
40
|
+
if (!parsed) {
|
|
41
|
+
throw configError(errorTitle, 'LLM 返回内容不是有效的 JSON(parseLlmJson 解析失败)', [
|
|
42
|
+
'检查 backgroundProvider 是否注入并可用',
|
|
43
|
+
'检查 LLM 模型是否输出预期的 JSON 结构',
|
|
44
|
+
'若问题持续,可降低候选数量或调整 prompt',
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
return parsed;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=llmJudgeHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llmJudgeHelper.js","sourceRoot":"","sources":["../../../src/agent/managers/llmJudgeHelper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAYzE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAqB,EACrB,QAAmB,EACnB,OAAwB,EACxB,UAAkB;IAElB,wCAAwC;IACxC,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE;QAC7D,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,yDAAyD;IACzD,MAAM,MAAM,GAAG,YAAY,CAAI,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,WAAW,CACf,UAAU,EACV,uCAAuC,EACvC;YACE,+BAA+B;YAC/B,0BAA0B;YAC1B,yBAAyB;SAC1B,CACF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -181,12 +181,12 @@ export declare class MemoryAdvisor {
|
|
|
181
181
|
*/
|
|
182
182
|
private findConflictCandidates;
|
|
183
183
|
/**
|
|
184
|
-
* 调用 LLM
|
|
184
|
+
* 调用 LLM 判断两条记忆是否存在语义冲突
|
|
185
185
|
*
|
|
186
186
|
* 使用结构化 JSON 输出(hasConflict + conflictDescription + recommendation + reason),
|
|
187
|
-
*
|
|
187
|
+
* 流式累积 + parseLlmJson + 异常封装委托给 llmJudgeHelper.judgeWithLlm。
|
|
188
188
|
*
|
|
189
|
-
* LLM
|
|
189
|
+
* LLM 失败时抛出 MemoraError(由 detectConflicts 捕获并降级跳过此对)。
|
|
190
190
|
*
|
|
191
191
|
* @param memoryA 记忆 A
|
|
192
192
|
* @param memoryB 记忆 B
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoryAdvisor.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/memoryAdvisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"memoryAdvisor.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/memoryAdvisor.ts"],"names":[],"mappings":"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"}
|