hippo-memory 1.21.0 → 1.23.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/README.md +2 -1
- package/dist/capture.d.ts.map +1 -1
- package/dist/capture.js +3 -2
- package/dist/capture.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +94 -22
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/customer-notes.d.ts.map +1 -1
- package/dist/customer-notes.js +10 -2
- package/dist/customer-notes.js.map +1 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +264 -1
- package/dist/db.js.map +1 -1
- package/dist/decisions.d.ts.map +1 -1
- package/dist/decisions.js +10 -2
- package/dist/decisions.js.map +1 -1
- package/dist/embedding-provider.d.ts +76 -0
- package/dist/embedding-provider.d.ts.map +1 -0
- package/dist/embedding-provider.js +301 -0
- package/dist/embedding-provider.js.map +1 -0
- package/dist/embeddings.d.ts +1 -0
- package/dist/embeddings.d.ts.map +1 -1
- package/dist/embeddings.js +112 -55
- package/dist/embeddings.js.map +1 -1
- package/dist/graph-extract.d.ts.map +1 -1
- package/dist/graph-extract.js +39 -12
- package/dist/graph-extract.js.map +1 -1
- package/dist/graph-recall.d.ts.map +1 -1
- package/dist/graph-recall.js +11 -1
- package/dist/graph-recall.js.map +1 -1
- package/dist/graph-stream.d.ts.map +1 -1
- package/dist/graph-stream.js +7 -1
- package/dist/graph-stream.js.map +1 -1
- package/dist/graph.d.ts +46 -7
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +129 -29
- package/dist/graph.js.map +1 -1
- package/dist/policies.d.ts.map +1 -1
- package/dist/policies.js +10 -2
- package/dist/policies.js.map +1 -1
- package/dist/project-briefs.d.ts.map +1 -1
- package/dist/project-briefs.js +10 -2
- package/dist/project-briefs.js.map +1 -1
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +31 -13
- package/dist/search.js.map +1 -1
- package/dist/src/capture.js +3 -2
- package/dist/src/capture.js.map +1 -1
- package/dist/src/cli.js +94 -22
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.js +1 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/customer-notes.js +10 -2
- package/dist/src/customer-notes.js.map +1 -1
- package/dist/src/db.js +264 -1
- package/dist/src/db.js.map +1 -1
- package/dist/src/decisions.js +10 -2
- package/dist/src/decisions.js.map +1 -1
- package/dist/src/embedding-provider.js +301 -0
- package/dist/src/embedding-provider.js.map +1 -0
- package/dist/src/embeddings.js +112 -55
- package/dist/src/embeddings.js.map +1 -1
- package/dist/src/graph-extract.js +39 -12
- package/dist/src/graph-extract.js.map +1 -1
- package/dist/src/graph-recall.js +11 -1
- package/dist/src/graph-recall.js.map +1 -1
- package/dist/src/graph-stream.js +7 -1
- package/dist/src/graph-stream.js.map +1 -1
- package/dist/src/graph.js +129 -29
- package/dist/src/graph.js.map +1 -1
- package/dist/src/policies.js +10 -2
- package/dist/src/policies.js.map +1 -1
- package/dist/src/project-briefs.js +10 -2
- package/dist/src/project-briefs.js.map +1 -1
- package/dist/src/search.js +31 -13
- package/dist/src/search.js.map +1 -1
- package/dist/src/version.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
package/dist/decisions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decisions.js","sourceRoot":"","sources":["../src/decisions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"decisions.js","sourceRoot":"","sources":["../src/decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable embedding providers for Hippo.
|
|
3
|
+
*
|
|
4
|
+
* The local `@xenova/transformers` path stays the zero-DEPENDENCY DEFAULT. Opt-in
|
|
5
|
+
* API providers (OpenAI / Voyage / Cohere) let a user bring a frontier embedder
|
|
6
|
+
* (e.g. text-embedding-3-large) for frontier-class retrieval. They use the native
|
|
7
|
+
* `fetch` global (Node >= 22.5, see package.json engines — NO new dependency) and
|
|
8
|
+
* read their key from a conventional env var. The provider is selected by
|
|
9
|
+
* `config.embeddings.provider` (default `'local'`).
|
|
10
|
+
*
|
|
11
|
+
* Design contract (see docs/plans/2026-06-08-b-pluggable-embedding-provider.md):
|
|
12
|
+
* - Local provider `id` is the BARE model string, so existing stores whose DB
|
|
13
|
+
* meta `embedding_model` is `Xenova/all-MiniLM-L6-v2` see NO identity change
|
|
14
|
+
* and are NOT force-reindexed on upgrade.
|
|
15
|
+
* - API provider `id` is `${kind}:${model}`; switching to/from an API embedder
|
|
16
|
+
* (or a dimension change) flips the identity and triggers the existing
|
|
17
|
+
* reindex-on-change path.
|
|
18
|
+
* - `resolveEmbeddingProvider` NEVER throws. `isAvailable()` is provider-aware
|
|
19
|
+
* (local -> dependency installed; api -> key present). `embed()` MAY throw on
|
|
20
|
+
* a hard transport/auth failure so a reindex can abort atomically; hot paths
|
|
21
|
+
* wrap it and fall back to BM25.
|
|
22
|
+
*
|
|
23
|
+
* The exact request/response shapes for the API providers are documented from each
|
|
24
|
+
* vendor's public embeddings API; they are unit-tested here against a mocked
|
|
25
|
+
* `fetch` and are integration-verified in Workstream C (real API calls are
|
|
26
|
+
* egress-blocked in the build sandbox).
|
|
27
|
+
*/
|
|
28
|
+
import { type EmbeddingRole } from './embeddings.js';
|
|
29
|
+
export type EmbeddingProviderKind = 'local' | 'openai' | 'voyage' | 'cohere';
|
|
30
|
+
export declare const API_PROVIDER_KINDS: readonly EmbeddingProviderKind[];
|
|
31
|
+
export interface EmbeddingProvider {
|
|
32
|
+
readonly kind: EmbeddingProviderKind;
|
|
33
|
+
readonly model: string;
|
|
34
|
+
/**
|
|
35
|
+
* Identity recorded in DB meta to drive reindex-on-change.
|
|
36
|
+
* local -> bare model string (back-compat); api -> `${kind}:${model}`.
|
|
37
|
+
*/
|
|
38
|
+
readonly id: string;
|
|
39
|
+
/** Known fixed output dimension, if any (undefined for local / unknown). */
|
|
40
|
+
readonly dimensions?: number;
|
|
41
|
+
/** Env var holding this provider's API key (undefined for the local provider). */
|
|
42
|
+
readonly keyEnv?: string;
|
|
43
|
+
/** local -> dependency installed; api -> key present. NEVER throws. */
|
|
44
|
+
isAvailable(): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Batch-embed. Returns one row per input in order; a row is `[]` when that
|
|
47
|
+
* single item could not be embedded. MAY throw on a hard transport/auth
|
|
48
|
+
* failure (so a reindex aborts before saving a partial index).
|
|
49
|
+
*/
|
|
50
|
+
embed(texts: string[], role?: EmbeddingRole): Promise<number[][]>;
|
|
51
|
+
}
|
|
52
|
+
export interface ResolveProviderOptions {
|
|
53
|
+
/** Explicit model override (mirrors resolveEmbeddingModel's explicitModel). */
|
|
54
|
+
model?: string;
|
|
55
|
+
/** Explicit provider override (mainly for tests). */
|
|
56
|
+
provider?: EmbeddingProviderKind;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build the active embedding provider from config (or an explicit override).
|
|
60
|
+
* Never throws for a missing key — that surfaces via `isAvailable()` on the hot
|
|
61
|
+
* paths and as a hard error only from the explicit `hippo embed` command. The
|
|
62
|
+
* only hard throw is an invalid config (e.g. an insecure apiBaseUrl), a
|
|
63
|
+
* deliberate loud failure; hot-path callers (search) wrap this in try/catch.
|
|
64
|
+
*/
|
|
65
|
+
export declare function resolveEmbeddingProvider(hippoRoot: string, opts?: ResolveProviderOptions): EmbeddingProvider;
|
|
66
|
+
/**
|
|
67
|
+
* The reindex identity for the active provider. Use this (NOT resolveEmbeddingModel)
|
|
68
|
+
* everywhere `embeddingModelRequiresReindex` / stored-model comparisons happen.
|
|
69
|
+
*/
|
|
70
|
+
export declare function resolveEmbeddingIdentity(hippoRoot: string, opts?: ResolveProviderOptions): string;
|
|
71
|
+
/**
|
|
72
|
+
* Provider-aware availability for a store: local -> dependency installed;
|
|
73
|
+
* api -> key present. Use at the call sites that decide whether to embed.
|
|
74
|
+
*/
|
|
75
|
+
export declare function isEmbeddingConfigured(hippoRoot: string): boolean;
|
|
76
|
+
//# sourceMappingURL=embedding-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-provider.d.ts","sourceRoot":"","sources":["../src/embedding-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7E,eAAO,MAAM,kBAAkB,EAAE,SAAS,qBAAqB,EAAmC,CAAC;AAOnG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,WAAW,IAAI,OAAO,CAAC;IACvB;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CACnE;AAiPD,MAAM,WAAW,sBAAsB;IACrC,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,sBAA2B,GAChC,iBAAiB,CA+BnB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,sBAA2B,GAAG,MAAM,CAErG;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAQhE"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable embedding providers for Hippo.
|
|
3
|
+
*
|
|
4
|
+
* The local `@xenova/transformers` path stays the zero-DEPENDENCY DEFAULT. Opt-in
|
|
5
|
+
* API providers (OpenAI / Voyage / Cohere) let a user bring a frontier embedder
|
|
6
|
+
* (e.g. text-embedding-3-large) for frontier-class retrieval. They use the native
|
|
7
|
+
* `fetch` global (Node >= 22.5, see package.json engines — NO new dependency) and
|
|
8
|
+
* read their key from a conventional env var. The provider is selected by
|
|
9
|
+
* `config.embeddings.provider` (default `'local'`).
|
|
10
|
+
*
|
|
11
|
+
* Design contract (see docs/plans/2026-06-08-b-pluggable-embedding-provider.md):
|
|
12
|
+
* - Local provider `id` is the BARE model string, so existing stores whose DB
|
|
13
|
+
* meta `embedding_model` is `Xenova/all-MiniLM-L6-v2` see NO identity change
|
|
14
|
+
* and are NOT force-reindexed on upgrade.
|
|
15
|
+
* - API provider `id` is `${kind}:${model}`; switching to/from an API embedder
|
|
16
|
+
* (or a dimension change) flips the identity and triggers the existing
|
|
17
|
+
* reindex-on-change path.
|
|
18
|
+
* - `resolveEmbeddingProvider` NEVER throws. `isAvailable()` is provider-aware
|
|
19
|
+
* (local -> dependency installed; api -> key present). `embed()` MAY throw on
|
|
20
|
+
* a hard transport/auth failure so a reindex can abort atomically; hot paths
|
|
21
|
+
* wrap it and fall back to BM25.
|
|
22
|
+
*
|
|
23
|
+
* The exact request/response shapes for the API providers are documented from each
|
|
24
|
+
* vendor's public embeddings API; they are unit-tested here against a mocked
|
|
25
|
+
* `fetch` and are integration-verified in Workstream C (real API calls are
|
|
26
|
+
* egress-blocked in the build sandbox).
|
|
27
|
+
*/
|
|
28
|
+
import { getEmbedding, isEmbeddingAvailable, resolveEmbeddingModel, DEFAULT_EMBEDDING_MODEL, } from './embeddings.js';
|
|
29
|
+
import { loadConfig } from './config.js';
|
|
30
|
+
export const API_PROVIDER_KINDS = ['openai', 'voyage', 'cohere'];
|
|
31
|
+
const DEFAULT_API_BATCH_SIZE = 64;
|
|
32
|
+
/** Per-request timeout for API embedding calls. A provider/proxy that accepts
|
|
33
|
+
* the connection but never responds must not hang embed/recall indefinitely. */
|
|
34
|
+
const REQUEST_TIMEOUT_MS = 30_000;
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Local provider — wraps the existing zero-dep transformers.js path.
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
class LocalEmbeddingProvider {
|
|
39
|
+
model;
|
|
40
|
+
enabled;
|
|
41
|
+
kind = 'local';
|
|
42
|
+
constructor(model, enabled = true) {
|
|
43
|
+
this.model = model;
|
|
44
|
+
this.enabled = enabled;
|
|
45
|
+
}
|
|
46
|
+
get id() {
|
|
47
|
+
return this.model;
|
|
48
|
+
}
|
|
49
|
+
isAvailable() {
|
|
50
|
+
return this.enabled && isEmbeddingAvailable();
|
|
51
|
+
}
|
|
52
|
+
async embed(texts, role) {
|
|
53
|
+
// Sequential to preserve the historical single-pipeline behaviour and avoid
|
|
54
|
+
// contending the one cached pipeline instance with N concurrent calls.
|
|
55
|
+
const out = [];
|
|
56
|
+
for (const text of texts) {
|
|
57
|
+
out.push(await getEmbedding(text, this.model, role));
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const API_SHAPES = {
|
|
63
|
+
openai: {
|
|
64
|
+
keyEnv: 'OPENAI_API_KEY',
|
|
65
|
+
defaultBaseUrl: 'https://api.openai.com/v1',
|
|
66
|
+
path: 'embeddings',
|
|
67
|
+
defaultModel: 'text-embedding-3-large',
|
|
68
|
+
// OpenAI has no asymmetric query/passage input type for embeddings.
|
|
69
|
+
buildBody: (model, texts) => ({ model, input: texts }),
|
|
70
|
+
extractVectors: (json) => {
|
|
71
|
+
const data = json.data ?? [];
|
|
72
|
+
return data.map((d) => d.embedding ?? []);
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
voyage: {
|
|
76
|
+
keyEnv: 'VOYAGE_API_KEY',
|
|
77
|
+
defaultBaseUrl: 'https://api.voyageai.com/v1',
|
|
78
|
+
path: 'embeddings',
|
|
79
|
+
defaultModel: 'voyage-3',
|
|
80
|
+
buildBody: (model, texts, role) => {
|
|
81
|
+
const body = { model, input: texts };
|
|
82
|
+
if (role)
|
|
83
|
+
body.input_type = role === 'query' ? 'query' : 'document';
|
|
84
|
+
return body;
|
|
85
|
+
},
|
|
86
|
+
extractVectors: (json) => {
|
|
87
|
+
const data = json.data ?? [];
|
|
88
|
+
return data.map((d) => d.embedding ?? []);
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
cohere: {
|
|
92
|
+
keyEnv: 'COHERE_API_KEY',
|
|
93
|
+
defaultBaseUrl: 'https://api.cohere.com/v2',
|
|
94
|
+
path: 'embed',
|
|
95
|
+
defaultModel: 'embed-v4.0',
|
|
96
|
+
buildBody: (model, texts, role) => ({
|
|
97
|
+
model,
|
|
98
|
+
texts,
|
|
99
|
+
input_type: role === 'query' ? 'search_query' : 'search_document',
|
|
100
|
+
embedding_types: ['float'],
|
|
101
|
+
}),
|
|
102
|
+
extractVectors: (json) => {
|
|
103
|
+
// Cohere v2: { embeddings: { float: number[][] } }
|
|
104
|
+
const emb = json.embeddings;
|
|
105
|
+
return emb?.float ?? [];
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
/** Remove a secret substring from any string before it surfaces in an error. */
|
|
110
|
+
function redact(text, secret) {
|
|
111
|
+
if (!secret)
|
|
112
|
+
return text;
|
|
113
|
+
return text.split(secret).join('***');
|
|
114
|
+
}
|
|
115
|
+
function l2normalize(v) {
|
|
116
|
+
let norm = 0;
|
|
117
|
+
for (const x of v)
|
|
118
|
+
norm += x * x;
|
|
119
|
+
norm = Math.sqrt(norm);
|
|
120
|
+
if (norm < 1e-12)
|
|
121
|
+
return v;
|
|
122
|
+
return v.map((x) => x / norm);
|
|
123
|
+
}
|
|
124
|
+
class ApiEmbeddingProvider {
|
|
125
|
+
kind;
|
|
126
|
+
model;
|
|
127
|
+
baseUrl;
|
|
128
|
+
batchSize;
|
|
129
|
+
enabled;
|
|
130
|
+
constructor(kind, model, baseUrl, batchSize, enabled = true) {
|
|
131
|
+
this.kind = kind;
|
|
132
|
+
this.model = model;
|
|
133
|
+
this.baseUrl = baseUrl;
|
|
134
|
+
this.batchSize = batchSize;
|
|
135
|
+
this.enabled = enabled;
|
|
136
|
+
}
|
|
137
|
+
get id() {
|
|
138
|
+
return `${this.kind}:${this.model}`;
|
|
139
|
+
}
|
|
140
|
+
get keyEnv() {
|
|
141
|
+
return API_SHAPES[this.kind].keyEnv;
|
|
142
|
+
}
|
|
143
|
+
isAvailable() {
|
|
144
|
+
return this.enabled && !!process.env[this.keyEnv]?.trim();
|
|
145
|
+
}
|
|
146
|
+
async embed(texts, role) {
|
|
147
|
+
if (texts.length === 0)
|
|
148
|
+
return [];
|
|
149
|
+
const key = process.env[this.keyEnv]?.trim();
|
|
150
|
+
if (!key) {
|
|
151
|
+
// Hard, actionable failure — never includes a key value (there is none).
|
|
152
|
+
throw new Error(`Embedding provider '${this.kind}' is configured but ${this.keyEnv} is not set. ` +
|
|
153
|
+
`Export ${this.keyEnv} or set config.embeddings.provider back to 'local'.`);
|
|
154
|
+
}
|
|
155
|
+
const out = [];
|
|
156
|
+
for (let i = 0; i < texts.length; i += this.batchSize) {
|
|
157
|
+
const chunk = texts.slice(i, i + this.batchSize);
|
|
158
|
+
const vecs = await this.embedChunk(chunk, key, role);
|
|
159
|
+
for (const v of vecs)
|
|
160
|
+
out.push(v.length > 0 ? l2normalize(v) : v);
|
|
161
|
+
}
|
|
162
|
+
return out;
|
|
163
|
+
}
|
|
164
|
+
async embedChunk(chunk, key, role) {
|
|
165
|
+
const shape = API_SHAPES[this.kind];
|
|
166
|
+
const url = `${this.baseUrl.replace(/\/$/, '')}/${shape.path}`;
|
|
167
|
+
let resp;
|
|
168
|
+
try {
|
|
169
|
+
resp = await fetch(url, {
|
|
170
|
+
method: 'POST',
|
|
171
|
+
headers: {
|
|
172
|
+
'content-type': 'application/json',
|
|
173
|
+
authorization: `Bearer ${key}`,
|
|
174
|
+
},
|
|
175
|
+
body: JSON.stringify(shape.buildBody(this.model, chunk, role)),
|
|
176
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
181
|
+
throw new Error(redact(`embedding request to ${this.kind} failed: ${msg}`, key));
|
|
182
|
+
}
|
|
183
|
+
if (!resp.ok) {
|
|
184
|
+
let detail = '';
|
|
185
|
+
try {
|
|
186
|
+
detail = await resp.text();
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
/* ignore body read error */
|
|
190
|
+
}
|
|
191
|
+
throw new Error(redact(`${this.kind} embeddings HTTP ${resp.status}: ${detail.slice(0, 300)}`, key));
|
|
192
|
+
}
|
|
193
|
+
let json;
|
|
194
|
+
try {
|
|
195
|
+
json = await resp.json();
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
199
|
+
throw new Error(redact(`${this.kind} embeddings returned invalid JSON: ${msg}`, key));
|
|
200
|
+
}
|
|
201
|
+
const vectors = shape.extractVectors(json);
|
|
202
|
+
// A 200 response with the wrong number of vectors (or any empty/malformed
|
|
203
|
+
// vector) is a provider/proxy contract violation, NOT a per-item miss. Throw
|
|
204
|
+
// so a reindex aborts atomically (preserving the prior usable index) and the
|
|
205
|
+
// explicit backfill surfaces it, instead of silently saving []-padded rows.
|
|
206
|
+
if (vectors.length !== chunk.length) {
|
|
207
|
+
throw new Error(redact(`${this.kind} embeddings returned ${vectors.length} vectors for ${chunk.length} inputs`, key));
|
|
208
|
+
}
|
|
209
|
+
for (let i = 0; i < vectors.length; i++) {
|
|
210
|
+
if (!vectors[i] || vectors[i].length === 0) {
|
|
211
|
+
throw new Error(redact(`${this.kind} embeddings returned an empty vector at index ${i}`, key));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return vectors;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
// Resolution
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
function readEmbeddingsConfig(hippoRoot) {
|
|
221
|
+
try {
|
|
222
|
+
return loadConfig(hippoRoot).embeddings;
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return {};
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/** Validate a user-supplied API base URL: HTTPS only (or explicit localhost). */
|
|
229
|
+
function validateBaseUrl(url, fallback) {
|
|
230
|
+
const candidate = url?.trim();
|
|
231
|
+
if (!candidate)
|
|
232
|
+
return fallback;
|
|
233
|
+
let parsed;
|
|
234
|
+
try {
|
|
235
|
+
parsed = new URL(candidate);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
throw new Error(`config.embeddings.apiBaseUrl is not a valid URL: ${candidate}`);
|
|
239
|
+
}
|
|
240
|
+
const isLocalhost = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';
|
|
241
|
+
if (parsed.protocol !== 'https:' && !isLocalhost) {
|
|
242
|
+
throw new Error(`config.embeddings.apiBaseUrl must use https (got ${parsed.protocol}//${parsed.hostname}). ` +
|
|
243
|
+
`Plaintext http is only allowed for localhost.`);
|
|
244
|
+
}
|
|
245
|
+
return candidate;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Build the active embedding provider from config (or an explicit override).
|
|
249
|
+
* Never throws for a missing key — that surfaces via `isAvailable()` on the hot
|
|
250
|
+
* paths and as a hard error only from the explicit `hippo embed` command. The
|
|
251
|
+
* only hard throw is an invalid config (e.g. an insecure apiBaseUrl), a
|
|
252
|
+
* deliberate loud failure; hot-path callers (search) wrap this in try/catch.
|
|
253
|
+
*/
|
|
254
|
+
export function resolveEmbeddingProvider(hippoRoot, opts = {}) {
|
|
255
|
+
const cfg = readEmbeddingsConfig(hippoRoot);
|
|
256
|
+
const requested = (opts.provider ?? cfg.provider ?? 'local');
|
|
257
|
+
// An explicit embeddings.enabled=false hard-disables embedding for BOTH local
|
|
258
|
+
// and API providers — for API this prevents unwanted paid off-box calls.
|
|
259
|
+
const enabled = cfg.enabled !== false;
|
|
260
|
+
if (requested === 'local') {
|
|
261
|
+
return new LocalEmbeddingProvider(resolveEmbeddingModel(hippoRoot, opts.model), enabled);
|
|
262
|
+
}
|
|
263
|
+
if (!API_PROVIDER_KINDS.includes(requested)) {
|
|
264
|
+
// Fail loud on a typo'd provider rather than silently using local (which
|
|
265
|
+
// would reindex with the local model and clobber the intended identity).
|
|
266
|
+
throw new Error(`Unknown embeddings.provider '${requested}'. Valid values: local, ${API_PROVIDER_KINDS.filter((k) => k !== 'local').join(', ')}.`);
|
|
267
|
+
}
|
|
268
|
+
const kind = requested;
|
|
269
|
+
const shape = API_SHAPES[kind];
|
|
270
|
+
// If no API model was chosen (config left the local default in place), fall
|
|
271
|
+
// back to the provider's flagship model rather than POSTing a local model id.
|
|
272
|
+
const requestedModel = (opts.model ?? cfg.model)?.trim();
|
|
273
|
+
const model = requestedModel && requestedModel !== DEFAULT_EMBEDDING_MODEL ? requestedModel : shape.defaultModel;
|
|
274
|
+
const baseUrl = validateBaseUrl(cfg.apiBaseUrl, shape.defaultBaseUrl);
|
|
275
|
+
const batchSize = typeof cfg.batchSize === 'number' && Number.isInteger(cfg.batchSize) && cfg.batchSize > 0
|
|
276
|
+
? cfg.batchSize
|
|
277
|
+
: DEFAULT_API_BATCH_SIZE;
|
|
278
|
+
return new ApiEmbeddingProvider(kind, model, baseUrl, batchSize, enabled);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* The reindex identity for the active provider. Use this (NOT resolveEmbeddingModel)
|
|
282
|
+
* everywhere `embeddingModelRequiresReindex` / stored-model comparisons happen.
|
|
283
|
+
*/
|
|
284
|
+
export function resolveEmbeddingIdentity(hippoRoot, opts = {}) {
|
|
285
|
+
return resolveEmbeddingProvider(hippoRoot, opts).id;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Provider-aware availability for a store: local -> dependency installed;
|
|
289
|
+
* api -> key present. Use at the call sites that decide whether to embed.
|
|
290
|
+
*/
|
|
291
|
+
export function isEmbeddingConfigured(hippoRoot) {
|
|
292
|
+
try {
|
|
293
|
+
return resolveEmbeddingProvider(hippoRoot).isAvailable();
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
// Invalid embedding config (e.g. an insecure apiBaseUrl) must not crash the
|
|
297
|
+
// best-effort ingestion guard — treat it as "not configured" and skip.
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=embedding-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-provider.js","sourceRoot":"","sources":["../src/embedding-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/embeddings.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Falls back silently if the library is not installed.
|
|
5
5
|
*/
|
|
6
6
|
import { MemoryEntry } from './memory.js';
|
|
7
|
+
export declare const DEFAULT_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
|
|
7
8
|
/**
|
|
8
9
|
* Per-model pooling dispatch for `@xenova/transformers`'s feature-extraction
|
|
9
10
|
* pipeline. BGE family models were trained with CLS pooling (per BAAI's
|
package/dist/embeddings.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAiB1C,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAGjE;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAExD;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM,CAMrE;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAqB9C;AA6ED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAYvF;AAyBD,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAiC,GAC9D,MAAM,GAAG,IAAI,CAIf;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAiC,GAC9D,OAAO,CAGT;AAyCD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,SAA0B,EAC/B,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CAenB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBjE;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAQ9E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAU3F;AAkBD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,WAAW,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAsDf;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CA+FjB"}
|