hermes-client-typescript 1.4.49

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 ADDED
@@ -0,0 +1,110 @@
1
+ # hermes-client-typescript
2
+
3
+ TypeScript client for [Hermes](https://github.com/SpaceFrontiers/hermes) search server.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add hermes-client-typescript
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { HermesClient } from "hermes-client-typescript";
15
+
16
+ const client = new HermesClient("localhost:50051");
17
+ client.connect();
18
+
19
+ // Create index
20
+ await client.createIndex(
21
+ "articles",
22
+ `
23
+ index articles {
24
+ title: text indexed stored
25
+ body: text indexed stored
26
+ }
27
+ `,
28
+ );
29
+
30
+ // Index documents
31
+ await client.indexDocuments("articles", [
32
+ { title: "Hello", body: "World" },
33
+ { title: "Foo", body: "Bar" },
34
+ ]);
35
+ await client.commit("articles");
36
+
37
+ // Search
38
+ const results = await client.search("articles", {
39
+ term: ["title", "hello"],
40
+ });
41
+ for (const hit of results.hits) {
42
+ console.log(hit.docId, hit.score, hit.fields);
43
+ }
44
+
45
+ // Clean up
46
+ client.close();
47
+ ```
48
+
49
+ ## API
50
+
51
+ ### Index Management
52
+
53
+ - `createIndex(indexName, schema)` — Create a new index with SDL or JSON schema
54
+ - `deleteIndex(indexName)` — Delete an index
55
+ - `listIndexes()` — List all index names
56
+ - `getIndexInfo(indexName)` — Get index metadata (doc count, segments, schema)
57
+
58
+ ### Document Indexing
59
+
60
+ - `indexDocuments(indexName, docs)` — Batch index documents, returns `[indexedCount, errorCount]`
61
+ - `indexDocument(indexName, doc)` — Index a single document
62
+ - `indexDocumentsStream(indexName, asyncIterable)` — Stream documents for indexing
63
+ - `commit(indexName)` — Commit pending changes, returns total doc count
64
+ - `forceMerge(indexName)` — Force merge segments
65
+
66
+ ### Search
67
+
68
+ - `search(indexName, options)` — Search with term, boolean, sparse/dense vector queries
69
+ - `getDocument(indexName, docId)` — Get document by ID
70
+
71
+ ### Search Options
72
+
73
+ ```typescript
74
+ await client.search("docs", {
75
+ // Term query
76
+ term: ["field", "value"],
77
+
78
+ // Boolean query
79
+ boolean: {
80
+ must: [["title", "hello"]],
81
+ should: [["body", "world"]],
82
+ },
83
+
84
+ // Sparse vector (pre-tokenized)
85
+ sparseVector: ["embedding", [1, 5, 10], [0.5, 0.3, 0.2]],
86
+
87
+ // Sparse text (server-side tokenization)
88
+ sparseText: ["embedding", "what is machine learning?"],
89
+
90
+ // Dense vector
91
+ denseVector: ["embedding", [0.1, 0.2, 0.3]],
92
+
93
+ // Options
94
+ limit: 10,
95
+ offset: 0,
96
+ fieldsToLoad: ["title", "body"],
97
+ combiner: "sum", // "sum" | "max" | "avg"
98
+
99
+ // L2 reranker: [field, queryVector, l1Limit]
100
+ reranker: ["embedding", [0.1, 0.2], 100],
101
+ });
102
+ ```
103
+
104
+ ## Development
105
+
106
+ ```bash
107
+ pnpm install
108
+ pnpm run generate # regenerate proto stubs
109
+ pnpm run build # compile TypeScript
110
+ ```
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Async Hermes client implementation.
3
+ */
4
+ import { Document, SearchResponse, IndexInfo, SearchOptions } from "./types";
5
+ export declare class HermesClient {
6
+ private address;
7
+ private channel;
8
+ private indexClient;
9
+ private searchClient;
10
+ constructor(address?: string);
11
+ /** Connect to the server. */
12
+ connect(): void;
13
+ /** Close the connection. */
14
+ close(): void;
15
+ private ensureConnected;
16
+ /** Create a new index. */
17
+ createIndex(indexName: string, schema: string): Promise<boolean>;
18
+ /** Delete an index. */
19
+ deleteIndex(indexName: string): Promise<boolean>;
20
+ /** List all indexes on the server. */
21
+ listIndexes(): Promise<string[]>;
22
+ /** Get information about an index. */
23
+ getIndexInfo(indexName: string): Promise<IndexInfo>;
24
+ /** Index multiple documents in batch. Returns [indexedCount, errorCount]. */
25
+ indexDocuments(indexName: string, documents: Record<string, any>[]): Promise<[number, number]>;
26
+ /** Index a single document. */
27
+ indexDocument(indexName: string, document: Record<string, any>): Promise<void>;
28
+ /** Stream documents for indexing. Returns number of indexed documents. */
29
+ indexDocumentsStream(indexName: string, documents: AsyncIterable<Record<string, any>>): Promise<number>;
30
+ /** Commit pending changes. Returns total number of documents. */
31
+ commit(indexName: string): Promise<number>;
32
+ /** Force merge all segments. Returns number of segments after merge. */
33
+ forceMerge(indexName: string): Promise<number>;
34
+ /** Search for documents. */
35
+ search(indexName: string, options?: SearchOptions): Promise<SearchResponse>;
36
+ /** Get a document by ID. Returns null if not found. */
37
+ getDocument(indexName: string, docId: number): Promise<Document | null>;
38
+ }
39
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,OAAO,EACL,QAAQ,EAER,cAAc,EACd,SAAS,EACT,aAAa,EAGd,MAAM,SAAS,CAAC;AAKjB,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,YAAY,CAA6B;gBAErC,OAAO,GAAE,MAA0B;IAI/C,6BAA6B;IAC7B,OAAO,IAAI,IAAI;IAMf,4BAA4B;IAC5B,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,eAAe;IAUvB,0BAA0B;IACpB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtE,uBAAuB;IACjB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtD,sCAAsC;IAChC,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAMtC,sCAAsC;IAChC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAezD,6EAA6E;IACvE,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAC/B,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAc5B,+BAA+B;IACzB,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;IAIhB,0EAA0E;IACpE,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC;IAgBlB,iEAAiE;IAC3D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMhD,wEAAwE;IAClE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUpD,4BAA4B;IACtB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IA2CrF,uDAAuD;IACjD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;CAmB9E"}
package/dist/client.js ADDED
@@ -0,0 +1,368 @@
1
+ "use strict";
2
+ /**
3
+ * Async Hermes client implementation.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HermesClient = void 0;
7
+ const grpc_js_1 = require("@grpc/grpc-js");
8
+ const nice_grpc_1 = require("nice-grpc");
9
+ const hermes_1 = require("./generated/hermes");
10
+ class HermesClient {
11
+ constructor(address = "localhost:50051") {
12
+ this.channel = null;
13
+ this.indexClient = null;
14
+ this.searchClient = null;
15
+ this.address = address;
16
+ }
17
+ /** Connect to the server. */
18
+ connect() {
19
+ this.channel = (0, nice_grpc_1.createChannel)(this.address, grpc_js_1.ChannelCredentials.createInsecure());
20
+ this.indexClient = (0, nice_grpc_1.createClient)(hermes_1.IndexServiceDefinition, this.channel);
21
+ this.searchClient = (0, nice_grpc_1.createClient)(hermes_1.SearchServiceDefinition, this.channel);
22
+ }
23
+ /** Close the connection. */
24
+ close() {
25
+ if (this.channel) {
26
+ this.channel.close();
27
+ this.channel = null;
28
+ this.indexClient = null;
29
+ this.searchClient = null;
30
+ }
31
+ }
32
+ ensureConnected() {
33
+ if (!this.indexClient || !this.searchClient) {
34
+ throw new Error("Client not connected. Call connect() first.");
35
+ }
36
+ }
37
+ // =========================================================================
38
+ // Index Management
39
+ // =========================================================================
40
+ /** Create a new index. */
41
+ async createIndex(indexName, schema) {
42
+ this.ensureConnected();
43
+ const response = await this.indexClient.createIndex({ indexName, schema });
44
+ return response.success;
45
+ }
46
+ /** Delete an index. */
47
+ async deleteIndex(indexName) {
48
+ this.ensureConnected();
49
+ const response = await this.indexClient.deleteIndex({ indexName });
50
+ return response.success;
51
+ }
52
+ /** List all indexes on the server. */
53
+ async listIndexes() {
54
+ this.ensureConnected();
55
+ const response = await this.indexClient.listIndexes({});
56
+ return response.indexNames;
57
+ }
58
+ /** Get information about an index. */
59
+ async getIndexInfo(indexName) {
60
+ this.ensureConnected();
61
+ const response = await this.searchClient.getIndexInfo({ indexName });
62
+ return {
63
+ indexName: response.indexName,
64
+ numDocs: response.numDocs,
65
+ numSegments: response.numSegments,
66
+ schema: response.schema,
67
+ };
68
+ }
69
+ // =========================================================================
70
+ // Document Indexing
71
+ // =========================================================================
72
+ /** Index multiple documents in batch. Returns [indexedCount, errorCount]. */
73
+ async indexDocuments(indexName, documents) {
74
+ this.ensureConnected();
75
+ const namedDocs = documents.map((doc) => ({
76
+ fields: toFieldEntries(doc),
77
+ }));
78
+ const response = await this.indexClient.batchIndexDocuments({
79
+ indexName,
80
+ documents: namedDocs,
81
+ });
82
+ return [response.indexedCount, response.errorCount];
83
+ }
84
+ /** Index a single document. */
85
+ async indexDocument(indexName, document) {
86
+ await this.indexDocuments(indexName, [document]);
87
+ }
88
+ /** Stream documents for indexing. Returns number of indexed documents. */
89
+ async indexDocumentsStream(indexName, documents) {
90
+ this.ensureConnected();
91
+ async function* requestIterator() {
92
+ for await (const doc of documents) {
93
+ yield {
94
+ indexName,
95
+ fields: toFieldEntries(doc),
96
+ };
97
+ }
98
+ }
99
+ const response = await this.indexClient.indexDocuments(requestIterator());
100
+ return response.indexedCount;
101
+ }
102
+ /** Commit pending changes. Returns total number of documents. */
103
+ async commit(indexName) {
104
+ this.ensureConnected();
105
+ const response = await this.indexClient.commit({ indexName });
106
+ return response.numDocs;
107
+ }
108
+ /** Force merge all segments. Returns number of segments after merge. */
109
+ async forceMerge(indexName) {
110
+ this.ensureConnected();
111
+ const response = await this.indexClient.forceMerge({ indexName });
112
+ return response.numSegments;
113
+ }
114
+ // =========================================================================
115
+ // Search
116
+ // =========================================================================
117
+ /** Search for documents. */
118
+ async search(indexName, options = {}) {
119
+ this.ensureConnected();
120
+ const query = buildQuery(options);
121
+ let reranker;
122
+ if (options.reranker) {
123
+ const [field, vector, limit] = options.reranker;
124
+ reranker = {
125
+ field,
126
+ vector,
127
+ limit,
128
+ combiner: rerankerCombinerToProto(options.rerankerCombiner ?? "log_sum_exp"),
129
+ combinerTemperature: 0,
130
+ combinerTopK: 0,
131
+ combinerDecay: 0,
132
+ };
133
+ }
134
+ const response = await this.searchClient.search({
135
+ indexName,
136
+ query,
137
+ limit: options.limit ?? 10,
138
+ offset: options.offset ?? 0,
139
+ fieldsToLoad: options.fieldsToLoad ?? [],
140
+ reranker,
141
+ });
142
+ const hits = response.hits.map((hit) => ({
143
+ docId: hit.docId,
144
+ score: hit.score,
145
+ fields: Object.fromEntries(Object.entries(hit.fields).map(([k, v]) => [k, fromFieldValue(v)])),
146
+ }));
147
+ return {
148
+ hits,
149
+ totalHits: response.totalHits,
150
+ tookMs: response.tookMs,
151
+ };
152
+ }
153
+ /** Get a document by ID. Returns null if not found. */
154
+ async getDocument(indexName, docId) {
155
+ this.ensureConnected();
156
+ try {
157
+ const response = await this.searchClient.getDocument({
158
+ indexName,
159
+ docId,
160
+ });
161
+ const fields = Object.fromEntries(Object.entries(response.fields).map(([k, v]) => [k, fromFieldValue(v)]));
162
+ return { fields };
163
+ }
164
+ catch (err) {
165
+ if (err?.code === 5) {
166
+ // NOT_FOUND
167
+ return null;
168
+ }
169
+ throw err;
170
+ }
171
+ }
172
+ }
173
+ exports.HermesClient = HermesClient;
174
+ // =============================================================================
175
+ // Helper functions
176
+ // =============================================================================
177
+ function isSparseVector(value) {
178
+ if (value.length === 0)
179
+ return false;
180
+ return value.every((item) => Array.isArray(item) &&
181
+ item.length === 2 &&
182
+ typeof item[0] === "number" &&
183
+ typeof item[1] === "number" &&
184
+ Number.isInteger(item[0]));
185
+ }
186
+ function isMultiSparseVector(value) {
187
+ if (value.length === 0)
188
+ return false;
189
+ return value.every((item) => Array.isArray(item) && isSparseVector(item));
190
+ }
191
+ function isDenseVector(value) {
192
+ if (value.length === 0)
193
+ return false;
194
+ return value.every((v) => typeof v === "number" && typeof v !== "boolean");
195
+ }
196
+ function isMultiDenseVector(value) {
197
+ if (value.length === 0)
198
+ return false;
199
+ return value.every((item) => Array.isArray(item) && isDenseVector(item));
200
+ }
201
+ function toFieldEntries(doc) {
202
+ const entries = [];
203
+ for (const [name, value] of Object.entries(doc)) {
204
+ if (Array.isArray(value)) {
205
+ if (isMultiSparseVector(value)) {
206
+ for (const sv of value) {
207
+ const indices = sv.map((item) => item[0]);
208
+ const values = sv.map((item) => item[1]);
209
+ entries.push({
210
+ name,
211
+ value: { sparseVector: { indices, values } },
212
+ });
213
+ }
214
+ continue;
215
+ }
216
+ if (isMultiDenseVector(value)) {
217
+ for (const dv of value) {
218
+ entries.push({
219
+ name,
220
+ value: { denseVector: { values: dv.map(Number) } },
221
+ });
222
+ }
223
+ continue;
224
+ }
225
+ }
226
+ entries.push({ name, value: toFieldValue(value) });
227
+ }
228
+ return entries;
229
+ }
230
+ function toFieldValue(value) {
231
+ if (typeof value === "string") {
232
+ return { text: value };
233
+ }
234
+ if (typeof value === "boolean") {
235
+ return { u64: value ? 1 : 0 };
236
+ }
237
+ if (typeof value === "number") {
238
+ if (Number.isInteger(value)) {
239
+ return value >= 0 ? { u64: value } : { i64: value };
240
+ }
241
+ return { f64: value };
242
+ }
243
+ if (value instanceof Uint8Array || Buffer.isBuffer(value)) {
244
+ return { bytesValue: value instanceof Uint8Array ? value : new Uint8Array(value) };
245
+ }
246
+ if (Array.isArray(value)) {
247
+ if (isSparseVector(value)) {
248
+ const indices = value.map((item) => item[0]);
249
+ const values = value.map((item) => item[1]);
250
+ return { sparseVector: { indices, values } };
251
+ }
252
+ if (isDenseVector(value)) {
253
+ return { denseVector: { values: value.map(Number) } };
254
+ }
255
+ return { jsonValue: JSON.stringify(value) };
256
+ }
257
+ if (typeof value === "object" && value !== null) {
258
+ return { jsonValue: JSON.stringify(value) };
259
+ }
260
+ return { text: String(value) };
261
+ }
262
+ function fromFieldValue(fv) {
263
+ if (fv.text !== undefined)
264
+ return fv.text;
265
+ if (fv.u64 !== undefined)
266
+ return fv.u64;
267
+ if (fv.i64 !== undefined)
268
+ return fv.i64;
269
+ if (fv.f64 !== undefined)
270
+ return fv.f64;
271
+ if (fv.bytesValue !== undefined)
272
+ return fv.bytesValue;
273
+ if (fv.jsonValue !== undefined)
274
+ return JSON.parse(fv.jsonValue);
275
+ if (fv.sparseVector !== undefined) {
276
+ return {
277
+ indices: Array.from(fv.sparseVector.indices),
278
+ values: Array.from(fv.sparseVector.values),
279
+ };
280
+ }
281
+ if (fv.denseVector !== undefined) {
282
+ return Array.from(fv.denseVector.values);
283
+ }
284
+ return null;
285
+ }
286
+ function combinerToProto(combiner) {
287
+ const map = { sum: 0, max: 1, avg: 2 };
288
+ return map[combiner] ?? 0;
289
+ }
290
+ function rerankerCombinerToProto(combiner) {
291
+ const map = {
292
+ log_sum_exp: hermes_1.MultiValueCombiner.COMBINER_LOG_SUM_EXP,
293
+ max: hermes_1.MultiValueCombiner.COMBINER_MAX,
294
+ avg: hermes_1.MultiValueCombiner.COMBINER_AVG,
295
+ sum: hermes_1.MultiValueCombiner.COMBINER_SUM,
296
+ weighted_top_k: hermes_1.MultiValueCombiner.COMBINER_WEIGHTED_TOP_K,
297
+ };
298
+ return map[combiner] ?? hermes_1.MultiValueCombiner.COMBINER_LOG_SUM_EXP;
299
+ }
300
+ function buildQuery(options) {
301
+ if (options.term) {
302
+ const [field, term] = options.term;
303
+ return { term: { field, term } };
304
+ }
305
+ if (options.boolean) {
306
+ const must = (options.boolean.must ?? []).map(([f, t]) => ({
307
+ term: { field: f, term: t },
308
+ }));
309
+ const should = (options.boolean.should ?? []).map(([f, t]) => ({
310
+ term: { field: f, term: t },
311
+ }));
312
+ const mustNot = (options.boolean.mustNot ?? []).map(([f, t]) => ({
313
+ term: { field: f, term: t },
314
+ }));
315
+ return { boolean: { must, should, mustNot } };
316
+ }
317
+ const combiner = combinerToProto(options.combiner ?? "sum");
318
+ if (options.sparseVector) {
319
+ const [field, indices, values] = options.sparseVector;
320
+ return {
321
+ sparseVector: {
322
+ field,
323
+ indices,
324
+ values,
325
+ text: "",
326
+ combiner,
327
+ heapFactor: options.heapFactor ?? 1.0,
328
+ combinerTemperature: 0,
329
+ combinerTopK: 0,
330
+ combinerDecay: 0,
331
+ },
332
+ };
333
+ }
334
+ if (options.sparseText) {
335
+ const [field, text] = options.sparseText;
336
+ return {
337
+ sparseVector: {
338
+ field,
339
+ indices: [],
340
+ values: [],
341
+ text,
342
+ combiner,
343
+ heapFactor: options.heapFactor ?? 1.0,
344
+ combinerTemperature: 0,
345
+ combinerTopK: 0,
346
+ combinerDecay: 0,
347
+ },
348
+ };
349
+ }
350
+ if (options.denseVector) {
351
+ const [field, vector] = options.denseVector;
352
+ return {
353
+ denseVector: {
354
+ field,
355
+ vector,
356
+ nprobe: options.nprobe ?? 0,
357
+ rerankFactor: options.rerankFactor ?? 0,
358
+ combiner,
359
+ combinerTemperature: 0,
360
+ combinerTopK: 0,
361
+ combinerDecay: 0,
362
+ },
363
+ };
364
+ }
365
+ // Default: match all (empty boolean query)
366
+ return { boolean: { must: [], should: [], mustNot: [] } };
367
+ }
368
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}