@anvia/transformers 1.0.0-rc.1 → 1.0.0-rc.3

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 CHANGED
@@ -1,8 +1,6 @@
1
1
  # @anvia/transformers
2
2
 
3
- Transformers.js embedding model adapter for Anvia.
4
-
5
- Use this package when you want local embedding generation through `@huggingface/transformers`, especially for development or lightweight RAG workflows.
3
+ Local Transformers.js embedding model adapter for Anvia.
6
4
 
7
5
  ## Installation
8
6
 
@@ -10,78 +8,67 @@ Use this package when you want local embedding generation through `@huggingface/
10
8
  pnpm add @anvia/transformers @anvia/core @huggingface/transformers
11
9
  ```
12
10
 
13
- In this monorepo, the package is available through the workspace:
14
-
15
- ```sh
16
- pnpm --filter @anvia/transformers build
17
- ```
18
-
19
11
  ## Usage
20
12
 
21
13
  ```ts
22
14
  import { embedDocuments } from "@anvia/core/embeddings";
23
- import { InMemoryVectorStore } from "@anvia/core/vector-store";
24
- import { createTransformersEmbeddingModel } from "@anvia/transformers";
25
-
26
- const embeddingModel = await createTransformersEmbeddingModel();
27
-
28
- const documents = await embedDocuments(
29
- embeddingModel,
30
- [
31
- {
32
- id: "password-reset",
33
- title: "Password reset policy",
34
- body: "Password reset links expire after 30 minutes.",
35
- },
36
- {
37
- id: "priority-support",
38
- title: "Priority support",
39
- body: "Enterprise customers receive priority support.",
40
- },
41
- ],
42
- {
43
- id: (document) => document.id,
44
- content: (document) => `${document.title}\n${document.body}`,
45
- },
46
- );
47
-
48
- const store = InMemoryVectorStore.fromDocuments(documents);
49
- const index = store.index(embeddingModel);
50
-
51
- const results = await index.search({
52
- query: "How long does a password reset link last?",
53
- topK: 3,
15
+ import { InMemoryVectorStore, retrieveDocuments } from "@anvia/core/vector-store";
16
+ import { loadTransformersEmbeddingModel } from "@anvia/transformers";
17
+
18
+ const model = await loadTransformersEmbeddingModel({ modelId: "Xenova/all-MiniLM-L6-v2" });
19
+ const { documents } = await embedDocuments({
20
+ model,
21
+ documents: [{ id: "password-reset", text: "Reset links expire after 30 minutes." }],
22
+ id: (document) => document.id,
23
+ content: (document) => document.text,
54
24
  });
55
25
 
56
- console.log(results);
26
+ const store = InMemoryVectorStore.fromDocuments({ documents });
27
+ const results = await retrieveDocuments({
28
+ store,
29
+ model,
30
+ query: "How long does a reset link last?",
31
+ topK: 3,
32
+ });
57
33
  ```
58
34
 
59
- ## Default Model
35
+ Loading is eager and may download model files. Reuse the returned handle and close it at application
36
+ shutdown. The handle supports `await using` and waits for active inference before disposing its
37
+ owned Transformers pipeline.
60
38
 
61
- The default embedding model is:
39
+ ```ts
40
+ const model = await loadTransformersEmbeddingModel({
41
+ modelId: "Xenova/all-MiniLM-L6-v2",
42
+ pooling: "mean",
43
+ normalize: true,
44
+ maxBatchSize: 16,
45
+ });
46
+ ```
62
47
 
63
48
  ```ts
64
- Xenova/all-MiniLM-L6-v2
49
+ await using model = await loadTransformersEmbeddingModel({
50
+ modelId: "Xenova/all-MiniLM-L6-v2",
51
+ device: "cpu",
52
+ dtype: "q8",
53
+ cacheDir: "./models",
54
+ });
65
55
  ```
66
56
 
67
- You can pass another feature-extraction model:
57
+ Adapt an existing pipeline when the application owns its lifecycle:
68
58
 
