@lacneu/openclaw-knowledge 3.1.2 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +264 -1
  2. package/README.md +131 -0
  3. package/dist/config.d.ts +4 -0
  4. package/dist/config.js +26 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/index.d.ts +25 -4
  7. package/dist/index.js +295 -46
  8. package/dist/index.js.map +1 -1
  9. package/dist/jina/classifier.d.ts +55 -0
  10. package/dist/jina/classifier.js +170 -0
  11. package/dist/jina/classifier.js.map +1 -0
  12. package/dist/jina/client.d.ts +30 -0
  13. package/dist/jina/client.js +131 -0
  14. package/dist/jina/client.js.map +1 -0
  15. package/dist/jina/errors.d.ts +42 -0
  16. package/dist/jina/errors.js +113 -0
  17. package/dist/jina/errors.js.map +1 -0
  18. package/dist/jina/reranker.d.ts +34 -0
  19. package/dist/jina/reranker.js +95 -0
  20. package/dist/jina/reranker.js.map +1 -0
  21. package/dist/jina/types.d.ts +78 -0
  22. package/dist/jina/types.js +12 -0
  23. package/dist/jina/types.js.map +1 -0
  24. package/dist/pgvector.d.ts +29 -0
  25. package/dist/pgvector.js +68 -0
  26. package/dist/pgvector.js.map +1 -1
  27. package/dist/router/heuristic.d.ts +29 -0
  28. package/dist/router/heuristic.js +104 -0
  29. package/dist/router/heuristic.js.map +1 -0
  30. package/dist/router/index.d.ts +33 -0
  31. package/dist/router/index.js +94 -0
  32. package/dist/router/index.js.map +1 -0
  33. package/dist/router/labels.d.ts +33 -0
  34. package/dist/router/labels.js +67 -0
  35. package/dist/router/labels.js.map +1 -0
  36. package/dist/router/types.d.ts +23 -0
  37. package/dist/router/types.js +7 -0
  38. package/dist/router/types.js.map +1 -0
  39. package/dist/tracing/events.d.ts +83 -0
  40. package/dist/tracing/events.js +86 -0
  41. package/dist/tracing/events.js.map +1 -0
  42. package/dist/types.d.ts +57 -0
  43. package/openclaw.plugin.json +97 -4
  44. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -3,67 +3,108 @@
3
3
  // Queries two knowledge sources in parallel and injects relevant context
4
4
  // into the agent's system prompt via `appendSystemContext`:
5
5
  // 1. PostgreSQL pgvector — semantic vector search on document embeddings
6
+ // (optionally re-ordered by a Jina cross-encoder reranker)
6
7
  // 2. LightRAG — knowledge graph with entity/relation multi-hop search
7
8
  //
8
- // Hook: before_prompt_build (requires OpenClaw >= v2026.3.7)
9
+ // As of v3.2.0:
10
+ // - An optional Jina-powered ROUTER decides which source(s) to call
11
+ // (or to skip retrieval entirely on heartbeats and meta-questions).
12
+ // - An optional Jina RERANKER re-orders pgvector results by relevance.
13
+ // Both features are opt-in via the `jina.*` config block and preserve
14
+ // pre-3.2.0 behavior when omitted.
15
+ //
16
+ // Hook: before_prompt_build (requires OpenClaw >= v2026.5.0)
9
17
  // Depends on: pg (node-postgres)
10
18
  //
11
19
  // This is the canonical entry point for the plugin. Helpers live in sibling
12
- // modules (`config.ts`, `embeddings.ts`, `pgvector.ts`, `lightrag.ts`) so the
13
- // business logic can be unit-tested without instantiating the full SDK.
20
+ // modules (`config.ts`, `embeddings.ts`, `pgvector.ts`, `lightrag.ts`,
21
+ // `jina/*`, `router/*`, `tracing/*`) so the business logic can be
22
+ // unit-tested without instantiating the full SDK.
14
23
  import pg from "pg";
15
24
  import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
16
25
  import { resolveConfig } from "./config.js";
17
26
  import { embedQuery } from "./embeddings.js";
18
- import { searchCollection, formatPgvectorResults } from "./pgvector.js";
27
+ import { searchCollection, formatPgvectorResults, rerankPgvectorResults, } from "./pgvector.js";
19
28
  import { queryLightRAG, formatLightRAGResults } from "./lightrag.js";
