@memtensor/memos-local-openclaw-plugin 0.3.20 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +239 -22
- package/dist/capture/index.d.ts +1 -1
- package/dist/capture/index.d.ts.map +1 -1
- package/dist/capture/index.js +33 -8
- package/dist/capture/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/ingest/providers/anthropic.d.ts.map +1 -1
- package/dist/ingest/providers/anthropic.js +22 -8
- package/dist/ingest/providers/anthropic.js.map +1 -1
- package/dist/ingest/providers/bedrock.d.ts.map +1 -1
- package/dist/ingest/providers/bedrock.js +22 -8
- package/dist/ingest/providers/bedrock.js.map +1 -1
- package/dist/ingest/providers/gemini.d.ts.map +1 -1
- package/dist/ingest/providers/gemini.js +22 -8
- package/dist/ingest/providers/gemini.js.map +1 -1
- package/dist/ingest/providers/index.d.ts +13 -18
- package/dist/ingest/providers/index.d.ts.map +1 -1
- package/dist/ingest/providers/index.js +213 -139
- package/dist/ingest/providers/index.js.map +1 -1
- package/dist/ingest/providers/openai.d.ts +1 -1
- package/dist/ingest/providers/openai.d.ts.map +1 -1
- package/dist/ingest/providers/openai.js +37 -17
- package/dist/ingest/providers/openai.js.map +1 -1
- package/dist/ingest/task-processor.d.ts +28 -3
- package/dist/ingest/task-processor.d.ts.map +1 -1
- package/dist/ingest/task-processor.js +166 -67
- package/dist/ingest/task-processor.js.map +1 -1
- package/dist/ingest/worker.d.ts.map +1 -1
- package/dist/ingest/worker.js +97 -75
- package/dist/ingest/worker.js.map +1 -1
- package/dist/shared/llm-call.d.ts +26 -0
- package/dist/shared/llm-call.d.ts.map +1 -0
- package/dist/shared/llm-call.js +163 -0
- package/dist/shared/llm-call.js.map +1 -0
- package/dist/skill/evaluator.d.ts +0 -3
- package/dist/skill/evaluator.d.ts.map +1 -1
- package/dist/skill/evaluator.js +34 -59
- package/dist/skill/evaluator.js.map +1 -1
- package/dist/skill/evolver.d.ts +22 -1
- package/dist/skill/evolver.d.ts.map +1 -1
- package/dist/skill/evolver.js +191 -32
- package/dist/skill/evolver.js.map +1 -1
- package/dist/skill/generator.d.ts +0 -3
- package/dist/skill/generator.d.ts.map +1 -1
- package/dist/skill/generator.js +15 -50
- package/dist/skill/generator.js.map +1 -1
- package/dist/skill/upgrader.d.ts +0 -2
- package/dist/skill/upgrader.d.ts.map +1 -1
- package/dist/skill/upgrader.js +4 -39
- package/dist/skill/upgrader.js.map +1 -1
- package/dist/skill/validator.d.ts +0 -2
- package/dist/skill/validator.d.ts.map +1 -1
- package/dist/skill/validator.js +14 -44
- package/dist/skill/validator.js.map +1 -1
- package/dist/storage/sqlite.d.ts +13 -2
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +92 -15
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/tools/memory-get.d.ts.map +1 -1
- package/dist/tools/memory-get.js +5 -1
- package/dist/tools/memory-get.js.map +1 -1
- package/dist/tools/memory-search.d.ts.map +1 -1
- package/dist/tools/memory-search.js +5 -0
- package/dist/tools/memory-search.js.map +1 -1
- package/dist/tools/memory-timeline.d.ts.map +1 -1
- package/dist/tools/memory-timeline.js +11 -2
- package/dist/tools/memory-timeline.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/viewer/html.d.ts +1 -1
- package/dist/viewer/html.d.ts.map +1 -1
- package/dist/viewer/html.js +380 -26
- package/dist/viewer/html.js.map +1 -1
- package/dist/viewer/server.d.ts +9 -0
- package/dist/viewer/server.d.ts.map +1 -1
- package/dist/viewer/server.js +549 -184
- package/dist/viewer/server.js.map +1 -1
- package/index.ts +9 -3
- package/package.json +2 -1
- package/src/capture/index.ts +39 -10
- package/src/index.ts +3 -2
- package/src/ingest/providers/anthropic.ts +22 -8
- package/src/ingest/providers/bedrock.ts +22 -8
- package/src/ingest/providers/gemini.ts +22 -8
- package/src/ingest/providers/index.ts +192 -142
- package/src/ingest/providers/openai.ts +37 -17
- package/src/ingest/task-processor.ts +183 -65
- package/src/ingest/worker.ts +98 -77
- package/src/shared/llm-call.ts +144 -0
- package/src/skill/evaluator.ts +35 -64
- package/src/skill/evolver.ts +201 -33
- package/src/skill/generator.ts +16 -59
- package/src/skill/upgrader.ts +5 -43
- package/src/skill/validator.ts +15 -47
- package/src/storage/sqlite.ts +107 -15
- package/src/tools/memory-get.ts +6 -1
- package/src/tools/memory-search.ts +6 -0
- package/src/tools/memory-timeline.ts +13 -1
- package/src/types.ts +2 -1
- package/src/viewer/html.ts +380 -26
- package/src/viewer/server.ts +535 -197
|
@@ -1,179 +1,253 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.Summarizer = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
4
39
|
const openai_1 = require("./openai");
|
|
5
40
|
const anthropic_1 = require("./anthropic");
|
|
6
41
|
const gemini_1 = require("./gemini");
|
|
7
42
|
const bedrock_1 = require("./bedrock");
|
|
43
|
+
/**
|
|
44
|
+
* Build a SummarizerConfig from OpenClaw's native model configuration (openclaw.json).
|
|
45
|
+
* This serves as the final fallback when both strongCfg and plugin summarizer fail or are absent.
|
|
46
|
+
*/
|
|
47
|
+
function loadOpenClawFallbackConfig(log) {
|
|
48
|
+
try {
|
|
49
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
50
|
+
const cfgPath = path.join(home, ".openclaw", "openclaw.json");
|
|
51
|
+
if (!fs.existsSync(cfgPath))
|
|
52
|
+
return undefined;
|
|
53
|
+
const raw = JSON.parse(fs.readFileSync(cfgPath, "utf-8"));
|
|
54
|
+
const agentModel = raw?.agents?.defaults?.model?.primary;
|
|
55
|
+
if (!agentModel)
|
|
56
|
+
return undefined;
|
|
57
|
+
const [providerKey, modelId] = agentModel.includes("/")
|
|
58
|
+
? agentModel.split("/", 2)
|
|
59
|
+
: [undefined, agentModel];
|
|
60
|
+
const providerCfg = providerKey
|
|
61
|
+
? raw?.models?.providers?.[providerKey]
|
|
62
|
+
: Object.values(raw?.models?.providers ?? {})[0];
|
|
63
|
+
if (!providerCfg)
|
|
64
|
+
return undefined;
|
|
65
|
+
const baseUrl = providerCfg.baseUrl;
|
|
66
|
+
const apiKey = providerCfg.apiKey;
|
|
67
|
+
if (!baseUrl || !apiKey)
|
|
68
|
+
return undefined;
|
|
69
|
+
const endpoint = baseUrl.endsWith("/chat/completions")
|
|
70
|
+
? baseUrl
|
|
71
|
+
: baseUrl.replace(/\/+$/, "") + "/chat/completions";
|
|
72
|
+
log.debug(`OpenClaw fallback model: ${modelId} via ${baseUrl}`);
|
|
73
|
+
return {
|
|
74
|
+
provider: "openai_compatible",
|
|
75
|
+
endpoint,
|
|
76
|
+
apiKey,
|
|
77
|
+
model: modelId,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
log.debug(`Failed to load OpenClaw fallback config: ${err}`);
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
8
85
|
class Summarizer {
|
|
9
86
|
cfg;
|
|
10
87
|
log;
|
|
11
|
-
|
|
88
|
+
strongCfg;
|
|
89
|
+
fallbackCfg;
|
|
90
|
+
constructor(cfg, log, strongCfg) {
|
|
12
91
|
this.cfg = cfg;
|
|
13
92
|
this.log = log;
|
|
93
|
+
this.strongCfg = strongCfg;
|
|
94
|
+
this.fallbackCfg = loadOpenClawFallbackConfig(log);
|
|
14
95
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Ordered config chain: strongCfg → cfg → fallbackCfg (OpenClaw native model).
|
|
98
|
+
* Returns configs that are defined, in priority order.
|
|
99
|
+
*/
|
|
100
|
+
getConfigChain() {
|
|
101
|
+
const chain = [];
|
|
102
|
+
if (this.strongCfg)
|
|
103
|
+
chain.push(this.strongCfg);
|
|
104
|
+
if (this.cfg)
|
|
105
|
+
chain.push(this.cfg);
|
|
106
|
+
if (this.fallbackCfg)
|
|
107
|
+
chain.push(this.fallbackCfg);
|
|
108
|
+
return chain;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Try calling fn with each config in the chain until one succeeds.
|
|
112
|
+
* Returns undefined if all fail.
|
|
113
|
+
*/
|
|
114
|
+
async tryChain(label, fn) {
|
|
115
|
+
const chain = this.getConfigChain();
|
|
116
|
+
for (let i = 0; i < chain.length; i++) {
|
|
117
|
+
try {
|
|
118
|
+
return await fn(chain[i]);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
const level = i < chain.length - 1 ? "warn" : "error";
|
|
122
|
+
const modelInfo = `${chain[i].provider}/${chain[i].model ?? "?"}`;
|
|
123
|
+
this.log[level](`${label} failed (${modelInfo}), ${i < chain.length - 1 ? "trying next" : "no more fallbacks"}: ${err}`);
|
|
124
|
+
}
|
|
21
125
|
}
|
|
22
|
-
|
|
23
|
-
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
async summarize(text) {
|
|
129
|
+
if (!this.cfg && !this.fallbackCfg) {
|
|
24
130
|
return ruleFallback(text);
|
|
25
131
|
}
|
|
132
|
+
const result = await this.tryChain("summarize", (cfg) => callSummarize(cfg, text, this.log));
|
|
133
|
+
return result ?? ruleFallback(text);
|
|
26
134
|
}
|
|
27
135
|
async summarizeTask(text) {
|
|
28
|
-
if (!this.cfg) {
|
|
29
|
-
return taskFallback(text);
|
|
30
|
-
}
|
|
31
|
-
try {
|
|
32
|
-
return await this.callTaskProvider(text);
|
|
33
|
-
}
|
|
34
|
-
catch (err) {
|
|
35
|
-
this.log.warn(`Task summarizer failed, using fallback: ${err}`);
|
|
136
|
+
if (!this.cfg && !this.fallbackCfg) {
|
|
36
137
|
return taskFallback(text);
|
|
37
138
|
}
|
|
139
|
+
const result = await this.tryChain("summarizeTask", (cfg) => callSummarizeTask(cfg, text, this.log));
|
|
140
|
+
return result ?? taskFallback(text);
|
|
38
141
|
}
|
|
39
|
-
async callProvider(text) {
|
|
40
|
-
const cfg = this.cfg;
|
|
41
|
-
switch (cfg.provider) {
|
|
42
|
-
case "openai":
|
|
43
|
-
case "openai_compatible":
|
|
44
|
-
return (0, openai_1.summarizeOpenAI)(text, cfg, this.log);
|
|
45
|
-
case "anthropic":
|
|
46
|
-
return (0, anthropic_1.summarizeAnthropic)(text, cfg, this.log);
|
|
47
|
-
case "gemini":
|
|
48
|
-
return (0, gemini_1.summarizeGemini)(text, cfg, this.log);
|
|
49
|
-
case "azure_openai":
|
|
50
|
-
return (0, openai_1.summarizeOpenAI)(text, cfg, this.log);
|
|
51
|
-
case "bedrock":
|
|
52
|
-
return (0, bedrock_1.summarizeBedrock)(text, cfg, this.log);
|
|
53
|
-
default:
|
|
54
|
-
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Ask the LLM whether the new message starts a different topic from the current conversation.
|
|
59
|
-
* Returns true if it's a new topic, false if it continues the current one.
|
|
60
|
-
* Returns null if no summarizer is configured (caller should fall back to heuristic).
|
|
61
|
-
*/
|
|
62
142
|
async judgeNewTopic(currentContext, newMessage) {
|
|
63
|
-
if (!this.cfg)
|
|
64
|
-
return null;
|
|
65
|
-
try {
|
|
66
|
-
return await this.callTopicJudge(currentContext, newMessage);
|
|
67
|
-
}
|
|
68
|
-
catch (err) {
|
|
69
|
-
this.log.warn(`Topic judge failed: ${err}`);
|
|
143
|
+
if (!this.cfg && !this.fallbackCfg)
|
|
70
144
|
return null;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
async callTopicJudge(currentContext, newMessage) {
|
|
74
|
-
const cfg = this.cfg;
|
|
75
|
-
switch (cfg.provider) {
|
|
76
|
-
case "openai":
|
|
77
|
-
case "openai_compatible":
|
|
78
|
-
case "azure_openai":
|
|
79
|
-
return (0, openai_1.judgeNewTopicOpenAI)(currentContext, newMessage, cfg, this.log);
|
|
80
|
-
case "anthropic":
|
|
81
|
-
return (0, anthropic_1.judgeNewTopicAnthropic)(currentContext, newMessage, cfg, this.log);
|
|
82
|
-
case "gemini":
|
|
83
|
-
return (0, gemini_1.judgeNewTopicGemini)(currentContext, newMessage, cfg, this.log);
|
|
84
|
-
case "bedrock":
|
|
85
|
-
return (0, bedrock_1.judgeNewTopicBedrock)(currentContext, newMessage, cfg, this.log);
|
|
86
|
-
default:
|
|
87
|
-
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
88
|
-
}
|
|
145
|
+
const result = await this.tryChain("judgeNewTopic", (cfg) => callTopicJudge(cfg, currentContext, newMessage, this.log));
|
|
146
|
+
return result ?? null;
|
|
89
147
|
}
|
|
90
|
-
/**
|
|
91
|
-
* Filter search results by LLM relevance judgment.
|
|
92
|
-
* Returns { relevant: number[], sufficient: boolean } or null if no summarizer configured.
|
|
93
|
-
*/
|
|
94
148
|
async filterRelevant(query, candidates) {
|
|
95
|
-
if (!this.cfg)
|
|
149
|
+
if (!this.cfg && !this.fallbackCfg)
|
|
96
150
|
return null;
|
|
97
151
|
if (candidates.length === 0)
|
|
98
152
|
return { relevant: [], sufficient: true };
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
catch (err) {
|
|
103
|
-
this.log.warn(`filterRelevant failed, returning all candidates: ${err}`);
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
153
|
+
const result = await this.tryChain("filterRelevant", (cfg) => callFilterRelevant(cfg, query, candidates, this.log));
|
|
154
|
+
return result ?? null;
|
|
106
155
|
}
|
|
107
|
-
async callFilterRelevant(query, candidates) {
|
|
108
|
-
const cfg = this.cfg;
|
|
109
|
-
switch (cfg.provider) {
|
|
110
|
-
case "openai":
|
|
111
|
-
case "openai_compatible":
|
|
112
|
-
case "azure_openai":
|
|
113
|
-
return (0, openai_1.filterRelevantOpenAI)(query, candidates, cfg, this.log);
|
|
114
|
-
case "anthropic":
|
|
115
|
-
return (0, anthropic_1.filterRelevantAnthropic)(query, candidates, cfg, this.log);
|
|
116
|
-
case "gemini":
|
|
117
|
-
return (0, gemini_1.filterRelevantGemini)(query, candidates, cfg, this.log);
|
|
118
|
-
case "bedrock":
|
|
119
|
-
return (0, bedrock_1.filterRelevantBedrock)(query, candidates, cfg, this.log);
|
|
120
|
-
default:
|
|
121
|
-
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Judge whether a new memory is DUPLICATE / UPDATE / NEW relative to similar existing memories.
|
|
126
|
-
* Returns null if no summarizer configured (caller should treat as NEW).
|
|
127
|
-
*/
|
|
128
156
|
async judgeDedup(newSummary, candidates) {
|
|
129
|
-
if (!this.cfg)
|
|
157
|
+
if (!this.cfg && !this.fallbackCfg)
|
|
130
158
|
return null;
|
|
131
159
|
if (candidates.length === 0)
|
|
132
160
|
return null;
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
catch (err) {
|
|
137
|
-
this.log.warn(`judgeDedup failed, treating as NEW: ${err}`);
|
|
138
|
-
return { action: "NEW", reason: "llm_error" };
|
|
139
|
-
}
|
|
161
|
+
const result = await this.tryChain("judgeDedup", (cfg) => callJudgeDedup(cfg, newSummary, candidates, this.log));
|
|
162
|
+
return result ?? { action: "NEW", reason: "all_models_failed" };
|
|
140
163
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
switch (cfg.provider) {
|
|
144
|
-
case "openai":
|
|
145
|
-
case "openai_compatible":
|
|
146
|
-
case "azure_openai":
|
|
147
|
-
return (0, openai_1.judgeDedupOpenAI)(newSummary, candidates, cfg, this.log);
|
|
148
|
-
case "anthropic":
|
|
149
|
-
return (0, anthropic_1.judgeDedupAnthropic)(newSummary, candidates, cfg, this.log);
|
|
150
|
-
case "gemini":
|
|
151
|
-
return (0, gemini_1.judgeDedupGemini)(newSummary, candidates, cfg, this.log);
|
|
152
|
-
case "bedrock":
|
|
153
|
-
return (0, bedrock_1.judgeDedupBedrock)(newSummary, candidates, cfg, this.log);
|
|
154
|
-
default:
|
|
155
|
-
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
async callTaskProvider(text) {
|
|
159
|
-
const cfg = this.cfg;
|
|
160
|
-
switch (cfg.provider) {
|
|
161
|
-
case "openai":
|
|
162
|
-
case "openai_compatible":
|
|
163
|
-
case "azure_openai":
|
|
164
|
-
return (0, openai_1.summarizeTaskOpenAI)(text, cfg, this.log);
|
|
165
|
-
case "anthropic":
|
|
166
|
-
return (0, anthropic_1.summarizeTaskAnthropic)(text, cfg, this.log);
|
|
167
|
-
case "gemini":
|
|
168
|
-
return (0, gemini_1.summarizeTaskGemini)(text, cfg, this.log);
|
|
169
|
-
case "bedrock":
|
|
170
|
-
return (0, bedrock_1.summarizeTaskBedrock)(text, cfg, this.log);
|
|
171
|
-
default:
|
|
172
|
-
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
173
|
-
}
|
|
164
|
+
getStrongConfig() {
|
|
165
|
+
return this.strongCfg;
|
|
174
166
|
}
|
|
175
167
|
}
|
|
176
168
|
exports.Summarizer = Summarizer;
|
|
169
|
+
// ─── Dispatch helpers ───
|
|
170
|
+
function callSummarize(cfg, text, log) {
|
|
171
|
+
switch (cfg.provider) {
|
|
172
|
+
case "openai":
|
|
173
|
+
case "openai_compatible":
|
|
174
|
+
case "azure_openai":
|
|
175
|
+
return (0, openai_1.summarizeOpenAI)(text, cfg, log);
|
|
176
|
+
case "anthropic":
|
|
177
|
+
return (0, anthropic_1.summarizeAnthropic)(text, cfg, log);
|
|
178
|
+
case "gemini":
|
|
179
|
+
return (0, gemini_1.summarizeGemini)(text, cfg, log);
|
|
180
|
+
case "bedrock":
|
|
181
|
+
return (0, bedrock_1.summarizeBedrock)(text, cfg, log);
|
|
182
|
+
default:
|
|
183
|
+
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function callSummarizeTask(cfg, text, log) {
|
|
187
|
+
switch (cfg.provider) {
|
|
188
|
+
case "openai":
|
|
189
|
+
case "openai_compatible":
|
|
190
|
+
case "azure_openai":
|
|
191
|
+
return (0, openai_1.summarizeTaskOpenAI)(text, cfg, log);
|
|
192
|
+
case "anthropic":
|
|
193
|
+
return (0, anthropic_1.summarizeTaskAnthropic)(text, cfg, log);
|
|
194
|
+
case "gemini":
|
|
195
|
+
return (0, gemini_1.summarizeTaskGemini)(text, cfg, log);
|
|
196
|
+
case "bedrock":
|
|
197
|
+
return (0, bedrock_1.summarizeTaskBedrock)(text, cfg, log);
|
|
198
|
+
default:
|
|
199
|
+
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function callTopicJudge(cfg, currentContext, newMessage, log) {
|
|
203
|
+
switch (cfg.provider) {
|
|
204
|
+
case "openai":
|
|
205
|
+
case "openai_compatible":
|
|
206
|
+
case "azure_openai":
|
|
207
|
+
return (0, openai_1.judgeNewTopicOpenAI)(currentContext, newMessage, cfg, log);
|
|
208
|
+
case "anthropic":
|
|
209
|
+
return (0, anthropic_1.judgeNewTopicAnthropic)(currentContext, newMessage, cfg, log);
|
|
210
|
+
case "gemini":
|
|
211
|
+
return (0, gemini_1.judgeNewTopicGemini)(currentContext, newMessage, cfg, log);
|
|
212
|
+
case "bedrock":
|
|
213
|
+
return (0, bedrock_1.judgeNewTopicBedrock)(currentContext, newMessage, cfg, log);
|
|
214
|
+
default:
|
|
215
|
+
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function callFilterRelevant(cfg, query, candidates, log) {
|
|
219
|
+
switch (cfg.provider) {
|
|
220
|
+
case "openai":
|
|
221
|
+
case "openai_compatible":
|
|
222
|
+
case "azure_openai":
|
|
223
|
+
return (0, openai_1.filterRelevantOpenAI)(query, candidates, cfg, log);
|
|
224
|
+
case "anthropic":
|
|
225
|
+
return (0, anthropic_1.filterRelevantAnthropic)(query, candidates, cfg, log);
|
|
226
|
+
case "gemini":
|
|
227
|
+
return (0, gemini_1.filterRelevantGemini)(query, candidates, cfg, log);
|
|
228
|
+
case "bedrock":
|
|
229
|
+
return (0, bedrock_1.filterRelevantBedrock)(query, candidates, cfg, log);
|
|
230
|
+
default:
|
|
231
|
+
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function callJudgeDedup(cfg, newSummary, candidates, log) {
|
|
235
|
+
switch (cfg.provider) {
|
|
236
|
+
case "openai":
|
|
237
|
+
case "openai_compatible":
|
|
238
|
+
case "azure_openai":
|
|
239
|
+
return (0, openai_1.judgeDedupOpenAI)(newSummary, candidates, cfg, log);
|
|
240
|
+
case "anthropic":
|
|
241
|
+
return (0, anthropic_1.judgeDedupAnthropic)(newSummary, candidates, cfg, log);
|
|
242
|
+
case "gemini":
|
|
243
|
+
return (0, gemini_1.judgeDedupGemini)(newSummary, candidates, cfg, log);
|
|
244
|
+
case "bedrock":
|
|
245
|
+
return (0, bedrock_1.judgeDedupBedrock)(newSummary, candidates, cfg, log);
|
|
246
|
+
default:
|
|
247
|
+
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// ─── Fallbacks ───
|
|
177
251
|
function taskFallback(text) {
|
|
178
252
|
const lines = text.split("\n").filter((l) => l.trim().length > 10);
|
|
179
253
|
return lines.slice(0, 30).join("\n").slice(0, 2000);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ingest/providers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ingest/providers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ export declare function filterRelevantOpenAI(query: string, candidates: Array<{
|
|
|
11
11
|
summary: string;
|
|
12
12
|
role: string;
|
|
13
13
|
}>, cfg: SummarizerConfig, log: Logger): Promise<FilterResult>;
|
|
14
|
-
export declare const DEDUP_JUDGE_PROMPT = "You are a memory deduplication system.
|
|
14
|
+
export declare const DEDUP_JUDGE_PROMPT = "You are a memory deduplication system.\n\nLANGUAGE RULE (MUST FOLLOW): You MUST reply in the SAME language as the input memories. \u5982\u679C\u8F93\u5165\u662F\u4E2D\u6587\uFF0Creason \u548C mergedSummary \u5FC5\u987B\u7528\u4E2D\u6587\u3002If input is English, reply in English. This applies to ALL text fields in your JSON output.\n\nGiven a NEW memory summary and several EXISTING memory summaries, determine the relationship.\n\nFor each EXISTING memory, the NEW memory is either:\n- \"DUPLICATE\": NEW conveys the same intent/meaning as an EXISTING memory, even if worded differently. Examples: \"\u8BF7\u544A\u8BC9\u6211\u4F60\u7684\u540D\u5B57\" vs \"\u4F60\u5E0C\u671B\u6211\u600E\u4E48\u79F0\u547C\u4F60\"; \"\u65B0\u4F1A\u8BDD\u5DF2\u5F00\u59CB\" vs \"New session started\"; greetings with minor variations. If the core information/intent is the same, it IS a duplicate.\n- \"UPDATE\": NEW contains meaningful additional information that supplements an EXISTING memory (new data, status change, concrete detail not present before)\n- \"NEW\": NEW covers a genuinely different topic/event with no semantic overlap\n\nIMPORTANT: Lean toward DUPLICATE when memories share the same intent, topic, or factual content. Only choose NEW when the topics are truly unrelated. Repetitive conversational patterns (greetings, session starts, identity questions, capability descriptions) across different sessions should be treated as DUPLICATE.\n\nPick the BEST match among all candidates. If none match well, choose \"NEW\".\n\nOutput a single JSON object (reason and mergedSummary MUST match input language):\n- If DUPLICATE: {\"action\":\"DUPLICATE\",\"targetIndex\":2,\"reason\":\"\u4E0E\u5DF2\u6709\u8BB0\u5FC6\u610F\u56FE\u76F8\u540C\"}\n- If UPDATE: {\"action\":\"UPDATE\",\"targetIndex\":3,\"reason\":\"\u65B0\u8BB0\u5FC6\u8865\u5145\u4E86\u989D\u5916\u7EC6\u8282\",\"mergedSummary\":\"\u5408\u5E76\u540E\u7684\u5B8C\u6574\u6458\u8981\uFF0C\u4FDD\u7559\u65B0\u65E7\u6240\u6709\u4FE1\u606F\"}\n- If NEW: {\"action\":\"NEW\",\"reason\":\"\u4E0D\u540C\u4E3B\u9898\uFF0C\u65E0\u5173\u8054\"}\n\nOutput ONLY the JSON object, no other text.";
|
|
15
15
|
export interface DedupResult {
|
|
16
16
|
action: "DUPLICATE" | "UPDATE" | "NEW";
|
|
17
17
|
targetIndex?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ingest/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAyC5D,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAgCjB;
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ingest/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAyC5D,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAgCjB;AA6BD,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC,CAmClB;AAwBD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACnE,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,YAAY,CAAC,CAoCvB;AAqBD,eAAO,MAAM,kBAAkB,imEAoBa,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,KAAK,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EACtE,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,WAAW,CAAC,CAoCtB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAiBtE"}
|
|
@@ -101,16 +101,30 @@ async function summarizeOpenAI(text, cfg, log) {
|
|
|
101
101
|
const json = (await resp.json());
|
|
102
102
|
return json.choices[0]?.message?.content?.trim() ?? "";
|
|
103
103
|
}
|
|
104
|
-
const TOPIC_JUDGE_PROMPT = `You are a conversation topic boundary detector. Given
|
|
104
|
+
const TOPIC_JUDGE_PROMPT = `You are a conversation topic boundary detector. Given the CURRENT task context (may include opening topic + recent exchanges) and a single NEW user message, decide if the new message belongs to the SAME task or starts a NEW one.
|
|
105
105
|
|
|
106
106
|
Answer ONLY "NEW" or "SAME".
|
|
107
107
|
|
|
108
|
-
|
|
109
|
-
-
|
|
110
|
-
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
113
|
-
-
|
|
108
|
+
SAME — the new message:
|
|
109
|
+
- Continues, follows up on, refines, or corrects the same subject/project/task
|
|
110
|
+
- Asks a clarification or next-step question about what was just discussed
|
|
111
|
+
- Reports a result, error, or feedback about the current task
|
|
112
|
+
- Discusses different tools, methods, or approaches for the SAME goal (e.g., learning English via BBC → via ChatGPT → via AI tools = all SAME "learning English" task)
|
|
113
|
+
- Mentions a related technology or platform in the context of the current goal
|
|
114
|
+
- Is a short acknowledgment (ok, thanks, 好的, 嗯) in direct response to the current flow
|
|
115
|
+
|
|
116
|
+
NEW — the new message:
|
|
117
|
+
- Introduces a clearly UNRELATED subject with NO logical connection to the current task
|
|
118
|
+
- The topic has ZERO overlap with any aspect of the current conversation (e.g., from "learning English" to "what's the weather tomorrow")
|
|
119
|
+
- Starts a request about a completely different domain or life area
|
|
120
|
+
- Begins with a new greeting/reset followed by a different topic
|
|
121
|
+
|
|
122
|
+
Key principles:
|
|
123
|
+
- STRONGLY lean toward SAME — only mark NEW for obvious, unambiguous topic shifts
|
|
124
|
+
- Different aspects, tools, or methods related to the same overall goal are SAME
|
|
125
|
+
- If the new message could reasonably be interpreted as part of the ongoing discussion, choose SAME
|
|
126
|
+
- Only choose NEW when there is absolutely no thematic connection to the current task
|
|
127
|
+
- Examples: "学英语" → "用AI工具学英语" = SAME; "学英语" → "明天天气" = NEW
|
|
114
128
|
|
|
115
129
|
Output exactly one word: NEW or SAME`;
|
|
116
130
|
async function judgeNewTopicOpenAI(currentContext, newMessage, cfg, log) {
|
|
@@ -121,7 +135,7 @@ async function judgeNewTopicOpenAI(currentContext, newMessage, cfg, log) {
|
|
|
121
135
|
Authorization: `Bearer ${cfg.apiKey}`,
|
|
122
136
|
...cfg.headers,
|
|
123
137
|
};
|
|
124
|
-
const userContent = `CURRENT
|
|
138
|
+
const userContent = `CURRENT TASK CONTEXT:\n${currentContext}\n\n---\n\nNEW USER MESSAGE:\n${newMessage}`;
|
|
125
139
|
const resp = await fetch(endpoint, {
|
|
126
140
|
method: "POST",
|
|
127
141
|
headers,
|
|
@@ -217,21 +231,27 @@ function parseFilterResult(raw, log) {
|
|
|
217
231
|
return { relevant: [], sufficient: false };
|
|
218
232
|
}
|
|
219
233
|
// ─── Smart Dedup: judge whether new memory is DUPLICATE / UPDATE / NEW ───
|
|
220
|
-
exports.DEDUP_JUDGE_PROMPT = `You are a memory deduplication system.
|
|
234
|
+
exports.DEDUP_JUDGE_PROMPT = `You are a memory deduplication system.
|
|
235
|
+
|
|
236
|
+
LANGUAGE RULE (MUST FOLLOW): You MUST reply in the SAME language as the input memories. 如果输入是中文,reason 和 mergedSummary 必须用中文。If input is English, reply in English. This applies to ALL text fields in your JSON output.
|
|
237
|
+
|
|
238
|
+
Given a NEW memory summary and several EXISTING memory summaries, determine the relationship.
|
|
221
239
|
|
|
222
240
|
For each EXISTING memory, the NEW memory is either:
|
|
223
|
-
- "DUPLICATE": NEW
|
|
224
|
-
- "UPDATE": NEW contains information that supplements
|
|
225
|
-
- "NEW": NEW
|
|
241
|
+
- "DUPLICATE": NEW conveys the same intent/meaning as an EXISTING memory, even if worded differently. Examples: "请告诉我你的名字" vs "你希望我怎么称呼你"; "新会话已开始" vs "New session started"; greetings with minor variations. If the core information/intent is the same, it IS a duplicate.
|
|
242
|
+
- "UPDATE": NEW contains meaningful additional information that supplements an EXISTING memory (new data, status change, concrete detail not present before)
|
|
243
|
+
- "NEW": NEW covers a genuinely different topic/event with no semantic overlap
|
|
244
|
+
|
|
245
|
+
IMPORTANT: Lean toward DUPLICATE when memories share the same intent, topic, or factual content. Only choose NEW when the topics are truly unrelated. Repetitive conversational patterns (greetings, session starts, identity questions, capability descriptions) across different sessions should be treated as DUPLICATE.
|
|
226
246
|
|
|
227
247
|
Pick the BEST match among all candidates. If none match well, choose "NEW".
|
|
228
248
|
|
|
229
|
-
Output a single JSON object:
|
|
230
|
-
- If DUPLICATE: {"action":"DUPLICATE","targetIndex":2,"reason":"
|
|
231
|
-
- If UPDATE: {"action":"UPDATE","targetIndex":3,"reason":"
|
|
232
|
-
- If NEW: {"action":"NEW","reason":"
|
|
249
|
+
Output a single JSON object (reason and mergedSummary MUST match input language):
|
|
250
|
+
- If DUPLICATE: {"action":"DUPLICATE","targetIndex":2,"reason":"与已有记忆意图相同"}
|
|
251
|
+
- If UPDATE: {"action":"UPDATE","targetIndex":3,"reason":"新记忆补充了额外细节","mergedSummary":"合并后的完整摘要,保留新旧所有信息"}
|
|
252
|
+
- If NEW: {"action":"NEW","reason":"不同主题,无关联"}
|
|
233
253
|
|
|
234
|
-
|
|
254
|
+
Output ONLY the JSON object, no other text.`;
|
|
235
255
|
async function judgeDedupOpenAI(newSummary, candidates, cfg, log) {
|
|
236
256
|
const endpoint = normalizeChatEndpoint(cfg.endpoint ?? "https://api.openai.com/v1/chat/completions");
|
|
237
257
|
const model = cfg.model ?? "gpt-4o-mini";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/ingest/providers/openai.ts"],"names":[],"mappings":";;;AAyCA,kDAmCC;AAED,0CAoCC;
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/ingest/providers/openai.ts"],"names":[],"mappings":"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"}
|