69
59
  ```ts
70
- const embeddingModel = await createTransformersEmbeddingModel({
71
- model: "Xenova/all-MiniLM-L6-v2",
60
+ import { adaptTransformersEmbeddingModel } from "@anvia/transformers";
61
+
62
+ const model = adaptTransformersEmbeddingModel({
63
+ runtime: existingPipeline,
64
+ modelId: "custom-model",
72
65
  pooling: "mean",
73
66
  normalize: true,
74
- maxBatchSize: 16,
75
67
  });
76
68
  ```
77
69
 
78
- ## Exports
79
-
80
- - `TransformersEmbeddingModel`
81
- - `createTransformersEmbeddingModel`
82
- - `DEFAULT_TRANSFORMERS_EMBEDDING_MODEL`
83
- - `TransformersEmbeddingModelOptions`
84
- - `TransformersPooling`
70
+ Adapted handles never dispose the caller-owned runtime. Embedding helpers use object arguments,
71
+ return named results, and accept `retries` and `abortSignal`.
85
72
 
86
73
  ## Development
87
74
 
package/dist/index.d.ts CHANGED
@@ -1,30 +1,40 @@
1
- import { EmbeddingModel, Embedding } from '@anvia/core/embeddings';
1
+ import { EmbeddingModel } from '@anvia/core/embeddings';
2
2
 
3
3
  type TransformersPooling = "mean" | "cls";
