@anvia/transformers 1.0.0-rc.1 → 1.0.0-rc.2
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 +42 -55
- package/dist/index.d.ts +30 -20
- package/dist/index.js +118 -30
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
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 {
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
57
|
+
Adapt an existing pipeline when the application owns its lifecycle:
|
|
68
58
|
|
|
69
59
|
```ts
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
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
|
|
1
|
+
import { EmbeddingModel } from '@anvia/core/embeddings';
|
|
2
2
|
|
|
3
3
|
type TransformersPooling = "mean" | "cls";
|
|
4
|
-
type
|
|
5
|
-
pooling: TransformersPooling;
|
|
6
|
-
normalize: boolean;
|
|
7
|
-
}) => Promise<{
|
|
4
|
+
type TransformersTensor = {
|
|
8
5
|
tolist(): unknown;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
19
|
-
|
|
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,
|
|
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,136 @@ 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
|
|
22
|
-
constructor(
|
|
23
|
-
this.
|
|
24
|
-
this.
|
|
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 =
|
|
27
|
+
this.maxBatchSize = positiveSafeInteger(options.maxBatchSize ?? 16, "maxBatchSize");
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
runtime;
|
|
30
|
+
provider = "transformers";
|
|
31
|
+
modelId;
|
|
31
32
|
maxBatchSize;
|
|
32
33
|
pooling;
|
|
33
34
|
normalize;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"feature-extraction",
|
|
38
|
-
model
|
|
39
|
-
);
|
|
40
|
-
return new _TransformersEmbeddingModel(extractor, { ...options, model });
|
|
35
|
+
beginCall() {
|
|
36
|
+
}
|
|
37
|
+
endCall() {
|
|
41
38
|
}
|
|
42
|
-
async embedTexts(texts) {
|
|
43
|
-
|
|
44
|
-
|
|
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
|
+
}
|
|
45
63
|
}
|
|
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
|
-
}));
|
|
55
64
|
}
|
|
56
65
|
};
|
|
57
|
-
|
|
58
|
-
|
|
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
|
+
}
|
|
83
|
+
}
|
|
84
|
+
close() {
|
|
85
|
+
if (this.closePromise !== void 0) {
|
|
86
|
+
return this.closePromise;
|
|
87
|
+
}
|
|
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();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
async function loadTransformersEmbeddingModel(options) {
|
|
102
|
+
const normalized = normalizeRuntimeOptions(options);
|
|
103
|
+
let runtime;
|
|
104
|
+
try {
|
|
105
|
+
runtime = await transformersPipeline("feature-extraction", normalized.modelId, {
|
|
106
|
+
...options.device === void 0 ? {} : { device: options.device },
|
|
107
|
+
...options.dtype === void 0 ? {} : { dtype: options.dtype },
|
|
108
|
+
...options.cacheDir === void 0 ? {} : { cache_dir: options.cacheDir },
|
|
109
|
+
...options.localFilesOnly === void 0 ? {} : { local_files_only: options.localFilesOnly },
|
|
110
|
+
...options.revision === void 0 ? {} : { revision: options.revision }
|
|
111
|
+
});
|
|
112
|
+
return new OwnedTransformersEmbeddingModel(runtime, normalized);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
await runtime?.dispose();
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function adaptTransformersEmbeddingModel(options) {
|
|
119
|
+
return new TransformersEmbeddingModel(options.runtime, normalizeRuntimeOptions(options));
|
|
120
|
+
}
|
|
121
|
+
function normalizeRuntimeOptions(options) {
|
|
122
|
+
return {
|
|
123
|
+
modelId: requireModelId(options.modelId),
|
|
124
|
+
pooling: options.pooling,
|
|
125
|
+
normalize: options.normalize,
|
|
126
|
+
maxBatchSize: positiveSafeInteger(options.maxBatchSize ?? 16, "maxBatchSize")
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function requireModelId(modelId) {
|
|
130
|
+
if (modelId.trim().length === 0) {
|
|
131
|
+
throw new TypeError("modelId must be a non-empty string");
|
|
132
|
+
}
|
|
133
|
+
return modelId;
|
|
134
|
+
}
|
|
135
|
+
function positiveSafeInteger(value, name) {
|
|
136
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
137
|
+
throw new TypeError(`${name} must be a positive safe integer`);
|
|
138
|
+
}
|
|
139
|
+
return value;
|
|
140
|
+
}
|
|
141
|
+
function throwIfAborted(signal) {
|
|
142
|
+
if (signal?.aborted) {
|
|
143
|
+
const error = new Error("The operation was aborted.");
|
|
144
|
+
error.name = "AbortError";
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
59
147
|
}
|
|
60
148
|
export {
|
|
61
149
|
DEFAULT_TRANSFORMERS_EMBEDDING_MODEL,
|
|
62
|
-
|
|
63
|
-
|
|
150
|
+
adaptTransformersEmbeddingModel,
|
|
151
|
+
loadTransformersEmbeddingModel
|
|
64
152
|
};
|
|
65
153
|
//# 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
|
|
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 runtime = (await transformersPipeline(\"feature-extraction\", normalized.modelId, {\n ...(options.device === undefined ? {} : { device: options.device }),\n ...(options.dtype === undefined ? {} : { dtype: options.dtype }),\n ...(options.cacheDir === undefined ? {} : { cache_dir: options.cacheDir }),\n ...(options.localFilesOnly === undefined ? {} : { local_files_only: options.localFilesOnly }),\n ...(options.revision === undefined ? {} : { revision: options.revision }),\n } as never)) 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.2",
|
|
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.2"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@anvia/core": "1.0.0-rc.
|
|
39
|
+
"@anvia/core": "1.0.0-rc.2"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
|