29
+ import { decideRoute } from "./router/index.js";
30
+ import { JinaError, summarizeJinaError } from "./jina/errors.js";
31
+ import { emitEvent, emitTurnMetadata } from "./tracing/events.js";
20
32
  // Re-export helpers so the test suite can import them directly without
21
33
  // duplicating imports from every submodule.
22
34
  export { resolveEnv, resolveConfig } from "./config.js";
23
35
  export { embedQuery } from "./embeddings.js";
24
- export { searchCollection, formatPgvectorResults } from "./pgvector.js";
36
+ export { searchCollection, formatPgvectorResults, rerankPgvectorResults, } from "./pgvector.js";
25
37
  export { queryLightRAG, truncateLightRAG, formatLightRAGResults } from "./lightrag.js";
38
+ export { decideRoute } from "./router/index.js";
26
39
  // ---------------------------------------------------------------------------
27
40
  // Hook handler factory
28
- //
29
- // Extracted from `register` so tests can exercise the handler directly
30
- // without mocking the full plugin API surface.
31
41
  // ---------------------------------------------------------------------------
32
42
  const MAX_CONSECUTIVE_ERRORS = 3;
33
43
  const COOLDOWN_MS = 5 * 60 * 1000;
34
44
  const MIN_QUERY_LENGTH = 3;
45
+ function newCooldown() {
46
+ return { consecutiveErrors: 0, cooldownUntil: 0 };
47
+ }
35
48
  /**
36
49
  * Build the `before_prompt_build` handler bound to a specific plugin state.
37
50
  * Kept as a pure factory so the handler can be unit-tested with fake deps.
38
51
  */
