@lacneu/openclaw-knowledge 3.2.0 → 3.2.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/CHANGELOG.md +209 -1
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +37 -1
- package/dist/index.js +169 -4
- package/dist/index.js.map +1 -1
- package/dist/router/index.d.ts +24 -0
- package/dist/router/index.js +34 -0
- package/dist/router/index.js.map +1 -1
- package/dist/router/types.d.ts +1 -1
- package/dist/types.d.ts +20 -4
- package/openclaw.plugin.json +13 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,213 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [3.2.2] - 2026-05-23
|
|
11
|
+
|
|
12
|
+
### Fixed — Jina classifier silently blocked retrieval on low-confidence scores
|
|
13
|
+
|
|
14
|
+
After v3.2.1 fixed query extraction, jerome's production traces showed
|
|
15
|
+
that 6 out of 8 user turns ended up with `route=NONE` from
|
|
16
|
+
`reason=classifier_hit` with scores tightly clustered around **0.25**:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
0.2540 0.2559 0.2642 0.2507 0.2630 0.2516
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
This pattern is the Jina v3 zero-shot **noise floor** — when no label
|
|
23
|
+
actually matches the query, the engine still picks the closest one (most
|
|
24
|
+
often `NONE` because its label happens to be embedded first), but the
|
|
25
|
+
decision is essentially random. The previous router code trusted any
|
|
26
|
+
prediction regardless of score, so the classifier silently blocked
|
|
27
|
+
retrieval on legitimate questions.
|
|
28
|
+
|
|
29
|
+
Confirmed regression scenario, from a real chat-export on 2026-05-23:
|
|
30
|
+
|
|
31
|
+
> Query: `"Quel est l'arbitrage principal de la réunion hebdomadaire
|
|
32
|
+
> Ataraxis du 19 mai 2026 ?"`
|
|
33
|
+
> Classifier: `NONE @ 0.25` → router blocked the RAG.
|
|
34
|
+
> The agent then recovered via the `gworkspace-search` skill, but the
|
|
35
|
+
> RAG never contributed and the turn took 43 s + 5 tool calls instead
|
|
36
|
+
> of one direct injection.
|
|
37
|
+
|
|
38
|
+
### Low-confidence guard
|
|
39
|
+
|
|
40
|
+
`decideRoute` now requires the classifier score to clear a configurable
|
|
41
|
+
`minConfidence` threshold (default `0.35`). Below the floor, the router
|
|
42
|
+
fails open to `ALL` with reason `classifier_low_confidence`. A `null`
|
|
43
|
+
score (Jina omitted the field) also triggers the fallback — we cannot
|
|
44
|
+
prove confidence.
|
|
45
|
+
|
|
46
|
+
Why `0.35`:
|
|
47
|
+
- Observed noise floor: 0.25–0.27 across all six false `NONE` hits.
|
|
48
|
+
- Observed real hits: typically 0.40–0.65 on Jina v3 zero-shot with
|
|
49
|
+
the descriptive built-in labels.
|
|
50
|
+
- A 0.35 floor catches the noise band without rejecting clear matches.
|
|
51
|
+
|
|
52
|
+
The threshold is exposed at:
|
|
53
|
+
- `RouterConfig.minConfidence` (internal API)
|
|
54
|
+
- `RouterPluginConfig.minConfidence` (user config, `[0, 1]`)
|
|
55
|
+
- `ResolvedKnowledgeConfig.routerMinConfidence` (resolved + clamped)
|
|
56
|
+
- `jina.router.minConfidence` in `openclaw.plugin.json` config schema
|
|
57
|
+
|
|
58
|
+
`resolveConfig` clamps the resolved value into `[0, 1]` defensively;
|
|
59
|
+
non-finite inputs collapse to `0` (the legacy / pre-3.2.2 behavior).
|
|
60
|
+
|
|
61
|
+
### Logging discrimination
|
|
62
|
+
|
|
63
|
+
`RouterReason` adds `classifier_low_confidence` so dashboards can tell
|
|
64
|
+
"the classifier confidently said NONE" from "the classifier had no
|
|
65
|
+
signal at all". Both flow into the same fail-open route (`ALL`), but
|
|
66
|
+
the distinction matters when tuning labels or training a few-shot
|
|
67
|
+
classifier — only `classifier_low_confidence` should drive label work.
|
|
68
|
+
|
|
69
|
+
### Migration
|
|
70
|
+
|
|
71
|
+
Drop-in patch. No config change required to activate the floor — the
|
|
72
|
+
default takes effect immediately. To recover the pre-3.2.2 behavior
|
|
73
|
+
explicitly (e.g. for an evaluation A/B), set
|
|
74
|
+
`jina.router.minConfidence: 0` via `openclaw config set`.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
sudo docker exec openclaw-jerome openclaw plugins update @lacneu/openclaw-knowledge
|
|
78
|
+
sudo docker exec openclaw-olivier openclaw plugins update @lacneu/openclaw-knowledge
|
|
79
|
+
sudo docker restart openclaw-jerome openclaw-olivier
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
After restart, watch the `[knowledge.event]` router lines: previously
|
|
83
|
+
all-`NONE` low-confidence noise should turn into `route=ALL`,
|
|
84
|
+
`reason=classifier_low_confidence`. Counts of true `classifier_hit`
|
|
85
|
+
decisions stay unchanged (high-confidence scores still pass through).
|
|
86
|
+
|
|
87
|
+
### Public-API safety (Codex pass #25)
|
|
88
|
+
|
|
89
|
+
`decideRoute` now applies the default + clamp **at function entry**
|
|
90
|
+
rather than relying on the caller. Previously, a legacy JS plugin
|
|
91
|
+
using the public export `decideRoute` without supplying the new
|
|
92
|
+
`minConfidence` field would have silently bypassed the guard
|
|
93
|
+
(`score < undefined` is `false` in JS, so every prediction would have
|
|
94
|
+
been treated as confident). The interface field is now declared
|
|
95
|
+
optional, and the function defaults to `DEFAULT_MIN_CONFIDENCE` (also
|
|
96
|
+
exported for callers who want to read the floor explicitly).
|
|
97
|
+
|
|
98
|
+
The clamp helper inside `decideRoute` also defends against misconfigured
|
|
99
|
+
negative thresholds — a negative value would have made every score
|
|
100
|
+
clear the floor, defeating the guard.
|
|
101
|
+
|
|
102
|
+
### Test coverage
|
|
103
|
+
|
|
104
|
+
- Total: 232 tests, all green (was 223 in 3.2.1; +9 new).
|
|
105
|
+
- 7 new tests in `test/router/router.test.ts` covering the Ataraxis
|
|
106
|
+
regression scenario, the exact boundary (`score === minConfidence`
|
|
107
|
+
passes), a clear-match scenario above threshold, the few-shot path,
|
|
108
|
+
the `minConfidence=0` escape hatch, the public-API safety case
|
|
109
|
+
(Codex #25 regression — omitted field still triggers the guard),
|
|
110
|
+
and the negative-value clamp.
|
|
111
|
+
- 2 new tests in `test/config.test.ts` covering the default value
|
|
112
|
+
(`0.35`), override, and `[0, 1]` clamping with non-finite inputs.
|
|
113
|
+
|
|
114
|
+
## [3.2.1] - 2026-05-23
|
|
115
|
+
|
|
116
|
+
### Fixed — router and reranker received the aggregated context, not the user query
|
|
117
|
+
|
|
118
|
+
In 3.2.0, the hook handler called `extractQueryFromMessages(event.messages)`
|
|
119
|
+
to obtain the user query that drove routing decisions and reranker calls.
|
|
120
|
+
Empirical observation in production (Opik trace
|
|
121
|
+
`019e565a-806b-...`) showed that on a real CLI turn with a 146-char user
|
|
122
|
+
prompt (`"Sender (untrusted metadata)...\n[Sat 2026-05-23 15:40 EDT] Quel
|
|
123
|
+
est la version du plugin knowledge ?"`), the `messages[last].content`
|
|
124
|
+
slot reached **23 893 chars** — OpenClaw 2026.5.x aggregates the
|
|
125
|
+
conversation window plus framing in there for LLM consumption.
|
|
126
|
+
|
|
127
|
+
Effect: the heuristic router (keyword matching, CLI-trivial regex,
|
|
128
|
+
meta-agent regex) ran against ~24 KB of accumulated context instead of
|
|
129
|
+
the 50-char user utterance. Matches fired effectively at random and the
|
|
130
|
+
router decisions became uncorrelated with the actual question. The
|
|
131
|
+
Jina classifier, when active, embedded a 24 KB blob for every turn —
|
|
132
|
+
needlessly expensive and noisy.
|
|
133
|
+
|
|
134
|
+
The SDK exposes the raw user prompt directly via `event.prompt`
|
|
135
|
+
(`PluginHookBeforePromptBuildEvent.prompt`, SDK >= 2026.5.0). The fix
|
|
136
|
+
reads `event.prompt` first, strips the OpenClaw envelope (sender
|
|
137
|
+
metadata + `[Day YYYY-MM-DD HH:MM TZ]` marker) via the new
|
|
138
|
+
`stripOpenClawHeaders()` helper, and falls back to the legacy
|
|
139
|
+
`extractQueryFromMessages` path only when `event.prompt` is absent.
|
|
140
|
+
|
|
141
|
+
Two new exported helpers (`extractUserQuery`, `stripOpenClawHeaders`)
|
|
142
|
+
cover the extraction logic and are unit-tested with 13 cases including
|
|
143
|
+
the exact 24 KB regression scenario.
|
|
144
|
+
|
|
145
|
+
### Migration
|
|
146
|
+
|
|
147
|
+
Drop-in patch — no config change required. `update` the plugin and
|
|
148
|
+
restart the gateway:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
sudo docker exec openclaw-jerome openclaw plugins update @lacneu/openclaw-knowledge
|
|
152
|
+
sudo docker exec openclaw-olivier openclaw plugins update @lacneu/openclaw-knowledge
|
|
153
|
+
sudo docker restart openclaw-jerome openclaw-olivier
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
After the restart, `[knowledge.event]` logs should show `queryLength`
|
|
157
|
+
in the tens-to-hundreds range on normal CLI turns (down from
|
|
158
|
+
~24 000 in 3.2.0).
|
|
159
|
+
|
|
160
|
+
### Envelope-stripping contract
|
|
161
|
+
|
|
162
|
+
The OpenClaw envelope produced by `event.prompt` follows this grammar:
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
( <header> "(" ("untrusted"|"metadata") <variant> "):" \n ``` <body> ``` \n+ ){0,8}
|
|
166
|
+
( [ <day> YYYY-MM-DD HH:MM[:SS] <tz> ] )?
|
|
167
|
+
<user utterance>
|
|
168
|
+
( <header> "(" ("untrusted"|"metadata") <variant> "):" <anything> EOF )?
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
The trailing suffix's body can be a fenced code block OR raw lines
|
|
172
|
+
(e.g. `<<<EXTERNAL_UNTRUSTED_CONTENT` / `Source:` markers). We anchor
|
|
173
|
+
on the header line only and drop everything after it.
|
|
174
|
+
|
|
175
|
+
`stripOpenClawHeaders` matches this shape anchored at the start:
|
|
176
|
+
|
|
177
|
+
- ZERO to EIGHT inbound-context blocks whose header contains any
|
|
178
|
+
`(untrusted …)` sentinel — covers the six SDK-known sentinels
|
|
179
|
+
(`Sender`, `Conversation info`, `Thread starter`, `Replied message`,
|
|
180
|
+
`Forwarded message context`, `Chat history since last reply`) plus
|
|
181
|
+
headroom for future additions.
|
|
182
|
+
- An OPTIONAL timestamp marker that can appear EITHER before OR after
|
|
183
|
+
the metadata blocks. Both `block+ ts?` (legacy CLI path) and
|
|
184
|
+
`ts blocks+` (timestamp-first injection path) are accepted because
|
|
185
|
+
production traces show the SDK emits both orderings. CLI turns
|
|
186
|
+
include the marker; webchat / Telegram channels can embed the
|
|
187
|
+
timestamp inside the `Conversation info` JSON instead. When present,
|
|
188
|
+
the TZ suffix is permissive (`[^\]\n]+`) so it accepts named
|
|
189
|
+
abbreviations (`EDT`, `UTC`, …) AND `Intl.DateTimeFormat` offsets
|
|
190
|
+
(`GMT+2`, `GMT+5:30`, `UTC-5`).
|
|
191
|
+
- The leading anchor preserves user content that itself contains
|
|
192
|
+
timestamp-shaped substrings (e.g. a pasted log excerpt).
|
|
193
|
+
- The hard cap of `MAX_ENVELOPE_BLOCKS + 2` iterations bounds the
|
|
194
|
+
regex engine's worst-case cost on malformed input.
|
|
195
|
+
|
|
196
|
+
`extractUserQuery` is authoritative on `event.prompt`: when the SDK
|
|
197
|
+
supplies it, the result of `stripOpenClawHeaders` is returned as-is,
|
|
198
|
+
even when empty. The legacy `extractQueryFromMessages(event.messages)`
|
|
199
|
+
fallback is only taken when `event.prompt` is `undefined` (older SDK).
|
|
200
|
+
Downstream `MIN_QUERY_LENGTH` drops empty results, so the
|
|
201
|
+
present-but-empty case is safe.
|
|
202
|
+
|
|
203
|
+
### Test coverage
|
|
204
|
+
|
|
205
|
+
- Total: 223 tests, all green.
|
|
206
|
+
- 34 tests in `test/extract-query.test.ts` covering both helpers,
|
|
207
|
+
including the v3.2.0 regression scenario (146-char prompt vs 24 KB
|
|
208
|
+
messages aggregate), the Codex pass #7 regression (empty-stripped
|
|
209
|
+
prompt MUST NOT fall back to the messages aggregate), the Codex
|
|
210
|
+
pass #8 regression (inner timestamp in user content MUST NOT trigger
|
|
211
|
+
stripping), the Codex pass #9 regression (multiple stacked metadata
|
|
212
|
+
blocks before the marker MUST all be stripped), the Codex pass #10
|
|
213
|
+
regression (`(untrusted, for context)` sentinel + GMT/UTC offset TZ
|
|
214
|
+
formats), and the Codex pass #24 regression (timestamp-first envelope
|
|
215
|
+
ordering: `[Sat …] Sender (untrusted metadata): … user query`).
|
|
216
|
+
|
|
10
217
|
## [3.2.0] - 2026-05-23
|
|
11
218
|
|
|
12
219
|
### Added — Jina-powered router (`jina.router.*`)
|
|
@@ -470,7 +677,8 @@ For instance owners on `@lacneu/openclaw-knowledge@3.1.0` or `3.1.1`:
|
|
|
470
677
|
- Release workflow: creates GitHub Release with tarball on tag push.
|
|
471
678
|
- Architecture, lifecycle, and sequence diagrams in `schemas/`.
|
|
472
679
|
|
|
473
|
-
[Unreleased]: https://github.com/OlivierNeu/openclaw-knowledge-plugin/compare/v3.2.
|
|
680
|
+
[Unreleased]: https://github.com/OlivierNeu/openclaw-knowledge-plugin/compare/v3.2.1...HEAD
|
|
681
|
+
[3.2.1]: https://github.com/OlivierNeu/openclaw-knowledge-plugin/compare/v3.2.0...v3.2.1
|
|
474
682
|
[3.2.0]: https://github.com/OlivierNeu/openclaw-knowledge-plugin/compare/v3.1.2...v3.2.0
|
|
475
683
|
[3.1.0]: https://github.com/OlivierNeu/openclaw-knowledge-plugin/compare/v1.2.0...v3.1.0
|
|
476
684
|
[1.2.0]: https://github.com/OlivierNeu/openclaw-knowledge-plugin/compare/v1.1.2...v1.2.0
|
package/dist/config.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
//
|
|
3
3
|
// These helpers are the only place that touches `process.env`, keeping the
|
|
4
4
|
// rest of the plugin easy to test with deterministic values.
|
|
5
|
+
import { DEFAULT_MIN_CONFIDENCE } from "./router/index.js";
|
|
5
6
|
/**
|
|
6
7
|
* Expand `${VAR_NAME}` patterns in a config string against `process.env`.
|
|
7
8
|
* Non-string values are returned untouched so the helper can be used on any
|
|
@@ -15,6 +16,16 @@ export function resolveEnv(value) {
|
|
|
15
16
|
return process.env[name] ?? "";
|
|
16
17
|
});
|
|
17
18
|
}
|
|
19
|
+
/** Clamp a finite number into `[0, 1]`. Non-finite values fall back to `0`. */
|
|
20
|
+
function clamp01(value) {
|
|
21
|
+
if (!Number.isFinite(value))
|
|
22
|
+
return 0;
|
|
23
|
+
if (value < 0)
|
|
24
|
+
return 0;
|
|
25
|
+
if (value > 1)
|
|
26
|
+
return 1;
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
18
29
|
const DEFAULT_POSTGRES_URL = "postgresql://openclaw:@postgresql:5432/knowledge";
|
|
19
30
|
const DEFAULT_COLLECTIONS = ["knowledge_default"];
|
|
20
31
|
const DEFAULT_TOP_K = 5;
|
|
@@ -23,6 +34,15 @@ const DEFAULT_MAX_INJECT_CHARS = 4000;
|
|
|
23
34
|
const DEFAULT_LIGHTRAG_MODE = "hybrid";
|
|
24
35
|
const DEFAULT_LIGHTRAG_MAX_CHARS = 4000;
|
|
25
36
|
const DEFAULT_ROUTER_MODE = "heuristic";
|
|
37
|
+
// The router's confidence floor is owned by `src/router/index.ts`
|
|
38
|
+
// (`DEFAULT_MIN_CONFIDENCE`). Re-export of a local alias would create
|
|
39
|
+
// two sources of truth — we import the single constant instead.
|
|
40
|
+
//
|
|
41
|
+
// Empirical observation on jerome's traces (v3.2.1 deployment): Jina v3
|
|
42
|
+
// zero-shot scores cluster at 0.25-0.27 when no label actually matches
|
|
43
|
+
// the query, then resolve to a noisy `NONE` decision that wrongly
|
|
44
|
+
// blocks retrieval. A floor of 0.35 catches that noise band while
|
|
45
|
+
// staying below typical hit scores (≈ 0.40-0.65).
|
|
26
46
|
const DEFAULT_RERANKER_MODEL = "jina-reranker-v2-base-multilingual";
|
|
27
47
|
const DEFAULT_RERANKER_TOP_N = 5;
|
|
28
48
|
/**
|
|
@@ -66,6 +86,9 @@ export function resolveConfig(cfg = {}) {
|
|
|
66
86
|
routerEnabled: router.enabled === true,
|
|
67
87
|
routerMode: router.mode ?? DEFAULT_ROUTER_MODE,
|
|
68
88
|
routerClassifierId,
|
|
89
|
+
// Clamp to [0, 1] to keep the classifier comparison well-defined
|
|
90
|
+
// even when a misconfigured value sneaks past the JSON schema.
|
|
91
|
+
routerMinConfidence: clamp01(router.minConfidence ?? DEFAULT_MIN_CONFIDENCE),
|
|
69
92
|
// Pgvector reranker — disabled by default. Requires both the toggle
|
|
70
93
|
// and a Jina key to actually activate at runtime (the handler checks
|
|
71
94
|
// this combination before calling).
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,EAAE;AACF,2EAA2E;AAC3E,6DAA6D;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { OpenClawPluginApi, PluginLogger } from "openclaw/plugin-sdk/plugin-entry";
|
|
2
2
|
import type { Route } from "./router/types.js";
|
|
3
|
-
import type { BeforePromptBuildEvent, BeforePromptBuildResult, PgPoolLike, PluginHookAgentContext, ResolvedKnowledgeConfig } from "./types.js";
|
|
3
|
+
import type { BeforePromptBuildEvent, BeforePromptBuildResult, PgPoolLike, PluginHookAgentContext, PromptMessage, ResolvedKnowledgeConfig } from "./types.js";
|
|
4
4
|
export { resolveEnv, resolveConfig } from "./config.js";
|
|
5
5
|
export { embedQuery } from "./embeddings.js";
|
|
6
6
|
export { searchCollection, formatPgvectorResults, rerankPgvectorResults, } from "./pgvector.js";
|
|
@@ -36,6 +36,42 @@ export declare function createBeforePromptBuildHandler(deps: HookHandlerDeps): (
|
|
|
36
36
|
* Exported for unit testing.
|
|
37
37
|
*/
|
|
38
38
|
export declare function projectRouteOnEnabledSources(route: Route, pgvectorEnabled: boolean, lightragEnabled: boolean): Route;
|
|
39
|
+
/**
|
|
40
|
+
* Strip the OpenClaw envelope (inbound-context blocks + timestamp
|
|
41
|
+
* marker) from the START of a raw user prompt and return only the user
|
|
42
|
+
* utterance. When no envelope is matched, the prompt is returned
|
|
43
|
+
* unchanged — the router then sees the full user content, which is the
|
|
44
|
+
* correct behavior for non-OpenClaw inputs.
|
|
45
|
+
*
|
|
46
|
+
* @internal exported for unit testing
|
|
47
|
+
*/
|
|
48
|
+
export declare function stripOpenClawHeaders(prompt: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Extract the user question from a `before_prompt_build` event.
|
|
51
|
+
*
|
|
52
|
+
* - When `event.prompt` is supplied (SDK 2026.5.0+), it is the
|
|
53
|
+
* authoritative source for the raw user utterance: this function
|
|
54
|
+
* strips the OpenClaw envelope and returns the result, even when the
|
|
55
|
+
* result is empty. `event.messages` is NOT consulted in this case
|
|
56
|
+
* because it carries the aggregated conversation window (multi-KB
|
|
57
|
+
* blob optimized for LLM consumption, not for plugin inspection).
|
|
58
|
+
* - When `event.prompt` is absent (older SDK), fall back to
|
|
59
|
+
* `extractQueryFromMessages(event.messages)`.
|
|
60
|
+
*
|
|
61
|
+
* The downstream `MIN_QUERY_LENGTH` check drops empty or near-empty
|
|
62
|
+
* results, so silently returning `""` from the `prompt` path is safe.
|
|
63
|
+
*
|
|
64
|
+
* @internal exported for unit testing
|
|
65
|
+
*/
|
|
66
|
+
export declare function extractUserQuery(event: BeforePromptBuildEvent): string;
|
|
67
|
+
/**
|
|
68
|
+
* Legacy extraction from `event.messages`, used only when the SDK does
|
|
69
|
+
* not populate `event.prompt`. On 2026.5.x+ the primary path is
|
|
70
|
+
* {@link extractUserQuery}.
|
|
71
|
+
*
|
|
72
|
+
* @internal exported for unit testing and backward compatibility
|
|
73
|
+
*/
|
|
74
|
+
export declare function extractQueryFromMessages(messages: PromptMessage[] | undefined): string;
|
|
39
75
|
/**
|
|
40
76
|
* Register the plugin against a minimal shape-compatible subset of the
|
|
41
77
|
* OpenClaw plugin API. Returns nothing; side effects are setting a hook and
|
package/dist/index.js
CHANGED
|
@@ -66,7 +66,7 @@ export function createBeforePromptBuildHandler(deps) {
|
|
|
66
66
|
if (isInCooldown(cooldowns.global))
|
|
67
67
|
return undefined;
|
|
68
68
|
}
|
|
69
|
-
const query =
|
|
69
|
+
const query = extractUserQuery(event);
|
|
70
70
|
if (!query || query.trim().length < MIN_QUERY_LENGTH)
|
|
71
71
|
return undefined;
|
|
72
72
|
emitTurnMetadata(logger, ctx?.runId, query.length);
|
|
@@ -216,6 +216,7 @@ async function runRouterWithCooldown(config, ctx, query, cooldown, logger) {
|
|
|
216
216
|
mode: effectiveMode,
|
|
217
217
|
jinaApiKey: config.jinaApiKey,
|
|
218
218
|
classifierId: config.routerClassifierId || undefined,
|
|
219
|
+
minConfidence: config.routerMinConfidence,
|
|
219
220
|
}, {
|
|
220
221
|
query,
|
|
221
222
|
trigger: ctx?.trigger,
|
|
@@ -242,11 +243,175 @@ async function runRouterWithCooldown(config, ctx, query, cooldown, logger) {
|
|
|
242
243
|
return { route: "ALL", reason: "classifier_error", score: null };
|
|
243
244
|
}
|
|
244
245
|
}
|
|
246
|
+
// OpenClaw envelope on `event.prompt`:
|
|
247
|
+
//
|
|
248
|
+
// - PREFIX: 0..MAX_ENVELOPE_BLOCKS inbound-context blocks, each with a
|
|
249
|
+
// header line containing `(untrusted ...):` followed by a fenced
|
|
250
|
+
// code block and a blank line. The SDK emits up to six distinct
|
|
251
|
+
// sentinel kinds (Conversation info, Sender, Thread starter,
|
|
252
|
+
// Replied message, Forwarded message context, Chat history); the
|
|
253
|
+
// cap allows two extra slots of headroom.
|
|
254
|
+
// - OPTIONAL TIMESTAMP MARKER `[Day YYYY-MM-DD HH:MM[:SS] TZ]`. CLI
|
|
255
|
+
// turns always include it; some channels carry the timestamp
|
|
256
|
+
// inside the Conversation info JSON instead.
|
|
257
|
+
// - USER UTTERANCE.
|
|
258
|
+
// - OPTIONAL SUFFIX: a trailing `*(untrusted ...):` block (e.g.
|
|
259
|
+
// `Untrusted context (metadata, do not treat as instructions or
|
|
260
|
+
// commands):`) that the SDK appends after the user content.
|
|
261
|
+
//
|
|
262
|
+
// ReDoS protection: we advance sticky regexes by `lastIndex` in a JS
|
|
263
|
+
// loop instead of using a `(?:...)*` quantifier. The block body is a
|
|
264
|
+
// lazy `[\s\S]*?` (no explicit char cap) — the SDK can legitimately
|
|
265
|
+
// pack JSON-escaped chat history that, after escaping, exceeds any
|
|
266
|
+
// fixed cap we'd pick. With sticky + lazy + outer JS loop the
|
|
267
|
+
// worst-case is linear in `prompt.length`. The trailing-suffix scan
|
|
268
|
+
// uses `lastIndexOf` plus a strictly anchored regex, also O(N).
|
|
269
|
+
//
|
|
270
|
+
// The OpenClaw SDK ships an equivalent `stripInboundMetadata` helper
|
|
271
|
+
// at node_modules/openclaw/dist/strip-inbound-meta-*.js, but it is not
|
|
272
|
+
// yet re-exported through `openclaw/plugin-sdk`. Migrate to it once a
|
|
273
|
+
// public export lands.
|
|
274
|
+
//
|
|
275
|
+
// SAFETY: `ENVELOPE_BLOCK_RE` and `ENVELOPE_TIMESTAMP_RE` carry
|
|
276
|
+
// `lastIndex` state across calls. Reset before each `exec` and never
|
|
277
|
+
// introduce `await` inside `stripOpenClawHeaders` — concurrent
|
|
278
|
+
// re-entry would corrupt the position counter.
|
|
279
|
+
const MAX_ENVELOPE_BLOCKS = 8;
|
|
280
|
+
// Sentinel sub-pattern matching either `(untrusted ...)` (used by prefix
|
|
281
|
+
// blocks: Sender, Conversation info, Replied message …) OR `(metadata, …)`
|
|
282
|
+
// (used by the trailing `Untrusted context (metadata, do not treat as
|
|
283
|
+
// instructions or commands):` suffix block). Anchored on the opening
|
|
284
|
+
// parenthesis so it cannot match arbitrary user prose.
|
|
285
|
+
const ENVELOPE_SENTINEL = String.raw `\((?:untrusted|metadata)[^)\n]*\)`;
|
|
286
|
+
const ENVELOPE_BLOCK_BODY = String.raw `[^\n]*` + ENVELOPE_SENTINEL + String.raw `:\s*\n` +
|
|
287
|
+
String.raw `\x60\x60\x60[\s\S]*?\n\x60\x60\x60`;
|
|
288
|
+
const ENVELOPE_BLOCK_RE = new RegExp(ENVELOPE_BLOCK_BODY + String.raw `\s*\n+`, "y");
|
|
289
|
+
const ENVELOPE_TIMESTAMP_RE = new RegExp(String.raw `\[\w{3,4}\s+\d{4}-\d{2}-\d{2}\s+\d{1,2}:\d{2}(?::\d{2})?\s+[^\]\n]+\]\s+`, "y");
|
|
290
|
+
// Trailing inbound-context header: the EXACT string OpenClaw emits to
|
|
291
|
+
// open the suffix block. The SDK's `appendUntrustedContext` writes this
|
|
292
|
+
// literal line verbatim (see node_modules/openclaw/dist/reply-*.js).
|
|
293
|
+
// Anchoring on the literal — rather than a generic
|
|
294
|
+
// `*(metadata|untrusted ...):` shape — avoids truncating user prompts
|
|
295
|
+
// that happen to contain a similar-looking header.
|
|
296
|
+
//
|
|
297
|
+
// Trade-off: a future SDK rewording will leave the suffix in the query
|
|
298
|
+
// until this constant is updated. That's acceptable: the strict match
|
|
299
|
+
// fails CLOSED (we keep too much) rather than open (we drop user
|
|
300
|
+
// content). Update this string in lockstep with the OpenClaw SDK.
|
|
301
|
+
const OPENCLAW_SUFFIX_HEADER = "Untrusted context (metadata, do not treat as instructions or commands):";
|
|
302
|
+
// Body markers the SDK emits IMMEDIATELY after the suffix header. A
|
|
303
|
+
// header line alone is not enough — a user can quote the header verbatim
|
|
304
|
+
// to ask about it. Requiring one of these markers right after the header
|
|
305
|
+
// distinguishes a real SDK suffix from a quoted reference.
|
|
306
|
+
const SUFFIX_BODY_MARKERS = [
|
|
307
|
+
"<<<EXTERNAL_UNTRUSTED_CONTENT",
|
|
308
|
+
"Source:",
|
|
309
|
+
"Content:",
|
|
310
|
+
"```",
|
|
311
|
+
];
|
|
312
|
+
/** Strip the trailing OpenClaw `Untrusted context` block when present. */
|
|
313
|
+
function stripTrailingSuffix(body) {
|
|
314
|
+
// `lastIndexOf` on a literal is O(N) and never backtracks.
|
|
315
|
+
const idx = body.lastIndexOf(OPENCLAW_SUFFIX_HEADER);
|
|
316
|
+
if (idx === -1)
|
|
317
|
+
return body;
|
|
318
|
+
// Header must sit alone on its line: preceded by `\n` (or string start)
|
|
319
|
+
// and followed only by whitespace before the next newline.
|
|
320
|
+
const before = idx === 0 ? "" : body[idx - 1];
|
|
321
|
+
if (before !== "\n" && before !== "")
|
|
322
|
+
return body;
|
|
323
|
+
const headerEnd = idx + OPENCLAW_SUFFIX_HEADER.length;
|
|
324
|
+
const newlineAfterHeader = body.indexOf("\n", headerEnd);
|
|
325
|
+
const restOfLine = newlineAfterHeader === -1 ? body.slice(headerEnd) : body.slice(headerEnd, newlineAfterHeader);
|
|
326
|
+
if (restOfLine.trim().length !== 0)
|
|
327
|
+
return body;
|
|
328
|
+
// The header alone is ambiguous (a user could be quoting it). Strip
|
|
329
|
+
// only when the body that follows begins with one of the markers the
|
|
330
|
+
// SDK actually emits.
|
|
331
|
+
const afterHeader = newlineAfterHeader === -1 ? "" : body.slice(newlineAfterHeader + 1).trimStart();
|
|
332
|
+
if (!SUFFIX_BODY_MARKERS.some((m) => afterHeader.startsWith(m)))
|
|
333
|
+
return body;
|
|
334
|
+
return body.slice(0, idx).trimEnd();
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Strip the OpenClaw envelope (inbound-context blocks + timestamp
|
|
338
|
+
* marker) from the START of a raw user prompt and return only the user
|
|
339
|
+
* utterance. When no envelope is matched, the prompt is returned
|
|
340
|
+
* unchanged — the router then sees the full user content, which is the
|
|
341
|
+
* correct behavior for non-OpenClaw inputs.
|
|
342
|
+
*
|
|
343
|
+
* @internal exported for unit testing
|
|
344
|
+
*/
|
|
345
|
+
export function stripOpenClawHeaders(prompt) {
|
|
346
|
+
if (prompt.length === 0)
|
|
347
|
+
return prompt;
|
|
348
|
+
let pos = 0;
|
|
349
|
+
let blocksConsumed = 0;
|
|
350
|
+
let markerMatched = false;
|
|
351
|
+
// The SDK ships both orderings observed in production:
|
|
352
|
+
// - `block+ timestamp? user` (legacy CLI path)
|
|
353
|
+
// - `timestamp blocks+ user` (timestamp-first injection path)
|
|
354
|
+
// We tolerate any interleaving by attempting both regexes each turn
|
|
355
|
+
// and stopping when neither advances. The iteration cap is
|
|
356
|
+
// `MAX_ENVELOPE_BLOCKS + 2` to allow at most one leading and one
|
|
357
|
+
// trailing timestamp around the blocks.
|
|
358
|
+
for (let i = 0; i < MAX_ENVELOPE_BLOCKS + 2; i++) {
|
|
359
|
+
ENVELOPE_BLOCK_RE.lastIndex = pos;
|
|
360
|
+
if (ENVELOPE_BLOCK_RE.exec(prompt) !== null) {
|
|
361
|
+
pos = ENVELOPE_BLOCK_RE.lastIndex;
|
|
362
|
+
blocksConsumed++;
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
ENVELOPE_TIMESTAMP_RE.lastIndex = pos;
|
|
366
|
+
if (!markerMatched && ENVELOPE_TIMESTAMP_RE.exec(prompt) !== null) {
|
|
367
|
+
pos = ENVELOPE_TIMESTAMP_RE.lastIndex;
|
|
368
|
+
markerMatched = true;
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
if (blocksConsumed === 0 && !markerMatched) {
|
|
374
|
+
// No prefix envelope detected — but a trailing suffix block may
|
|
375
|
+
// still be present (e.g. a webchat turn where only the
|
|
376
|
+
// `Untrusted context (metadata, ...)` block is appended). Probe
|
|
377
|
+
// for it before returning. When no suffix matches either, return
|
|
378
|
+
// the prompt unchanged.
|
|
379
|
+
const trailingStripped = stripTrailingSuffix(prompt);
|
|
380
|
+
return trailingStripped === prompt ? prompt : trailingStripped.trim();
|
|
381
|
+
}
|
|
382
|
+
return stripTrailingSuffix(prompt.slice(pos).trim());
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Extract the user question from a `before_prompt_build` event.
|
|
386
|
+
*
|
|
387
|
+
* - When `event.prompt` is supplied (SDK 2026.5.0+), it is the
|
|
388
|
+
* authoritative source for the raw user utterance: this function
|
|
389
|
+
* strips the OpenClaw envelope and returns the result, even when the
|
|
390
|
+
* result is empty. `event.messages` is NOT consulted in this case
|
|
391
|
+
* because it carries the aggregated conversation window (multi-KB
|
|
392
|
+
* blob optimized for LLM consumption, not for plugin inspection).
|
|
393
|
+
* - When `event.prompt` is absent (older SDK), fall back to
|
|
394
|
+
* `extractQueryFromMessages(event.messages)`.
|
|
395
|
+
*
|
|
396
|
+
* The downstream `MIN_QUERY_LENGTH` check drops empty or near-empty
|
|
397
|
+
* results, so silently returning `""` from the `prompt` path is safe.
|
|
398
|
+
*
|
|
399
|
+
* @internal exported for unit testing
|
|
400
|
+
*/
|
|
401
|
+
export function extractUserQuery(event) {
|
|
402
|
+
if (typeof event.prompt === "string") {
|
|
403
|
+
return stripOpenClawHeaders(event.prompt);
|
|
404
|
+
}
|
|
405
|
+
return extractQueryFromMessages(event.messages);
|
|
406
|
+
}
|
|
245
407
|
/**
|
|
246
|
-
*
|
|
247
|
-
*
|
|
408
|
+
* Legacy extraction from `event.messages`, used only when the SDK does
|
|
409
|
+
* not populate `event.prompt`. On 2026.5.x+ the primary path is
|
|
410
|
+
* {@link extractUserQuery}.
|
|
411
|
+
*
|
|
412
|
+
* @internal exported for unit testing and backward compatibility
|
|
248
413
|
*/
|
|
249
|
-
function extractQueryFromMessages(messages) {
|
|
414
|
+
export function extractQueryFromMessages(messages) {
|
|
250
415
|
if (!Array.isArray(messages) || messages.length === 0)
|
|
251
416
|
return "";
|
|
252
417
|
for (let i = messages.length - 1; i >= 0; i--) {
|
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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"}
|
package/dist/router/index.d.ts
CHANGED
|
@@ -15,7 +15,31 @@ export interface RouterConfig {
|
|
|
15
15
|
labels?: readonly string[];
|
|
16
16
|
/** Triggers that bypass retrieval (subset of NON_USER_TRIGGERS). */
|
|
17
17
|
skipTriggers?: readonly string[];
|
|
18
|
+
/**
|
|
19
|
+
* Minimum classifier confidence (cosine similarity in `[0, 1]`) required
|
|
20
|
+
* to trust a classifier prediction. When `outcome.score` is below this
|
|
21
|
+
* threshold, the router fails open to `ALL` with reason
|
|
22
|
+
* `"classifier_low_confidence"` rather than acting on a noisy decision.
|
|
23
|
+
*
|
|
24
|
+
* Optional in the public interface so external JS callers that pre-date
|
|
25
|
+
* v3.2.2 still benefit from the guard via {@link DEFAULT_MIN_CONFIDENCE}.
|
|
26
|
+
* The internal call site in `src/index.ts` always passes a resolved,
|
|
27
|
+
* clamped value (see `ResolvedKnowledgeConfig.routerMinConfidence`).
|
|
28
|
+
*
|
|
29
|
+
* Rationale: Jina v3 zero-shot scores cluster around 0.25 when none of
|
|
30
|
+
* the labels actually match the query. Acting on those quasi-random
|
|
31
|
+
* predictions (especially `NONE`) silently blocks legitimate retrieval.
|
|
32
|
+
* Trusting only confident scores keeps the gate fail-safe.
|
|
33
|
+
*/
|
|
34
|
+
minConfidence?: number;
|
|
18
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Default applied by {@link decideRoute} when a caller omits
|
|
38
|
+
* `minConfidence` (e.g. older JS plugins that haven't migrated to the
|
|
39
|
+
* 3.2.2 shape). Matches the production default in `src/config.ts` —
|
|
40
|
+
* keep both constants in sync.
|
|
41
|
+
*/
|
|
42
|
+
export declare const DEFAULT_MIN_CONFIDENCE = 0.35;
|
|
19
43
|
export interface RouterRuntimeContext {
|
|
20
44
|
query: string;
|
|
21
45
|
trigger?: string;
|
package/dist/router/index.js
CHANGED
|
@@ -14,6 +14,23 @@ import { classifyFewShot, classifyZeroShot, } from "../jina/classifier.js";
|
|
|
14
14
|
import { JinaError } from "../jina/errors.js";
|
|
15
15
|
import { DEFAULT_ROUTER_LABELS, ROUTER_LABEL_NAMES, extractRouteFromLabel, } from "./labels.js";
|
|
16
16
|
import { heuristicRoute } from "./heuristic.js";
|
|
17
|
+
/**
|
|
18
|
+
* Default applied by {@link decideRoute} when a caller omits
|
|
19
|
+
* `minConfidence` (e.g. older JS plugins that haven't migrated to the
|
|
20
|
+
* 3.2.2 shape). Matches the production default in `src/config.ts` —
|
|
21
|
+
* keep both constants in sync.
|
|
22
|
+
*/
|
|
23
|
+
export const DEFAULT_MIN_CONFIDENCE = 0.35;
|
|
24
|
+
/** Clamp a finite number into `[0, 1]`. Non-finite values fall back to `0`. */
|
|
25
|
+
function clampConfidence(value) {
|
|
26
|
+
if (!Number.isFinite(value))
|
|
27
|
+
return 0;
|
|
28
|
+
if (value < 0)
|
|
29
|
+
return 0;
|
|
30
|
+
if (value > 1)
|
|
31
|
+
return 1;
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
17
34
|
const FALLBACK = "ALL";
|
|
18
35
|
/**
|
|
19
36
|
* Decide the route for one user turn.
|
|
@@ -22,6 +39,10 @@ const FALLBACK = "ALL";
|
|
|
22
39
|
* uses `route` to gate source calls.
|
|
23
40
|
*/
|
|
24
41
|
export async function decideRoute(cfg, ctx) {
|
|
42
|
+
// Normalize the confidence threshold once at function entry so the
|
|
43
|
+
// low-confidence guard applies uniformly to every caller, including
|
|
44
|
+
// external JS plugins that may pass an undefined / out-of-range value.
|
|
45
|
+
const minConfidence = clampConfidence(cfg.minConfidence ?? DEFAULT_MIN_CONFIDENCE);
|
|
25
46
|
// 0. Disabled → preserve legacy behavior.
|
|
26
47
|
if (!cfg.enabled) {
|
|
27
48
|
return { route: "ALL", reason: "router_disabled", score: null };
|
|
@@ -71,6 +92,19 @@ export async function decideRoute(cfg, ctx) {
|
|
|
71
92
|
if (!isKnownRoute(routeName)) {
|
|
72
93
|
return { route: FALLBACK, reason: "classifier_fallback", score: outcome.score };
|
|
73
94
|
}
|
|
95
|
+
// Low-confidence guard: a classifier score below `minConfidence`
|
|
96
|
+
// means none of the labels actually matched the query (the engine
|
|
97
|
+
// just picked the least-bad one). Trusting it would silently block
|
|
98
|
+
// retrieval on legitimate questions. Fail open and log the score.
|
|
99
|
+
// A `null` score also fails open: when Jina omits the score field
|
|
100
|
+
// we cannot prove the prediction is confident.
|
|
101
|
+
if (outcome.score === null || outcome.score < minConfidence) {
|
|
102
|
+
return {
|
|
103
|
+
route: FALLBACK,
|
|
104
|
+
reason: "classifier_low_confidence",
|
|
105
|
+
score: outcome.score,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
74
108
|
return {
|
|
75
109
|
route: routeName,
|
|
76
110
|
reason: "classifier_hit",
|
package/dist/router/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,2EAA2E;AAC3E,kEAAkE;AAClE,EAAE;AACF,+BAA+B;AAC/B,sEAAsE;AACtE,kDAAkD;AAClD,sEAAsE;AACtE,oEAAoE;AACpE,sEAAsE;AACtE,iDAAiD;AAEjD,OAAO,EACL,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"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"}
|
package/dist/router/types.d.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
export type Route = "NONE" | "PGVECTOR_ONLY" | "LIGHTRAG_ONLY" | "ALL";
|
|
16
16
|
/** Source of a router decision — used in logs to trace the reasoning path. */
|
|
17
|
-
export type RouterReason = "router_disabled" | "heuristic_trigger" | "heuristic_meta" | "heuristic_short" | "heuristic_keyword" | "classifier_hit" | "classifier_fallback" | "classifier_error";
|
|
17
|
+
export type RouterReason = "router_disabled" | "heuristic_trigger" | "heuristic_meta" | "heuristic_short" | "heuristic_keyword" | "classifier_hit" | "classifier_low_confidence" | "classifier_fallback" | "classifier_error";
|
|
18
18
|
export interface RouterDecision {
|
|
19
19
|
route: Route;
|
|
20
20
|
reason: RouterReason;
|
package/dist/types.d.ts
CHANGED
|
@@ -55,6 +55,13 @@ export interface RouterPluginConfig {
|
|
|
55
55
|
* `POST /v1/train` — the plugin does NOT implement training.
|
|
56
56
|
*/
|
|
57
57
|
classifierId?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Minimum classifier confidence (cosine similarity in `[0, 1]`) required
|
|
60
|
+
* to trust a classifier prediction. When the top score is below this
|
|
61
|
+
* threshold, the router fails open to `ALL` rather than acting on a
|
|
62
|
+
* noisy decision. Default: `0.35`.
|
|
63
|
+
*/
|
|
64
|
+
minConfidence?: number;
|
|
58
65
|
}
|
|
59
66
|
export interface PgvectorRerankerPluginConfig {
|
|
60
67
|
enabled?: boolean;
|
|
@@ -86,6 +93,12 @@ export interface ResolvedKnowledgeConfig {
|
|
|
86
93
|
routerEnabled: boolean;
|
|
87
94
|
routerMode: "heuristic" | "jina-classifier";
|
|
88
95
|
routerClassifierId: string;
|
|
96
|
+
/**
|
|
97
|
+
* Minimum classifier confidence (cosine similarity in `[0, 1]`) required
|
|
98
|
+
* to act on a classifier prediction. Below this threshold the router
|
|
99
|
+
* fails open to `ALL`. See `RouterConfig.minConfidence` for rationale.
|
|
100
|
+
*/
|
|
101
|
+
routerMinConfidence: number;
|
|
89
102
|
pgvectorRerankerEnabled: boolean;
|
|
90
103
|
pgvectorRerankerModel: RerankerModel;
|
|
91
104
|
pgvectorRerankerTopN: number;
|
|
@@ -138,13 +151,16 @@ export interface PgvectorRow {
|
|
|
138
151
|
}
|
|
139
152
|
/**
|
|
140
153
|
* Shape of the `before_prompt_build` event payload as consumed by this plugin.
|
|
141
|
-
* We only rely on `messages`; the SDK may add other fields that we ignore.
|
|
142
154
|
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
155
|
+
* As of v3.2.1, `prompt` is the PRIMARY source for the user query — it is
|
|
156
|
+
* the raw user text surfaced by the SDK, distinct from `messages` which may
|
|
157
|
+
* aggregate the full conversation window (with summaries, system prompt
|
|
158
|
+
* fragments, etc.). The handler reads `prompt` first; `messages` remains
|
|
159
|
+
* as a legacy fallback for SDK versions that do not populate it.
|
|
146
160
|
*/
|
|
147
161
|
export interface BeforePromptBuildEvent {
|
|
162
|
+
/** Raw user prompt for this turn. SDK >= 2026.5.0. */
|
|
163
|
+
prompt?: string;
|
|
148
164
|
messages?: PromptMessage[];
|
|
149
165
|
}
|
|
150
166
|
export interface PromptMessage {
|
package/openclaw.plugin.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "openclaw-knowledge",
|
|
3
3
|
"name": "Knowledge Base",
|
|
4
4
|
"description": "Multi-source knowledge search (pgvector + LightRAG) with optional Jina-powered router & reranker — injects relevant documents and knowledge graph context before each turn via the before_prompt_build hook",
|
|
5
|
-
"version": "3.2.
|
|
5
|
+
"version": "3.2.2",
|
|
6
6
|
"activation": {
|
|
7
7
|
"onStartup": true
|
|
8
8
|
},
|
|
@@ -105,6 +105,13 @@
|
|
|
105
105
|
"classifierId": {
|
|
106
106
|
"type": "string",
|
|
107
107
|
"description": "Optional pre-trained Jina classifier_id (few-shot mode). Train it out-of-band via POST /v1/train then paste the ID here. When omitted, the router uses zero-shot with built-in labels."
|
|
108
|
+
},
|
|
109
|
+
"minConfidence": {
|
|
110
|
+
"type": "number",
|
|
111
|
+
"minimum": 0,
|
|
112
|
+
"maximum": 1,
|
|
113
|
+
"default": 0.35,
|
|
114
|
+
"description": "Minimum classifier confidence (cosine similarity 0–1) required to trust a classifier prediction. Scores below this floor fail open to ALL with reason classifier_low_confidence. Default 0.35 — observed noise floor on Jina v3 zero-shot when no label matches."
|
|
108
115
|
}
|
|
109
116
|
}
|
|
110
117
|
},
|
|
@@ -226,6 +233,11 @@
|
|
|
226
233
|
"advanced": true,
|
|
227
234
|
"help": "Optional. When set, the router uses your pre-trained classifier instead of zero-shot labels."
|
|
228
235
|
},
|
|
236
|
+
"jina.router.minConfidence": {
|
|
237
|
+
"label": "Classifier min confidence",
|
|
238
|
+
"advanced": true,
|
|
239
|
+
"help": "Floor on classifier score (0–1). Below this, the router falls back to ALL. Default 0.35 — keeps NONE decisions safe when zero-shot signal is too weak."
|
|
240
|
+
},
|
|
229
241
|
"jina.pgvectorReranker.enabled": {
|
|
230
242
|
"label": "Enable pgvector reranker",
|
|
231
243
|
"advanced": true,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lacneu/openclaw-knowledge",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Multi-source knowledge plugin for OpenClaw — pgvector + LightRAG injection with optional Jina-powered router & reranker, via before_prompt_build hook",
|
|
6
6
|
"license": "MIT",
|