@fgv/ts-extras-transformers 5.1.0-47 → 5.1.0-49
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/LICENSE +21 -0
- package/package.json +15 -5
- package/.rush/temp/07e0671e768f0e37ed8eb3497bda5f1e14278f10.tar.log +0 -30
- package/.rush/temp/chunked-rush-logs/ts-extras-transformers.build.chunks.jsonl +0 -9
- package/.rush/temp/operation/build/all.log +0 -9
- package/.rush/temp/operation/build/log-chunks.jsonl +0 -9
- package/.rush/temp/operation/build/state.json +0 -3
- package/.rush/temp/shrinkwrap-deps.json +0 -742
- package/config/api-extractor.json +0 -38
- package/config/jest.config.json +0 -13
- package/config/rig.json +0 -6
- package/dist/test/unit/transformers.test.js +0 -234
- package/dist/test/unit/transformers.test.js.map +0 -1
- package/eslint.config.js +0 -15
- package/etc/ts-extras-transformers.api.md +0 -52
- package/lib/test/unit/transformers.test.d.ts +0 -2
- package/lib/test/unit/transformers.test.d.ts.map +0 -1
- package/lib/test/unit/transformers.test.js +0 -269
- package/lib/test/unit/transformers.test.js.map +0 -1
- package/rush-logs/ts-extras-transformers.build.cache.log +0 -3
- package/rush-logs/ts-extras-transformers.build.log +0 -9
- package/src/index.ts +0 -212
- package/src/test/unit/transformers.test.ts +0 -320
- package/temp/build/lint/_eslint-5eVG3S6w.json +0 -14
- package/temp/build/typescript/ts_8nwakTlr.json +0 -1
- package/temp/ts-extras-transformers.api.json +0 -790
- package/temp/ts-extras-transformers.api.md +0 -52
- package/tsconfig.json +0 -8
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json",
|
|
3
|
-
"projectFolder": "..",
|
|
4
|
-
"mainEntryPointFilePath": "<projectFolder>/lib/index.d.ts",
|
|
5
|
-
"bundledPackages": [],
|
|
6
|
-
"compiler": {},
|
|
7
|
-
"apiReport": {
|
|
8
|
-
"enabled": true
|
|
9
|
-
},
|
|
10
|
-
"docModel": {
|
|
11
|
-
"enabled": true
|
|
12
|
-
},
|
|
13
|
-
"dtsRollup": {
|
|
14
|
-
"enabled": true
|
|
15
|
-
},
|
|
16
|
-
"tsdocMetadata": {},
|
|
17
|
-
"messages": {
|
|
18
|
-
"compilerMessageReporting": {
|
|
19
|
-
"default": {
|
|
20
|
-
"logLevel": "warning"
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
"extractorMessageReporting": {
|
|
24
|
-
"default": {
|
|
25
|
-
"logLevel": "warning"
|
|
26
|
-
},
|
|
27
|
-
"ae-unresolved-link": {
|
|
28
|
-
"logLevel": "none",
|
|
29
|
-
"addToApiReportFile": true
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
"tsdocMessageReporting": {
|
|
33
|
-
"default": {
|
|
34
|
-
"logLevel": "warning"
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
package/config/jest.config.json
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "@fgv/heft-dual-rig/profiles/default/config/jest.config.json",
|
|
3
|
-
"coverageThreshold": {
|
|
4
|
-
"global": {
|
|
5
|
-
"branches": 100,
|
|
6
|
-
"functions": 100,
|
|
7
|
-
"lines": 100,
|
|
8
|
-
"statements": 100
|
|
9
|
-
}
|
|
10
|
-
},
|
|
11
|
-
"collectCoverage": true,
|
|
12
|
-
"coverageReporters": ["text", "lcov", "html"]
|
|
13
|
-
}
|
package/config/rig.json
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
// The "rig.json" file directs tools to look for their config files in an external package.
|
|
2
|
-
// Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package
|
|
3
|
-
{
|
|
4
|
-
"$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json",
|
|
5
|
-
"rigPackageName": "@fgv/heft-dual-rig"
|
|
6
|
-
}
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
jest.mock('@huggingface/transformers');
|
|
2
|
-
import '@fgv/ts-utils-jest';
|
|
3
|
-
import * as upstream from '@huggingface/transformers';
|
|
4
|
-
import { loadPipeline, classify, classifyAll, embed, summarize } from '../../index';
|
|
5
|
-
// ─── loadPipeline ──────────────────────────────────────────────────────────────
|
|
6
|
-
describe('loadPipeline', () => {
|
|
7
|
-
beforeEach(() => {
|
|
8
|
-
jest.resetAllMocks();
|
|
9
|
-
});
|
|
10
|
-
test('returns Success wrapping the upstream pipeline on success', async () => {
|
|
11
|
-
const mockPipeline = jest.fn();
|
|
12
|
-
jest.mocked(upstream.pipeline).mockResolvedValueOnce(mockPipeline);
|
|
13
|
-
const result = await loadPipeline('text-classification', 'Xenova/distilbert-base-uncased-finetuned-sst-2-english');
|
|
14
|
-
expect(result).toSucceedWith(mockPipeline);
|
|
15
|
-
});
|
|
16
|
-
test('passes task and model to the upstream pipeline factory', async () => {
|
|
17
|
-
const mockPipeline = jest.fn();
|
|
18
|
-
jest.mocked(upstream.pipeline).mockResolvedValueOnce(mockPipeline);
|
|
19
|
-
await loadPipeline('text-classification', 'some-model-id');
|
|
20
|
-
expect(upstream.pipeline).toHaveBeenCalledWith('text-classification', 'some-model-id', undefined);
|
|
21
|
-
});
|
|
22
|
-
test('passes options through to the upstream pipeline factory', async () => {
|
|
23
|
-
const mockPipeline = jest.fn();
|
|
24
|
-
jest.mocked(upstream.pipeline).mockResolvedValueOnce(mockPipeline);
|
|
25
|
-
const opts = { device: 'cpu' };
|
|
26
|
-
await loadPipeline('text-classification', 'some-model-id', opts);
|
|
27
|
-
expect(upstream.pipeline).toHaveBeenCalledWith('text-classification', 'some-model-id', opts);
|
|
28
|
-
});
|
|
29
|
-
test('returns Success when model is omitted', async () => {
|
|
30
|
-
const mockPipeline = jest.fn();
|
|
31
|
-
jest.mocked(upstream.pipeline).mockResolvedValueOnce(mockPipeline);
|
|
32
|
-
const result = await loadPipeline('feature-extraction');
|
|
33
|
-
expect(result).toSucceed();
|
|
34
|
-
expect(upstream.pipeline).toHaveBeenCalledWith('feature-extraction', undefined, undefined);
|
|
35
|
-
});
|
|
36
|
-
test('returns Failure capturing upstream error message on network failure', async () => {
|
|
37
|
-
jest
|
|
38
|
-
.mocked(upstream.pipeline)
|
|
39
|
-
.mockRejectedValueOnce(new Error('Could not locate the model: model-not-found'));
|
|
40
|
-
const result = await loadPipeline('text-classification', 'model-not-found');
|
|
41
|
-
expect(result).toFailWith(/could not locate the model/i);
|
|
42
|
-
});
|
|
43
|
-
test('returns Failure capturing upstream error on ONNX init failure', async () => {
|
|
44
|
-
jest.mocked(upstream.pipeline).mockRejectedValueOnce(new Error('Failed to initialize ONNX runtime'));
|
|
45
|
-
const result = await loadPipeline('text-classification', 'some-model');
|
|
46
|
-
expect(result).toFailWith(/failed to initialize onnx runtime/i);
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
// ─── classify ─────────────────────────────────────────────────────────────────
|
|
50
|
-
describe('classify', () => {
|
|
51
|
-
let mockClassifier;
|
|
52
|
-
beforeEach(() => {
|
|
53
|
-
jest.resetAllMocks();
|
|
54
|
-
mockClassifier = jest.fn();
|
|
55
|
-
});
|
|
56
|
-
test('returns Success wrapping TextClassificationOutput on success', async () => {
|
|
57
|
-
const mockOutput = [{ label: 'POSITIVE', score: 0.9998 }];
|
|
58
|
-
mockClassifier.mockResolvedValueOnce(mockOutput);
|
|
59
|
-
const result = await classify(mockClassifier, 'I love transformers!');
|
|
60
|
-
expect(result).toSucceedWith(mockOutput);
|
|
61
|
-
});
|
|
62
|
-
test('passes text to the upstream classifier', async () => {
|
|
63
|
-
const mockOutput = [{ label: 'NEGATIVE', score: 0.9997 }];
|
|
64
|
-
mockClassifier.mockResolvedValueOnce(mockOutput);
|
|
65
|
-
await classify(mockClassifier, 'I hate bugs');
|
|
66
|
-
expect(mockClassifier).toHaveBeenCalledWith('I hate bugs', undefined);
|
|
67
|
-
});
|
|
68
|
-
test('passes options through to the upstream classifier', async () => {
|
|
69
|
-
const mockOutput = [
|
|
70
|
-
{ label: 'POSITIVE', score: 0.9998 },
|
|
71
|
-
{ label: 'NEGATIVE', score: 0.0002 }
|
|
72
|
-
];
|
|
73
|
-
mockClassifier.mockResolvedValueOnce(mockOutput);
|
|
74
|
-
const opts = { top_k: null };
|
|
75
|
-
await classify(mockClassifier, 'Hello world', opts);
|
|
76
|
-
expect(mockClassifier).toHaveBeenCalledWith('Hello world', opts);
|
|
77
|
-
});
|
|
78
|
-
test('normalises flat array result correctly', async () => {
|
|
79
|
-
const mockOutput = [
|
|
80
|
-
{ label: 'SAFE', score: 0.95 },
|
|
81
|
-
{ label: 'UNSAFE', score: 0.05 }
|
|
82
|
-
];
|
|
83
|
-
mockClassifier.mockResolvedValueOnce(mockOutput);
|
|
84
|
-
expect(await classify(mockClassifier, 'hello')).toSucceedWith(mockOutput);
|
|
85
|
-
});
|
|
86
|
-
test('normalises nested array result by flattening one level', async () => {
|
|
87
|
-
// When upstream returns array-of-arrays (e.g. batch input path leaked through),
|
|
88
|
-
// we flatten one level so consumers always receive a flat TextClassificationOutput.
|
|
89
|
-
const inner = [{ label: 'POSITIVE', score: 0.9 }];
|
|
90
|
-
mockClassifier.mockResolvedValueOnce([inner]);
|
|
91
|
-
expect(await classify(mockClassifier, 'hello')).toSucceedAndSatisfy((output) => {
|
|
92
|
-
expect(output).toEqual([{ label: 'POSITIVE', score: 0.9 }]);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
test('returns Failure capturing upstream error on inference failure', async () => {
|
|
96
|
-
mockClassifier.mockRejectedValueOnce(new Error('Inference session error: out of memory'));
|
|
97
|
-
const result = await classify(mockClassifier, 'some text');
|
|
98
|
-
expect(result).toFailWith(/inference session error/i);
|
|
99
|
-
});
|
|
100
|
-
test('returns Failure capturing upstream tokenisation error', async () => {
|
|
101
|
-
mockClassifier.mockRejectedValueOnce(new Error('Tokenisation failed: unexpected token'));
|
|
102
|
-
const result = await classify(mockClassifier, 'bad input');
|
|
103
|
-
expect(result).toFailWith(/tokenisation failed/i);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
// ─── classifyAll ──────────────────────────────────────────────────────────────
|
|
107
|
-
describe('classifyAll', () => {
|
|
108
|
-
let mockClassifier;
|
|
109
|
-
beforeEach(() => {
|
|
110
|
-
jest.resetAllMocks();
|
|
111
|
-
mockClassifier = jest.fn();
|
|
112
|
-
});
|
|
113
|
-
test('forces top_k: null on the underlying classify call', async () => {
|
|
114
|
-
const mockOutput = [
|
|
115
|
-
{ label: 'POSITIVE', score: 0.9998 },
|
|
116
|
-
{ label: 'NEGATIVE', score: 0.0002 }
|
|
117
|
-
];
|
|
118
|
-
mockClassifier.mockResolvedValueOnce(mockOutput);
|
|
119
|
-
await classifyAll(mockClassifier, 'hello');
|
|
120
|
-
expect(mockClassifier).toHaveBeenCalledWith('hello', { top_k: null });
|
|
121
|
-
});
|
|
122
|
-
test('overrides caller-supplied top_k with null', async () => {
|
|
123
|
-
const mockOutput = [
|
|
124
|
-
{ label: 'POSITIVE', score: 0.9998 },
|
|
125
|
-
{ label: 'NEGATIVE', score: 0.0002 }
|
|
126
|
-
];
|
|
127
|
-
mockClassifier.mockResolvedValueOnce(mockOutput);
|
|
128
|
-
await classifyAll(mockClassifier, 'hello', { top_k: 1 });
|
|
129
|
-
expect(mockClassifier).toHaveBeenCalledWith('hello', { top_k: null });
|
|
130
|
-
});
|
|
131
|
-
test('returns all labels on success', async () => {
|
|
132
|
-
const mockOutput = [
|
|
133
|
-
{ label: 'POSITIVE', score: 0.9998 },
|
|
134
|
-
{ label: 'NEGATIVE', score: 0.0002 }
|
|
135
|
-
];
|
|
136
|
-
mockClassifier.mockResolvedValueOnce(mockOutput);
|
|
137
|
-
const result = await classifyAll(mockClassifier, 'I love transformers!');
|
|
138
|
-
expect(result).toSucceedWith(mockOutput);
|
|
139
|
-
});
|
|
140
|
-
test('propagates upstream inference failure as Failure', async () => {
|
|
141
|
-
mockClassifier.mockRejectedValueOnce(new Error('Inference session error: out of memory'));
|
|
142
|
-
const result = await classifyAll(mockClassifier, 'some text');
|
|
143
|
-
expect(result).toFailWith(/inference session error/i);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
// ─── embed ────────────────────────────────────────────────────────────────────
|
|
147
|
-
describe('embed', () => {
|
|
148
|
-
let mockExtractor;
|
|
149
|
-
beforeEach(() => {
|
|
150
|
-
jest.resetAllMocks();
|
|
151
|
-
mockExtractor = jest.fn();
|
|
152
|
-
});
|
|
153
|
-
test('returns Success wrapping the upstream Tensor on success', async () => {
|
|
154
|
-
const mockTensor = {
|
|
155
|
-
type: 'float32',
|
|
156
|
-
data: new Float32Array([0.1, 0.2, 0.3]),
|
|
157
|
-
dims: [1, 3]
|
|
158
|
-
};
|
|
159
|
-
mockExtractor.mockResolvedValueOnce(mockTensor);
|
|
160
|
-
const result = await embed(mockExtractor, 'This is a test.');
|
|
161
|
-
expect(result).toSucceedWith(mockTensor);
|
|
162
|
-
});
|
|
163
|
-
test('passes text to the upstream extractor', async () => {
|
|
164
|
-
const mockTensor = { type: 'float32', data: new Float32Array([0.1]), dims: [1, 1] };
|
|
165
|
-
mockExtractor.mockResolvedValueOnce(mockTensor);
|
|
166
|
-
await embed(mockExtractor, 'hello world');
|
|
167
|
-
expect(mockExtractor).toHaveBeenCalledWith('hello world', undefined);
|
|
168
|
-
});
|
|
169
|
-
test('passes string array to the upstream extractor', async () => {
|
|
170
|
-
const mockTensor = {
|
|
171
|
-
type: 'float32',
|
|
172
|
-
data: new Float32Array([0.1, 0.2]),
|
|
173
|
-
dims: [2, 1]
|
|
174
|
-
};
|
|
175
|
-
mockExtractor.mockResolvedValueOnce(mockTensor);
|
|
176
|
-
await embed(mockExtractor, ['text one', 'text two']);
|
|
177
|
-
expect(mockExtractor).toHaveBeenCalledWith(['text one', 'text two'], undefined);
|
|
178
|
-
});
|
|
179
|
-
test('passes options through to the upstream extractor', async () => {
|
|
180
|
-
const mockTensor = { type: 'float32', data: new Float32Array([0.5]), dims: [1, 1] };
|
|
181
|
-
mockExtractor.mockResolvedValueOnce(mockTensor);
|
|
182
|
-
const opts = { pooling: 'mean', normalize: true };
|
|
183
|
-
await embed(mockExtractor, 'some text', opts);
|
|
184
|
-
expect(mockExtractor).toHaveBeenCalledWith('some text', opts);
|
|
185
|
-
});
|
|
186
|
-
test('returns Failure capturing upstream inference error', async () => {
|
|
187
|
-
mockExtractor.mockRejectedValueOnce(new Error('Inference session error: out of memory'));
|
|
188
|
-
const result = await embed(mockExtractor, 'some text');
|
|
189
|
-
expect(result).toFailWith(/inference session error/i);
|
|
190
|
-
});
|
|
191
|
-
test('returns Failure capturing upstream tokenisation error', async () => {
|
|
192
|
-
mockExtractor.mockRejectedValueOnce(new Error('Tokenisation failed: input too long'));
|
|
193
|
-
const result = await embed(mockExtractor, 'bad input');
|
|
194
|
-
expect(result).toFailWith(/tokenisation failed/i);
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
// ─── summarize ──────────────────────────────────────────────────────────────────
|
|
198
|
-
describe('summarize', () => {
|
|
199
|
-
let mockSummarizer;
|
|
200
|
-
beforeEach(() => {
|
|
201
|
-
jest.resetAllMocks();
|
|
202
|
-
mockSummarizer = jest.fn();
|
|
203
|
-
});
|
|
204
|
-
test('returns Success wrapping SummarizationOutput on success', async () => {
|
|
205
|
-
const mockOutput = [{ summary_text: 'A short summary.' }];
|
|
206
|
-
mockSummarizer.mockResolvedValueOnce(mockOutput);
|
|
207
|
-
const result = await summarize(mockSummarizer, 'A long article that needs summarizing.');
|
|
208
|
-
expect(result).toSucceedWith(mockOutput);
|
|
209
|
-
});
|
|
210
|
-
test('passes text to the upstream summarizer', async () => {
|
|
211
|
-
const mockOutput = [{ summary_text: 'Summary.' }];
|
|
212
|
-
mockSummarizer.mockResolvedValueOnce(mockOutput);
|
|
213
|
-
await summarize(mockSummarizer, 'some long document');
|
|
214
|
-
expect(mockSummarizer).toHaveBeenCalledWith('some long document', undefined);
|
|
215
|
-
});
|
|
216
|
-
test('passes options through to the upstream summarizer', async () => {
|
|
217
|
-
const mockOutput = [{ summary_text: 'Bounded summary.' }];
|
|
218
|
-
mockSummarizer.mockResolvedValueOnce(mockOutput);
|
|
219
|
-
const opts = { min_length: 10, max_length: 50 };
|
|
220
|
-
await summarize(mockSummarizer, 'a document', opts);
|
|
221
|
-
expect(mockSummarizer).toHaveBeenCalledWith('a document', opts);
|
|
222
|
-
});
|
|
223
|
-
test('returns Failure capturing upstream inference error', async () => {
|
|
224
|
-
mockSummarizer.mockRejectedValueOnce(new Error('Inference session error: out of memory'));
|
|
225
|
-
const result = await summarize(mockSummarizer, 'some text');
|
|
226
|
-
expect(result).toFailWith(/inference session error/i);
|
|
227
|
-
});
|
|
228
|
-
test('returns Failure capturing upstream tokenisation error', async () => {
|
|
229
|
-
mockSummarizer.mockRejectedValueOnce(new Error('Tokenisation failed: input too long'));
|
|
230
|
-
const result = await summarize(mockSummarizer, 'bad input');
|
|
231
|
-
expect(result).toFailWith(/tokenisation failed/i);
|
|
232
|
-
});
|
|
233
|
-
});
|
|
234
|
-
//# sourceMappingURL=transformers.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transformers.test.js","sourceRoot":"","sources":["../../../src/test/unit/transformers.test.ts"],"names":[],"mappings":"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","sourcesContent":["jest.mock('@huggingface/transformers');\n\nimport '@fgv/ts-utils-jest';\nimport * as upstream from '@huggingface/transformers';\nimport {\n loadPipeline,\n classify,\n classifyAll,\n embed,\n summarize,\n type TextClassificationPipeline,\n type TextClassificationOutput,\n type FeatureExtractionPipeline,\n type SummarizationPipeline,\n type SummarizationOutput,\n type Tensor,\n type AllTasks\n} from '../../index';\n\n// ─── loadPipeline ──────────────────────────────────────────────────────────────\n\ndescribe('loadPipeline', () => {\n beforeEach(() => {\n jest.resetAllMocks();\n });\n\n test('returns Success wrapping the upstream pipeline on success', async () => {\n const mockPipeline = jest.fn() as unknown as AllTasks['text-classification'];\n jest.mocked(upstream.pipeline).mockResolvedValueOnce(mockPipeline);\n\n const result = await loadPipeline(\n 'text-classification',\n 'Xenova/distilbert-base-uncased-finetuned-sst-2-english'\n );\n expect(result).toSucceedWith(mockPipeline);\n });\n\n test('passes task and model to the upstream pipeline factory', async () => {\n const mockPipeline = jest.fn() as unknown as AllTasks['text-classification'];\n jest.mocked(upstream.pipeline).mockResolvedValueOnce(mockPipeline);\n\n await loadPipeline('text-classification', 'some-model-id');\n expect(upstream.pipeline).toHaveBeenCalledWith('text-classification', 'some-model-id', undefined);\n });\n\n test('passes options through to the upstream pipeline factory', async () => {\n const mockPipeline = jest.fn() as unknown as AllTasks['text-classification'];\n jest.mocked(upstream.pipeline).mockResolvedValueOnce(mockPipeline);\n\n const opts = { device: 'cpu' } as Parameters<typeof upstream.pipeline>[2];\n await loadPipeline('text-classification', 'some-model-id', opts);\n expect(upstream.pipeline).toHaveBeenCalledWith('text-classification', 'some-model-id', opts);\n });\n\n test('returns Success when model is omitted', async () => {\n const mockPipeline = jest.fn() as unknown as AllTasks['feature-extraction'];\n jest.mocked(upstream.pipeline).mockResolvedValueOnce(mockPipeline);\n\n const result = await loadPipeline('feature-extraction');\n expect(result).toSucceed();\n expect(upstream.pipeline).toHaveBeenCalledWith('feature-extraction', undefined, undefined);\n });\n\n test('returns Failure capturing upstream error message on network failure', async () => {\n jest\n .mocked(upstream.pipeline)\n .mockRejectedValueOnce(new Error('Could not locate the model: model-not-found'));\n\n const result = await loadPipeline('text-classification', 'model-not-found');\n expect(result).toFailWith(/could not locate the model/i);\n });\n\n test('returns Failure capturing upstream error on ONNX init failure', async () => {\n jest.mocked(upstream.pipeline).mockRejectedValueOnce(new Error('Failed to initialize ONNX runtime'));\n\n const result = await loadPipeline('text-classification', 'some-model');\n expect(result).toFailWith(/failed to initialize onnx runtime/i);\n });\n});\n\n// ─── classify ─────────────────────────────────────────────────────────────────\n\ndescribe('classify', () => {\n let mockClassifier: jest.MockedFunction<TextClassificationPipeline>;\n\n beforeEach(() => {\n jest.resetAllMocks();\n mockClassifier = jest.fn() as unknown as jest.MockedFunction<TextClassificationPipeline>;\n });\n\n test('returns Success wrapping TextClassificationOutput on success', async () => {\n const mockOutput: TextClassificationOutput = [{ label: 'POSITIVE', score: 0.9998 }];\n mockClassifier.mockResolvedValueOnce(mockOutput);\n\n const result = await classify(mockClassifier, 'I love transformers!');\n expect(result).toSucceedWith(mockOutput);\n });\n\n test('passes text to the upstream classifier', async () => {\n const mockOutput: TextClassificationOutput = [{ label: 'NEGATIVE', score: 0.9997 }];\n mockClassifier.mockResolvedValueOnce(mockOutput);\n\n await classify(mockClassifier, 'I hate bugs');\n expect(mockClassifier).toHaveBeenCalledWith('I hate bugs', undefined);\n });\n\n test('passes options through to the upstream classifier', async () => {\n const mockOutput: TextClassificationOutput = [\n { label: 'POSITIVE', score: 0.9998 },\n { label: 'NEGATIVE', score: 0.0002 }\n ];\n mockClassifier.mockResolvedValueOnce(mockOutput);\n\n const opts = { top_k: null };\n await classify(mockClassifier, 'Hello world', opts);\n expect(mockClassifier).toHaveBeenCalledWith('Hello world', opts);\n });\n\n test('normalises flat array result correctly', async () => {\n const mockOutput: TextClassificationOutput = [\n { label: 'SAFE', score: 0.95 },\n { label: 'UNSAFE', score: 0.05 }\n ];\n mockClassifier.mockResolvedValueOnce(mockOutput);\n\n expect(await classify(mockClassifier, 'hello')).toSucceedWith(mockOutput);\n });\n\n test('normalises nested array result by flattening one level', async () => {\n // When upstream returns array-of-arrays (e.g. batch input path leaked through),\n // we flatten one level so consumers always receive a flat TextClassificationOutput.\n const inner: TextClassificationOutput = [{ label: 'POSITIVE', score: 0.9 }];\n mockClassifier.mockResolvedValueOnce([inner] as unknown as TextClassificationOutput);\n\n expect(await classify(mockClassifier, 'hello')).toSucceedAndSatisfy((output) => {\n expect(output).toEqual([{ label: 'POSITIVE', score: 0.9 }]);\n });\n });\n\n test('returns Failure capturing upstream error on inference failure', async () => {\n mockClassifier.mockRejectedValueOnce(new Error('Inference session error: out of memory'));\n\n const result = await classify(mockClassifier, 'some text');\n expect(result).toFailWith(/inference session error/i);\n });\n\n test('returns Failure capturing upstream tokenisation error', async () => {\n mockClassifier.mockRejectedValueOnce(new Error('Tokenisation failed: unexpected token'));\n\n const result = await classify(mockClassifier, 'bad input');\n expect(result).toFailWith(/tokenisation failed/i);\n });\n});\n\n// ─── classifyAll ──────────────────────────────────────────────────────────────\n\ndescribe('classifyAll', () => {\n let mockClassifier: jest.MockedFunction<TextClassificationPipeline>;\n\n beforeEach(() => {\n jest.resetAllMocks();\n mockClassifier = jest.fn() as unknown as jest.MockedFunction<TextClassificationPipeline>;\n });\n\n test('forces top_k: null on the underlying classify call', async () => {\n const mockOutput: TextClassificationOutput = [\n { label: 'POSITIVE', score: 0.9998 },\n { label: 'NEGATIVE', score: 0.0002 }\n ];\n mockClassifier.mockResolvedValueOnce(mockOutput);\n\n await classifyAll(mockClassifier, 'hello');\n expect(mockClassifier).toHaveBeenCalledWith('hello', { top_k: null });\n });\n\n test('overrides caller-supplied top_k with null', async () => {\n const mockOutput: TextClassificationOutput = [\n { label: 'POSITIVE', score: 0.9998 },\n { label: 'NEGATIVE', score: 0.0002 }\n ];\n mockClassifier.mockResolvedValueOnce(mockOutput);\n\n await classifyAll(mockClassifier, 'hello', { top_k: 1 });\n expect(mockClassifier).toHaveBeenCalledWith('hello', { top_k: null });\n });\n\n test('returns all labels on success', async () => {\n const mockOutput: TextClassificationOutput = [\n { label: 'POSITIVE', score: 0.9998 },\n { label: 'NEGATIVE', score: 0.0002 }\n ];\n mockClassifier.mockResolvedValueOnce(mockOutput);\n\n const result = await classifyAll(mockClassifier, 'I love transformers!');\n expect(result).toSucceedWith(mockOutput);\n });\n\n test('propagates upstream inference failure as Failure', async () => {\n mockClassifier.mockRejectedValueOnce(new Error('Inference session error: out of memory'));\n\n const result = await classifyAll(mockClassifier, 'some text');\n expect(result).toFailWith(/inference session error/i);\n });\n});\n\n// ─── embed ────────────────────────────────────────────────────────────────────\n\ndescribe('embed', () => {\n let mockExtractor: jest.MockedFunction<FeatureExtractionPipeline>;\n\n beforeEach(() => {\n jest.resetAllMocks();\n mockExtractor = jest.fn() as unknown as jest.MockedFunction<FeatureExtractionPipeline>;\n });\n\n test('returns Success wrapping the upstream Tensor on success', async () => {\n const mockTensor = {\n type: 'float32',\n data: new Float32Array([0.1, 0.2, 0.3]),\n dims: [1, 3]\n } as unknown as Tensor;\n mockExtractor.mockResolvedValueOnce(mockTensor);\n\n const result = await embed(mockExtractor, 'This is a test.');\n expect(result).toSucceedWith(mockTensor);\n });\n\n test('passes text to the upstream extractor', async () => {\n const mockTensor = { type: 'float32', data: new Float32Array([0.1]), dims: [1, 1] } as unknown as Tensor;\n mockExtractor.mockResolvedValueOnce(mockTensor);\n\n await embed(mockExtractor, 'hello world');\n expect(mockExtractor).toHaveBeenCalledWith('hello world', undefined);\n });\n\n test('passes string array to the upstream extractor', async () => {\n const mockTensor = {\n type: 'float32',\n data: new Float32Array([0.1, 0.2]),\n dims: [2, 1]\n } as unknown as Tensor;\n mockExtractor.mockResolvedValueOnce(mockTensor);\n\n await embed(mockExtractor, ['text one', 'text two']);\n expect(mockExtractor).toHaveBeenCalledWith(['text one', 'text two'], undefined);\n });\n\n test('passes options through to the upstream extractor', async () => {\n const mockTensor = { type: 'float32', data: new Float32Array([0.5]), dims: [1, 1] } as unknown as Tensor;\n mockExtractor.mockResolvedValueOnce(mockTensor);\n\n const opts = { pooling: 'mean' as const, normalize: true };\n await embed(mockExtractor, 'some text', opts);\n expect(mockExtractor).toHaveBeenCalledWith('some text', opts);\n });\n\n test('returns Failure capturing upstream inference error', async () => {\n mockExtractor.mockRejectedValueOnce(new Error('Inference session error: out of memory'));\n\n const result = await embed(mockExtractor, 'some text');\n expect(result).toFailWith(/inference session error/i);\n });\n\n test('returns Failure capturing upstream tokenisation error', async () => {\n mockExtractor.mockRejectedValueOnce(new Error('Tokenisation failed: input too long'));\n\n const result = await embed(mockExtractor, 'bad input');\n expect(result).toFailWith(/tokenisation failed/i);\n });\n});\n\n// ─── summarize ──────────────────────────────────────────────────────────────────\n\ndescribe('summarize', () => {\n let mockSummarizer: jest.MockedFunction<SummarizationPipeline>;\n\n beforeEach(() => {\n jest.resetAllMocks();\n mockSummarizer = jest.fn() as unknown as jest.MockedFunction<SummarizationPipeline>;\n });\n\n test('returns Success wrapping SummarizationOutput on success', async () => {\n const mockOutput: SummarizationOutput = [{ summary_text: 'A short summary.' }];\n mockSummarizer.mockResolvedValueOnce(mockOutput);\n\n const result = await summarize(mockSummarizer, 'A long article that needs summarizing.');\n expect(result).toSucceedWith(mockOutput);\n });\n\n test('passes text to the upstream summarizer', async () => {\n const mockOutput: SummarizationOutput = [{ summary_text: 'Summary.' }];\n mockSummarizer.mockResolvedValueOnce(mockOutput);\n\n await summarize(mockSummarizer, 'some long document');\n expect(mockSummarizer).toHaveBeenCalledWith('some long document', undefined);\n });\n\n test('passes options through to the upstream summarizer', async () => {\n const mockOutput: SummarizationOutput = [{ summary_text: 'Bounded summary.' }];\n mockSummarizer.mockResolvedValueOnce(mockOutput);\n\n const opts = { min_length: 10, max_length: 50 };\n await summarize(mockSummarizer, 'a document', opts);\n expect(mockSummarizer).toHaveBeenCalledWith('a document', opts);\n });\n\n test('returns Failure capturing upstream inference error', async () => {\n mockSummarizer.mockRejectedValueOnce(new Error('Inference session error: out of memory'));\n\n const result = await summarize(mockSummarizer, 'some text');\n expect(result).toFailWith(/inference session error/i);\n });\n\n test('returns Failure capturing upstream tokenisation error', async () => {\n mockSummarizer.mockRejectedValueOnce(new Error('Tokenisation failed: input too long'));\n\n const result = await summarize(mockSummarizer, 'bad input');\n expect(result).toFailWith(/tokenisation failed/i);\n });\n});\n"]}
|
package/eslint.config.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
// ESLint 9 flat config
|
|
2
|
-
const nodeProfile = require('@rushstack/eslint-config/flat/profile/node');
|
|
3
|
-
const packletsPlugin = require('@rushstack/eslint-config/flat/mixins/packlets');
|
|
4
|
-
const tsdocPlugin = require('@rushstack/eslint-config/flat/mixins/tsdoc');
|
|
5
|
-
|
|
6
|
-
module.exports = [
|
|
7
|
-
...nodeProfile,
|
|
8
|
-
packletsPlugin,
|
|
9
|
-
...tsdocPlugin,
|
|
10
|
-
{
|
|
11
|
-
rules: {
|
|
12
|
-
'@rushstack/packlets/mechanics': 'warn'
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
];
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
## API Report File for "@fgv/ts-extras-transformers"
|
|
2
|
-
|
|
3
|
-
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
|
|
4
|
-
|
|
5
|
-
```ts
|
|
6
|
-
|
|
7
|
-
import { AllTasks } from '@huggingface/transformers';
|
|
8
|
-
import { FeatureExtractionPipeline } from '@huggingface/transformers';
|
|
9
|
-
import { pipeline } from '@huggingface/transformers';
|
|
10
|
-
import { PipelineType } from '@huggingface/transformers';
|
|
11
|
-
import { PretrainedModelOptions } from '@huggingface/transformers';
|
|
12
|
-
import { Result } from '@fgv/ts-utils';
|
|
13
|
-
import { SummarizationOutput } from '@huggingface/transformers';
|
|
14
|
-
import { SummarizationPipeline } from '@huggingface/transformers';
|
|
15
|
-
import { Tensor } from '@huggingface/transformers';
|
|
16
|
-
import { TextClassificationOutput } from '@huggingface/transformers';
|
|
17
|
-
import { TextClassificationPipeline } from '@huggingface/transformers';
|
|
18
|
-
|
|
19
|
-
export { AllTasks }
|
|
20
|
-
|
|
21
|
-
// @public
|
|
22
|
-
export function classify(classifier: TextClassificationPipeline, text: string, options?: Parameters<TextClassificationPipeline>[1]): Promise<Result<TextClassificationOutput>>;
|
|
23
|
-
|
|
24
|
-
// @public
|
|
25
|
-
export function classifyAll(classifier: TextClassificationPipeline, text: string, options?: Parameters<TextClassificationPipeline>[1]): Promise<Result<TextClassificationOutput>>;
|
|
26
|
-
|
|
27
|
-
// @public
|
|
28
|
-
export function embed(extractor: FeatureExtractionPipeline, text: string | string[], options?: Parameters<FeatureExtractionPipeline['_call']>[1]): Promise<Result<Tensor>>;
|
|
29
|
-
|
|
30
|
-
export { FeatureExtractionPipeline }
|
|
31
|
-
|
|
32
|
-
// @public
|
|
33
|
-
export function loadPipeline<T extends PipelineType>(task: T, model?: string, options?: Parameters<typeof pipeline>[2]): Promise<Result<AllTasks[T]>>;
|
|
34
|
-
|
|
35
|
-
export { PipelineType }
|
|
36
|
-
|
|
37
|
-
export { PretrainedModelOptions }
|
|
38
|
-
|
|
39
|
-
export { SummarizationOutput }
|
|
40
|
-
|
|
41
|
-
export { SummarizationPipeline }
|
|
42
|
-
|
|
43
|
-
// @public
|
|
44
|
-
export function summarize(summarizer: SummarizationPipeline, text: string, options?: Parameters<SummarizationPipeline>[1]): Promise<Result<SummarizationOutput>>;
|
|
45
|
-
|
|
46
|
-
export { Tensor }
|
|
47
|
-
|
|
48
|
-
export { TextClassificationOutput }
|
|
49
|
-
|
|
50
|
-
export { TextClassificationPipeline }
|
|
51
|
-
|
|
52
|
-
```
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transformers.test.d.ts","sourceRoot":"","sources":["../../../src/test/unit/transformers.test.ts"],"names":[],"mappings":"AAEA,OAAO,oBAAoB,CAAC"}
|