39
52
  export function createBeforePromptBuildHandler(deps) {
40
53
  const { config, pool, logger } = deps;
41
- // Per-instance state: consecutive failure counter and cooldown deadline.
42
- // Closed-over so two registrations of the hook never share state.
43
- let consecutiveErrors = 0;
44
- let cooldownUntil = 0;
45
- return async function beforePromptBuild(event) {
54
+ // Per-instance cooldown state. Closed-over so two registrations of the
55
+ // hook never share counters.
56
+ const cooldowns = {
57
+ global: newCooldown(),
58
+ router: newCooldown(),
59
+ pgvector_reranker: newCooldown(),
60
+ };
61
+ return async function beforePromptBuild(event, ctx) {
46
62
  if (!config.enabled)
47
63
  return undefined;
48
- // Cooldown after repeated failures: skip silently until the deadline
49
- // passes, then reset the counter and resume normal operation.
50
- if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {
51
- if (Date.now() < cooldownUntil)
64
+ if (isInCooldown(cooldowns.global)) {
65
+ maybeResetCooldown(cooldowns.global, "global", logger);
66
+ if (isInCooldown(cooldowns.global))
52
67
  return undefined;
53
- consecutiveErrors = 0;
54
- logger.info("openclaw-knowledge: resuming after cooldown");
55
68
  }
56
69
  const query = extractQueryFromMessages(event.messages);
57
70
  if (!query || query.trim().length < MIN_QUERY_LENGTH)
58
71
  return undefined;
72
+ emitTurnMetadata(logger, ctx?.runId, query.length);
73
+ // -----------------------------------------------------------------
74
+ // Router gate — decide which sources (if any) to consult.
75
+ // -----------------------------------------------------------------
76
+ const decision = await runRouterWithCooldown(config, ctx, query, cooldowns.router, logger);
77
+ // Project the abstract router decision onto the sources actually
78
+ // configured in this deployment. Without this projection, an
79
+ // exclusive route (e.g. LIGHTRAG_ONLY) on a single-source deployment
80
+ // (e.g. pgvector only) would produce zero tasks and strip context
81
+ // the deployment could otherwise have provided.
82
+ const effectiveRoute = projectRouteOnEnabledSources(decision.route, config.pgvectorEnabled, config.lightragEnabled);
83
+ emitEvent(logger, {
84
+ type: "router",
85
+ route: effectiveRoute,
86
+ reason: decision.reason,
87
+ score: decision.score,
88
+ queryLength: query.length,
89
+ trigger: ctx?.trigger,
90
+ });
91
+ if (effectiveRoute === "NONE")
92
+ return undefined;
93
+ // -----------------------------------------------------------------
94
+ // Source execution — guided by the route.
95
+ // -----------------------------------------------------------------
59
96
  try {
60
97
  const tasks = [];
61
- if (config.pgvectorEnabled && pool) {
62
- tasks.push(runPgvectorSource(pool, query, config));
98
+ if (shouldUsePgvector(effectiveRoute) &&
99
+ config.pgvectorEnabled &&
100
+ pool) {
101
+ tasks.push(runPgvectorSource(pool, query, config, cooldowns.pgvector_reranker, logger));
63
102
  }
64
- if (config.lightragEnabled) {
103
+ if (shouldUseLightRAG(effectiveRoute) && config.lightragEnabled) {
65
104
  tasks.push(runLightRAGSource(query, config));
66
105
  }
106
+ if (tasks.length === 0)
107
+ return undefined;
67
108
  const settled = await Promise.allSettled(tasks);
68
109
  const sections = [];
69
110
  let failedSources = 0;
@@ -82,14 +123,10 @@ export function createBeforePromptBuildHandler(deps) {
82
123
  // cooldown tracking. A partial failure is fine — the other source's
83
124
  // context is better than nothing.
84
125
  if (failedSources > 0 && failedSources === tasks.length) {
85
- consecutiveErrors++;
86
- if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {
87
- cooldownUntil = Date.now() + COOLDOWN_MS;
88
- logger.error(`openclaw-knowledge: ${consecutiveErrors} consecutive errors — cooling down 5 min`);
89
- }
126
+ registerError(cooldowns.global, "global", logger);
90
127
  return undefined;
91
128
  }
92
- consecutiveErrors = 0;
129
+ cooldowns.global.consecutiveErrors = 0;
93
130
  if (sections.length === 0)
94
131
  return undefined;
95
132
  return {
@@ -105,19 +142,106 @@ export function createBeforePromptBuildHandler(deps) {
105
142
  }
106
143
  catch (err) {
107
144
  // Catch-all: an unexpected crash must never propagate to the agent.
108
- consecutiveErrors++;
109
145
  const message = err instanceof Error ? err.message : String(err);
110
- if (consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {
111
- cooldownUntil = Date.now() + COOLDOWN_MS;
112
- logger.error(`openclaw-knowledge: ${consecutiveErrors} consecutive errors — cooling down 5 min: ${message}`);
113
- }
114
- else {
115
- logger.error(`openclaw-knowledge: ${message}`);
116
- }
146
+ logger.error(`openclaw-knowledge: ${message}`);
147
+ registerError(cooldowns.global, "global", logger);
117
148
  return undefined;
118
149
  }
119
150
  };
120
151
  }
152
+ // ---------------------------------------------------------------------------
153
+ // Route gating helpers
154
+ // ---------------------------------------------------------------------------
155
+ function shouldUsePgvector(route) {
156
+ return route === "PGVECTOR_ONLY" || route === "ALL";
157
+ }
158
+ function shouldUseLightRAG(route) {
159
+ return route === "LIGHTRAG_ONLY" || route === "ALL";
160
+ }
161
+ /**
162
+ * Project a router decision onto the set of sources that are actually
163
+ * enabled in this deployment. This prevents "silent empty retrieval"
164
+ * when, for example, a pgvector-only deployment is told to use
165
+ * `LIGHTRAG_ONLY` for a multi-hop question — without this projection the
166
+ * task list would be empty and the agent would lose context that
167
+ * pgvector could have provided.
168
+ *
169
+ * Rules:
170
+ * - `NONE` → `NONE` (the router deliberately wants no retrieval).
171
+ * - `ALL` → `ALL` (downstream `shouldUseX` already skips disabled sources).
172
+ * - `PGVECTOR_ONLY` + pgvector disabled:
173
+ * - LightRAG available → `LIGHTRAG_ONLY` (best effort)
174
+ * - neither available → `NONE` (caller short-circuits)
175
+ * - `LIGHTRAG_ONLY` + LightRAG disabled: symmetric.
176
+ *
177
+ * Exported for unit testing.
178
+ */
179
+ export function projectRouteOnEnabledSources(route, pgvectorEnabled, lightragEnabled) {
180
+ if (route === "NONE" || route === "ALL")
181
+ return route;
182
+ if (route === "PGVECTOR_ONLY") {
183
+ if (pgvectorEnabled)
184
+ return "PGVECTOR_ONLY";
185
+ return lightragEnabled ? "LIGHTRAG_ONLY" : "NONE";
186
+ }
187
+ // route === "LIGHTRAG_ONLY"
188
+ if (lightragEnabled)
189
+ return "LIGHTRAG_ONLY";
190
+ return pgvectorEnabled ? "PGVECTOR_ONLY" : "NONE";
191
+ }
192
+ /**
193
+ * Run `decideRoute` with isolated cooldown tracking. The router fails open
194
+ * by contract (returns ALL on any Jina error) — the cooldown here is only
195
+ * meant to suppress repeated log spam during a sustained outage, not to
196
+ * stop retrieval.
197
+ */
198
+ async function runRouterWithCooldown(config, ctx, query, cooldown, logger) {
199
+ // Reset stale cooldown FIRST so we don't keep the classifier circuit
200
+ // open longer than necessary (the first turn after expiry must be
201
+ // able to attempt the classifier again).
202
+ maybeResetCooldown(cooldown, "router", logger);
203
+ // When the classifier circuit is open, we DOWNGRADE the mode to
204
+ // "heuristic" rather than short-circuiting to `ALL`. The cheap local
205
+ // rules (heartbeat / cron / memory trigger gating, meta-agent regex,
206
+ // CLI-trivial guard, keyword fast-paths) MUST still run during a Jina
207
+ // outage — otherwise a 5-min outage re-enables retrieval for every
208
+ // heartbeat, which is the exact waste the router is meant to prevent.
209
+ const classifierCircuitOpen = isInCooldown(cooldown);
210
+ const effectiveMode = classifierCircuitOpen
211
+ ? "heuristic"
212
+ : config.routerMode;
213
+ try {
214
+ const d = await decideRoute({
215
+ enabled: config.routerEnabled,
216
+ mode: effectiveMode,
217
+ jinaApiKey: config.jinaApiKey,
218
+ classifierId: config.routerClassifierId || undefined,
219
+ }, {
220
+ query,
221
+ trigger: ctx?.trigger,
222
+ isCli: ctx?.messageProvider === "cli",
223
+ });
224
+ if (d.reason === "classifier_error") {
225
+ registerError(cooldown, "router", logger);
226
+ }
227
+ else if (!classifierCircuitOpen) {
228
+ // Only reset the error counter when we actually exercised the
229
+ // classifier path. While the circuit is open, heuristic-only
230
+ // successes must NOT prematurely declare the classifier healthy.
231
+ cooldown.consecutiveErrors = 0;
232
+ }
233
+ return d;
234
+ }
235
+ catch (err) {
236
+ // Defense in depth: decideRoute already handles Jina errors internally
237
+ // but a non-Jina exception (programmer error) lands here. Log only
238
+ // the error CLASS, never the message — the message could echo
239
+ // user content for some programmatic errors.
240
+ logger.error(`openclaw-knowledge: router unexpected error — ${summarizeJinaError(err)}`);
241
+ registerError(cooldown, "router", logger);
242
+ return { route: "ALL", reason: "classifier_error", score: null };
243
+ }
244
+ }
121
245
  /**
122
246
  * Extract the most recent user message text. OpenClaw surfaces two content
123
247
  * shapes: a plain string, or an array of typed content parts (multi-modal).
@@ -142,16 +266,81 @@ function extractQueryFromMessages(messages) {
142
266
  }
143
267
  return "";
144
268
  }
145
- async function runPgvectorSource(pool, query, config) {
269
+ async function runPgvectorSource(pool, query, config, rerankerCooldown, logger) {
270
+ const startedAt = Date.now();
146
271
  const vector = await embedQuery(query, config.geminiApiKey);
147
272
  const searches = config.collections.map((col) => searchCollection(pool, col, vector, config.topK, config.scoreThreshold));
148
273
  const allResults = (await Promise.all(searches)).flat();
149
274
  allResults.sort((a, b) => b.score - a.score);
150
- return { source: "pgvector", data: allResults };
275
+ // Capture the recall size BEFORE the reranker runs. This is the
276
+ // number that monitors "how many candidates did pgvector find?"
277
+ // post-rerank, `data.length` may be smaller (truncated to topN), so
278
+ // we must not conflate the two in telemetry.
279
+ const rawCount = allResults.length;
280
+ // Optional cross-encoder rerank, gated on its own cooldown so a Jina
281
+ // hiccup doesn't poison the rest of the plugin.
282
+ //
283
+ // IMPORTANT: reset the cooldown BEFORE computing `rerankerActive`.
284
+ // Otherwise the first turn after the 5-min window expires would still
285
+ // see `consecutiveErrors=3`, skip the rerank, and only reset on the
286
+ // way out — leaving the operator with a "resuming" log message but a
287
+ // request that did NOT actually use the reranker.
288
+ maybeResetCooldown(rerankerCooldown, "pgvector_reranker", logger);
289
+ const rerankerActive = config.pgvectorRerankerEnabled &&
290
+ Boolean(config.jinaApiKey) &&
291
+ !isInCooldown(rerankerCooldown);
292
+ if (!rerankerActive) {
293
+ return {
294
+ source: "pgvector",
295
+ data: allResults,
296
+ rawCount,
297
+ reranked: false,
298
+ durationMs: Date.now() - startedAt,
299
+ };
300
+ }
301
+ try {
302
+ const reranked = await rerankPgvectorResults(allResults, {
303
+ apiKey: config.jinaApiKey,
304
+ query,
305
+ model: config.pgvectorRerankerModel,
306
+ topN: config.pgvectorRerankerTopN,
307
+ });
308
+ rerankerCooldown.consecutiveErrors = 0;
309
+ return {
310
+ source: "pgvector",
311
+ data: reranked,
312
+ rawCount,
313
+ reranked: true,
314
+ durationMs: Date.now() - startedAt,
315
+ };
316
+ }
317
+ catch (err) {
318
+ // Jina rerank failed → log a SANITIZED summary and fall back to
319
+ // cosine order. We do NOT log `err.message` because Jina error
320
+ // bodies (truncated to 200 chars in JinaApiError) may echo the
321
+ // query or document chunks — that would leak PHI / sensitive
322
+ // content into log files.
323
+ //
324
+ // We also intentionally DO NOT propagate the rejection to
325
+ // Promise.allSettled: pgvector retrieval itself succeeded, the
326
+ // reranker is bonus.
327
+ const isJina = err instanceof JinaError;
328
+ logger.error(`openclaw-knowledge: pgvector reranker failed — ${summarizeJinaError(err)}`);
329
+ if (isJina)
330
+ registerError(rerankerCooldown, "pgvector_reranker", logger);
331
+ return {
332
+ source: "pgvector",
333
+ data: allResults,
334
+ rawCount,
335
+ reranked: false,
336
+ durationMs: Date.now() - startedAt,
337
+ };
338
+ }
151
339
  }
152
340
  async function runLightRAGSource(query, config) {
341
+ const startedAt = Date.now();
153
342
  const context = await queryLightRAG(config.lightragUrl, config.lightragApiKey, query, config.lightragQueryMode);
154
- return { source: "lightrag", data: context };
343
+ return { source: "lightrag", data: context, durationMs: Date.now() - startedAt };
155
344
  }
156
345
  function renderSection(result, config, logger) {
157
346
  if (result.source === "pgvector") {
@@ -159,7 +348,21 @@ function renderSection(result, config, logger) {
159
348
  if (!formatted)
160
349
  return null;
161
350
  const topScore = result.data[0]?.score?.toFixed(2) ?? "n/a";
162
- logger.info(`openclaw-knowledge: pgvector ${result.data.length} result(s) (top: ${topScore})`);
351
+ const rerankNote = result.reranked ? " [reranked]" : "";
352
+ logger.info(`openclaw-knowledge: pgvector — ${result.data.length} result(s)${rerankNote} (top: ${topScore})`);
353
+ emitEvent(logger, {
354
+ type: "pgvector",
355
+ collections: config.collections,
356
+ // `rawCount` is the recall size out of the vector index, captured
357
+ // BEFORE the reranker truncates to topN. `rerankedCount` is the
358
+ // final size that reaches the LLM (or `null` when the reranker
359
+ // is inactive). This split lets operators monitor recall vs.
360
+ // pruning independently.
361
+ rawCount: result.rawCount,
362
+ rerankedCount: result.reranked ? result.data.length : null,
363
+ topScore: result.data[0]?.score ?? null,
364
+ durationMs: result.durationMs,
365
+ });
163
366
  return "### Document Search Results (pgvector)\n" + formatted;
164
367
  }
165
368
  if (result.source === "lightrag") {
@@ -167,15 +370,46 @@ function renderSection(result, config, logger) {
167
370
  if (!formatted)
168
371
  return null;
169
372
  logger.info(`openclaw-knowledge: LightRAG — ${formatted.truncated.length}/${formatted.originalLength} chars (truncated from ${formatted.originalLength})`);
373
+ emitEvent(logger, {
374
+ type: "lightrag",
375
+ mode: config.lightragQueryMode,
376
+ contextChars: formatted.originalLength,
377
+ truncatedChars: formatted.truncated.length,
378
+ durationMs: result.durationMs,
379
+ });
170
380
  return "### Knowledge Graph Context (LightRAG)\n" + formatted.truncated;
171
381
  }
172
382
  return null;
173
383
  }
174
384
  // ---------------------------------------------------------------------------
385
+ // Cooldown utilities
386
+ // ---------------------------------------------------------------------------
387
+ function isInCooldown(state) {
388
+ return state.consecutiveErrors >= MAX_CONSECUTIVE_ERRORS;
389
+ }
390
+ function maybeResetCooldown(state, scope, logger) {
391
+ if (!isInCooldown(state))
392
+ return;
393
+ if (Date.now() < state.cooldownUntil)
394
+ return;
395
+ state.consecutiveErrors = 0;
396
+ state.cooldownUntil = 0;
397
+ logger.info(`openclaw-knowledge: ${scope} — resuming after cooldown`);
398
+ }
399
+ function registerError(state, scope, logger) {
400
+ state.consecutiveErrors++;
401
+ if (state.consecutiveErrors >= MAX_CONSECUTIVE_ERRORS) {
402
+ state.cooldownUntil = Date.now() + COOLDOWN_MS;
403
+ logger.error(`openclaw-knowledge: ${state.consecutiveErrors} consecutive errors — ${scope} cooling down 5 min`);
404
+ emitEvent(logger, {
405
+ type: "cooldown",
406
+ scope,
407
+ consecutiveErrors: state.consecutiveErrors,
408
+ });
409
+ }
410
+ }
411
+ // ---------------------------------------------------------------------------
175
412
  // Plugin registration helper
176
- //
177
- // Exposed so tests can exercise the full wiring (including api.on) without
178
- // going through `definePluginEntry`, which is tied to the SDK runtime.
179
413
  // ---------------------------------------------------------------------------
180
414
  /**
181
415
  * Register the plugin against a minimal shape-compatible subset of the
@@ -189,6 +423,15 @@ export function registerKnowledgePlugin(api) {
189
423
  api.logger.warn("openclaw-knowledge: neither pgvector nor LightRAG configured — plugin disabled");
190
424
  return;
191
425
  }
426
+ // Sanity check: when the reranker is on, we want at least ~2× the topN
427
+ // as raw candidates to give the cross-encoder room to re-order.
428
+ if (config.pgvectorRerankerEnabled &&
429
+ config.topK < config.pgvectorRerankerTopN * 2) {
430
+ api.logger.warn(`openclaw-knowledge: topK=${config.topK} is small relative to ` +
431
+ `pgvectorRerankerTopN=${config.pgvectorRerankerTopN}. ` +
432
+ `Recommended: topK ≥ ${config.pgvectorRerankerTopN * 2} for the ` +
433
+ `reranker to meaningfully change ordering.`);
434
+ }
192
435
  // Only instantiate the pg pool when pgvector is actually in play. Booting
193
436
  // a pool with no valid connection string would keep the plugin disabled
194
437
  // anyway and leak sockets on hot-reload.
@@ -206,12 +449,18 @@ export function registerKnowledgePlugin(api) {
206
449
  }
207
450
  const sources = [];
208
451
  if (config.pgvectorEnabled) {
209
- sources.push(`pgvector (${config.collections.join(", ")})`);
452
+ const rerankNote = config.pgvectorRerankerEnabled
453
+ ? ` + reranker(${config.pgvectorRerankerModel})`
454
+ : "";
455
+ sources.push(`pgvector (${config.collections.join(", ")})${rerankNote}`);
210
456
  }
211
457
  if (config.lightragEnabled) {
212
458
  sources.push(`LightRAG (${config.lightragQueryMode})`);
213
459
  }
214
- api.logger.info(`openclaw-knowledge: ready sources: ${sources.join(" + ")}`);
460
+ const routerNote = config.routerEnabled
461
+ ? ` | router=${config.routerMode}${config.routerClassifierId ? "/few-shot" : "/zero-shot"}`
462
+ : "";
463
+ api.logger.info(`openclaw-knowledge: ready — sources: ${sources.join(" + ")}${routerNote}`);
215
464
  const handler = createBeforePromptBuildHandler({
216
465
  config,
217
466
  pool,
@@ -231,7 +480,7 @@ export function registerKnowledgePlugin(api) {
231
480
  export default definePluginEntry({
232
481
  id: "openclaw-knowledge",
233
482
  name: "Knowledge Base",
234
- description: "Multi-source knowledge search for OpenClaw (pgvector + LightRAG)",
483
+ description: "Multi-source knowledge search for OpenClaw (pgvector + LightRAG) with optional Jina-powered router & reranker",
235
484
  register(api) {
236
485
  registerKnowledgePlugin(api);
237
486
  },
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { ClassificationOutcome, ClassifierEmbeddingModel } from "./types.js";
2
+ export interface ZeroShotClassifyParams {
3
+ apiKey: string;
4
+ text: string;
5
+ labels: string[];
6
+ model?: ClassifierEmbeddingModel;
7
+ timeoutMs?: number;
8
+ signal?: AbortSignal;
9
+ }
10
+ /**
11
+ * Classify `text` against a list of semantic labels.
12
+ *
13
+ * Returns `null` when:
14
+ * - the response shape is unexpected (Jina rev mismatch),
15
+ * - the predicted label does not exactly match any provided label (we
16
+ * refuse to invent a class — the router should treat this as "unknown").
17
+ *
18
+ * Throws on network / API errors so the caller's circuit breaker can react.
19
+ */
20
+ export declare function classifyZeroShot({ apiKey, text, labels, model, timeoutMs, signal, }: ZeroShotClassifyParams): Promise<ClassificationOutcome | null>;
21
+ export interface FewShotClassifyParams {
22
+ apiKey: string;
23
+ text: string;
24
+ classifierId: string;
25
+ /**
26
+ * Optional whitelist used by the defensive parser to verify that the
27
+ * returned label is one the caller expects. When omitted, any non-empty
28
+ * string returned by Jina is accepted (caller knows what was trained).
29
+ */
30
+ expectedLabels?: string[];
31
+ timeoutMs?: number;
32
+ signal?: AbortSignal;
33
+ }
34
+ /**
35
+ * Classify `text` using a pre-trained few-shot classifier identified by
36
+ * `classifierId`. Same `null`-vs-throw contract as `classifyZeroShot`.
37
+ */
38
+ export declare function classifyFewShot({ apiKey, text, classifierId, expectedLabels, timeoutMs, signal, }: FewShotClassifyParams): Promise<ClassificationOutcome | null>;
39
+ /**
40
+ * Extract the predicted label + optional score from a Classifier response.
41
+ *
42
+ * Known shapes (in order tried):
43
+ * 1. `{ data: [ { predictions: [ { label, score } ] } ] }`
44
+ * 2. `{ results: [ { label, score } ] }`
45
+ * 3. `{ data: [ { label, score } ] }`
46
+ * 4. `{ data: [ { prediction, confidence } ] }`
47
+ *
48
+ * The first match wins. When `allowedLabels` is provided, the picked label
49
+ * MUST be an exact (case-sensitive) member — otherwise we return `null` and
50
+ * the caller falls back to its safe default (the router treats `null` like
51
+ * an outage).
52
+ *
53
+ * @internal exported only for unit testing
54
+ */
55
+ export declare function parseClassificationResponse(raw: unknown, allowedLabels?: string[]): ClassificationOutcome | null;