@memtensor/memos-local-openclaw-plugin 1.0.2-beta.5 → 1.0.2
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/capture/index.js +52 -8
- package/dist/capture/index.js.map +1 -1
- package/dist/ingest/chunker.d.ts +3 -4
- package/dist/ingest/chunker.d.ts.map +1 -1
- package/dist/ingest/chunker.js +19 -24
- package/dist/ingest/chunker.js.map +1 -1
- package/dist/ingest/providers/anthropic.d.ts +3 -1
- package/dist/ingest/providers/anthropic.d.ts.map +1 -1
- package/dist/ingest/providers/anthropic.js +79 -39
- package/dist/ingest/providers/anthropic.js.map +1 -1
- package/dist/ingest/providers/bedrock.d.ts +3 -1
- package/dist/ingest/providers/bedrock.d.ts.map +1 -1
- package/dist/ingest/providers/bedrock.js +79 -39
- package/dist/ingest/providers/bedrock.js.map +1 -1
- package/dist/ingest/providers/gemini.d.ts +3 -1
- package/dist/ingest/providers/gemini.d.ts.map +1 -1
- package/dist/ingest/providers/gemini.js +77 -39
- package/dist/ingest/providers/gemini.js.map +1 -1
- package/dist/ingest/providers/index.d.ts +3 -1
- package/dist/ingest/providers/index.d.ts.map +1 -1
- package/dist/ingest/providers/index.js +70 -30
- package/dist/ingest/providers/index.js.map +1 -1
- package/dist/ingest/providers/openai.d.ts +3 -1
- package/dist/ingest/providers/openai.d.ts.map +1 -1
- package/dist/ingest/providers/openai.js +80 -39
- package/dist/ingest/providers/openai.js.map +1 -1
- package/dist/ingest/task-processor.d.ts +1 -0
- package/dist/ingest/task-processor.d.ts.map +1 -1
- package/dist/ingest/task-processor.js +33 -9
- package/dist/ingest/task-processor.js.map +1 -1
- package/dist/ingest/worker.d.ts.map +1 -1
- package/dist/ingest/worker.js +29 -13
- package/dist/ingest/worker.js.map +1 -1
- package/dist/recall/engine.d.ts.map +1 -1
- package/dist/recall/engine.js +19 -14
- package/dist/recall/engine.js.map +1 -1
- package/dist/skill/bundled-memory-guide.d.ts +1 -5
- package/dist/skill/bundled-memory-guide.d.ts.map +1 -1
- package/dist/skill/bundled-memory-guide.js +38 -97
- package/dist/skill/bundled-memory-guide.js.map +1 -1
- package/dist/skill/evaluator.js +1 -1
- package/dist/storage/sqlite.d.ts +1 -2
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +90 -17
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/tools/memory-get.d.ts.map +1 -1
- package/dist/tools/memory-get.js +1 -3
- package/dist/tools/memory-get.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/update-check.d.ts +21 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +111 -0
- package/dist/update-check.js.map +1 -0
- package/dist/viewer/html.d.ts.map +1 -1
- package/dist/viewer/html.js +444 -182
- package/dist/viewer/html.js.map +1 -1
- package/dist/viewer/server.d.ts +1 -1
- package/dist/viewer/server.d.ts.map +1 -1
- package/dist/viewer/server.js +142 -78
- package/dist/viewer/server.js.map +1 -1
- package/index.ts +206 -198
- package/openclaw.plugin.json +3 -0
- package/package.json +5 -1
- package/scripts/postinstall.cjs +69 -2
- package/skill/memos-memory-guide/SKILL.md +73 -36
- package/src/capture/index.ts +52 -8
- package/src/ingest/chunker.ts +22 -30
- package/src/ingest/providers/anthropic.ts +89 -41
- package/src/ingest/providers/bedrock.ts +90 -41
- package/src/ingest/providers/gemini.ts +89 -41
- package/src/ingest/providers/index.ts +81 -35
- package/src/ingest/providers/openai.ts +90 -41
- package/src/ingest/task-processor.ts +29 -8
- package/src/ingest/worker.ts +31 -13
- package/src/recall/engine.ts +20 -13
- package/src/skill/bundled-memory-guide.ts +5 -96
- package/src/skill/evaluator.ts +1 -1
- package/src/storage/sqlite.ts +93 -21
- package/src/tools/memory-get.ts +1 -4
- package/src/types.ts +2 -9
- package/src/update-check.ts +96 -0
- package/src/viewer/html.ts +444 -182
- package/src/viewer/server.ts +101 -66
|
@@ -1,33 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.summarizeTaskBedrock = summarizeTaskBedrock;
|
|
4
|
+
exports.generateTaskTitleBedrock = generateTaskTitleBedrock;
|
|
4
5
|
exports.judgeNewTopicBedrock = judgeNewTopicBedrock;
|
|
5
6
|
exports.filterRelevantBedrock = filterRelevantBedrock;
|
|
6
7
|
exports.summarizeBedrock = summarizeBedrock;
|
|
7
8
|
exports.judgeDedupBedrock = judgeDedupBedrock;
|
|
8
|
-
const SYSTEM_PROMPT = `You
|
|
9
|
+
const SYSTEM_PROMPT = `You generate a retrieval-friendly title.
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
11
|
+
Return exactly one noun phrase that names the topic AND its key details.
|
|
12
|
+
|
|
13
|
+
Requirements:
|
|
14
|
+
- Same language as input
|
|
15
|
+
- Keep proper nouns, API/function names, specific parameters, versions, error codes
|
|
16
|
+
- Include WHO/WHAT/WHERE details when present (e.g. person name + event, tool name + what it does)
|
|
17
|
+
- Prefer concrete topic words over generic words
|
|
18
|
+
- No verbs unless unavoidable
|
|
19
|
+
- No generic endings like:
|
|
20
|
+
功能说明、使用说明、简介、介绍、用途、summary、overview、basics
|
|
21
|
+
- Chinese: 10-50 characters (aim for 15-30)
|
|
22
|
+
- Non-Chinese: 5-15 words (aim for 8-12)
|
|
23
|
+
- Output title only`;
|
|
18
24
|
const TASK_SUMMARY_PROMPT = `You create a DETAILED task summary from a multi-turn conversation. This summary will be the ONLY record of this conversation, so it must preserve ALL important information.
|
|
19
25
|
|
|
20
|
-
|
|
26
|
+
## LANGUAGE RULE (HIGHEST PRIORITY)
|
|
27
|
+
Detect the PRIMARY language of the user's messages. If most user messages are Chinese, ALL output (title, goal, steps, result, details) MUST be in Chinese. If English, output in English. NEVER mix. This rule overrides everything below.
|
|
21
28
|
|
|
22
29
|
Output EXACTLY this structure:
|
|
23
30
|
|
|
24
|
-
📌 Title
|
|
25
|
-
A short, descriptive title (10-30 characters).
|
|
31
|
+
📌 Title / 标题
|
|
32
|
+
A short, descriptive title (10-30 characters). Same language as user messages.
|
|
26
33
|
|
|
27
|
-
🎯 Goal
|
|
34
|
+
🎯 Goal / 目标
|
|
28
35
|
One sentence: what the user wanted to accomplish.
|
|
29
36
|
|
|
30
|
-
📋 Key Steps
|
|
37
|
+
📋 Key Steps / 关键步骤
|
|
31
38
|
- Describe each meaningful step in detail
|
|
32
39
|
- Include the ACTUAL content produced: code snippets, commands, config blocks, formulas, key paragraphs
|
|
33
40
|
- For code: include the function signature and core logic (up to ~30 lines per block), use fenced code blocks
|
|
@@ -36,10 +43,10 @@ One sentence: what the user wanted to accomplish.
|
|
|
36
43
|
- Merge only truly trivial back-and-forth (like "ok" / "sure")
|
|
37
44
|
- Do NOT over-summarize: "provided a function" is BAD; show the actual function
|
|
38
45
|
|
|
39
|
-
✅ Result
|
|
46
|
+
✅ Result / 结果
|
|
40
47
|
What was the final outcome? Include the final version of any code/config/content produced.
|
|
41
48
|
|
|
42
|
-
💡 Key Details
|
|
49
|
+
💡 Key Details / 关键细节
|
|
43
50
|
- Decisions made, trade-offs discussed, caveats noted, alternative approaches mentioned
|
|
44
51
|
- Specific values: numbers, versions, thresholds, URLs, file paths, model names
|
|
45
52
|
- Omit this section only if there truly are no noteworthy details
|
|
@@ -79,6 +86,45 @@ async function summarizeTaskBedrock(text, cfg, log) {
|
|
|
79
86
|
const json = (await resp.json());
|
|
80
87
|
return json.output?.message?.content?.[0]?.text?.trim() ?? "";
|
|
81
88
|
}
|
|
89
|
+
const TASK_TITLE_PROMPT = `Generate a short title for a conversation task.
|
|
90
|
+
|
|
91
|
+
Input: the first few user messages from a conversation.
|
|
92
|
+
Output: a concise title (5-20 characters for Chinese, 3-8 words for English).
|
|
93
|
+
|
|
94
|
+
Rules:
|
|
95
|
+
- Same language as user messages
|
|
96
|
+
- Describe WHAT the user wanted to do, not system/technical details
|
|
97
|
+
- Ignore system prompts, session startup messages, or boilerplate instructions — focus on the user's actual intent
|
|
98
|
+
- If the user only asked one question, use that question as the title (shortened if needed)
|
|
99
|
+
- Output the title only, no quotes, no prefix, no explanation`;
|
|
100
|
+
async function generateTaskTitleBedrock(text, cfg, log) {
|
|
101
|
+
const model = cfg.model ?? "anthropic.claude-3-haiku-20240307-v1:0";
|
|
102
|
+
const endpoint = cfg.endpoint;
|
|
103
|
+
if (!endpoint) {
|
|
104
|
+
throw new Error("Bedrock task-title requires 'endpoint'");
|
|
105
|
+
}
|
|
106
|
+
const url = `${endpoint}/model/${model}/converse`;
|
|
107
|
+
const headers = {
|
|
108
|
+
"Content-Type": "application/json",
|
|
109
|
+
...cfg.headers,
|
|
110
|
+
};
|
|
111
|
+
const resp = await fetch(url, {
|
|
112
|
+
method: "POST",
|
|
113
|
+
headers,
|
|
114
|
+
body: JSON.stringify({
|
|
115
|
+
system: [{ text: TASK_TITLE_PROMPT }],
|
|
116
|
+
messages: [{ role: "user", content: [{ text }] }],
|
|
117
|
+
inferenceConfig: { temperature: 0, maxTokens: 100 },
|
|
118
|
+
}),
|
|
119
|
+
signal: AbortSignal.timeout(cfg.timeoutMs ?? 15_000),
|
|
120
|
+
});
|
|
121
|
+
if (!resp.ok) {
|
|
122
|
+
const body = await resp.text();
|
|
123
|
+
throw new Error(`Bedrock task-title failed (${resp.status}): ${body}`);
|
|
124
|
+
}
|
|
125
|
+
const json = (await resp.json());
|
|
126
|
+
return json.output?.message?.content?.[0]?.text?.trim() ?? "";
|
|
127
|
+
}
|
|
82
128
|
const TOPIC_JUDGE_PROMPT = `You are a conversation topic boundary detector. Given the CURRENT task context and a NEW user message, decide if the new message belongs to the SAME task or starts a NEW one.
|
|
83
129
|
|
|
84
130
|
Answer ONLY "NEW" or "SAME".
|
|
@@ -135,32 +181,23 @@ async function judgeNewTopicBedrock(currentContext, newMessage, cfg, log) {
|
|
|
135
181
|
log.debug(`Topic judge result: "${answer}"`);
|
|
136
182
|
return answer.startsWith("NEW");
|
|
137
183
|
}
|
|
138
|
-
const FILTER_RELEVANT_PROMPT = `You are a
|
|
184
|
+
const FILTER_RELEVANT_PROMPT = `You are a memory relevance judge.
|
|
139
185
|
|
|
140
|
-
|
|
141
|
-
- A candidate is relevant ONLY if it shares the same subject/topic as the query.
|
|
142
|
-
- EXCLUDE candidates about unrelated topics, even if they are from the same user.
|
|
143
|
-
- For list/history questions (e.g. "which companies did I work at"), include all MATCHING items.
|
|
144
|
-
- For factual lookups, a single direct answer is enough.
|
|
145
|
-
- When in doubt, EXCLUDE the candidate. Precision is more important than recall.
|
|
146
|
-
2. Judge whether the selected memories are SUFFICIENT to fully answer the query.
|
|
186
|
+
Given a QUERY and CANDIDATE memories, decide: does each candidate's content contain information that would HELP ANSWER the query?
|
|
147
187
|
|
|
148
|
-
|
|
149
|
-
-
|
|
150
|
-
-
|
|
151
|
-
- Query: "SSH port" → ONLY include candidates mentioning SSH or port configuration.
|
|
188
|
+
CORE QUESTION: "If I include this memory, will it help produce a better answer?"
|
|
189
|
+
- YES → include
|
|
190
|
+
- NO → exclude
|
|
152
191
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
Output a JSON object with exactly two fields:
|
|
158
|
-
{"relevant":[1,3,5],"sufficient":true}
|
|
159
|
-
|
|
160
|
-
- "relevant": array of candidate numbers that are relevant. Empty array [] if none are relevant.
|
|
161
|
-
- "sufficient": true ONLY if the memories contain a direct answer; false otherwise.
|
|
192
|
+
RULES:
|
|
193
|
+
1. A candidate is relevant if its content provides facts, context, or data that directly supports answering the query.
|
|
194
|
+
2. A candidate that merely shares the same broad topic/domain but contains NO useful information for answering is NOT relevant.
|
|
195
|
+
3. If NO candidate can help answer the query, return {"relevant":[],"sufficient":false} — do NOT force-pick the "least irrelevant" one.
|
|
162
196
|
|
|
163
|
-
|
|
197
|
+
OUTPUT — JSON only:
|
|
198
|
+
{"relevant":[1,3],"sufficient":true}
|
|
199
|
+
- "relevant": candidate numbers whose content helps answer the query. [] if none can help.
|
|
200
|
+
- "sufficient": true only if the selected memories fully answer the query.`;
|
|
164
201
|
async function filterRelevantBedrock(query, candidates, cfg, log) {
|
|
165
202
|
const model = cfg.model ?? "anthropic.claude-3-haiku-20240307-v1:0";
|
|
166
203
|
const endpoint = cfg.endpoint;
|
|
@@ -173,7 +210,10 @@ async function filterRelevantBedrock(query, candidates, cfg, log) {
|
|
|
173
210
|
...cfg.headers,
|
|
174
211
|
};
|
|
175
212
|
const candidateText = candidates
|
|
176
|
-
.map((c) =>
|
|
213
|
+
.map((c) => {
|
|
214
|
+
const timeTag = c.time ? ` (${c.time})` : "";
|
|
215
|
+
return `${c.index}. [${c.role}]${timeTag}\n ${c.content}`;
|
|
216
|
+
})
|
|
177
217
|
.join("\n");
|
|
178
218
|
const resp = await fetch(url, {
|
|
179
219
|
method: "POST",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../../src/ingest/providers/bedrock.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../../src/ingest/providers/bedrock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import type { SummarizerConfig, Logger } from "../../types";
|
|
2
2
|
export declare function summarizeTaskGemini(text: string, cfg: SummarizerConfig, log: Logger): Promise<string>;
|
|
3
|
+
export declare function generateTaskTitleGemini(text: string, cfg: SummarizerConfig, log: Logger): Promise<string>;
|
|
3
4
|
export declare function judgeNewTopicGemini(currentContext: string, newMessage: string, cfg: SummarizerConfig, log: Logger): Promise<boolean>;
|
|
4
5
|
import type { FilterResult } from "./openai";
|
|
5
6
|
export type { FilterResult } from "./openai";
|
|
6
7
|
export declare function filterRelevantGemini(query: string, candidates: Array<{
|
|
7
8
|
index: number;
|
|
8
|
-
summary: string;
|
|
9
9
|
role: string;
|
|
10
|
+
content: string;
|
|
11
|
+
time?: string;
|
|
10
12
|
}>, cfg: SummarizerConfig, log: Logger): Promise<FilterResult>;
|
|
11
13
|
export declare function summarizeGemini(text: string, cfg: SummarizerConfig, log: Logger): Promise<string>;
|
|
12
14
|
import type { DedupResult } from "./openai";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/ingest/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/ingest/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAwD5D,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAcD,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CA8BjB;AA4BD,wBAAsB,mBAAmB,CACvC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC,CAkClB;AAoBD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAClF,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,YAAY,CAAC,CAuCvB;AAmBD,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAgCjB;AAKD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,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,CA2BtB"}
|
|
@@ -1,33 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.summarizeTaskGemini = summarizeTaskGemini;
|
|
4
|
+
exports.generateTaskTitleGemini = generateTaskTitleGemini;
|
|
4
5
|
exports.judgeNewTopicGemini = judgeNewTopicGemini;
|
|
5
6
|
exports.filterRelevantGemini = filterRelevantGemini;
|
|
6
7
|
exports.summarizeGemini = summarizeGemini;
|
|
7
8
|
exports.judgeDedupGemini = judgeDedupGemini;
|
|
8
|
-
const SYSTEM_PROMPT = `You
|
|
9
|
+
const SYSTEM_PROMPT = `You generate a retrieval-friendly title.
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
11
|
+
Return exactly one noun phrase that names the topic AND its key details.
|
|
12
|
+
|
|
13
|
+
Requirements:
|
|
14
|
+
- Same language as input
|
|
15
|
+
- Keep proper nouns, API/function names, specific parameters, versions, error codes
|
|
16
|
+
- Include WHO/WHAT/WHERE details when present (e.g. person name + event, tool name + what it does)
|
|
17
|
+
- Prefer concrete topic words over generic words
|
|
18
|
+
- No verbs unless unavoidable
|
|
19
|
+
- No generic endings like:
|
|
20
|
+
功能说明、使用说明、简介、介绍、用途、summary、overview、basics
|
|
21
|
+
- Chinese: 10-50 characters (aim for 15-30)
|
|
22
|
+
- Non-Chinese: 5-15 words (aim for 8-12)
|
|
23
|
+
- Output title only`;
|
|
18
24
|
const TASK_SUMMARY_PROMPT = `You create a DETAILED task summary from a multi-turn conversation. This summary will be the ONLY record of this conversation, so it must preserve ALL important information.
|
|
19
25
|
|
|
20
|
-
|
|
26
|
+
## LANGUAGE RULE (HIGHEST PRIORITY)
|
|
27
|
+
Detect the PRIMARY language of the user's messages. If most user messages are Chinese, ALL output (title, goal, steps, result, details) MUST be in Chinese. If English, output in English. NEVER mix. This rule overrides everything below.
|
|
21
28
|
|
|
22
29
|
Output EXACTLY this structure:
|
|
23
30
|
|
|
24
|
-
📌 Title
|
|
25
|
-
A short, descriptive title (10-30 characters).
|
|
31
|
+
📌 Title / 标题
|
|
32
|
+
A short, descriptive title (10-30 characters). Same language as user messages.
|
|
26
33
|
|
|
27
|
-
🎯 Goal
|
|
34
|
+
🎯 Goal / 目标
|
|
28
35
|
One sentence: what the user wanted to accomplish.
|
|
29
36
|
|
|
30
|
-
📋 Key Steps
|
|
37
|
+
📋 Key Steps / 关键步骤
|
|
31
38
|
- Describe each meaningful step in detail
|
|
32
39
|
- Include the ACTUAL content produced: code snippets, commands, config blocks, formulas, key paragraphs
|
|
33
40
|
- For code: include the function signature and core logic (up to ~30 lines per block), use fenced code blocks
|
|
@@ -36,10 +43,10 @@ One sentence: what the user wanted to accomplish.
|
|
|
36
43
|
- Merge only truly trivial back-and-forth (like "ok" / "sure")
|
|
37
44
|
- Do NOT over-summarize: "provided a function" is BAD; show the actual function
|
|
38
45
|
|
|
39
|
-
✅ Result
|
|
46
|
+
✅ Result / 结果
|
|
40
47
|
What was the final outcome? Include the final version of any code/config/content produced.
|
|
41
48
|
|
|
42
|
-
💡 Key Details
|
|
49
|
+
💡 Key Details / 关键细节
|
|
43
50
|
- Decisions made, trade-offs discussed, caveats noted, alternative approaches mentioned
|
|
44
51
|
- Specific values: numbers, versions, thresholds, URLs, file paths, model names
|
|
45
52
|
- Omit this section only if there truly are no noteworthy details
|
|
@@ -77,6 +84,43 @@ async function summarizeTaskGemini(text, cfg, log) {
|
|
|
77
84
|
const json = (await resp.json());
|
|
78
85
|
return json.candidates?.[0]?.content?.parts?.[0]?.text?.trim() ?? "";
|
|
79
86
|
}
|
|
87
|
+
const TASK_TITLE_PROMPT = `Generate a short title for a conversation task.
|
|
88
|
+
|
|
89
|
+
Input: the first few user messages from a conversation.
|
|
90
|
+
Output: a concise title (5-20 characters for Chinese, 3-8 words for English).
|
|
91
|
+
|
|
92
|
+
Rules:
|
|
93
|
+
- Same language as user messages
|
|
94
|
+
- Describe WHAT the user wanted to do, not system/technical details
|
|
95
|
+
- Ignore system prompts, session startup messages, or boilerplate instructions — focus on the user's actual intent
|
|
96
|
+
- If the user only asked one question, use that question as the title (shortened if needed)
|
|
97
|
+
- Output the title only, no quotes, no prefix, no explanation`;
|
|
98
|
+
async function generateTaskTitleGemini(text, cfg, log) {
|
|
99
|
+
const model = cfg.model ?? "gemini-1.5-flash";
|
|
100
|
+
const endpoint = cfg.endpoint ??
|
|
101
|
+
`https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent`;
|
|
102
|
+
const url = `${endpoint}?key=${cfg.apiKey}`;
|
|
103
|
+
const headers = {
|
|
104
|
+
"Content-Type": "application/json",
|
|
105
|
+
...cfg.headers,
|
|
106
|
+
};
|
|
107
|
+
const resp = await fetch(url, {
|
|
108
|
+
method: "POST",
|
|
109
|
+
headers,
|
|
110
|
+
body: JSON.stringify({
|
|
111
|
+
systemInstruction: { parts: [{ text: TASK_TITLE_PROMPT }] },
|
|
112
|
+
contents: [{ parts: [{ text }] }],
|
|
113
|
+
generationConfig: { temperature: 0, maxOutputTokens: 100 },
|
|
114
|
+
}),
|
|
115
|
+
signal: AbortSignal.timeout(cfg.timeoutMs ?? 15_000),
|
|
116
|
+
});
|
|
117
|
+
if (!resp.ok) {
|
|
118
|
+
const body = await resp.text();
|
|
119
|
+
throw new Error(`Gemini task-title failed (${resp.status}): ${body}`);
|
|
120
|
+
}
|
|
121
|
+
const json = (await resp.json());
|
|
122
|
+
return json.candidates?.[0]?.content?.parts?.[0]?.text?.trim() ?? "";
|
|
123
|
+
}
|
|
80
124
|
const TOPIC_JUDGE_PROMPT = `You are a conversation topic boundary detector. Given the CURRENT task context and a NEW user message, decide if the new message belongs to the SAME task or starts a NEW one.
|
|
81
125
|
|
|
82
126
|
Answer ONLY "NEW" or "SAME".
|
|
@@ -131,32 +175,23 @@ async function judgeNewTopicGemini(currentContext, newMessage, cfg, log) {
|
|
|
131
175
|
log.debug(`Topic judge result: "${answer}"`);
|
|
132
176
|
return answer.startsWith("NEW");
|
|
133
177
|
}
|
|
134
|
-
const FILTER_RELEVANT_PROMPT = `You are a
|
|
178
|
+
const FILTER_RELEVANT_PROMPT = `You are a memory relevance judge.
|
|
135
179
|
|
|
136
|
-
|
|
137
|
-
- A candidate is relevant ONLY if it shares the same subject/topic as the query.
|
|
138
|
-
- EXCLUDE candidates about unrelated topics, even if they are from the same user.
|
|
139
|
-
- For list/history questions (e.g. "which companies did I work at"), include all MATCHING items.
|
|
140
|
-
- For factual lookups, a single direct answer is enough.
|
|
141
|
-
- When in doubt, EXCLUDE the candidate. Precision is more important than recall.
|
|
142
|
-
2. Judge whether the selected memories are SUFFICIENT to fully answer the query.
|
|
180
|
+
Given a QUERY and CANDIDATE memories, decide: does each candidate's content contain information that would HELP ANSWER the query?
|
|
143
181
|
|
|
144
|
-
|
|
145
|
-
-
|
|
146
|
-
-
|
|
147
|
-
- Query: "SSH port" → ONLY include candidates mentioning SSH or port configuration.
|
|
182
|
+
CORE QUESTION: "If I include this memory, will it help produce a better answer?"
|
|
183
|
+
- YES → include
|
|
184
|
+
- NO → exclude
|
|
148
185
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
Output a JSON object with exactly two fields:
|
|
154
|
-
{"relevant":[1,3,5],"sufficient":true}
|
|
155
|
-
|
|
156
|
-
- "relevant": array of candidate numbers that are relevant. Empty array [] if none are relevant.
|
|
157
|
-
- "sufficient": true ONLY if the memories contain a direct answer; false otherwise.
|
|
186
|
+
RULES:
|
|
187
|
+
1. A candidate is relevant if its content provides facts, context, or data that directly supports answering the query.
|
|
188
|
+
2. A candidate that merely shares the same broad topic/domain but contains NO useful information for answering is NOT relevant.
|
|
189
|
+
3. If NO candidate can help answer the query, return {"relevant":[],"sufficient":false} — do NOT force-pick the "least irrelevant" one.
|
|
158
190
|
|
|
159
|
-
|
|
191
|
+
OUTPUT — JSON only:
|
|
192
|
+
{"relevant":[1,3],"sufficient":true}
|
|
193
|
+
- "relevant": candidate numbers whose content helps answer the query. [] if none can help.
|
|
194
|
+
- "sufficient": true only if the selected memories fully answer the query.`;
|
|
160
195
|
async function filterRelevantGemini(query, candidates, cfg, log) {
|
|
161
196
|
const model = cfg.model ?? "gemini-1.5-flash";
|
|
162
197
|
const endpoint = cfg.endpoint ??
|
|
@@ -167,7 +202,10 @@ async function filterRelevantGemini(query, candidates, cfg, log) {
|
|
|
167
202
|
...cfg.headers,
|
|
168
203
|
};
|
|
169
204
|
const candidateText = candidates
|
|
170
|
-
.map((c) =>
|
|
205
|
+
.map((c) => {
|
|
206
|
+
const timeTag = c.time ? ` (${c.time})` : "";
|
|
207
|
+
return `${c.index}. [${c.role}]${timeTag}\n ${c.content}`;
|
|
208
|
+
})
|
|
171
209
|
.join("\n");
|
|
172
210
|
const resp = await fetch(url, {
|
|
173
211
|
method: "POST",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/ingest/providers/gemini.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/ingest/providers/gemini.ts"],"names":[],"mappings":";;AAwDA,kDAkCC;AAcD,0DAkCC;AA4BD,kDAuCC;AAuBD,oDA4CC;AAmBD,0CAoCC;AAQD,4CAgCC;AA7WD,MAAM,aAAa,GAAG;;;;;;;;;;;;;;oBAcF,CAAC;AAErB,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAoCQ,CAAC;AAE9B,KAAK,UAAU,mBAAmB,CACvC,IAAY,EACZ,GAAqB,EACrB,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,kBAAkB,CAAC;IAC9C,MAAM,QAAQ,GACZ,GAAG,CAAC,QAAQ;QACZ,2DAA2D,KAAK,kBAAkB,CAAC;IAErF,MAAM,GAAG,GAAG,GAAG,QAAQ,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;IAC5C,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,GAAG,GAAG,CAAC,OAAO;KACf,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC5B,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,EAAE;YAC7D,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACjC,gBAAgB,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;SACjF,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;KACrD,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA2E,CAAC;IAC3G,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,iBAAiB,GAAG;;;;;;;;;;8DAUoC,CAAC;AAExD,KAAK,UAAU,uBAAuB,CAC3C,IAAY,EACZ,GAAqB,EACrB,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,kBAAkB,CAAC;IAC9C,MAAM,QAAQ,GACZ,GAAG,CAAC,QAAQ;QACZ,2DAA2D,KAAK,kBAAkB,CAAC;IAErF,MAAM,GAAG,GAAG,GAAG,QAAQ,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;IAC5C,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,GAAG,GAAG,CAAC,OAAO;KACf,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC5B,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE;YAC3D,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACjC,gBAAgB,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE;SAC3D,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;KACrD,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA2E,CAAC;IAC3G,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;qCAwBU,CAAC;AAE/B,KAAK,UAAU,mBAAmB,CACvC,cAAsB,EACtB,UAAkB,EAClB,GAAqB,EACrB,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,kBAAkB,CAAC;IAC9C,MAAM,QAAQ,GACZ,GAAG,CAAC,QAAQ;QACZ,2DAA2D,KAAK,kBAAkB,CAAC;IAErF,MAAM,GAAG,GAAG,GAAG,QAAQ,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;IAC5C,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,GAAG,GAAG,CAAC,OAAO;KACf,CAAC;IAEF,MAAM,WAAW,GAAG,0BAA0B,cAAc,iCAAiC,UAAU,EAAE,CAAC;IAE1G,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC5B,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,EAAE;YAC5D,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;YAC9C,gBAAgB,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE;SAC1D,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;KACrD,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA2E,CAAC;IAC3G,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAC3F,GAAG,CAAC,KAAK,CAAC,wBAAwB,MAAM,GAAG,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;2EAgB4C,CAAC;AAKrE,KAAK,UAAU,oBAAoB,CACxC,KAAa,EACb,UAAkF,EAClF,GAAqB,EACrB,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,kBAAkB,CAAC;IAC9C,MAAM,QAAQ,GACZ,GAAG,CAAC,QAAQ;QACZ,2DAA2D,KAAK,kBAAkB,CAAC;IAErF,MAAM,GAAG,GAAG,GAAG,QAAQ,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;IAC5C,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,GAAG,GAAG,CAAC,OAAO;KACf,CAAC;IAEF,MAAM,aAAa,GAAG,UAAU;SAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,OAAO,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,IAAI,OAAO,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9D,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC5B,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,EAAE;YAChE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,KAAK,oBAAoB,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC;YACrF,gBAAgB,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE;SAC3D,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;KACrD,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA2E,CAAC;IAC3G,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;IAC5E,GAAG,CAAC,KAAK,CAAC,qCAAqC,GAAG,GAAG,CAAC,CAAC;IACvD,OAAO,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW,EAAE,GAAW;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvC,OAAO;oBACL,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;oBAChE,UAAU,EAAE,GAAG,CAAC,UAAU,KAAK,IAAI;iBACpC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,GAAG,CAAC,IAAI,CAAC,gDAAgD,GAAG,iCAAiC,CAAC,CAAC;IAC/F,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC7C,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,GAAqB,EACrB,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,kBAAkB,CAAC;IAC9C,MAAM,QAAQ,GACZ,GAAG,CAAC,QAAQ;QACZ,2DAA2D,KAAK,kBAAkB,CAAC;IAErF,MAAM,GAAG,GAAG,GAAG,QAAQ,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;IAC5C,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,GAAG,GAAG,CAAC,OAAO;KACf,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC5B,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE;YACvD,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,wBAAwB,IAAI,wBAAwB,EAAE,CAAC,EAAE,CAAC;YACvF,gBAAgB,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE;SAC9E,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;KACrD,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAE9B,CAAC;IACF,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvE,CAAC;AAED,sBAAsB;AAEtB,qCAAgE;AAIzD,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,UAAsE,EACtE,GAAqB,EACrB,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,kBAAkB,CAAC;IAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,2DAA2D,KAAK,kBAAkB,CAAC;IACpH,MAAM,GAAG,GAAG,GAAG,QAAQ,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;IAC5C,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAE/F,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEnF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC5B,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,2BAAkB,EAAE,CAAC,EAAE;YAC5D,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,UAAU,2BAA2B,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC;YACvG,gBAAgB,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE;SAC3D,CAAC;QACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;KACrD,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA2E,CAAC;IAC3G,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;IAC5E,OAAO,IAAA,yBAAgB,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -38,11 +38,13 @@ export declare class Summarizer {
|
|
|
38
38
|
private tryChain;
|
|
39
39
|
summarize(text: string): Promise<string>;
|
|
40
40
|
summarizeTask(text: string): Promise<string>;
|
|
41
|
+
generateTaskTitle(text: string): Promise<string>;
|
|
41
42
|
judgeNewTopic(currentContext: string, newMessage: string): Promise<boolean | null>;
|
|
42
43
|
filterRelevant(query: string, candidates: Array<{
|
|
43
44
|
index: number;
|
|
44
|
-
summary: string;
|
|
45
45
|
role: string;
|
|
46
|
+
content: string;
|
|
47
|
+
time?: string;
|
|
46
48
|
}>): Promise<FilterResult | null>;
|
|
47
49
|
judgeDedup(newSummary: string, candidates: Array<{
|
|
48
50
|
index: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ingest/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAoD1D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;IAChD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,cAAM,kBAAkB;IACtB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,aAAa,CAAuD;IAE5E,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiBhD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAU7D,MAAM,IAAI,gBAAgB,EAAE;IAI5B,OAAO,CAAC,WAAW;CAQpB;AAED,eAAO,MAAM,WAAW,oBAA2B,CAAC;AAEpD,qBAAa,UAAU;IAKnB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,GAAG;IALb,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,WAAW,CAA+B;gBAGxC,GAAG,EAAE,gBAAgB,GAAG,SAAS,EACjC,GAAG,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,gBAAgB;IAM9B;;;OAGG;IACH,OAAO,CAAC,cAAc;IAQtB;;;OAGG;YACW,QAAQ;IAoBhB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ingest/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAoD1D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;IAChD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,cAAM,kBAAkB;IACtB,OAAO,CAAC,KAAK,CAAuC;IACpD,OAAO,CAAC,aAAa,CAAuD;IAE5E,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiBhD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAU7D,MAAM,IAAI,gBAAgB,EAAE;IAI5B,OAAO,CAAC,WAAW;CAQpB;AAED,eAAO,MAAM,WAAW,oBAA2B,CAAC;AAEpD,qBAAa,UAAU;IAKnB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,GAAG;IALb,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,WAAW,CAA+B;gBAGxC,GAAG,EAAE,gBAAgB,GAAG,SAAS,EACjC,GAAG,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,gBAAgB;IAM9B;;;OAGG;IACH,OAAO,CAAC,cAAc;IAQtB;;;OAGG;YACW,QAAQ;IAoBhB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiDxC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS5C,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMhD,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAsBlF,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GACjF,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQzB,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,GACrE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQ9B,eAAe,IAAI,gBAAgB,GAAG,SAAS;CAGhD"}
|
|
@@ -171,30 +171,45 @@ class Summarizer {
|
|
|
171
171
|
return undefined;
|
|
172
172
|
}
|
|
173
173
|
async summarize(text) {
|
|
174
|
+
const cleaned = stripMarkdown(text).trim();
|
|
175
|
+
if (wordCount(cleaned) <= 10) {
|
|
176
|
+
return cleaned;
|
|
177
|
+
}
|
|
174
178
|
if (!this.cfg && !this.fallbackCfg) {
|
|
175
|
-
return ruleFallback(
|
|
179
|
+
return ruleFallback(cleaned);
|
|
176
180
|
}
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
181
|
+
const accept = (s) => !!s && s.length > 0 && s.length < cleaned.length;
|
|
182
|
+
let llmCalled = false;
|
|
183
|
+
try {
|
|
184
|
+
const result = await this.tryChain("summarize", (cfg) => callSummarize(cfg, text, this.log));
|
|
185
|
+
llmCalled = true;
|
|
186
|
+
const resultCleaned = result ? stripMarkdown(result).trim() : undefined;
|
|
187
|
+
if (accept(resultCleaned)) {
|
|
188
|
+
return resultCleaned;
|
|
189
|
+
}
|
|
190
|
+
if (resultCleaned !== undefined) {
|
|
191
|
+
this.log.warn(`summarize: result (${resultCleaned.length}) >= input (${cleaned.length}), retrying`);
|
|
192
|
+
}
|
|
180
193
|
}
|
|
181
|
-
|
|
182
|
-
this.log.warn(`summarize
|
|
194
|
+
catch (err) {
|
|
195
|
+
this.log.warn(`summarize primary failed: ${err}`);
|
|
183
196
|
}
|
|
184
197
|
const fallback = this.fallbackCfg ?? this.cfg;
|
|
185
198
|
if (fallback) {
|
|
186
199
|
try {
|
|
187
200
|
const retry = await callSummarize(fallback, text, this.log);
|
|
188
|
-
|
|
201
|
+
llmCalled = true;
|
|
202
|
+
const retryCleaned = retry ? stripMarkdown(retry).trim() : undefined;
|
|
203
|
+
if (accept(retryCleaned)) {
|
|
189
204
|
exports.modelHealth.recordSuccess("summarize", `${fallback.provider}/${fallback.model ?? "?"}`);
|
|
190
|
-
return
|
|
205
|
+
return retryCleaned;
|
|
191
206
|
}
|
|
192
207
|
}
|
|
193
208
|
catch (err) {
|
|
194
209
|
this.log.warn(`summarize fallback retry failed: ${err}`);
|
|
195
210
|
}
|
|
196
211
|
}
|
|
197
|
-
return ruleFallback(
|
|
212
|
+
return llmCalled ? cleaned : ruleFallback(cleaned);
|
|
198
213
|
}
|
|
199
214
|
async summarizeTask(text) {
|
|
200
215
|
if (!this.cfg && !this.fallbackCfg) {
|
|
@@ -203,6 +218,12 @@ class Summarizer {
|
|
|
203
218
|
const result = await this.tryChain("summarizeTask", (cfg) => callSummarizeTask(cfg, text, this.log));
|
|
204
219
|
return result ?? taskFallback(text);
|
|
205
220
|
}
|
|
221
|
+
async generateTaskTitle(text) {
|
|
222
|
+
if (!this.cfg && !this.fallbackCfg)
|
|
223
|
+
return "";
|
|
224
|
+
const result = await this.tryChain("generateTaskTitle", (cfg) => callGenerateTaskTitle(cfg, text, this.log));
|
|
225
|
+
return result ?? "";
|
|
226
|
+
}
|
|
206
227
|
async judgeNewTopic(currentContext, newMessage) {
|
|
207
228
|
const chain = [];
|
|
208
229
|
if (this.strongCfg)
|
|
@@ -282,6 +303,22 @@ function callSummarizeTask(cfg, text, log) {
|
|
|
282
303
|
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
283
304
|
}
|
|
284
305
|
}
|
|
306
|
+
function callGenerateTaskTitle(cfg, text, log) {
|
|
307
|
+
switch (cfg.provider) {
|
|
308
|
+
case "openai":
|
|
309
|
+
case "openai_compatible":
|
|
310
|
+
case "azure_openai":
|
|
311
|
+
return (0, openai_1.generateTaskTitleOpenAI)(text, cfg, log);
|
|
312
|
+
case "anthropic":
|
|
313
|
+
return (0, anthropic_1.generateTaskTitleAnthropic)(text, cfg, log);
|
|
314
|
+
case "gemini":
|
|
315
|
+
return (0, gemini_1.generateTaskTitleGemini)(text, cfg, log);
|
|
316
|
+
case "bedrock":
|
|
317
|
+
return (0, bedrock_1.generateTaskTitleBedrock)(text, cfg, log);
|
|
318
|
+
default:
|
|
319
|
+
throw new Error(`Unknown summarizer provider: ${cfg.provider}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
285
322
|
function callTopicJudge(cfg, currentContext, newMessage, log) {
|
|
286
323
|
switch (cfg.provider) {
|
|
287
324
|
case "openai":
|
|
@@ -331,30 +368,33 @@ function callJudgeDedup(cfg, newSummary, candidates, log) {
|
|
|
331
368
|
}
|
|
332
369
|
}
|
|
333
370
|
// ─── Fallbacks ───
|
|
371
|
+
function ruleFallback(text) {
|
|
372
|
+
const lines = text.split("\n").filter((l) => l.trim().length > 5);
|
|
373
|
+
return (lines[0] ?? text).trim();
|
|
374
|
+
}
|
|
334
375
|
function taskFallback(text) {
|
|
335
376
|
const lines = text.split("\n").filter((l) => l.trim().length > 10);
|
|
336
377
|
return lines.slice(0, 30).join("\n").slice(0, 2000);
|
|
337
378
|
}
|
|
338
|
-
function
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
return summary.slice(0, maxLen);
|
|
379
|
+
function stripMarkdown(text) {
|
|
380
|
+
return text
|
|
381
|
+
.replace(/\*\*([^*]+)\*\*/g, "$1")
|
|
382
|
+
.replace(/\*([^*]+)\*/g, "$1")
|
|
383
|
+
.replace(/^#{1,6}\s+/gm, "")
|
|
384
|
+
.replace(/`([^`]+)`/g, "$1")
|
|
385
|
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1")
|
|
386
|
+
.trim();
|
|
387
|
+
}
|
|
388
|
+
/** Count "words": CJK characters count as 1 word each, latin words separated by spaces. */
|
|
389
|
+
function wordCount(text) {
|
|
390
|
+
let count = 0;
|
|
391
|
+
const cjk = /[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]/g;
|
|
392
|
+
const cjkMatches = text.match(cjk);
|
|
393
|
+
if (cjkMatches)
|
|
394
|
+
count += cjkMatches.length;
|
|
395
|
+
const noCjk = text.replace(cjk, " ").trim();
|
|
396
|
+
if (noCjk)
|
|
397
|
+
count += noCjk.split(/\s+/).filter(Boolean).length;
|
|
398
|
+
return count;
|
|
359
399
|
}
|
|
360
400
|
//# sourceMappingURL=index.js.map
|