Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/embedder/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
export type { Embedder } from './types';

// Language detection & CJK utilities — re-exported from utils for backward compatibility
export { isCJK, splitMixed, detectLanguage, tokenizerForLanguage, detectTokenizer } from '../utils/tokenizer';
export { isCJK, detectLanguage, tokenizerForLanguage, detectTokenizer } from '../utils/tokenizer';
export type { LanguageHint } from '../utils/tokenizer';

// TransformersEmbedder — production-quality model embedder
Expand All @@ -26,4 +26,4 @@ export { EmbedderManager, getEmbedder, resetEmbedder } from './manager';

// Embedder resolution
export { resolveEmbedder } from './resolve';
export type { EmbedderInfo, EmbedderKind, ResolveResult } from './resolve';
export type { EmbedderInfo, EmbedderKind } from './resolve';
21 changes: 9 additions & 12 deletions src/embedder/manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,16 @@ export interface EmbedderManagerOptions {
export class EmbedderManager {
private _defaultEmbedder: Embedder | null = null;
private readonly _loader: TransformersLoader;
private readonly _ownsLoader: boolean;

constructor(options?: EmbedderManagerOptions) {
if (options?.transformersLoader) {
this._loader = options.transformersLoader;
this._ownsLoader = false;
} else {
// Default: use global shared loader (backward-compatible)
this._loader = {
load: loadTransformersModule,
reset: resetTransformersModule,
};
this._ownsLoader = false;
}
}

Expand Down Expand Up @@ -70,12 +67,12 @@ export class EmbedderManager {
if (!t) {
throw new Error(
'@huggingface/transformers is not installed. Semantic search requires a model-based embedder.\n' +
' Install it with:\n' +
' npm install @huggingface/transformers\n' +
' Then download the model:\n' +
' node scripts/download-model.mjs\n' +
' Or set mirror for China:\n' +
' export HF_ENDPOINT=https://hf-mirror.com'
' Install it with:\n' +
' npm install @huggingface/transformers\n' +
' Then download the model:\n' +
' node scripts/download-model.mjs\n' +
' Or set mirror for China:\n' +
' export HF_ENDPOINT=https://hf-mirror.com',
);
}

Expand All @@ -86,9 +83,9 @@ export class EmbedderManager {
} catch (err) {
throw new Error(
`Failed to load embedding model (bge-small-zh-v1.5): ${(err as Error).message?.split('\n')[0] ?? 'unknown'}\n` +
' To fix model download:\n' +
' 1. Set mirror: export HF_ENDPOINT=https://hf-mirror.com\n' +
' 2. Manual download: node scripts/download-model.mjs'
' To fix model download:\n' +
' 1. Set mirror: export HF_ENDPOINT=https://hf-mirror.com\n' +
' 2. Manual download: node scripts/download-model.mjs',
);
}
return this._defaultEmbedder;
Expand Down
8 changes: 3 additions & 5 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,22 +37,19 @@ export {
tokenizerForLanguage,
detectTokenizer,
} from './embedder';
export type { Embedder } from './embedder';
export type { LanguageHint } from './embedder';
export type { EmbedderInfo, EmbedderKind } from './embedder';
export type { Embedder, LanguageHint, EmbedderInfo, EmbedderKind } from './embedder';

// Zvec store — custom vector storage backends
export {
IZvecStore,
ActualZvecStore,
createZvecStore,
openZvecStore,
openZvecStoreSync,
isZvecAvailable,
buildZvecSchema,
cosineSimilarity,
} from './storage/zvec-store';
export type {
IZvecStore,
ZvecDoc,
ZvecQueryResult,
ZvecSearchParams,
Expand All @@ -66,3 +63,4 @@ export type {
export { Store } from './storage/store';
export type { StoreQueryParams } from './storage/store';


4 changes: 2 additions & 2 deletions src/loaders/util.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as crypto from 'crypto';
import * as path from 'path';
import { computeContentHash } from '../utils/hash';

/**
* Convert a file path to a safe, collision-resistant ID for zvec.
Expand All @@ -20,7 +20,7 @@ export function pathToId(filePath: string): string {
const normalized = path.normalize(filePath).replace(/\\/g, '/').replace(/^\/+/, '');

// Generate a compact hash of the full path (16 hex chars = 64-bit)
const hash = crypto.createHash('sha256').update(normalized).digest('hex').slice(0, 16);
const hash = computeContentHash(normalized);

// Derive a short readable suffix from the filename (without extension)
const basename = normalized.split('/').pop() ?? '';
Expand Down
Loading
Loading