verso-db 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +81 -49
- package/dist/BinaryHeap.d.ts +16 -5
- package/dist/BinaryHeap.d.ts.map +1 -1
- package/dist/BinaryHeap.js +138 -0
- package/dist/BinaryHeap.js.map +1 -0
- package/dist/Collection.d.ts +98 -17
- package/dist/Collection.d.ts.map +1 -1
- package/dist/Collection.js +1186 -0
- package/dist/Collection.js.map +1 -0
- package/dist/HNSWIndex.d.ts +170 -15
- package/dist/HNSWIndex.d.ts.map +1 -1
- package/dist/HNSWIndex.js +2818 -0
- package/dist/HNSWIndex.js.map +1 -0
- package/dist/MaxBinaryHeap.d.ts +2 -60
- package/dist/MaxBinaryHeap.d.ts.map +1 -1
- package/dist/MaxBinaryHeap.js +5 -0
- package/dist/MaxBinaryHeap.js.map +1 -0
- package/dist/SearchWorker.d.ts +104 -0
- package/dist/SearchWorker.d.ts.map +1 -0
- package/dist/SearchWorker.js +573 -0
- package/dist/SearchWorker.js.map +1 -0
- package/dist/VectorDB.d.ts +19 -5
- package/dist/VectorDB.d.ts.map +1 -1
- package/dist/VectorDB.js +246 -0
- package/dist/VectorDB.js.map +1 -0
- package/dist/WorkerPool.d.ts +92 -0
- package/dist/WorkerPool.d.ts.map +1 -0
- package/dist/WorkerPool.js +266 -0
- package/dist/WorkerPool.js.map +1 -0
- package/dist/backends/JsDistanceBackend.d.ts +3 -20
- package/dist/backends/JsDistanceBackend.d.ts.map +1 -1
- package/dist/backends/JsDistanceBackend.js +163 -0
- package/dist/backends/JsDistanceBackend.js.map +1 -0
- package/dist/encoding/DeltaEncoder.d.ts +2 -2
- package/dist/encoding/DeltaEncoder.d.ts.map +1 -1
- package/dist/encoding/DeltaEncoder.js +199 -0
- package/dist/encoding/DeltaEncoder.js.map +1 -0
- package/dist/errors.js +97 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +16 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +61 -3419
- package/dist/index.js.map +1 -0
- package/dist/presets.d.ts +9 -9
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +205 -0
- package/dist/presets.js.map +1 -0
- package/dist/quantization/ScalarQuantizer.d.ts +10 -34
- package/dist/quantization/ScalarQuantizer.d.ts.map +1 -1
- package/dist/quantization/ScalarQuantizer.js +346 -0
- package/dist/quantization/ScalarQuantizer.js.map +1 -0
- package/dist/storage/BatchWriter.d.ts.map +1 -1
- package/dist/storage/BatchWriter.js +351 -0
- package/dist/storage/BatchWriter.js.map +1 -0
- package/dist/storage/BunStorageBackend.d.ts +12 -5
- package/dist/storage/BunStorageBackend.d.ts.map +1 -1
- package/dist/storage/BunStorageBackend.js +182 -0
- package/dist/storage/BunStorageBackend.js.map +1 -0
- package/dist/storage/MemoryBackend.d.ts.map +1 -1
- package/dist/storage/MemoryBackend.js +109 -0
- package/dist/storage/MemoryBackend.js.map +1 -0
- package/dist/storage/OPFSBackend.d.ts +9 -1
- package/dist/storage/OPFSBackend.d.ts.map +1 -1
- package/dist/storage/OPFSBackend.js +325 -0
- package/dist/storage/OPFSBackend.js.map +1 -0
- package/dist/storage/StorageBackend.d.ts +1 -1
- package/dist/storage/StorageBackend.js +12 -0
- package/dist/storage/StorageBackend.js.map +1 -0
- package/dist/storage/WriteAheadLog.d.ts +15 -11
- package/dist/storage/WriteAheadLog.d.ts.map +1 -1
- package/dist/storage/WriteAheadLog.js +321 -0
- package/dist/storage/WriteAheadLog.js.map +1 -0
- package/dist/storage/createStorageBackend.d.ts +4 -0
- package/dist/storage/createStorageBackend.d.ts.map +1 -1
- package/dist/storage/createStorageBackend.js +119 -0
- package/dist/storage/createStorageBackend.js.map +1 -0
- package/dist/storage/index.d.ts +3 -3
- package/dist/storage/index.js +33 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/nodeFsRuntime.d.ts +14 -0
- package/dist/storage/nodeFsRuntime.d.ts.map +1 -0
- package/dist/storage/nodeFsRuntime.js +105 -0
- package/dist/storage/nodeFsRuntime.js.map +1 -0
- package/package.json +47 -23
- package/dist/Storage.d.ts +0 -54
- package/dist/Storage.d.ts.map +0 -1
- package/dist/backends/DistanceBackend.d.ts +0 -5
- package/dist/backends/DistanceBackend.d.ts.map +0 -1
- package/src/BinaryHeap.ts +0 -131
- package/src/Collection.ts +0 -695
- package/src/HNSWIndex.ts +0 -1839
- package/src/MaxBinaryHeap.ts +0 -175
- package/src/Storage.ts +0 -435
- package/src/VectorDB.ts +0 -109
- package/src/backends/DistanceBackend.ts +0 -17
- package/src/backends/JsDistanceBackend.ts +0 -227
- package/src/encoding/DeltaEncoder.ts +0 -217
- package/src/errors.ts +0 -110
- package/src/index.ts +0 -138
- package/src/presets.ts +0 -229
- package/src/quantization/ScalarQuantizer.ts +0 -383
- package/src/storage/BatchWriter.ts +0 -336
- package/src/storage/BunStorageBackend.ts +0 -161
- package/src/storage/MemoryBackend.ts +0 -120
- package/src/storage/OPFSBackend.ts +0 -250
- package/src/storage/StorageBackend.ts +0 -74
- package/src/storage/WriteAheadLog.ts +0 -326
- package/src/storage/createStorageBackend.ts +0 -137
- package/src/storage/index.ts +0 -53
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delta Encoding with Varint for Neighbor Lists
|
|
3
|
+
*
|
|
4
|
+
* Implements delta-encoded neighbor lists as used by Qdrant for ~38% storage reduction.
|
|
5
|
+
* Neighbor IDs are sorted, then stored as deltas with variable-length encoding.
|
|
6
|
+
*
|
|
7
|
+
* Format:
|
|
8
|
+
* - First ID stored as full uint32
|
|
9
|
+
* - Subsequent IDs stored as varint deltas from previous ID
|
|
10
|
+
*
|
|
11
|
+
* Varint encoding (like Protocol Buffers):
|
|
12
|
+
* - Values 0-127: 1 byte
|
|
13
|
+
* - Values 128-16383: 2 bytes
|
|
14
|
+
* - Values 16384-2097151: 3 bytes
|
|
15
|
+
* - Values 2097152-268435455: 4 bytes
|
|
16
|
+
* - Larger: 5 bytes
|
|
17
|
+
*/
|
|
18
|
+
import { VectorDBError } from '../errors.js';
|
|
19
|
+
/**
|
|
20
|
+
* Encode an unsigned integer as a varint
|
|
21
|
+
* Returns the number of bytes written
|
|
22
|
+
*/
|
|
23
|
+
export function encodeVarint(value, buffer, offset) {
|
|
24
|
+
let v = value >>> 0; // Ensure unsigned
|
|
25
|
+
let bytesWritten = 0;
|
|
26
|
+
while (v >= 0x80) {
|
|
27
|
+
buffer[offset + bytesWritten] = (v & 0x7f) | 0x80;
|
|
28
|
+
v >>>= 7;
|
|
29
|
+
bytesWritten++;
|
|
30
|
+
}
|
|
31
|
+
buffer[offset + bytesWritten] = v;
|
|
32
|
+
return bytesWritten + 1;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Decode a varint from buffer
|
|
36
|
+
* Returns [value, bytesRead]
|
|
37
|
+
*/
|
|
38
|
+
export function decodeVarint(buffer, offset) {
|
|
39
|
+
let result = 0;
|
|
40
|
+
let shift = 0;
|
|
41
|
+
let bytesRead = 0;
|
|
42
|
+
while (offset + bytesRead < buffer.length) {
|
|
43
|
+
const byte = buffer[offset + bytesRead];
|
|
44
|
+
if (shift < 28) {
|
|
45
|
+
result |= (byte & 0x7f) << shift;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// At shift >= 28, use multiplication to avoid sign-bit corruption from << on int32
|
|
49
|
+
result = (result + (byte & 0x7f) * (2 ** shift)) >>> 0;
|
|
50
|
+
}
|
|
51
|
+
bytesRead++;
|
|
52
|
+
if ((byte & 0x80) === 0) {
|
|
53
|
+
return [result >>> 0, bytesRead];
|
|
54
|
+
}
|
|
55
|
+
shift += 7;
|
|
56
|
+
if (shift > 35) {
|
|
57
|
+
throw new VectorDBError('Varint too long', 'CORRUPT_INDEX');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
throw new VectorDBError('Unexpected end of buffer', 'CORRUPT_INDEX');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Calculate the number of bytes needed to encode a varint
|
|
64
|
+
*/
|
|
65
|
+
export function varintSize(value) {
|
|
66
|
+
let v = value >>> 0;
|
|
67
|
+
let size = 1;
|
|
68
|
+
while (v >= 0x80) {
|
|
69
|
+
v >>>= 7;
|
|
70
|
+
size++;
|
|
71
|
+
}
|
|
72
|
+
return size;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Delta-encode a sorted array of neighbor IDs
|
|
76
|
+
* Returns the encoded buffer
|
|
77
|
+
*/
|
|
78
|
+
export function deltaEncodeNeighbors(neighbors, preSorted = false) {
|
|
79
|
+
if (neighbors.length === 0) {
|
|
80
|
+
return new Uint8Array(0);
|
|
81
|
+
}
|
|
82
|
+
for (let i = 0; i < neighbors.length; i++) {
|
|
83
|
+
const id = neighbors[i];
|
|
84
|
+
if (!Number.isInteger(id) || id < 0 || id > 0xFFFFFFFF) {
|
|
85
|
+
throw new VectorDBError(`Invalid neighbor ID at index ${i}: ${id}`, 'VALIDATION_ERROR');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Sort neighbors for optimal delta encoding
|
|
89
|
+
const sorted = preSorted ? neighbors : neighbors.slice().sort((a, b) => a - b);
|
|
90
|
+
// Calculate required buffer size
|
|
91
|
+
let size = 4; // First ID as uint32
|
|
92
|
+
let prev = sorted[0];
|
|
93
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
94
|
+
const delta = sorted[i] - prev;
|
|
95
|
+
size += varintSize(delta);
|
|
96
|
+
prev = sorted[i];
|
|
97
|
+
}
|
|
98
|
+
// Encode
|
|
99
|
+
const buffer = new Uint8Array(size);
|
|
100
|
+
const view = new DataView(buffer.buffer);
|
|
101
|
+
// First ID as full uint32 (little-endian)
|
|
102
|
+
view.setUint32(0, sorted[0], true);
|
|
103
|
+
let offset = 4;
|
|
104
|
+
// Remaining as deltas
|
|
105
|
+
prev = sorted[0];
|
|
106
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
107
|
+
const delta = sorted[i] - prev;
|
|
108
|
+
offset += encodeVarint(delta, buffer, offset);
|
|
109
|
+
prev = sorted[i];
|
|
110
|
+
}
|
|
111
|
+
return buffer;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Decode a delta-encoded neighbor list
|
|
115
|
+
* Returns the original neighbor IDs (sorted)
|
|
116
|
+
*/
|
|
117
|
+
export function deltaDecodeNeighbors(buffer, count) {
|
|
118
|
+
if (count === 0 || buffer.length === 0) {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
122
|
+
const neighbors = new Array(count);
|
|
123
|
+
// First ID as full uint32
|
|
124
|
+
neighbors[0] = view.getUint32(0, true);
|
|
125
|
+
let offset = 4;
|
|
126
|
+
// Remaining as deltas
|
|
127
|
+
for (let i = 1; i < count; i++) {
|
|
128
|
+
const [delta, bytesRead] = decodeVarint(buffer, offset);
|
|
129
|
+
neighbors[i] = neighbors[i - 1] + delta;
|
|
130
|
+
offset += bytesRead;
|
|
131
|
+
}
|
|
132
|
+
return neighbors;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Calculate the encoded size for a neighbor list without actually encoding
|
|
136
|
+
* Useful for calculating total buffer size before serialization
|
|
137
|
+
*/
|
|
138
|
+
export function deltaEncodedSize(neighbors, preSorted = false) {
|
|
139
|
+
if (neighbors.length === 0) {
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
for (let i = 0; i < neighbors.length; i++) {
|
|
143
|
+
const id = neighbors[i];
|
|
144
|
+
if (!Number.isInteger(id) || id < 0 || id > 0xFFFFFFFF) {
|
|
145
|
+
throw new VectorDBError(`Invalid neighbor ID at index ${i}: ${id}`, 'VALIDATION_ERROR');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const sorted = preSorted ? neighbors : neighbors.slice().sort((a, b) => a - b);
|
|
149
|
+
let size = 4; // First ID as uint32
|
|
150
|
+
let prev = sorted[0];
|
|
151
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
152
|
+
const delta = sorted[i] - prev;
|
|
153
|
+
size += varintSize(delta);
|
|
154
|
+
prev = sorted[i];
|
|
155
|
+
}
|
|
156
|
+
return size;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Batch encode multiple neighbor lists efficiently
|
|
160
|
+
* Returns a single buffer with all encoded lists concatenated
|
|
161
|
+
* Also returns offsets for each list
|
|
162
|
+
*/
|
|
163
|
+
export function deltaEncodeBatch(neighborLists) {
|
|
164
|
+
// Sort each list once, then pass pre-sorted to both size calculation and encoding
|
|
165
|
+
const sortedLists = neighborLists.map(list => list.length > 0 ? list.slice().sort((a, b) => a - b) : list);
|
|
166
|
+
// Calculate total size and individual sizes
|
|
167
|
+
const sizes = sortedLists.map(list => deltaEncodedSize(list, true));
|
|
168
|
+
const totalSize = sizes.reduce((a, b) => a + b, 0);
|
|
169
|
+
// Allocate single buffer
|
|
170
|
+
const buffer = new Uint8Array(totalSize);
|
|
171
|
+
const offsets = [];
|
|
172
|
+
let currentOffset = 0;
|
|
173
|
+
for (let i = 0; i < sortedLists.length; i++) {
|
|
174
|
+
offsets.push(currentOffset);
|
|
175
|
+
if (sortedLists[i].length > 0) {
|
|
176
|
+
const encoded = deltaEncodeNeighbors(sortedLists[i], true);
|
|
177
|
+
buffer.set(encoded, currentOffset);
|
|
178
|
+
currentOffset += encoded.length;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return { buffer, offsets, sizes };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Decode a batch of neighbor lists from a single buffer
|
|
185
|
+
*/
|
|
186
|
+
export function deltaDecodeBatch(buffer, offsets, sizes, counts) {
|
|
187
|
+
const results = [];
|
|
188
|
+
for (let i = 0; i < offsets.length; i++) {
|
|
189
|
+
if (counts[i] === 0 || sizes[i] === 0) {
|
|
190
|
+
results.push([]);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const slice = buffer.subarray(offsets[i], offsets[i] + sizes[i]);
|
|
194
|
+
results.push(deltaDecodeNeighbors(slice, counts[i]));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return results;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=DeltaEncoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeltaEncoder.js","sourceRoot":"","sources":["../../src/encoding/DeltaEncoder.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all VectorDB errors
|
|
3
|
+
*/
|
|
4
|
+
export class VectorDBError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(message, code) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'VectorDBError';
|
|
9
|
+
this.code = code;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Thrown when vector dimensions don't match expected dimensions
|
|
14
|
+
*/
|
|
15
|
+
export class DimensionMismatchError extends VectorDBError {
|
|
16
|
+
expected;
|
|
17
|
+
actual;
|
|
18
|
+
constructor(expected, actual, context) {
|
|
19
|
+
const message = context
|
|
20
|
+
? `${context}: expected dimension ${expected}, got ${actual}`
|
|
21
|
+
: `Dimension mismatch: expected ${expected}, got ${actual}`;
|
|
22
|
+
super(message, 'DIMENSION_MISMATCH');
|
|
23
|
+
this.name = 'DimensionMismatchError';
|
|
24
|
+
this.expected = expected;
|
|
25
|
+
this.actual = actual;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Thrown when attempting to add a vector with an ID that already exists
|
|
30
|
+
*/
|
|
31
|
+
export class DuplicateVectorError extends VectorDBError {
|
|
32
|
+
ids;
|
|
33
|
+
constructor(ids) {
|
|
34
|
+
const message = ids.length === 1
|
|
35
|
+
? `Vector with ID '${ids[0]}' already exists`
|
|
36
|
+
: `Vectors with IDs already exist: ${ids.join(', ')}`;
|
|
37
|
+
super(message, 'DUPLICATE_VECTOR');
|
|
38
|
+
this.name = 'DuplicateVectorError';
|
|
39
|
+
this.ids = ids;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Thrown when a requested collection does not exist
|
|
44
|
+
*/
|
|
45
|
+
export class CollectionNotFoundError extends VectorDBError {
|
|
46
|
+
collectionName;
|
|
47
|
+
constructor(collectionName) {
|
|
48
|
+
super(`Collection '${collectionName}' does not exist`, 'COLLECTION_NOT_FOUND');
|
|
49
|
+
this.name = 'CollectionNotFoundError';
|
|
50
|
+
this.collectionName = collectionName;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Thrown when attempting to create a collection that already exists
|
|
55
|
+
*/
|
|
56
|
+
export class CollectionExistsError extends VectorDBError {
|
|
57
|
+
collectionName;
|
|
58
|
+
constructor(collectionName) {
|
|
59
|
+
super(`Collection '${collectionName}' already exists`, 'COLLECTION_EXISTS');
|
|
60
|
+
this.name = 'CollectionExistsError';
|
|
61
|
+
this.collectionName = collectionName;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Thrown when a storage operation fails
|
|
66
|
+
*/
|
|
67
|
+
export class StorageError extends VectorDBError {
|
|
68
|
+
operation;
|
|
69
|
+
path;
|
|
70
|
+
constructor(operation, message, path) {
|
|
71
|
+
super(`Storage ${operation} failed: ${message}`, 'STORAGE_ERROR');
|
|
72
|
+
this.name = 'StorageError';
|
|
73
|
+
this.operation = operation;
|
|
74
|
+
this.path = path;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Thrown when quantization operations fail
|
|
79
|
+
*/
|
|
80
|
+
export class QuantizationError extends VectorDBError {
|
|
81
|
+
constructor(message) {
|
|
82
|
+
super(message, 'QUANTIZATION_ERROR');
|
|
83
|
+
this.name = 'QuantizationError';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Thrown when a vector is not found in the index
|
|
88
|
+
*/
|
|
89
|
+
export class VectorNotFoundError extends VectorDBError {
|
|
90
|
+
vectorId;
|
|
91
|
+
constructor(vectorId) {
|
|
92
|
+
super(`Vector '${vectorId}' not found`, 'VECTOR_NOT_FOUND');
|
|
93
|
+
this.name = 'VectorNotFoundError';
|
|
94
|
+
this.vectorId = vectorId;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,IAAI,CAAS;IAEtB,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IAC9C,QAAQ,CAAS;IACjB,MAAM,CAAS;IAExB,YAAY,QAAgB,EAAE,MAAc,EAAE,OAAgB;QAC5D,MAAM,OAAO,GAAG,OAAO;YACrB,CAAC,CAAC,GAAG,OAAO,wBAAwB,QAAQ,SAAS,MAAM,EAAE;YAC7D,CAAC,CAAC,gCAAgC,QAAQ,SAAS,MAAM,EAAE,CAAC;QAC9D,KAAK,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,aAAa;IAC5C,GAAG,CAAW;IAEvB,YAAY,GAAa;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC;YAC9B,CAAC,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,kBAAkB;YAC7C,CAAC,CAAC,mCAAmC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,aAAa;IAC/C,cAAc,CAAS;IAEhC,YAAY,cAAsB;QAChC,KAAK,CAAC,eAAe,cAAc,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IAC7C,cAAc,CAAS;IAEhC,YAAY,cAAsB;QAChC,KAAK,CAAC,eAAe,cAAc,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,aAAa;IACpC,SAAS,CAAS;IAClB,IAAI,CAAU;IAEvB,YAAY,SAAiB,EAAE,OAAe,EAAE,IAAa;QAC3D,KAAK,CAAC,WAAW,SAAS,YAAY,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAC3C,QAAQ,CAAkB;IAEnC,YAAY,QAAyB;QACnC,KAAK,CAAC,WAAW,QAAQ,aAAa,EAAE,kBAAkB,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* verso - High-performance vector search with HNSW indexing
|
|
2
|
+
* verso-db - High-performance vector search with HNSW indexing
|
|
3
3
|
*
|
|
4
4
|
* Features:
|
|
5
5
|
* - HNSW algorithm for approximate nearest neighbor search
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
* - Int8 scalar quantization for 4x memory reduction
|
|
8
8
|
* - Batch query support for improved throughput
|
|
9
9
|
* - Parameter presets for different use cases
|
|
10
|
-
* - Multi-platform: Bun (file system) and Browser (OPFS)
|
|
10
|
+
* - Multi-platform: Bun/Node.js (file system) and Browser (OPFS)
|
|
11
11
|
*
|
|
12
12
|
* @example
|
|
13
13
|
* ```typescript
|
|
14
|
-
* import { VectorDB, getRecommendedPreset } from 'verso';
|
|
14
|
+
* import { VectorDB, getRecommendedPreset } from 'verso-db';
|
|
15
15
|
*
|
|
16
|
-
* const db = new VectorDB();
|
|
16
|
+
* const db = new VectorDB({ storagePath: './vectors' });
|
|
17
17
|
* const preset = getRecommendedPreset(768);
|
|
18
18
|
*
|
|
19
19
|
* const collection = await db.createCollection('my-vectors', {
|
|
@@ -36,29 +36,28 @@
|
|
|
36
36
|
* ```
|
|
37
37
|
*
|
|
38
38
|
* @packageDocumentation
|
|
39
|
-
* @module verso
|
|
39
|
+
* @module verso-db
|
|
40
40
|
*/
|
|
41
41
|
export { VectorDB } from './VectorDB';
|
|
42
|
-
export type { VectorDBConfig } from './VectorDB';
|
|
42
|
+
export type { VectorDBConfig, CollectionConfig } from './VectorDB';
|
|
43
43
|
export { Collection } from './Collection';
|
|
44
|
-
export type { AddConfig, QueryConfig, QueryResult } from './Collection';
|
|
44
|
+
export type { AddConfig, QueryConfig, QueryResult, CollectionOptions } from './Collection';
|
|
45
45
|
export { HNSWIndex } from './HNSWIndex';
|
|
46
|
-
export type { DistanceMetric
|
|
47
|
-
export type { DistanceBackend } from './backends/DistanceBackend';
|
|
48
|
-
export { JsDistanceBackend, dotProductFast, l2SquaredFast, normalizeInPlace, cosineDistanceFast } from './backends/JsDistanceBackend';
|
|
49
|
-
export { BinaryHeap } from './BinaryHeap';
|
|
50
|
-
export { MaxBinaryHeap } from './MaxBinaryHeap';
|
|
51
|
-
export { ScalarQuantizer, QuantizedVectorStore, dotProductInt8, l2SquaredInt8, cosineDistanceInt8 } from './quantization/ScalarQuantizer';
|
|
52
|
-
export type { QuantizationParams } from './quantization/ScalarQuantizer';
|
|
46
|
+
export type { DistanceMetric } from './HNSWIndex';
|
|
53
47
|
export type { HNSWPreset } from './presets';
|
|
54
48
|
export { PRESET_LOW_DIM, PRESET_MEDIUM_DIM, PRESET_HIGH_DIM, PRESET_VERY_HIGH_DIM, PRESET_SMALL_DATASET, PRESET_LARGE_DATASET, PRESET_MAX_RECALL, PRESET_LOW_LATENCY, PRESETS, getRecommendedPreset, getPreset, getRAGPreset } from './presets';
|
|
49
|
+
export { ScalarQuantizer } from './quantization/ScalarQuantizer';
|
|
50
|
+
export type { QuantizationParams } from './quantization/ScalarQuantizer';
|
|
55
51
|
export type { StorageBackend, StorageOptions } from './storage/StorageBackend';
|
|
56
52
|
export { BunStorageBackend } from './storage/BunStorageBackend';
|
|
57
53
|
export { MemoryBackend } from './storage/MemoryBackend';
|
|
58
54
|
export { OPFSBackend } from './storage/OPFSBackend';
|
|
59
55
|
export { createStorageBackend, getRecommendedStorageType, isStorageTypeAvailable, type StorageType, type CreateStorageOptions, } from './storage/createStorageBackend';
|
|
60
|
-
export { WriteAheadLog, WALOperationType
|
|
61
|
-
export {
|
|
62
|
-
export {
|
|
56
|
+
export { WriteAheadLog, WALOperationType } from './storage/WriteAheadLog';
|
|
57
|
+
export type { WALEntry } from './storage/WriteAheadLog';
|
|
58
|
+
export { BatchWriter, createBatchWriter } from './storage/BatchWriter';
|
|
59
|
+
export type { BatchWriterOptions } from './storage/BatchWriter';
|
|
60
|
+
export { WorkerPool } from './WorkerPool';
|
|
61
|
+
export { WorkerSearchState } from './SearchWorker';
|
|
63
62
|
export { VectorDBError, DimensionMismatchError, DuplicateVectorError, CollectionNotFoundError, CollectionExistsError, StorageError, QuantizationError, VectorNotFoundError, } from './errors';
|
|
64
63
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAKH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,OAAO,EACP,oBAAoB,EACpB,SAAS,EACT,YAAY,EACb,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGzE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,oBAAoB,GAC1B,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC1E,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,UAAU,CAAC"}
|