Skip to content

Commit 9938b10

Browse files
feat: make @huggingface/transformers optional and improve error handling in EmbeddingService
1 parent 615f4af commit 9938b10

4 files changed

Lines changed: 40 additions & 11 deletions

File tree

libs/enclave-vm/package.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@
4242
"astring": "1.9.0",
4343
"zod": "^4.1.13"
4444
},
45-
"optionalDependencies": {
46-
"@huggingface/transformers": "^3.0.0"
47-
},
4845
"peerDependencies": {
4946
"@huggingface/transformers": "^3.0.0"
5047
},

libs/vectoriadb/package.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,13 @@
3737
"default": "./dist/src/index.js"
3838
}
3939
},
40-
"dependencies": {
41-
"@huggingface/transformers": "^3.2.2"
40+
"peerDependencies": {
41+
"@huggingface/transformers": "^3.0.0"
42+
},
43+
"peerDependenciesMeta": {
44+
"@huggingface/transformers": {
45+
"optional": true
46+
}
4247
},
4348
"devDependencies": {
4449
"typescript": "^5.9.3"

libs/vectoriadb/src/embedding.service.ts

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
import { pipeline } from '@huggingface/transformers';
2-
import { EmbeddingError } from './errors';
1+
import { EmbeddingError, ConfigurationError } from './errors';
2+
3+
// Dynamic import type for @huggingface/transformers
4+
type PipelineFunction = typeof import('@huggingface/transformers').pipeline;
35

46
/**
57
* Service for generating embeddings using transformers.js
8+
*
9+
* NOTE: This service requires @huggingface/transformers to be installed.
10+
* Install it with: npm install @huggingface/transformers
11+
*
12+
* For a zero-dependency alternative, use TFIDFEmbeddingService instead.
613
*/
714
export class EmbeddingService {
815
private pipeline: any = null;
@@ -17,6 +24,23 @@ export class EmbeddingService {
1724
this.cacheDir = cacheDir;
1825
}
1926

27+
/**
28+
* Dynamically import @huggingface/transformers
29+
* This allows the package to be optional - only loaded when actually used
30+
*/
31+
private async loadTransformers(): Promise<PipelineFunction> {
32+
try {
33+
const transformers = await import('@huggingface/transformers');
34+
return transformers.pipeline;
35+
} catch (error) {
36+
throw new ConfigurationError(
37+
'@huggingface/transformers is not installed. ' +
38+
'Install it with: npm install @huggingface/transformers\n' +
39+
'Or use TFIDFVectoria/TFIDFEmbeddingService for a zero-dependency alternative.',
40+
);
41+
}
42+
}
43+
2044
/**
2145
* Initialize the embedding model
2246
*/
@@ -36,8 +60,11 @@ export class EmbeddingService {
3660

3761
private async _initialize(): Promise<void> {
3862
try {
63+
// Dynamically load transformers
64+
const pipelineFn = await this.loadTransformers();
65+
3966
// Create feature extraction pipeline
40-
this.pipeline = await pipeline('feature-extraction', this.modelName, {
67+
this.pipeline = await pipelineFn('feature-extraction', this.modelName, {
4168
// Use local models directory to cache models
4269
cache_dir: this.cacheDir,
4370
// // Don't require progress bars in production
@@ -54,6 +81,9 @@ export class EmbeddingService {
5481
this.isInitialized = true;
5582
} catch (error) {
5683
this.initializationPromise = null;
84+
if (error instanceof ConfigurationError) {
85+
throw error;
86+
}
5787
throw new EmbeddingError(
5888
`Failed to initialize embedding model: ${error instanceof Error ? error.message : String(error)}`,
5989
error instanceof Error ? error : undefined,

package.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919
"*.{json,css,scss,md,html,yml,yaml}": "prettier --write"
2020
},
2121
"private": true,
22-
"dependencies": {
23-
"@huggingface/transformers": "^3.2.2"
24-
},
2522
"devDependencies": {
2623
"@eslint/js": "^9.8.0",
2724
"@mdx-js/mdx": "^3.1.1",

0 commit comments

Comments
 (0)