|
9 | 9 | * using Hierarchical Navigable Small World graphs", 2016. |
10 | 10 | */ |
11 | 11 |
|
| 12 | +import { QueryModeError } from "./errors.js"; |
| 13 | + |
12 | 14 | // --------------------------------------------------------------------------- |
13 | 15 | // Distance functions |
14 | 16 | // --------------------------------------------------------------------------- |
@@ -50,11 +52,11 @@ export function dotDistance(a: Float32Array, b: Float32Array): number { |
50 | 52 | /** Validate that a vector contains only finite values. */ |
51 | 53 | function validateVector(vec: Float32Array, dim: number, label: string): void { |
52 | 54 | if (vec.length !== dim) { |
53 | | - throw new Error(`${label}: expected dimension ${dim}, got ${vec.length}`); |
| 55 | + throw new QueryModeError("SCHEMA_MISMATCH", `${label}: expected dimension ${dim}, got ${vec.length}`); |
54 | 56 | } |
55 | 57 | for (let i = 0; i < vec.length; i++) { |
56 | 58 | if (!Number.isFinite(vec[i])) { |
57 | | - throw new Error(`${label} contains non-finite value at index ${i}: ${vec[i]}`); |
| 59 | + throw new QueryModeError("QUERY_FAILED", `${label} contains non-finite value at index ${i}: ${vec[i]}`); |
58 | 60 | } |
59 | 61 | } |
60 | 62 | } |
@@ -370,7 +372,7 @@ export class HnswIndex { |
370 | 372 |
|
371 | 373 | // Store vector |
372 | 374 | if (id !== this._size) { |
373 | | - throw new Error(`IDs must be sequential. Expected ${this._size}, got ${id}`); |
| 375 | + throw new QueryModeError("QUERY_FAILED", `IDs must be sequential. Expected ${this._size}, got ${id}`); |
374 | 376 | } |
375 | 377 | this.vectors.push(vector); |
376 | 378 |
|
@@ -442,7 +444,7 @@ export class HnswIndex { |
442 | 444 | /** Batch add vectors from a contiguous Float32Array. */ |
443 | 445 | addBatch(vectors: Float32Array, dim: number): void { |
444 | 446 | if (vectors.length % dim !== 0) { |
445 | | - throw new Error(`Vector buffer length ${vectors.length} is not divisible by dim ${dim}`); |
| 447 | + throw new QueryModeError("SCHEMA_MISMATCH", `Vector buffer length ${vectors.length} is not divisible by dim ${dim}`); |
446 | 448 | } |
447 | 449 | const count = vectors.length / dim; |
448 | 450 | const startId = this._size; |
@@ -590,7 +592,7 @@ export class HnswIndex { |
590 | 592 | // Header |
591 | 593 | const magic = view.getUint32(offset, true); offset += 4; |
592 | 594 | if (magic !== HNSW_MAGIC) { |
593 | | - throw new Error(`Invalid HNSW magic: 0x${magic.toString(16)}, expected 0x${HNSW_MAGIC.toString(16)}`); |
| 595 | + throw new QueryModeError("INVALID_FORMAT", `Invalid HNSW magic: 0x${magic.toString(16)}, expected 0x${HNSW_MAGIC.toString(16)}`); |
594 | 596 | } |
595 | 597 |
|
596 | 598 | const dim = view.getUint32(offset, true); offset += 4; |
|
0 commit comments