4
- type TransformersFeatureExtractionPipeline = (texts: string[], options: {
5
- pooling: TransformersPooling;
6
- normalize: boolean;
7
- }) => Promise<{
4
+ type TransformersTensor = {
8
5
  tolist(): unknown;
9
- }>;
10
- type TransformersEmbeddingModelOptions = {
11
- model?: string | undefined;
6
+ dispose(): void;
7
+ };
8
+ type TransformersFeatureExtractionPipeline = {
9
+ (texts: string[], options: {
10
+ pooling: TransformersPooling;
11
+ normalize: boolean;
12
+ }): Promise<TransformersTensor>;
13
+ dispose(): Promise<void>;
14
+ };
15
+ type TransformersEmbeddingRuntimeOptions = {
16
+ modelId: string;
12
17
  pooling?: TransformersPooling | undefined;
13
18
  normalize?: boolean | undefined;
14
19
  maxBatchSize?: number | undefined;
15
20
  };
21
+ type LoadTransformersEmbeddingModelOptions = TransformersEmbeddingRuntimeOptions & {
22
+ device?: string | Record<string, string> | undefined;
23
+ dtype?: string | Record<string, string> | undefined;
24
+ cacheDir?: string | undefined;
25
+ localFilesOnly?: boolean | undefined;
26
+ revision?: string | undefined;
27
+ };
28
+ type AdaptTransformersEmbeddingModelOptions = TransformersEmbeddingRuntimeOptions & {
29
+ runtime: TransformersFeatureExtractionPipeline;
30
+ };
31
+ interface LoadedTransformersEmbeddingModel extends EmbeddingModel, AsyncDisposable {
32
+ close(): Promise<void>;
33
+ }
34
+ type TransformersEmbeddingModelHandle = EmbeddingModel;
16
35
 
17
36
  declare const DEFAULT_TRANSFORMERS_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
18
- declare class TransformersEmbeddingModel implements EmbeddingModel {
19
- private readonly extractor;
20
- readonly model: string;
21
- readonly maxBatchSize: number;
22
- private readonly pooling;
23
- private readonly normalize;
24
- constructor(extractor: TransformersFeatureExtractionPipeline, options?: TransformersEmbeddingModelOptions);
25
- static create(options?: TransformersEmbeddingModelOptions): Promise<TransformersEmbeddingModel>;
26
- embedTexts(texts: string[]): Promise<Embedding[]>;
27
- }
28
- declare function createTransformersEmbeddingModel(options?: TransformersEmbeddingModelOptions): Promise<TransformersEmbeddingModel>;
37
+ declare function loadTransformersEmbeddingModel(options: LoadTransformersEmbeddingModelOptions): Promise<LoadedTransformersEmbeddingModel>;
38
+ declare function adaptTransformersEmbeddingModel(options: AdaptTransformersEmbeddingModelOptions): TransformersEmbeddingModelHandle;
29
39
 
30
- export { DEFAULT_TRANSFORMERS_EMBEDDING_MODEL, TransformersEmbeddingModel, type TransformersEmbeddingModelOptions, type TransformersFeatureExtractionPipeline, type TransformersPooling, createTransformersEmbeddingModel };
40
+ export { type AdaptTransformersEmbeddingModelOptions, DEFAULT_TRANSFORMERS_EMBEDDING_MODEL, type LoadTransformersEmbeddingModelOptions, type LoadedTransformersEmbeddingModel, type TransformersEmbeddingModelHandle, type TransformersFeatureExtractionPipeline, type TransformersPooling, type TransformersTensor, adaptTransformersEmbeddingModel, loadTransformersEmbeddingModel };
package/dist/index.js CHANGED
@@ -18,48 +18,142 @@ function parseVectors(value, expectedLength) {
18
18
 
19
19
  // src/model.ts
20
20
  var DEFAULT_TRANSFORMERS_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
21
- var TransformersEmbeddingModel = class _TransformersEmbeddingModel {
22
- constructor(extractor, options = {}) {
23
- this.extractor = extractor;
24
- this.model = options.model ?? DEFAULT_TRANSFORMERS_EMBEDDING_MODEL;
21
+ var TransformersEmbeddingModel = class {
22
+ constructor(runtime, options) {
23
+ this.runtime = runtime;
24
+ this.modelId = requireModelId(options.modelId);
25
25
  this.pooling = options.pooling ?? "mean";
26
26
  this.normalize = options.normalize ?? true;
27
- this.maxBatchSize = Math.max(1, Math.trunc(options.maxBatchSize ?? 16));
27
+ this.maxBatchSize = positiveSafeInteger(options.maxBatchSize ?? 16, "maxBatchSize");
28
28
  }
29
- extractor;
30
- model;
29
+ runtime;
30
+ provider = "transformers";
31
+ modelId;
31
32
  maxBatchSize;
32
33
  pooling;
33
34
  normalize;
34
- static async create(options = {}) {
35
- const model = options.model ?? DEFAULT_TRANSFORMERS_EMBEDDING_MODEL;
36
- const extractor = await transformersPipeline(
37
- "feature-extraction",
38
- model
39
- );
40
- return new _TransformersEmbeddingModel(extractor, { ...options, model });
35
+ beginCall() {
36
+ }
37
+ endCall() {
38
+ }
39
+ async embedTexts(texts, options) {
40
+ this.beginCall();
41
+ let output;
42
+ try {
43
+ throwIfAborted(options?.abortSignal);
44
+ if (texts.length === 0) {
45
+ return [];
46
+ }
47
+ output = await this.runtime(texts, {
48
+ pooling: this.pooling,
49
+ normalize: this.normalize
50
+ });
51
+ throwIfAborted(options?.abortSignal);
52
+ const vectors = parseVectors(output.tolist(), texts.length);
53
+ return texts.map((document, index) => ({
54
+ document,
55
+ vector: vectors[index]
56
+ }));
57
+ } finally {
58
+ try {
59
+ output?.dispose();
60
+ } finally {
61
+ this.endCall();
62
+ }
63
+ }
64
+ }
65
+ };
66
+ var OwnedTransformersEmbeddingModel = class extends TransformersEmbeddingModel {
67
+ closed = false;
68
+ activeCalls = 0;
69
+ idleWaiters = /* @__PURE__ */ new Set();
70
+ closePromise;
71
+ beginCall() {
72
+ if (this.closed) {
73
+ throw new Error("Transformers embedding model is closed.");
74
+ }
75
+ this.activeCalls += 1;
76
+ }
77
+ endCall() {
78
+ this.activeCalls -= 1;
79
+ if (this.activeCalls === 0) {
80
+ for (const resolve of this.idleWaiters) resolve();
81
+ this.idleWaiters.clear();
82
+ }
41
83
  }
42
- async embedTexts(texts) {
43
- if (texts.length === 0) {
44
- return [];
84
+ close() {
85
+ if (this.closePromise !== void 0) {
86
+ return this.closePromise;
45
87
  }
46
- const output = await this.extractor(texts, {
47
- pooling: this.pooling,
48
- normalize: this.normalize
49
- });
50
- const vectors = parseVectors(output.tolist(), texts.length);
51
- return texts.map((document, index) => ({
52
- document,
53
- vector: vectors[index]
54
- }));
88
+ this.closed = true;
89
+ this.closePromise = (async () => {
90
+ if (this.activeCalls > 0) {
91
+ await new Promise((resolve) => this.idleWaiters.add(resolve));
92
+ }
93
+ await this.runtime.dispose();
94
+ })();
95
+ return this.closePromise;
96
+ }
97
+ async [Symbol.asyncDispose]() {
98
+ await this.close();
55
99
  }
56
100
  };
57
- function createTransformersEmbeddingModel(options = {}) {
58
- return TransformersEmbeddingModel.create(options);
101
+ async function loadTransformersEmbeddingModel(options) {
102
+ const normalized = normalizeRuntimeOptions(options);
103
+ let runtime;
104
+ try {
105
+ const runtimeOptions = {};
106
+ if (options.device !== void 0) runtimeOptions.device = options.device;
107
+ if (options.dtype !== void 0) runtimeOptions.dtype = options.dtype;
108
+ if (options.cacheDir !== void 0) runtimeOptions.cache_dir = options.cacheDir;
109
+ if (options.localFilesOnly !== void 0) {
110
+ runtimeOptions.local_files_only = options.localFilesOnly;
111
+ }
112
+ if (options.revision !== void 0) runtimeOptions.revision = options.revision;
113
+ runtime = await transformersPipeline(
114
+ "feature-extraction",
115
+ normalized.modelId,
116
+ runtimeOptions
117
+ );
118
+ return new OwnedTransformersEmbeddingModel(runtime, normalized);
119
+ } catch (error) {
120
+ await runtime?.dispose();
121
+ throw error;
122
+ }
123
+ }
124
+ function adaptTransformersEmbeddingModel(options) {
125
+ return new TransformersEmbeddingModel(options.runtime, normalizeRuntimeOptions(options));
126
+ }
127
+ function normalizeRuntimeOptions(options) {
128
+ return {
129
+ modelId: requireModelId(options.modelId),
130
+ pooling: options.pooling,
131
+ normalize: options.normalize,
132
+ maxBatchSize: positiveSafeInteger(options.maxBatchSize ?? 16, "maxBatchSize")
133
+ };
134
+ }
135
+ function requireModelId(modelId) {
136
+ if (modelId.trim().length === 0) {
137
+ throw new TypeError("modelId must be a non-empty string");
138
+ }
139
+ return modelId;
140
+ }
141
+ function positiveSafeInteger(value, name) {
142
+ if (!Number.isSafeInteger(value) || value <= 0) {
143
+ throw new TypeError(`${name} must be a positive safe integer`);
144
+ }
145
+ return value;
146
+ }
147
+ function throwIfAborted(signal) {
148
+ if (signal?.aborted) {
149
+ const error = new Error("The operation was aborted.");
150
+ error.name = "AbortError";
151
+ throw error;
152
+ }
59
153
  }
60
154
  export {
61
155
  DEFAULT_TRANSFORMERS_EMBEDDING_MODEL,
62
- TransformersEmbeddingModel,
63
- createTransformersEmbeddingModel
156
+ adaptTransformersEmbeddingModel,
157
+ loadTransformersEmbeddingModel
64
158
  };
65
159
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/model.ts","../src/helpers.ts"],"sourcesContent":["import type { Embedding, EmbeddingModel } from \"@anvia/core/embeddings\";\nimport { pipeline as transformersPipeline } from \"@huggingface/transformers\";\nimport { parseVectors } from \"./helpers.js\";\nimport type {\n TransformersEmbeddingModelOptions,\n TransformersFeatureExtractionPipeline,\n TransformersPooling,\n} from \"./types.js\";\n\nexport const DEFAULT_TRANSFORMERS_EMBEDDING_MODEL = \"Xenova/all-MiniLM-L6-v2\";\n\nexport class TransformersEmbeddingModel implements EmbeddingModel {\n readonly model: string;\n readonly maxBatchSize: number;\n\n private readonly pooling: TransformersPooling;\n private readonly normalize: boolean;\n\n constructor(\n private readonly extractor: TransformersFeatureExtractionPipeline,\n options: TransformersEmbeddingModelOptions = {},\n ) {\n this.model = options.model ?? DEFAULT_TRANSFORMERS_EMBEDDING_MODEL;\n this.pooling = options.pooling ?? \"mean\";\n this.normalize = options.normalize ?? true;\n this.maxBatchSize = Math.max(1, Math.trunc(options.maxBatchSize ?? 16));\n }\n\n static async create(\n options: TransformersEmbeddingModelOptions = {},\n ): Promise<TransformersEmbeddingModel> {\n const model = options.model ?? DEFAULT_TRANSFORMERS_EMBEDDING_MODEL;\n const extractor = (await transformersPipeline(\n \"feature-extraction\",\n model,\n )) as TransformersFeatureExtractionPipeline;\n\n return new TransformersEmbeddingModel(extractor, { ...options, model });\n }\n\n async embedTexts(texts: string[]): Promise<Embedding[]> {\n if (texts.length === 0) {\n return [];\n }\n\n const output = await this.extractor(texts, {\n pooling: this.pooling,\n normalize: this.normalize,\n });\n const vectors = parseVectors(output.tolist(), texts.length);\n\n return texts.map((document, index) => ({\n document,\n vector: vectors[index] as number[],\n }));\n }\n}\n\nexport function createTransformersEmbeddingModel(\n options: TransformersEmbeddingModelOptions = {},\n): Promise<TransformersEmbeddingModel> {\n return TransformersEmbeddingModel.create(options);\n}\n","export function parseVectors(value: unknown, expectedLength: number): number[][] {\n if (!Array.isArray(value) || value.length !== expectedLength) {\n throw new Error(\n `Transformers embedding model returned ${Array.isArray(value) ? value.length : 0} embeddings for ${expectedLength} texts`,\n );\n }\n\n return value.map((vector, index) => {\n if (!Array.isArray(vector) || !vector.every((item) => typeof item === \"number\")) {\n throw new Error(`Transformers embedding model returned an invalid vector at index ${index}`);\n }\n return vector;\n });\n}\n"],"mappings":";AACA,SAAS,YAAY,4BAA4B;;;ACD1C,SAAS,aAAa,OAAgB,gBAAoC;AAC/E,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,gBAAgB;AAC5D,UAAM,IAAI;AAAA,MACR,yCAAyC,MAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,CAAC,mBAAmB,cAAc;AAAA,IACnH;AAAA,EACF;AAEA,SAAO,MAAM,IAAI,CAAC,QAAQ,UAAU;AAClC,QAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,CAAC,OAAO,MAAM,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AAC/E,YAAM,IAAI,MAAM,oEAAoE,KAAK,EAAE;AAAA,IAC7F;AACA,WAAO;AAAA,EACT,CAAC;AACH;;;ADJO,IAAM,uCAAuC;AAE7C,IAAM,6BAAN,MAAM,4BAAqD;AAAA,EAOhE,YACmB,WACjB,UAA6C,CAAC,GAC9C;AAFiB;AAGjB,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,gBAAgB,EAAE,CAAC;AAAA,EACxE;AAAA,EAPmB;AAAA,EAPV;AAAA,EACA;AAAA,EAEQ;AAAA,EACA;AAAA,EAYjB,aAAa,OACX,UAA6C,CAAC,GACT;AACrC,UAAM,QAAQ,QAAQ,SAAS;AAC/B,UAAM,YAAa,MAAM;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAEA,WAAO,IAAI,4BAA2B,WAAW,EAAE,GAAG,SAAS,MAAM,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,WAAW,OAAuC;AACtD,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,SAAS,MAAM,KAAK,UAAU,OAAO;AAAA,MACzC,SAAS,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,IAClB,CAAC;AACD,UAAM,UAAU,aAAa,OAAO,OAAO,GAAG,MAAM,MAAM;AAE1D,WAAO,MAAM,IAAI,CAAC,UAAU,WAAW;AAAA,MACrC;AAAA,MACA,QAAQ,QAAQ,KAAK;AAAA,IACvB,EAAE;AAAA,EACJ;AACF;AAEO,SAAS,iCACd,UAA6C,CAAC,GACT;AACrC,SAAO,2BAA2B,OAAO,OAAO;AAClD;","names":[]}
1
+ {"version":3,"sources":["../src/model.ts","../src/helpers.ts"],"sourcesContent":["import type { Embedding, EmbeddingModel, ModelCallOptions } from \"@anvia/core/embeddings\";\nimport { pipeline as transformersPipeline } from \"@huggingface/transformers\";\nimport { parseVectors } from \"./helpers.js\";\nimport type {\n AdaptTransformersEmbeddingModelOptions,\n LoadedTransformersEmbeddingModel,\n LoadTransformersEmbeddingModelOptions,\n TransformersEmbeddingModelHandle,\n TransformersFeatureExtractionPipeline,\n TransformersPooling,\n TransformersTensor,\n} from \"./types.js\";\n\nexport const DEFAULT_TRANSFORMERS_EMBEDDING_MODEL = \"Xenova/all-MiniLM-L6-v2\";\n\nclass TransformersEmbeddingModel implements EmbeddingModel {\n readonly provider = \"transformers\";\n readonly modelId: string;\n readonly maxBatchSize: number;\n\n private readonly pooling: TransformersPooling;\n private readonly normalize: boolean;\n\n constructor(\n protected readonly runtime: TransformersFeatureExtractionPipeline,\n options: {\n modelId: string;\n pooling?: TransformersPooling | undefined;\n normalize?: boolean | undefined;\n maxBatchSize?: number | undefined;\n },\n ) {\n this.modelId = requireModelId(options.modelId);\n this.pooling = options.pooling ?? \"mean\";\n this.normalize = options.normalize ?? true;\n this.maxBatchSize = positiveSafeInteger(options.maxBatchSize ?? 16, \"maxBatchSize\");\n }\n\n protected beginCall(): void {}\n protected endCall(): void {}\n\n async embedTexts(texts: string[], options?: ModelCallOptions): Promise<Embedding[]> {\n this.beginCall();\n let output: TransformersTensor | undefined;\n try {\n throwIfAborted(options?.abortSignal);\n if (texts.length === 0) {\n return [];\n }\n\n output = await this.runtime(texts, {\n pooling: this.pooling,\n normalize: this.normalize,\n });\n throwIfAborted(options?.abortSignal);\n const vectors = parseVectors(output.tolist(), texts.length);\n\n return texts.map((document, index) => ({\n document,\n vector: vectors[index] as number[],\n }));\n } finally {\n try {\n output?.dispose();\n } finally {\n this.endCall();\n }\n }\n }\n}\n\nclass OwnedTransformersEmbeddingModel\n extends TransformersEmbeddingModel\n implements LoadedTransformersEmbeddingModel\n{\n private closed = false;\n private activeCalls = 0;\n private readonly idleWaiters = new Set<() => void>();\n private closePromise: Promise<void> | undefined;\n\n protected override beginCall(): void {\n if (this.closed) {\n throw new Error(\"Transformers embedding model is closed.\");\n }\n this.activeCalls += 1;\n }\n\n protected override endCall(): void {\n this.activeCalls -= 1;\n if (this.activeCalls === 0) {\n for (const resolve of this.idleWaiters) resolve();\n this.idleWaiters.clear();\n }\n }\n\n close(): Promise<void> {\n if (this.closePromise !== undefined) {\n return this.closePromise;\n }\n this.closed = true;\n this.closePromise = (async () => {\n if (this.activeCalls > 0) {\n await new Promise<void>((resolve) => this.idleWaiters.add(resolve));\n }\n await this.runtime.dispose();\n })();\n return this.closePromise;\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n}\n\nexport async function loadTransformersEmbeddingModel(\n options: LoadTransformersEmbeddingModelOptions,\n): Promise<LoadedTransformersEmbeddingModel> {\n const normalized = normalizeRuntimeOptions(options);\n let runtime: TransformersFeatureExtractionPipeline | undefined;\n try {\n const runtimeOptions: Record<string, unknown> = {};\n if (options.device !== undefined) runtimeOptions.device = options.device;\n if (options.dtype !== undefined) runtimeOptions.dtype = options.dtype;\n if (options.cacheDir !== undefined) runtimeOptions.cache_dir = options.cacheDir;\n if (options.localFilesOnly !== undefined) {\n runtimeOptions.local_files_only = options.localFilesOnly;\n }\n if (options.revision !== undefined) runtimeOptions.revision = options.revision;\n runtime = (await transformersPipeline(\n \"feature-extraction\",\n normalized.modelId,\n runtimeOptions as never,\n )) as TransformersFeatureExtractionPipeline;\n return new OwnedTransformersEmbeddingModel(runtime, normalized);\n } catch (error) {\n await runtime?.dispose();\n throw error;\n }\n}\n\nexport function adaptTransformersEmbeddingModel(\n options: AdaptTransformersEmbeddingModelOptions,\n): TransformersEmbeddingModelHandle {\n return new TransformersEmbeddingModel(options.runtime, normalizeRuntimeOptions(options));\n}\n\nfunction normalizeRuntimeOptions(options: {\n modelId: string;\n pooling?: TransformersPooling | undefined;\n normalize?: boolean | undefined;\n maxBatchSize?: number | undefined;\n}) {\n return {\n modelId: requireModelId(options.modelId),\n pooling: options.pooling,\n normalize: options.normalize,\n maxBatchSize: positiveSafeInteger(options.maxBatchSize ?? 16, \"maxBatchSize\"),\n };\n}\n\nfunction requireModelId(modelId: string): string {\n if (modelId.trim().length === 0) {\n throw new TypeError(\"modelId must be a non-empty string\");\n }\n return modelId;\n}\n\nfunction positiveSafeInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`${name} must be a positive safe integer`);\n }\n return value;\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n const error = new Error(\"The operation was aborted.\");\n error.name = \"AbortError\";\n throw error;\n }\n}\n","export function parseVectors(value: unknown, expectedLength: number): number[][] {\n if (!Array.isArray(value) || value.length !== expectedLength) {\n throw new Error(\n `Transformers embedding model returned ${Array.isArray(value) ? value.length : 0} embeddings for ${expectedLength} texts`,\n );\n }\n\n return value.map((vector, index) => {\n if (!Array.isArray(vector) || !vector.every((item) => typeof item === \"number\")) {\n throw new Error(`Transformers embedding model returned an invalid vector at index ${index}`);\n }\n return vector;\n });\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/transformers",
3
- "version": "1.0.0-rc.1",
3
+ "version": "1.0.0-rc.3",
4
4
  "description": "Transformers.js embedding model adapter for Anvia.",
5
5
  "author": "anvia",
6
6
  "maintainer": "Indra Zulfi",
@@ -33,10 +33,10 @@
33
33
  "tsup": "^8.5.0",
34
34
  "typescript": "^5.9.3",
35
35
  "vitest": "^4.0.8",
36
- "@anvia/core": "1.0.0-rc.1"
36
+ "@anvia/core": "1.0.0-rc.3"
37
37
  },
38
38
  "peerDependencies": {
39
- "@anvia/core": "1.0.0-rc.1"
39
+ "@anvia/core": "1.0.0-rc.3"
40
40
  },
41
41
  "scripts": {
42
42
  "build": "tsup src/index.ts --format esm --dts --sourcemap --clean",