@cendor/guardrails 0.4.0 → 0.6.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.
package/dist/semantic.js CHANGED
@@ -1,16 +1,19 @@
1
1
  /**
2
- * Similarity checks over a **bring-your-own** embedding function — groundedness + denied-topics. The
3
- * TS port of `cendor.guardrails.semantic`.
2
+ * Similarity checks over a **bring-your-own** embedding function — groundedness, denied-topics, and
3
+ * custom-category. The TS port of `cendor.guardrails.semantic`.
4
4
  *
5
5
  * - `groundedness` — trip when a response is **not** close enough to any provided source (a RAG
6
6
  * hallucination gate).
7
7
  * - `deniedTopics` — trip when the payload is **too** close to any denied-topic exemplar.
8
+ * - `customCategory` — trip when the payload is close to a category you define by example.
8
9
  *
9
- * Both take an `embed(text) => number[]` callable — **you** supply the model (a local
10
- * sentence-transformer, a hosted embeddings endpoint, anything). cendor ships **no** embedding model,
11
- * mirroring `cassette`'s bring-your-own-scorer. Cosine similarity is computed in pure TS (no deps).
12
- * These are heuristics: a threshold you tune, not a guarantee keep an ungrounded answer advisory
13
- * (`action: 'flag'`) unless you have measured your own corpus. For richer, reasoned judgement, use the
10
+ * All take an `embed(text) => number[] | Promise<number[]>` callable — **you** supply the model (a
11
+ * local sentence-transformer, a hosted embeddings endpoint, `embeddings.localEmbedder()`, anything).
12
+ * cendor ships **no** embedding model, mirroring `cassette`'s bring-your-own-scorer. `embed` may be
13
+ * **sync or async**: a sync embed keeps the check sync (usable via `apply` / `install`); an async
14
+ * embed (e.g. a hosted endpoint or `embeddings.localEmbedder()` via transformers.js) makes the check
15
+ * async — run it through `applyAsync` or the SDK loop. Cosine similarity is computed in pure TS.
16
+ * These are heuristics: a threshold you tune, not a guarantee. For richer, reasoned judgement, use the
14
17
  * `judge` LLM-judge helpers instead.
15
18
  *
16
19
  * Imports only `./decision` and reuses `payloadText` from `./rules` (a hoisted function), so the
@@ -23,6 +26,14 @@ function resolveOnError(action, onError) {
23
26
  return onError;
24
27
  return action === 'flag' ? 'fail_open' : 'fail_closed';
25
28
  }
29
+ function isThenable(x) {
30
+ return x != null && typeof x.then === 'function';
31
+ }
32
+ /** Apply `fn` to a value that may be a Promise, staying **sync when the value is sync**. `fn` may
33
+ * itself return a Promise; nested levels flatten (Promise.then), so the result is `R | Promise<R>`. */
34
+ function chain(v, fn) {
35
+ return isThenable(v) ? v.then(fn) : fn(v);
36
+ }
26
37
  function cosine(a, b) {
27
38
  let dot = 0;
28
39
  let na = 0;
@@ -39,12 +50,24 @@ function cosine(a, b) {
39
50
  return 0;
40
51
  return dot / (Math.sqrt(na) * Math.sqrt(nb));
41
52
  }
42
- /** Embed `texts` once, on first check (not at construction — so building an agent makes no call). */
53
+ /**
54
+ * Embed `texts` once, on first check (not at construction — so building an agent makes no call).
55
+ * Returns the vectors synchronously for a sync `embed`, or a Promise for an async one; the result is
56
+ * cached either way.
57
+ */
43
58
  function lazyVectors(embed, texts) {
44
59
  let cache;
45
60
  return () => {
46
- if (cache === undefined)
47
- cache = texts.map((t) => [...embed(t)]);
61
+ if (cache !== undefined)
62
+ return cache;
63
+ const raw = texts.map((t) => embed(t));
64
+ if (raw.some(isThenable)) {
65
+ return Promise.all(raw.map((r) => Promise.resolve(r).then((v) => [...v]))).then((v) => {
66
+ cache = v;
67
+ return v;
68
+ });
69
+ }
70
+ cache = raw.map((r) => [...r]);
48
71
  return cache;
49
72
  };
50
73
  }
@@ -56,43 +79,43 @@ function lazyVectors(embed, texts) {
56
79
  export function groundedness(embed, sources, opts = {}) {
57
80
  const { threshold = 0.75, stage = 'output', action = 'flag', name = 'groundedness', timeout, onError, } = opts;
58
81
  const sourceVecs = lazyVectors(embed, [...sources]);
59
- const check = (payload, _ctx) => {
60
- const vecs = sourceVecs();
82
+ const check = (payload, _ctx) => chain(sourceVecs(), (vecs) => {
61
83
  if (vecs.length === 0)
62
84
  return null;
63
- const answer = [...embed(payloadText(payload))];
64
- const best = vecs.reduce((m, v) => Math.max(m, cosine(answer, v)), 0);
65
- if (best >= threshold)
66
- return null;
67
- return new Verdict(action, `ungrounded: max similarity ${best.toFixed(2)} < ${threshold}`);
68
- };
85
+ return chain(embed(payloadText(payload)), (answer) => {
86
+ const best = vecs.reduce((m, v) => Math.max(m, cosine([...answer], v)), 0);
87
+ if (best >= threshold)
88
+ return null;
89
+ return new Verdict(action, `ungrounded: max similarity ${best.toFixed(2)} < ${threshold}`);
90
+ });
91
+ });
69
92
  return defineGuardrail(check, { name, stage, timeout, onError: resolveOnError(action, onError) });
70
93
  }
71
94
  /**
72
95
  * Trip when the payload is semantically close to a **custom category** you define by example — the
73
- * local, `$0` counterpart to Azure Content Safety's *rapid custom categories* (description + examples
74
- * embedding search), with no cloud call and no training step. Trips when the payload's max cosine
96
+ * local counterpart to Azure Content Safety's *rapid custom categories* (description + examples
97
+ * embedding search), with no cloud call and no training step. Trips when the payload's max cosine
75
98
  * similarity to any example is **at or above** `threshold`, recording `metadata.category` /
76
99
  * `metadata.score`; catches paraphrases `keywordDeny` misses. Defaults to `action:'flag'` (a tuned
77
100
  * heuristic — calibrate before you block). No catch-rate claim; empty `examples` never trips.
78
101
  *
79
- * `embed(text)` is **bring-your-own** — a local sentence-transformer, a hosted endpoint, or e.g. a
80
- * transformers.js pipeline. (There is no zero-config `localEmbedder` in TS yet model2vec is
81
- * Python-only; parity 🚧.)
102
+ * `embed(text)` is **bring-your-own** — sync (keeps the check usable via `apply`) or async (a hosted
103
+ * endpoint / `embeddings.localEmbedder()`, which makes the check async use `applyAsync` / the SDK).
82
104
  */
83
105
  export function customCategory(category, examples, embed, opts = {}) {
84
106
  const { threshold = 0.8, stage = 'input', action = 'flag', name = `custom_category:${category}`, timeout, onError, } = opts;
85
107
  const exampleVecs = lazyVectors(embed, [...examples]);
86
- const check = (payload, _ctx) => {
87
- const vecs = exampleVecs();
108
+ const check = (payload, _ctx) => chain(exampleVecs(), (vecs) => {
88
109
  if (vecs.length === 0)
89
110
  return null;
90
- const query = [...embed(payloadText(payload))];
91
- const best = vecs.reduce((m, v) => Math.max(m, cosine(query, v)), Number.NEGATIVE_INFINITY);
92
- if (best < threshold)
93
- return null;
94
- return new Verdict(action, `custom category ${JSON.stringify(category)}: sim ${best.toFixed(2)} >= ${threshold}`, null, { category, score: Math.round(best * 1e4) / 1e4 });
95
- };
111
+ return chain(embed(payloadText(payload)), (q) => {
112
+ const query = [...q];
113
+ const best = vecs.reduce((m, v) => Math.max(m, cosine(query, v)), Number.NEGATIVE_INFINITY);
114
+ if (best < threshold)
115
+ return null;
116
+ return new Verdict(action, `custom category ${JSON.stringify(category)}: sim ${best.toFixed(2)} >= ${threshold}`, null, { category, score: Math.round(best * 1e4) / 1e4 });
117
+ });
118
+ });
96
119
  return defineGuardrail(check, { name, stage, timeout, onError: resolveOnError(action, onError) });
97
120
  }
98
121
  /**
@@ -104,24 +127,25 @@ export function deniedTopics(embed, topics, opts = {}) {
104
127
  const { threshold = 0.8, stage = 'input', action = 'block', name = 'denied_topics', timeout, onError, } = opts;
105
128
  const topicList = [...topics];
106
129
  const topicVecs = lazyVectors(embed, topicList);
107
- const check = (payload, _ctx) => {
108
- const vecs = topicVecs();
130
+ const check = (payload, _ctx) => chain(topicVecs(), (vecs) => {
109
131
  if (vecs.length === 0)
110
132
  return null;
111
- const query = [...embed(payloadText(payload))];
112
- let bestI = 0;
113
- let bestSim = Number.NEGATIVE_INFINITY;
114
- vecs.forEach((v, i) => {
115
- const s = cosine(query, v);
116
- if (s > bestSim) {
117
- bestSim = s;
118
- bestI = i;
119
- }
133
+ return chain(embed(payloadText(payload)), (q) => {
134
+ const query = [...q];
135
+ let bestI = 0;
136
+ let bestSim = Number.NEGATIVE_INFINITY;
137
+ vecs.forEach((v, i) => {
138
+ const s = cosine(query, v);
139
+ if (s > bestSim) {
140
+ bestSim = s;
141
+ bestI = i;
142
+ }
143
+ });
144
+ if (bestSim < threshold)
145
+ return null;
146
+ return new Verdict(action, `denied topic ${JSON.stringify(topicList[bestI])}: sim ${bestSim.toFixed(2)} >= ${threshold}`);
120
147
  });
121
- if (bestSim < threshold)
122
- return null;
123
- return new Verdict(action, `denied topic ${JSON.stringify(topicList[bestI])}: sim ${bestSim.toFixed(2)} >= ${threshold}`);
124
- };
148
+ });
125
149
  return defineGuardrail(check, { name, stage, timeout, onError: resolveOnError(action, onError) });
126
150
  }
127
151
  //# sourceMappingURL=semantic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../src/semantic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../src/semantic.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cendor/guardrails",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "A local-first gate for LLM apps: define a check — keyword, regex, URL, length, JSON-schema — attach it to a stage (input, tool call, tool output, output). Deterministic, microsecond, $0, and every decision is audit-grade evidence.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -23,7 +23,15 @@
23
23
  "node": ">=18"
24
24
  },
25
25
  "dependencies": {
26
- "@cendor/core": "^0.4.1"
26
+ "@cendor/core": "^0.5.0"
27
+ },
28
+ "peerDependencies": {
29
+ "@huggingface/transformers": ">=3"
30
+ },
31
+ "peerDependenciesMeta": {
32
+ "@huggingface/transformers": {
33
+ "optional": true
34
+ }
27
35
  },
28
36
  "keywords": [
29
37
  "llm",