@anvia/transformers 1.0.0-rc.2 → 1.0.0-rc.4
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/dist/index.js +13 -7
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -102,13 +102,19 @@ async function loadTransformersEmbeddingModel(options) {
|
|
|
102
102
|
const normalized = normalizeRuntimeOptions(options);
|
|
103
103
|
let runtime;
|
|
104
104
|
try {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
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
|
+
);
|
|
112
118
|
return new OwnedTransformersEmbeddingModel(runtime, normalized);
|
|
113
119
|
} catch (error) {
|
|
114
120
|
await runtime?.dispose();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
|
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.
|
|
3
|
+
"version": "1.0.0-rc.4",
|
|
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.
|
|
36
|
+
"@anvia/core": "1.0.0-rc.4"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@anvia/core": "1.0.0-rc.
|
|
39
|
+
"@anvia/core": "1.0.0-rc.4"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
|