@workglow/ai-provider 0.0.81 → 0.0.83

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.
@@ -11,7 +11,7 @@ export declare const HfTransformersOnnxModelSchema: {
11
11
  readonly const: "HF_TRANSFORMERS_ONNX";
12
12
  readonly description: "Discriminator: ONNX runtime backend.";
13
13
  };
14
- readonly providerConfig: {
14
+ readonly provider_config: {
15
15
  readonly type: "object";
16
16
  readonly description: "ONNX runtime-specific options.";
17
17
  readonly properties: {
@@ -29,7 +29,7 @@ export declare const HfTransformersOnnxModelSchema: {
29
29
  readonly type: "string";
30
30
  readonly enum: ("auto" | "fp32" | "fp16" | "q8" | "int8" | "uint8" | "q4" | "bnb4" | "q4f16")[];
31
31
  readonly description: "Data type for the ONNX model.";
32
- readonly default: "float32";
32
+ readonly default: "auto";
33
33
  };
34
34
  readonly device: {
35
35
  readonly type: "string";
@@ -43,6 +43,7 @@ export declare const HfTransformersOnnxModelSchema: {
43
43
  readonly type: "string";
44
44
  };
45
45
  readonly description: "Raw ONNX Runtime execution provider identifiers.";
46
+ readonly "x-ui-hidden": true;
46
47
  };
47
48
  readonly intraOpNumThreads: {
48
49
  readonly type: "integer";
@@ -83,17 +84,17 @@ export declare const HfTransformersOnnxModelSchema: {
83
84
  };
84
85
  };
85
86
  };
86
- readonly required: readonly ["provider", "providerConfig"];
87
+ readonly required: readonly ["provider", "provider_config"];
87
88
  readonly additionalProperties: true;
88
89
  };
89
- declare const ExtendedModelRecordSchema: {
90
+ export declare const HfTransformersOnnxModelRecordSchema: {
90
91
  readonly type: "object";
91
92
  readonly properties: {
92
93
  readonly provider: {
93
94
  readonly const: "HF_TRANSFORMERS_ONNX";
94
95
  readonly description: "Discriminator: ONNX runtime backend.";
95
96
  };
96
- readonly providerConfig: {
97
+ readonly provider_config: {
97
98
  readonly type: "object";
98
99
  readonly description: "ONNX runtime-specific options.";
99
100
  readonly properties: {
@@ -111,7 +112,7 @@ declare const ExtendedModelRecordSchema: {
111
112
  readonly type: "string";
112
113
  readonly enum: ("auto" | "fp32" | "fp16" | "q8" | "int8" | "uint8" | "q4" | "bnb4" | "q4f16")[];
113
114
  readonly description: "Data type for the ONNX model.";
114
- readonly default: "float32";
115
+ readonly default: "auto";
115
116
  };
116
117
  readonly device: {
117
118
  readonly type: "string";
@@ -125,6 +126,7 @@ declare const ExtendedModelRecordSchema: {
125
126
  readonly type: "string";
126
127
  };
127
128
  readonly description: "Raw ONNX Runtime execution provider identifiers.";
129
+ readonly "x-ui-hidden": true;
128
130
  };
129
131
  readonly intraOpNumThreads: {
130
132
  readonly type: "integer";
@@ -172,30 +174,33 @@ declare const ExtendedModelRecordSchema: {
172
174
  readonly items: {
173
175
  readonly type: "string";
174
176
  };
177
+ readonly "x-ui-editor": "multiselect";
175
178
  };
176
179
  readonly title: {
177
180
  readonly type: "string";
178
181
  };
179
182
  readonly description: {
180
183
  readonly type: "string";
184
+ readonly "x-ui-editor": "textarea";
181
185
  };
182
186
  readonly metadata: {
183
187
  readonly type: "object";
184
188
  readonly default: {};
189
+ readonly "x-ui-hidden": true;
185
190
  };
186
191
  };
187
- readonly required: readonly ["model_id", "tasks", "provider", "title", "description", "providerConfig", "metadata", "provider", "providerConfig"];
192
+ readonly required: readonly ["model_id", "tasks", "provider", "title", "description", "provider_config", "metadata", "provider", "provider_config"];
188
193
  readonly additionalProperties: false;
189
194
  };
190
- export type HfTransformersOnnxModelRecord = FromSchema<typeof ExtendedModelRecordSchema>;
191
- declare const ExtendedModelConfigSchema: {
195
+ export type HfTransformersOnnxModelRecord = FromSchema<typeof HfTransformersOnnxModelRecordSchema>;
196
+ export declare const HfTransformersOnnxModelConfigSchema: {
192
197
  readonly type: "object";
193
198
  readonly properties: {
194
199
  readonly provider: {
195
200
  readonly const: "HF_TRANSFORMERS_ONNX";
196
201
  readonly description: "Discriminator: ONNX runtime backend.";
197
202
  };
198
- readonly providerConfig: {
203
+ readonly provider_config: {
199
204
  readonly type: "object";
200
205
  readonly description: "ONNX runtime-specific options.";
201
206
  readonly properties: {
@@ -213,7 +218,7 @@ declare const ExtendedModelConfigSchema: {
213
218
  readonly type: "string";
214
219
  readonly enum: ("auto" | "fp32" | "fp16" | "q8" | "int8" | "uint8" | "q4" | "bnb4" | "q4f16")[];
215
220
  readonly description: "Data type for the ONNX model.";
216
- readonly default: "float32";
221
+ readonly default: "auto";
217
222
  };
218
223
  readonly device: {
219
224
  readonly type: "string";
@@ -227,6 +232,7 @@ declare const ExtendedModelConfigSchema: {
227
232
  readonly type: "string";
228
233
  };
229
234
  readonly description: "Raw ONNX Runtime execution provider identifiers.";
235
+ readonly "x-ui-hidden": true;
230
236
  };
231
237
  readonly intraOpNumThreads: {
232
238
  readonly type: "integer";
@@ -274,21 +280,23 @@ declare const ExtendedModelConfigSchema: {
274
280
  readonly items: {
275
281
  readonly type: "string";
276
282
  };
283
+ readonly "x-ui-editor": "multiselect";
277
284
  };
278
285
  readonly title: {
279
286
  readonly type: "string";
280
287
  };
281
288
  readonly description: {
282
289
  readonly type: "string";
290
+ readonly "x-ui-editor": "textarea";
283
291
  };
284
292
  readonly metadata: {
285
293
  readonly type: "object";
286
294
  readonly default: {};
295
+ readonly "x-ui-hidden": true;
287
296
  };
288
297
  };
289
- readonly required: readonly ["provider", "providerConfig", "provider", "providerConfig"];
298
+ readonly required: readonly ["provider", "provider_config", "provider", "provider_config"];
290
299
  readonly additionalProperties: false;
291
300
  };
292
- export type HfTransformersOnnxModelConfig = FromSchema<typeof ExtendedModelConfigSchema>;
293
- export {};
301
+ export type HfTransformersOnnxModelConfig = FromSchema<typeof HfTransformersOnnxModelConfigSchema>;
294
302
  //# sourceMappingURL=HFT_ModelSchema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HFT_ModelSchema.d.ts","sourceRoot":"","sources":["../../../src/hf-transformers/common/HFT_ModelSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAwB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGlE,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+ED,CAAC;AAE1C,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQU,CAAC;AAE1C,MAAM,MAAM,6BAA6B,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEzF,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQU,CAAC;AAE1C,MAAM,MAAM,6BAA6B,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
1
+ {"version":3,"file":"HFT_ModelSchema.d.ts","sourceRoot":"","sources":["../../../src/hf-transformers/common/HFT_ModelSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAwB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGlE,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFD,CAAC;AAE1C,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQP,CAAC;AAE1C,MAAM,MAAM,6BAA6B,GAAG,UAAU,CAAC,OAAO,mCAAmC,CAAC,CAAC;AAEnG,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQP,CAAC;AAE1C,MAAM,MAAM,6BAA6B,GAAG,UAAU,CAAC,OAAO,mCAAmC,CAAC,CAAC"}
package/dist/index.js CHANGED
@@ -61,9 +61,9 @@ function clearPipelineCache() {
61
61
  pipelines.clear();
62
62
  }
63
63
  function getPipelineCacheKey(model) {
64
- const dType = model.providerConfig.dType || "q8";
65
- const device = model.providerConfig.device || "";
66
- return `${model.providerConfig.modelPath}:${model.providerConfig.pipeline}:${dType}:${device}`;
64
+ const dType = model.provider_config.dType || "q8";
65
+ const device = model.provider_config.device || "";
66
+ return `${model.provider_config.modelPath}:${model.provider_config.pipeline}:${dType}:${device}`;
67
67
  }
68
68
  var getPipeline = async (model, onProgress, options = {}, progressScaleMax = 10) => {
69
69
  const cacheKey = getPipelineCacheKey(model);
@@ -240,16 +240,16 @@ var getPipeline = async (model, onProgress, options = {}, progressScaleMax = 10)
240
240
  }
241
241
  };
242
242
  const pipelineOptions = {
243
- dtype: model.providerConfig.dType || "q8",
244
- ...model.providerConfig.useExternalDataFormat ? { use_external_data_format: model.providerConfig.useExternalDataFormat } : {},
245
- ...model.providerConfig.device ? { device: model.providerConfig.device } : {},
243
+ dtype: model.provider_config.dType || "q8",
244
+ ...model.provider_config.useExternalDataFormat ? { use_external_data_format: model.provider_config.useExternalDataFormat } : {},
245
+ ...model.provider_config.device ? { device: model.provider_config.device } : {},
246
246
  ...options,
247
247
  progress_callback: progressCallback
248
248
  };
249
249
  if (abortSignal?.aborted) {
250
250
  throw new Error("Operation aborted before pipeline creation");
251
251
  }
252
- const pipelineType = model.providerConfig.pipeline;
252
+ const pipelineType = model.provider_config.pipeline;
253
253
  const abortPromise = new Promise((_, reject) => {
254
254
  if (abortSignal) {
255
255
  const handleAbort = () => {
@@ -262,7 +262,7 @@ var getPipeline = async (model, onProgress, options = {}, progressScaleMax = 10)
262
262
  }
263
263
  }
264
264
  });
265
- const pipelinePromise = pipeline(pipelineType, model.providerConfig.modelPath, pipelineOptions);
265
+ const pipelinePromise = pipeline(pipelineType, model.provider_config.modelPath, pipelineOptions);
266
266
  try {
267
267
  const result = await (abortSignal ? Promise.race([pipelinePromise, abortPromise]) : pipelinePromise);
268
268
  if (abortSignal?.aborted) {
@@ -289,7 +289,7 @@ var HFT_Unload = async (input, model, onProgress, signal) => {
289
289
  pipelines.delete(cacheKey);
290
290
  onProgress(50, "Pipeline removed from memory");
291
291
  }
292
- const modelPath = model.providerConfig.modelPath;
292
+ const modelPath = model.provider_config.modelPath;
293
293
  await deleteModelCache(modelPath);
294
294
  onProgress(100, "Model cache deleted");
295
295
  return {
@@ -330,17 +330,17 @@ var HFT_TextEmbedding = async (input, model, onProgress, signal) => {
330
330
  });
331
331
  const hfVector = await generateEmbedding(input.text, {
332
332
  pooling: "mean",
333
- normalize: model?.providerConfig.normalize,
333
+ normalize: model?.provider_config.normalize,
334
334
  ...signal ? { abort_signal: signal } : {}
335
335
  });
336
- if (hfVector.size !== model?.providerConfig.nativeDimensions) {
337
- console.warn(`HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${model?.providerConfig.nativeDimensions}`, input, hfVector);
338
- throw new Error(`HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${model?.providerConfig.nativeDimensions}`);
336
+ if (hfVector.size !== model?.provider_config.nativeDimensions) {
337
+ console.warn(`HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${model?.provider_config.nativeDimensions}`, input, hfVector);
338
+ throw new Error(`HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${model?.provider_config.nativeDimensions}`);
339
339
  }
340
340
  return { vector: hfVector.data };
341
341
  };
342
342
  var HFT_TextClassification = async (input, model, onProgress, signal) => {
343
- if (model?.providerConfig?.pipeline === "zero-shot-classification") {
343
+ if (model?.provider_config?.pipeline === "zero-shot-classification") {
344
344
  if (!input.candidateLabels || !Array.isArray(input.candidateLabels) || input.candidateLabels.length === 0) {
345
345
  throw new Error("Zero-shot text classification requires candidate labels");
346
346
  }
@@ -600,7 +600,7 @@ var HFT_ImageEmbedding = async (input, model, onProgress, signal) => {
600
600
  };
601
601
  };
602
602
  var HFT_ImageClassification = async (input, model, onProgress, signal) => {
603
- if (model?.providerConfig?.pipeline === "zero-shot-image-classification") {
603
+ if (model?.provider_config?.pipeline === "zero-shot-image-classification") {
604
604
  if (!input.categories || !Array.isArray(input.categories) || input.categories.length === 0) {
605
605
  console.warn("Zero-shot image classification requires categories", input);
606
606
  throw new Error("Zero-shot image classification requires categories");
@@ -633,7 +633,7 @@ var HFT_ImageClassification = async (input, model, onProgress, signal) => {
633
633
  };
634
634
  };
635
635
  var HFT_ObjectDetection = async (input, model, onProgress, signal) => {
636
- if (model?.providerConfig?.pipeline === "zero-shot-object-detection") {
636
+ if (model?.provider_config?.pipeline === "zero-shot-object-detection") {
637
637
  if (!input.labels || !Array.isArray(input.labels) || input.labels.length === 0) {
638
638
  throw new Error("Zero-shot object detection requires labels");
639
639
  }
@@ -694,7 +694,7 @@ var HfTransformersOnnxModelSchema = {
694
694
  const: HF_TRANSFORMERS_ONNX,
695
695
  description: "Discriminator: ONNX runtime backend."
696
696
  },
697
- providerConfig: {
697
+ provider_config: {
698
698
  type: "object",
699
699
  description: "ONNX runtime-specific options.",
700
700
  properties: {
@@ -712,7 +712,7 @@ var HfTransformersOnnxModelSchema = {
712
712
  type: "string",
713
713
  enum: Object.values(QuantizationDataType),
714
714
  description: "Data type for the ONNX model.",
715
- default: "float32"
715
+ default: "auto"
716
716
  },
717
717
  device: {
718
718
  type: "string",
@@ -723,7 +723,8 @@ var HfTransformersOnnxModelSchema = {
723
723
  executionProviders: {
724
724
  type: "array",
725
725
  items: { type: "string" },
726
- description: "Raw ONNX Runtime execution provider identifiers."
726
+ description: "Raw ONNX Runtime execution provider identifiers.",
727
+ "x-ui-hidden": true
727
728
  },
728
729
  intraOpNumThreads: {
729
730
  type: "integer",
@@ -764,10 +765,10 @@ var HfTransformersOnnxModelSchema = {
764
765
  }
765
766
  }
766
767
  },
767
- required: ["provider", "providerConfig"],
768
+ required: ["provider", "provider_config"],
768
769
  additionalProperties: true
769
770
  };
770
- var ExtendedModelRecordSchema = {
771
+ var HfTransformersOnnxModelRecordSchema = {
771
772
  type: "object",
772
773
  properties: {
773
774
  ...ModelRecordSchema.properties,
@@ -776,7 +777,7 @@ var ExtendedModelRecordSchema = {
776
777
  required: [...ModelRecordSchema.required, ...HfTransformersOnnxModelSchema.required],
777
778
  additionalProperties: false
778
779
  };
779
- var ExtendedModelConfigSchema = {
780
+ var HfTransformersOnnxModelConfigSchema = {
780
781
  type: "object",
781
782
  properties: {
782
783
  ...ModelConfigSchema.properties,
@@ -958,7 +959,7 @@ import { PermanentJobError } from "@workglow/job-queue";
958
959
  var wasm_tasks = new Map;
959
960
  var wasm_reference_counts = new Map;
960
961
  var getWasmTask = async (model, onProgress, signal) => {
961
- const taskEngine = model.providerConfig.taskEngine;
962
+ const taskEngine = model.provider_config.taskEngine;
962
963
  if (wasm_tasks.has(taskEngine)) {
963
964
  return wasm_tasks.get(taskEngine);
964
965
  }
@@ -1002,8 +1003,8 @@ var optionsMatch = (opts1, opts2) => {
1002
1003
  });
1003
1004
  };
1004
1005
  var getModelTask = async (model, options, onProgress, signal, TaskType) => {
1005
- const modelPath = model.providerConfig.modelPath;
1006
- const taskEngine = model.providerConfig.taskEngine;
1006
+ const modelPath = model.provider_config.modelPath;
1007
+ const taskEngine = model.provider_config.taskEngine;
1007
1008
  const cachedTasks = modelTaskCache.get(modelPath);
1008
1009
  if (cachedTasks) {
1009
1010
  const matchedTask = cachedTasks.find((cached) => optionsMatch(cached.options, options));
@@ -1029,7 +1030,7 @@ var getModelTask = async (model, options, onProgress, signal, TaskType) => {
1029
1030
  };
1030
1031
  var TFMP_Download = async (input, model, onProgress, signal) => {
1031
1032
  let task;
1032
- switch (model?.providerConfig.pipeline) {
1033
+ switch (model?.provider_config.pipeline) {
1033
1034
  case "text-embedder":
1034
1035
  task = await getModelTask(model, {}, onProgress, signal, TextEmbedder);
1035
1036
  break;
@@ -1067,11 +1068,11 @@ var TFMP_Download = async (input, model, onProgress, signal) => {
1067
1068
  task = await getModelTask(model, {}, onProgress, signal, PoseLandmarker);
1068
1069
  break;
1069
1070
  default:
1070
- throw new PermanentJobError(`Invalid pipeline: ${model?.providerConfig.pipeline}. Supported pipelines: text-embedder, text-classifier, text-language-detector, vision-image-classifier, vision-image-embedder, vision-image-segmenter, vision-object-detector, vision-face-detector, vision-face-landmarker, vision-gesture-recognizer, vision-hand-landmarker, vision-pose-landmarker`);
1071
+ throw new PermanentJobError(`Invalid pipeline: ${model?.provider_config.pipeline}. Supported pipelines: text-embedder, text-classifier, text-language-detector, vision-image-classifier, vision-image-embedder, vision-image-segmenter, vision-object-detector, vision-face-detector, vision-face-landmarker, vision-gesture-recognizer, vision-hand-landmarker, vision-pose-landmarker`);
1071
1072
  }
1072
1073
  onProgress(0.9, "Pipeline loaded");
1073
1074
  task.close();
1074
- const taskEngine = model?.providerConfig.taskEngine;
1075
+ const taskEngine = model?.provider_config.taskEngine;
1075
1076
  wasm_reference_counts.set(taskEngine, wasm_reference_counts.get(taskEngine) - 1);
1076
1077
  return {
1077
1078
  model: input.model
@@ -1122,7 +1123,7 @@ var TFMP_TextLanguageDetection = async (input, model, onProgress, signal) => {
1122
1123
  };
1123
1124
  };
1124
1125
  var TFMP_Unload = async (input, model, onProgress, signal) => {
1125
- const modelPath = model.providerConfig.modelPath;
1126
+ const modelPath = model.provider_config.modelPath;
1126
1127
  onProgress(10, "Unloading model");
1127
1128
  if (modelTaskCache.has(modelPath)) {
1128
1129
  const cachedTasks = modelTaskCache.get(modelPath);
@@ -1397,7 +1398,7 @@ var TFMPModelSchema = {
1397
1398
  const: TENSORFLOW_MEDIAPIPE,
1398
1399
  description: "Discriminator: TensorFlow MediaPipe backend."
1399
1400
  },
1400
- providerConfig: {
1401
+ provider_config: {
1401
1402
  type: "object",
1402
1403
  description: "TensorFlow MediaPipe-specific options.",
1403
1404
  properties: {
@@ -1420,10 +1421,10 @@ var TFMPModelSchema = {
1420
1421
  additionalProperties: false
1421
1422
  }
1422
1423
  },
1423
- required: ["provider", "providerConfig"],
1424
+ required: ["provider", "provider_config"],
1424
1425
  additionalProperties: true
1425
1426
  };
1426
- var ExtendedModelRecordSchema2 = {
1427
+ var TFMPModelRecordSchema = {
1427
1428
  type: "object",
1428
1429
  properties: {
1429
1430
  ...ModelRecordSchema2.properties,
@@ -1432,7 +1433,7 @@ var ExtendedModelRecordSchema2 = {
1432
1433
  required: [...ModelRecordSchema2.required, ...TFMPModelSchema.required],
1433
1434
  additionalProperties: false
1434
1435
  };
1435
- var ExtendedModelConfigSchema2 = {
1436
+ var TFMPModelConfigSchema = {
1436
1437
  type: "object",
1437
1438
  properties: {
1438
1439
  ...ModelConfigSchema2.properties,
@@ -1569,11 +1570,15 @@ export {
1569
1570
  TFMP_FaceDetector,
1570
1571
  TFMP_Download,
1571
1572
  TFMPModelSchema,
1573
+ TFMPModelRecordSchema,
1574
+ TFMPModelConfigSchema,
1572
1575
  TENSORFLOW_MEDIAPIPE,
1573
1576
  QuantizationDataType,
1574
1577
  PipelineUseCase,
1575
1578
  MultimodalPipelineUseCase,
1576
1579
  HfTransformersOnnxModelSchema,
1580
+ HfTransformersOnnxModelRecordSchema,
1581
+ HfTransformersOnnxModelConfigSchema,
1577
1582
  HTF_CACHE_NAME,
1578
1583
  HF_TRANSFORMERS_ONNX,
1579
1584
  HFT_WORKER_JOBRUN_REGISTER,
@@ -1599,4 +1604,4 @@ export {
1599
1604
  AudioPipelineUseCase
1600
1605
  };
1601
1606
 
1602
- //# debugId=75F5396ABB47DC9E64756E2164756E21
1607
+ //# debugId=F3006E11D0637B7464756E2164756E21
package/dist/index.js.map CHANGED
@@ -3,19 +3,19 @@
3
3
  "sources": ["../src/hf-transformers/common/HFT_Constants.ts", "../src/hf-transformers/common/HFT_JobRunFns.ts", "../src/hf-transformers/common/HFT_ModelSchema.ts", "../src/hf-transformers/registry/HFT_Client_RegisterJobFns.ts", "../src/hf-transformers/registry/HFT_Inline_RegisterJobFns.ts", "../src/hf-transformers/registry/HFT_Worker_RegisterJobFns.ts", "../src/tf-mediapipe/common/TFMP_Constants.ts", "../src/tf-mediapipe/common/TFMP_JobRunFns.ts", "../src/tf-mediapipe/common/TFMP_ModelSchema.ts", "../src/tf-mediapipe/registry/TFMP_Client_RegisterJobFns.ts", "../src/tf-mediapipe/registry/TFMP_Inline_RegisterJobFns.ts", "../src/tf-mediapipe/registry/TFMP_Worker_RegisterJobFns.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const HF_TRANSFORMERS_ONNX = \"HF_TRANSFORMERS_ONNX\";\nexport const HTF_CACHE_NAME = \"transformers-cache\";\n\nexport type QuantizationDataType =\n | \"auto\" // Auto-detect based on environment\n | \"fp32\"\n | \"fp16\"\n | \"q8\"\n | \"int8\"\n | \"uint8\"\n | \"q4\"\n | \"bnb4\"\n | \"q4f16\"; // fp16 model with int4 block weight quantization\n\nexport const QuantizationDataType = {\n auto: \"auto\",\n fp32: \"fp32\",\n fp16: \"fp16\",\n q8: \"q8\",\n int8: \"int8\",\n uint8: \"uint8\",\n q4: \"q4\",\n bnb4: \"bnb4\",\n q4f16: \"q4f16\",\n} as const satisfies Record<QuantizationDataType, QuantizationDataType>;\n\nexport type TextPipelineUseCase =\n | \"fill-mask\" // https://huggingface.co/tasks/fill-mask\n | \"token-classification\" // https://huggingface.co/tasks/token-classification\n | \"text-generation\" // https://huggingface.co/tasks/text-generation#completion-generation-models\n | \"text2text-generation\" // https://huggingface.co/tasks/text-generation#text-to-text-generation-models\n | \"text-classification\" // https://huggingface.co/tasks/text-classification\n | \"summarization\" // https://huggingface.co/tasks/sentence-similarity\n | \"translation\" // https://huggingface.co/tasks/translation\n | \"feature-extraction\" // https://huggingface.co/tasks/feature-extraction\n | \"zero-shot-classification\" // https://huggingface.co/tasks/zero-shot-classification\n | \"question-answering\"; // https://huggingface.co/tasks/question-answering\n\nexport const TextPipelineUseCase = {\n \"fill-mask\": \"fill-mask\",\n \"token-classification\": \"token-classification\",\n \"text-generation\": \"text-generation\",\n \"text2text-generation\": \"text2text-generation\",\n \"text-classification\": \"text-classification\",\n summarization: \"summarization\",\n translation: \"translation\",\n \"feature-extraction\": \"feature-extraction\",\n \"zero-shot-classification\": \"zero-shot-classification\",\n \"question-answering\": \"question-answering\",\n} as const satisfies Record<TextPipelineUseCase, TextPipelineUseCase>;\n\nexport type VisionPipelineUseCase =\n | \"background-removal\" // https://huggingface.co/tasks/image-segmentation#background-removal\n | \"image-segmentation\" // https://huggingface.co/tasks/image-segmentation\n | \"depth-estimation\" // https://huggingface.co/tasks/depth-estimation\n | \"image-classification\" // https://huggingface.co/tasks/image-classification\n | \"image-to-image\" // https://huggingface.co/tasks/image-to-image\n | \"object-detection\" // https://huggingface.co/tasks/object-detection\n | \"image-feature-extraction\"; // https://huggingface.co/tasks/image-feature-extraction\n\nexport const VisionPipelineUseCase = {\n \"background-removal\": \"background-removal\",\n \"image-segmentation\": \"image-segmentation\",\n \"depth-estimation\": \"depth-estimation\",\n \"image-classification\": \"image-classification\",\n \"image-to-image\": \"image-to-image\",\n \"object-detection\": \"object-detection\",\n \"image-feature-extraction\": \"image-feature-extraction\",\n} as const satisfies Record<VisionPipelineUseCase, VisionPipelineUseCase>;\n\nexport type AudioPipelineUseCase =\n | \"audio-classification\" // https://huggingface.co/tasks/audio-classification\n | \"automatic-speech-recognition\" // https://huggingface.co/tasks/automatic-speech-recognition\n | \"text-to-speech\"; // https://huggingface.co/tasks/text-to-speech\n\nexport const AudioPipelineUseCase = {\n \"audio-classification\": \"audio-classification\",\n \"automatic-speech-recognition\": \"automatic-speech-recognition\",\n \"text-to-speech\": \"text-to-speech\",\n} as const satisfies Record<AudioPipelineUseCase, AudioPipelineUseCase>;\n\nexport type MultimodalPipelineUseCase =\n | \"document-question-answering\" // https://huggingface.co/tasks/document-question-answering\n | \"image-to-text\" // https://huggingface.co/tasks/image-to-text\n | \"zero-shot-audio-classification\" // https://huggingface.co/tasks/zero-shot-audio-classification\n | \"zero-shot-image-classification\" // https://huggingface.co/tasks/zero-shot-image-classification\n | \"zero-shot-object-detection\"; // https://huggingface.co/tasks/zero-shot-object-detection\n\nexport const MultimodalPipelineUseCase = {\n \"document-question-answering\": \"document-question-answering\",\n \"image-to-text\": \"image-to-text\",\n \"zero-shot-audio-classification\": \"zero-shot-audio-classification\",\n \"zero-shot-image-classification\": \"zero-shot-image-classification\",\n \"zero-shot-object-detection\": \"zero-shot-object-detection\",\n} as const satisfies Record<MultimodalPipelineUseCase, MultimodalPipelineUseCase>;\n\nexport type PipelineUseCase =\n | TextPipelineUseCase\n | VisionPipelineUseCase\n | AudioPipelineUseCase\n | MultimodalPipelineUseCase;\n\nexport const PipelineUseCase = {\n ...TextPipelineUseCase,\n ...VisionPipelineUseCase,\n ...AudioPipelineUseCase,\n ...MultimodalPipelineUseCase,\n} as const satisfies Record<PipelineUseCase, PipelineUseCase>;\n",
6
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n type BackgroundRemovalPipeline,\n DocumentQuestionAnsweringSingle,\n type FeatureExtractionPipeline,\n FillMaskPipeline,\n FillMaskSingle,\n type ImageClassificationPipeline,\n type ImageFeatureExtractionPipeline,\n type ImageSegmentationPipeline,\n type ImageToTextPipeline,\n type ObjectDetectionPipeline,\n pipeline,\n // @ts-ignore temporary \"fix\"\n type PretrainedModelOptions,\n QuestionAnsweringPipeline,\n RawImage,\n SummarizationPipeline,\n SummarizationSingle,\n TextClassificationOutput,\n TextClassificationPipeline,\n type TextGenerationPipeline,\n TextGenerationSingle,\n TextStreamer,\n TokenClassificationPipeline,\n TokenClassificationSingle,\n TranslationPipeline,\n TranslationSingle,\n type ZeroShotClassificationPipeline,\n type ZeroShotImageClassificationPipeline,\n type ZeroShotObjectDetectionPipeline,\n} from \"@sroussey/transformers\";\nimport type {\n AiProviderRunFn,\n BackgroundRemovalTaskExecuteInput,\n BackgroundRemovalTaskExecuteOutput,\n DownloadModelTaskExecuteInput,\n DownloadModelTaskExecuteOutput,\n ImageClassificationTaskExecuteInput,\n ImageClassificationTaskExecuteOutput,\n ImageEmbeddingTaskExecuteInput,\n ImageEmbeddingTaskExecuteOutput,\n ImageSegmentationTaskExecuteInput,\n ImageSegmentationTaskExecuteOutput,\n ImageToTextTaskExecuteInput,\n ImageToTextTaskExecuteOutput,\n ObjectDetectionTaskExecuteInput,\n ObjectDetectionTaskExecuteOutput,\n TextClassificationTaskExecuteInput,\n TextClassificationTaskExecuteOutput,\n TextEmbeddingTaskExecuteInput,\n TextEmbeddingTaskExecuteOutput,\n TextFillMaskTaskExecuteInput,\n TextFillMaskTaskExecuteOutput,\n TextGenerationTaskExecuteInput,\n TextGenerationTaskExecuteOutput,\n TextLanguageDetectionTaskExecuteInput,\n TextLanguageDetectionTaskExecuteOutput,\n TextNamedEntityRecognitionTaskExecuteInput,\n TextNamedEntityRecognitionTaskExecuteOutput,\n TextQuestionAnswerTaskExecuteInput,\n TextQuestionAnswerTaskExecuteOutput,\n TextRewriterTaskExecuteInput,\n TextRewriterTaskExecuteOutput,\n TextSummaryTaskExecuteInput,\n TextSummaryTaskExecuteOutput,\n TextTranslationTaskExecuteInput,\n TextTranslationTaskExecuteOutput,\n TypedArray,\n UnloadModelTaskExecuteInput,\n UnloadModelTaskExecuteOutput,\n} from \"@workglow/ai\";\nimport { CallbackStatus } from \"./HFT_CallbackStatus\";\nimport { HTF_CACHE_NAME } from \"./HFT_Constants\";\nimport { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\n\nconst pipelines = new Map<string, any>();\n\n/**\n * Clear all cached pipelines\n */\nexport function clearPipelineCache(): void {\n pipelines.clear();\n}\n\n/**\n * Generate a cache key for a pipeline that includes all configuration options\n * that affect pipeline creation (modelPath, pipeline, dType, device)\n */\nfunction getPipelineCacheKey(model: HfTransformersOnnxModelConfig): string {\n const dType = model.providerConfig.dType || \"q8\";\n const device = model.providerConfig.device || \"\";\n return `${model.providerConfig.modelPath}:${model.providerConfig.pipeline}:${dType}:${device}`;\n}\n\n/**\n * Helper function to get a pipeline for a model\n * @param progressScaleMax - Maximum progress value for download phase (100 for download-only, 10 for download+run)\n */\nconst getPipeline = async (\n model: HfTransformersOnnxModelConfig,\n onProgress: (progress: number, message?: string, details?: any) => void,\n options: PretrainedModelOptions = {},\n progressScaleMax: number = 10\n) => {\n const cacheKey = getPipelineCacheKey(model);\n if (pipelines.has(cacheKey)) {\n return pipelines.get(cacheKey);\n }\n\n // Track file sizes and progress for weighted calculation\n const fileSizes = new Map<string, number>();\n const fileProgress = new Map<string, number>();\n const fileCompleted = new Set<string>();\n const fileFirstSent = new Set<string>();\n const fileLastSent = new Set<string>();\n const fileLastEventTime = new Map<string, number>();\n const pendingProgressByFile = new Map<\n string,\n { progress: number; file: string; fileProgress: number }\n >();\n let throttleTimer: ReturnType<typeof setTimeout> | null = null;\n const THROTTLE_MS = 160;\n\n // Pre-estimate total download size based on typical model structure:\n // 3 tiny files (~1KB each) + 1 medium file (~20MB) + 0-2 large files (~1GB each if present)\n const estimatedTinyFiles = 3;\n const estimatedMediumFiles = 1;\n const estimatedTinySize = 1024; // 1KB\n const estimatedMediumSize = 20 * 1024 * 1024; // 20MB\n const estimatedLargeSize = 1024 * 1024 * 1024; // 1GB\n\n // Start with minimum estimate (4 files), add large files dynamically as we discover them\n const baseEstimate =\n estimatedTinyFiles * estimatedTinySize + estimatedMediumFiles * estimatedMediumSize;\n\n /**\n * Sends a progress event, respecting throttling but always sending first/last per file\n */\n const sendProgress = (\n overallProgress: number,\n file: string,\n fileProgressValue: number,\n isFirst: boolean,\n isLast: boolean\n ): void => {\n const now = Date.now();\n const lastTime = fileLastEventTime.get(file) || 0;\n const timeSinceLastEvent = now - lastTime;\n const shouldThrottle = !isFirst && !isLast && timeSinceLastEvent < THROTTLE_MS;\n\n if (shouldThrottle) {\n // Store pending progress for this file\n pendingProgressByFile.set(file, {\n progress: overallProgress,\n file,\n fileProgress: fileProgressValue,\n });\n // Schedule sending if not already scheduled\n if (!throttleTimer) {\n const timeRemaining = Math.max(1, THROTTLE_MS - timeSinceLastEvent);\n throttleTimer = setTimeout(() => {\n // Send all pending progress events\n for (const [pendingFile, pending] of pendingProgressByFile.entries()) {\n onProgress(Math.round(pending.progress), \"Downloading model\", {\n file: pendingFile,\n progress: pending.fileProgress,\n });\n fileLastEventTime.set(pendingFile, Date.now());\n }\n pendingProgressByFile.clear();\n throttleTimer = null;\n }, timeRemaining);\n }\n return;\n }\n\n // Send immediately\n onProgress(Math.round(overallProgress), \"Downloading model\", {\n file,\n progress: fileProgressValue,\n });\n fileLastEventTime.set(file, now);\n // Clear any pending progress for this file since we're sending it now\n pendingProgressByFile.delete(file);\n if (throttleTimer && pendingProgressByFile.size === 0) {\n clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n };\n\n // Track whether we've seen a substantial file (to avoid premature progress reports for tiny config files)\n let hasSeenSubstantialFile = false;\n const substantialFileThreshold = 1024 * 1024; // 1MB - files larger than this are substantial\n\n // Get the abort signal from options if provided\n const abortSignal = options.abort_signal;\n\n // Create a callback status object for progress tracking\n const progressCallback = (status: CallbackStatus) => {\n // Check if operation has been aborted before processing progress\n if (abortSignal?.aborted) {\n return; // Don't process progress for aborted operations\n }\n\n if (status.status === \"progress\") {\n const file = status.file;\n const fileTotal = status.total;\n const fileProgressValue = status.progress;\n\n // Track file size on first progress event\n if (!fileSizes.has(file)) {\n fileSizes.set(file, fileTotal);\n fileProgress.set(file, 0);\n\n // Check if this is a substantial file\n if (fileTotal >= substantialFileThreshold) {\n hasSeenSubstantialFile = true;\n }\n }\n\n // Update file progress\n fileProgress.set(file, fileProgressValue);\n\n // Check if file is complete\n const isComplete = fileProgressValue >= 100;\n if (isComplete && !fileCompleted.has(file)) {\n fileCompleted.add(file);\n fileProgress.set(file, 100);\n }\n\n // Calculate actual loaded bytes and adjust estimated total\n let actualLoadedSize = 0;\n let actualTotalSize = 0;\n\n // Categorize seen files and track their actual sizes\n const tinyThreshold = 100 * 1024; // 100KB - files smaller are config/vocab\n const mediumThreshold = 100 * 1024 * 1024; // 100MB - tokenizer and small models\n let seenTinyCount = 0;\n let seenMediumCount = 0;\n let seenLargeCount = 0;\n\n for (const [trackedFile, size] of fileSizes.entries()) {\n actualTotalSize += size;\n const progress = fileProgress.get(trackedFile) || 0;\n actualLoadedSize += (size * progress) / 100;\n\n // Categorize file\n if (size < tinyThreshold) {\n seenTinyCount++;\n } else if (size < mediumThreshold) {\n seenMediumCount++;\n } else {\n seenLargeCount++;\n }\n }\n\n // Adjust estimated total size:\n // - Start with actual sizes of seen files\n // - Add estimates for unseen tiny/medium files\n // - For large files: conservatively assume 1 until we've seen all expected files\n const unseenTinyFiles = Math.max(0, estimatedTinyFiles - seenTinyCount);\n const unseenMediumFiles = Math.max(0, estimatedMediumFiles - seenMediumCount);\n\n // Dynamically estimate large files:\n // - If we've seen a large file, assume up to 2 total\n // - Otherwise, conservatively assume 1 large file might exist to prevent premature 100% progress\n // - This prevents the progress from jumping when a large file appears unexpectedly\n let estimatedLargeFiles: number;\n if (seenLargeCount > 0) {\n estimatedLargeFiles = 2; // We've seen at least one, expect up to 2\n } else {\n estimatedLargeFiles = 1; // Haven't seen any large files yet, but assume 1 might exist\n }\n const unseenLargeFiles = Math.max(0, estimatedLargeFiles - seenLargeCount);\n\n const adjustedTotalSize =\n actualTotalSize +\n unseenTinyFiles * estimatedTinySize +\n unseenMediumFiles * estimatedMediumSize +\n unseenLargeFiles * estimatedLargeSize;\n\n // Scale progress to the configured range (0-100 for download-only, 0-10 for download+run)\n const rawProgress = adjustedTotalSize > 0 ? (actualLoadedSize / adjustedTotalSize) * 100 : 0;\n const overallProgress = (rawProgress * progressScaleMax) / 100;\n\n // Determine if this is first or last event for this file\n const isFirst = !fileFirstSent.has(file);\n const isLast = isComplete && !fileLastSent.has(file);\n\n if (isFirst) {\n fileFirstSent.add(file);\n }\n if (isLast) {\n fileLastSent.add(file);\n }\n\n // Only report progress if we've seen a substantial file (to avoid premature 100% for tiny config files)\n if (hasSeenSubstantialFile) {\n sendProgress(overallProgress, file, fileProgressValue, isFirst, isLast);\n }\n } else if (status.status === \"done\" || status.status === \"download\") {\n // Handle file completion from bookend events\n const file = status.file;\n\n // Check if this file should mark the start of substantial downloads\n const fileSize = fileSizes.get(file) || 0;\n if (fileSize >= substantialFileThreshold) {\n hasSeenSubstantialFile = true;\n }\n\n if (!fileCompleted.has(file)) {\n fileCompleted.add(file);\n fileProgress.set(file, 100);\n\n // Recalculate overall progress using same logic as progress handler\n let actualLoadedSize = 0;\n let actualTotalSize = 0;\n\n const tinyThreshold = 100 * 1024; // 100KB - files smaller are config/vocab\n const mediumThreshold = 100 * 1024 * 1024; // 100MB - tokenizer and small models\n let seenTinyCount = 0;\n let seenMediumCount = 0;\n let seenLargeCount = 0;\n\n for (const [trackedFile, size] of fileSizes.entries()) {\n actualTotalSize += size;\n const progress = fileProgress.get(trackedFile) || 0;\n actualLoadedSize += (size * progress) / 100;\n\n // Categorize file\n if (size < tinyThreshold) {\n seenTinyCount++;\n } else if (size < mediumThreshold) {\n seenMediumCount++;\n } else {\n seenLargeCount++;\n }\n }\n\n // Adjust estimated total size (same logic as progress handler)\n const unseenTinyFiles = Math.max(0, estimatedTinyFiles - seenTinyCount);\n const unseenMediumFiles = Math.max(0, estimatedMediumFiles - seenMediumCount);\n\n // Dynamically estimate large files (same logic as progress handler)\n let estimatedLargeFiles: number;\n if (seenLargeCount > 0) {\n estimatedLargeFiles = 2;\n } else {\n estimatedLargeFiles = 1;\n }\n const unseenLargeFiles = Math.max(0, estimatedLargeFiles - seenLargeCount);\n\n const adjustedTotalSize =\n actualTotalSize +\n unseenTinyFiles * estimatedTinySize +\n unseenMediumFiles * estimatedMediumSize +\n unseenLargeFiles * estimatedLargeSize;\n\n // Scale progress to the configured range (0-100 for download-only, 0-10 for download+run)\n const rawProgress =\n adjustedTotalSize > 0 ? (actualLoadedSize / adjustedTotalSize) * 100 : 0;\n const overallProgress = (rawProgress * progressScaleMax) / 100;\n const isLast = !fileLastSent.has(file);\n if (isLast) {\n fileLastSent.add(file);\n // Only report if we've seen a substantial file\n if (hasSeenSubstantialFile) {\n sendProgress(overallProgress, file, 100, false, true);\n }\n }\n }\n }\n };\n\n const pipelineOptions: PretrainedModelOptions = {\n dtype: model.providerConfig.dType || \"q8\",\n ...(model.providerConfig.useExternalDataFormat\n ? { use_external_data_format: model.providerConfig.useExternalDataFormat }\n : {}),\n ...(model.providerConfig.device ? { device: model.providerConfig.device as any } : {}),\n ...options,\n progress_callback: progressCallback,\n };\n\n // Check if already aborted before starting\n if (abortSignal?.aborted) {\n throw new Error(\"Operation aborted before pipeline creation\");\n }\n\n const pipelineType = model.providerConfig.pipeline;\n\n // Wrap the pipeline call with abort handling\n // Create a promise that rejects when aborted\n const abortPromise = new Promise<never>((_, reject) => {\n if (abortSignal) {\n const handleAbort = () => {\n reject(new Error(\"Pipeline download aborted\"));\n };\n\n if (abortSignal.aborted) {\n handleAbort();\n } else {\n abortSignal.addEventListener(\"abort\", handleAbort, { once: true });\n }\n }\n });\n\n // Race between pipeline creation and abort\n const pipelinePromise = pipeline(pipelineType, model.providerConfig.modelPath, pipelineOptions);\n\n try {\n const result = await (abortSignal\n ? Promise.race([pipelinePromise, abortPromise])\n : pipelinePromise);\n\n // Check if aborted after pipeline creation\n if (abortSignal?.aborted) {\n throw new Error(\"Operation aborted after pipeline creation\");\n }\n\n pipelines.set(cacheKey, result);\n return result;\n } catch (error: any) {\n // If aborted, throw a clean abort error rather than internal stream errors\n if (abortSignal?.aborted) {\n throw new Error(\"Pipeline download aborted\");\n }\n // Otherwise, re-throw the original error\n throw error;\n }\n};\n\n/**\n * Core implementation for downloading and caching a Hugging Face Transformers model.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_Download: AiProviderRunFn<\n DownloadModelTaskExecuteInput,\n DownloadModelTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n // Download the model by creating a pipeline\n // Use 100 as progressScaleMax since this is download-only (0-100%)\n await getPipeline(model!, onProgress, { abort_signal: signal }, 100);\n\n return {\n model: input.model!,\n };\n};\n\n/**\n * Core implementation for unloading a Hugging Face Transformers model.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_Unload: AiProviderRunFn<\n UnloadModelTaskExecuteInput,\n UnloadModelTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n // Delete the pipeline from the in-memory map\n const cacheKey = getPipelineCacheKey(model!);\n if (pipelines.has(cacheKey)) {\n pipelines.delete(cacheKey);\n onProgress(50, \"Pipeline removed from memory\");\n }\n\n // Delete model cache entries\n const modelPath = model!.providerConfig.modelPath;\n await deleteModelCache(modelPath);\n onProgress(100, \"Model cache deleted\");\n\n return {\n model: input.model!,\n };\n};\n\n/**\n * Deletes all cache entries for a given model path\n * @param modelPath - The model path to delete from cache\n */\nconst deleteModelCache = async (modelPath: string): Promise<void> => {\n const cache = await caches.open(HTF_CACHE_NAME);\n const keys = await cache.keys();\n const prefix = `/${modelPath}/`;\n\n // Collect all matching requests first\n const requestsToDelete: Request[] = [];\n for (const request of keys) {\n const url = new URL(request.url);\n if (url.pathname.startsWith(prefix)) {\n requestsToDelete.push(request);\n }\n }\n\n // Delete all matching requests\n let deletedCount = 0;\n for (const request of requestsToDelete) {\n try {\n const deleted = await cache.delete(request);\n if (deleted) {\n deletedCount++;\n } else {\n // If delete returns false, try with URL string as fallback\n const deletedByUrl = await cache.delete(request.url);\n if (deletedByUrl) {\n deletedCount++;\n }\n }\n } catch (error) {\n console.error(`Failed to delete cache entry: ${request.url}`, error);\n }\n }\n};\n\n/**\n * Core implementation for text embedding using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\n\nexport const HFT_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskExecuteInput,\n TextEmbeddingTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateEmbedding: FeatureExtractionPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n // Generate the embedding\n const hfVector = await generateEmbedding(input.text, {\n pooling: \"mean\",\n normalize: model?.providerConfig.normalize,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n // Validate the embedding dimensions\n if (hfVector.size !== model?.providerConfig.nativeDimensions) {\n console.warn(\n `HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${model?.providerConfig.nativeDimensions}`,\n input,\n hfVector\n );\n throw new Error(\n `HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${model?.providerConfig.nativeDimensions}`\n );\n }\n\n return { vector: hfVector.data as TypedArray };\n};\n\nexport const HFT_TextClassification: AiProviderRunFn<\n TextClassificationTaskExecuteInput,\n TextClassificationTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.providerConfig?.pipeline === \"zero-shot-classification\") {\n if (\n !input.candidateLabels ||\n !Array.isArray(input.candidateLabels) ||\n input.candidateLabels.length === 0\n ) {\n throw new Error(\"Zero-shot text classification requires candidate labels\");\n }\n\n const zeroShotClassifier: ZeroShotClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {\n abort_signal: signal,\n }\n );\n const result: any = await zeroShotClassifier(input.text, input.candidateLabels as string[], {});\n\n return {\n categories: result.labels.map((label: string, idx: number) => ({\n label,\n score: result.scores[idx],\n })),\n };\n }\n\n const TextClassification: TextClassificationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const result = await TextClassification(input.text, {\n top_k: input.maxCategories || undefined,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n if (Array.isArray(result[0])) {\n return {\n categories: result[0].map((category) => ({\n label: category.label,\n score: category.score,\n })),\n };\n }\n\n return {\n categories: (result as TextClassificationOutput).map((category) => ({\n label: category.label,\n score: category.score,\n })),\n };\n};\n\nexport const HFT_TextLanguageDetection: AiProviderRunFn<\n TextLanguageDetectionTaskExecuteInput,\n TextLanguageDetectionTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const TextClassification: TextClassificationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const result = await TextClassification(input.text, {\n top_k: input.maxLanguages || undefined,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n if (Array.isArray(result[0])) {\n return {\n languages: result[0].map((category) => ({\n language: category.label,\n score: category.score,\n })),\n };\n }\n\n return {\n languages: (result as TextClassificationOutput).map((category) => ({\n language: category.label,\n score: category.score,\n })),\n };\n};\n\nexport const HFT_TextNamedEntityRecognition: AiProviderRunFn<\n TextNamedEntityRecognitionTaskExecuteInput,\n TextNamedEntityRecognitionTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const textNamedEntityRecognition: TokenClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {\n abort_signal: signal,\n }\n );\n let results = await textNamedEntityRecognition(input.text, {\n ignore_labels: input.blockList as string[] | undefined,\n ...(signal ? { abort_signal: signal } : {}),\n });\n let entities: TokenClassificationSingle[] = [];\n if (!Array.isArray(results)) {\n entities = [results];\n } else {\n entities = results as TokenClassificationSingle[];\n }\n return {\n entities: entities.map((entity) => ({\n entity: entity.entity,\n score: entity.score,\n word: entity.word,\n })),\n };\n};\n\nexport const HFT_TextFillMask: AiProviderRunFn<\n TextFillMaskTaskExecuteInput,\n TextFillMaskTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const unmasker: FillMaskPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n let results = await unmasker(input.text);\n let predictions: FillMaskSingle[] = [];\n if (!Array.isArray(results)) {\n predictions = [results];\n } else {\n predictions = results as FillMaskSingle[];\n }\n return {\n predictions: predictions.map((prediction) => ({\n entity: prediction.token_str,\n score: prediction.score,\n sequence: prediction.sequence,\n })),\n };\n};\n\n/**\n * Core implementation for text generation using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextGeneration: AiProviderRunFn<\n TextGenerationTaskExecuteInput,\n TextGenerationTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateText: TextGenerationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n const streamer = createTextStreamer(generateText.tokenizer, onProgress, signal);\n\n let results = await generateText(input.prompt, {\n streamer,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n if (!Array.isArray(results)) {\n results = [results];\n }\n let text = (results[0] as TextGenerationSingle)?.generated_text;\n\n if (Array.isArray(text)) {\n text = text[text.length - 1]?.content;\n }\n return {\n text,\n };\n};\n\n/**\n * Core implementation for text translation using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextTranslation: AiProviderRunFn<\n TextTranslationTaskExecuteInput,\n TextTranslationTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const translate: TranslationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const streamer = createTextStreamer(translate.tokenizer, onProgress);\n\n const result = await translate(input.text, {\n src_lang: input.source_lang,\n tgt_lang: input.target_lang,\n streamer,\n ...(signal ? { abort_signal: signal } : {}),\n } as any);\n\n let translatedText: string | string[] = \"\";\n if (Array.isArray(result)) {\n translatedText = result.map((r) => (r as TranslationSingle)?.translation_text || \"\");\n } else {\n translatedText = (result as TranslationSingle)?.translation_text || \"\";\n }\n\n return {\n text: translatedText,\n target_lang: input.target_lang,\n };\n};\n\n/**\n * Core implementation for text rewriting using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextRewriter: AiProviderRunFn<\n TextRewriterTaskExecuteInput,\n TextRewriterTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateText: TextGenerationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const streamer = createTextStreamer(generateText.tokenizer, onProgress);\n\n // This lib doesn't support this kind of rewriting with a separate prompt vs text\n const promptedText = (input.prompt ? input.prompt + \"\\n\" : \"\") + input.text;\n\n let results = await generateText(promptedText, {\n streamer,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n if (!Array.isArray(results)) {\n results = [results];\n }\n\n let text = (results[0] as TextGenerationSingle)?.generated_text;\n if (Array.isArray(text)) {\n text = text[text.length - 1]?.content;\n }\n\n if (text === promptedText) {\n throw new Error(\"Rewriter failed to generate new text\");\n }\n\n return {\n text,\n };\n};\n\n/**\n * Core implementation for text summarization using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextSummary: AiProviderRunFn<\n TextSummaryTaskExecuteInput,\n TextSummaryTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateSummary: SummarizationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const streamer = createTextStreamer(generateSummary.tokenizer, onProgress);\n\n let result = await generateSummary(input.text, {\n streamer,\n ...(signal ? { abort_signal: signal } : {}),\n } as any);\n\n let summaryText = \"\";\n if (Array.isArray(result)) {\n summaryText = (result[0] as SummarizationSingle)?.summary_text || \"\";\n } else {\n summaryText = (result as SummarizationSingle)?.summary_text || \"\";\n }\n\n return {\n text: summaryText,\n };\n};\n\n/**\n * Core implementation for question answering using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextQuestionAnswer: AiProviderRunFn<\n TextQuestionAnswerTaskExecuteInput,\n TextQuestionAnswerTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n // Get the question answering pipeline\n const generateAnswer: QuestionAnsweringPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const streamer = createTextStreamer(generateAnswer.tokenizer, onProgress);\n\n const result = await generateAnswer(input.question, input.context, {\n streamer,\n ...(signal ? { abort_signal: signal } : {}),\n } as any);\n\n let answerText = \"\";\n if (Array.isArray(result)) {\n answerText = (result[0] as DocumentQuestionAnsweringSingle)?.answer || \"\";\n } else {\n answerText = (result as DocumentQuestionAnsweringSingle)?.answer || \"\";\n }\n\n return {\n text: answerText,\n };\n};\n\n/**\n * Core implementation for image segmentation using Hugging Face Transformers.\n */\nexport const HFT_ImageSegmentation: AiProviderRunFn<\n ImageSegmentationTaskExecuteInput,\n ImageSegmentationTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const segmenter: ImageSegmentationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n const result = await segmenter(input.image as any, {\n threshold: input.threshold,\n mask_threshold: input.maskThreshold,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n const masks = Array.isArray(result) ? result : [result];\n\n const processedMasks = await Promise.all(\n masks.map(async (mask) => ({\n label: mask.label || \"\",\n score: mask.score || 0,\n mask: {} as { [x: string]: unknown },\n }))\n );\n\n return {\n masks: processedMasks,\n };\n};\n\n/**\n * Core implementation for image to text using Hugging Face Transformers.\n */\nexport const HFT_ImageToText: AiProviderRunFn<\n ImageToTextTaskExecuteInput,\n ImageToTextTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const captioner: ImageToTextPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n const result: any = await captioner(input.image as string, {\n max_new_tokens: input.maxTokens,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n const text = Array.isArray(result) ? result[0]?.generated_text : result?.generated_text;\n\n return {\n text: text || \"\",\n };\n};\n\n/**\n * Core implementation for background removal using Hugging Face Transformers.\n */\nexport const HFT_BackgroundRemoval: AiProviderRunFn<\n BackgroundRemovalTaskExecuteInput,\n BackgroundRemovalTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const remover: BackgroundRemovalPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n const result = await remover(input.image as string, {\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n const resultImage = Array.isArray(result) ? result[0] : result;\n\n return {\n image: imageToBase64(resultImage),\n };\n};\n\n/**\n * Core implementation for image embedding using Hugging Face Transformers.\n */\nexport const HFT_ImageEmbedding: AiProviderRunFn<\n ImageEmbeddingTaskExecuteInput,\n ImageEmbeddingTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const embedder: ImageFeatureExtractionPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n const result: any = await embedder(input.image as string);\n\n return {\n vector: result.data as TypedArray,\n };\n};\n\n/**\n * Core implementation for image classification using Hugging Face Transformers.\n * Auto-selects between regular and zero-shot classification.\n */\nexport const HFT_ImageClassification: AiProviderRunFn<\n ImageClassificationTaskExecuteInput,\n ImageClassificationTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.providerConfig?.pipeline === \"zero-shot-image-classification\") {\n if (!input.categories || !Array.isArray(input.categories) || input.categories.length === 0) {\n console.warn(\"Zero-shot image classification requires categories\", input);\n throw new Error(\"Zero-shot image classification requires categories\");\n }\n const zeroShotClassifier: ZeroShotImageClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {\n abort_signal: signal,\n }\n );\n const result: any = await zeroShotClassifier(\n input.image as string,\n input.categories! as string[],\n {}\n );\n\n const results = Array.isArray(result) ? result : [result];\n\n return {\n categories: results.map((r: any) => ({\n label: r.label,\n score: r.score,\n })),\n };\n }\n\n const classifier: ImageClassificationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const result: any = await classifier(input.image as string, {\n top_k: (input as any).maxCategories,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n const results = Array.isArray(result) ? result : [result];\n\n return {\n categories: results.map((r: any) => ({\n label: r.label,\n score: r.score,\n })),\n };\n};\n\n/**\n * Core implementation for object detection using Hugging Face Transformers.\n * Auto-selects between regular and zero-shot detection.\n */\nexport const HFT_ObjectDetection: AiProviderRunFn<\n ObjectDetectionTaskExecuteInput,\n ObjectDetectionTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.providerConfig?.pipeline === \"zero-shot-object-detection\") {\n if (!input.labels || !Array.isArray(input.labels) || input.labels.length === 0) {\n throw new Error(\"Zero-shot object detection requires labels\");\n }\n const zeroShotDetector: ZeroShotObjectDetectionPipeline = await getPipeline(\n model!,\n onProgress,\n {\n abort_signal: signal,\n }\n );\n const result: any = await zeroShotDetector(input.image as string, Array.from(input.labels!), {\n threshold: (input as any).threshold,\n });\n\n const detections = Array.isArray(result) ? result : [result];\n\n return {\n detections: detections.map((d: any) => ({\n label: d.label,\n score: d.score,\n box: d.box,\n })),\n };\n }\n\n const detector: ObjectDetectionPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const result: any = await detector(input.image as string, {\n threshold: (input as any).threshold,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n const detections = Array.isArray(result) ? result : [result];\n\n return {\n detections: detections.map((d: any) => ({\n label: d.label,\n score: d.score,\n box: d.box,\n })),\n };\n};\n/**\n * Helper function to convert RawImage to base64 PNG\n */\nfunction imageToBase64(image: RawImage): string {\n // Convert RawImage to base64 PNG\n // This is a simplified version - actual implementation would use canvas or similar\n return (image as any).toBase64?.() || \"\";\n}\n\n/**\n * Create a text streamer for a given tokenizer and update progress function\n * @param tokenizer - The tokenizer to use for the streamer\n * @param updateProgress - The function to call to update the progress\n * @param signal - The signal to use for the streamer for aborting\n * @returns The text streamer\n */\nfunction createTextStreamer(\n tokenizer: any,\n updateProgress: (progress: number, message?: string, details?: any) => void,\n signal?: AbortSignal\n) {\n let count = 0;\n return new TextStreamer(tokenizer, {\n skip_prompt: true,\n decode_kwargs: { skip_special_tokens: true },\n callback_function: (text: string) => {\n count++;\n const result = 100 * (1 - Math.exp(-0.05 * count));\n const progress = Math.round(Math.min(result, 100));\n updateProgress(progress, \"Generating\", { text, progress });\n },\n ...(signal ? { abort_signal: signal } : {}),\n });\n}\n",
7
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ModelConfigSchema, ModelRecordSchema } from \"@workglow/ai\";\nimport { DataPortSchemaObject, FromSchema } from \"@workglow/util\";\nimport { HF_TRANSFORMERS_ONNX, PipelineUseCase, QuantizationDataType } from \"./HFT_Constants\";\n\nexport const HfTransformersOnnxModelSchema = {\n type: \"object\",\n properties: {\n provider: {\n const: HF_TRANSFORMERS_ONNX,\n description: \"Discriminator: ONNX runtime backend.\",\n },\n providerConfig: {\n type: \"object\",\n description: \"ONNX runtime-specific options.\",\n properties: {\n pipeline: {\n type: \"string\",\n enum: Object.values(PipelineUseCase),\n description: \"Pipeline type for the ONNX model.\",\n default: \"text-generation\",\n },\n modelPath: {\n type: \"string\",\n description: \"Filesystem path or URI for the ONNX model.\",\n },\n dType: {\n type: \"string\",\n enum: Object.values(QuantizationDataType),\n description: \"Data type for the ONNX model.\",\n default: \"float32\",\n },\n device: {\n type: \"string\",\n enum: [\"cpu\", \"gpu\", \"webgpu\", \"wasm\", \"metal\"],\n description: \"High-level device selection.\",\n default: \"webgpu\",\n },\n executionProviders: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Raw ONNX Runtime execution provider identifiers.\",\n },\n intraOpNumThreads: {\n type: \"integer\",\n minimum: 1,\n },\n interOpNumThreads: {\n type: \"integer\",\n minimum: 1,\n },\n useExternalDataFormat: {\n type: \"boolean\",\n description: \"Whether the model uses external data format.\",\n },\n nativeDimensions: {\n type: \"integer\",\n description: \"The native dimensions of the model.\",\n },\n normalize: {\n type: \"boolean\",\n description: \"Whether the model uses normalization.\",\n },\n languageStyle: {\n type: \"string\",\n description: \"The language style of the model.\",\n },\n },\n required: [\"modelPath\", \"pipeline\"],\n additionalProperties: false,\n if: {\n properties: {\n pipeline: {\n const: \"feature-extraction\",\n },\n },\n },\n then: {\n required: [\"nativeDimensions\"],\n },\n },\n },\n required: [\"provider\", \"providerConfig\"],\n additionalProperties: true,\n} as const satisfies DataPortSchemaObject;\n\nconst ExtendedModelRecordSchema = {\n type: \"object\",\n properties: {\n ...ModelRecordSchema.properties,\n ...HfTransformersOnnxModelSchema.properties,\n },\n required: [...ModelRecordSchema.required, ...HfTransformersOnnxModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type HfTransformersOnnxModelRecord = FromSchema<typeof ExtendedModelRecordSchema>;\n\nconst ExtendedModelConfigSchema = {\n type: \"object\",\n properties: {\n ...ModelConfigSchema.properties,\n ...HfTransformersOnnxModelSchema.properties,\n },\n required: [...ModelConfigSchema.required, ...HfTransformersOnnxModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type HfTransformersOnnxModelConfig = FromSchema<typeof ExtendedModelConfigSchema>;\n",
6
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n type BackgroundRemovalPipeline,\n DocumentQuestionAnsweringSingle,\n type FeatureExtractionPipeline,\n FillMaskPipeline,\n FillMaskSingle,\n type ImageClassificationPipeline,\n type ImageFeatureExtractionPipeline,\n type ImageSegmentationPipeline,\n type ImageToTextPipeline,\n type ObjectDetectionPipeline,\n pipeline,\n // @ts-ignore temporary \"fix\"\n type PretrainedModelOptions,\n QuestionAnsweringPipeline,\n RawImage,\n SummarizationPipeline,\n SummarizationSingle,\n TextClassificationOutput,\n TextClassificationPipeline,\n type TextGenerationPipeline,\n TextGenerationSingle,\n TextStreamer,\n TokenClassificationPipeline,\n TokenClassificationSingle,\n TranslationPipeline,\n TranslationSingle,\n type ZeroShotClassificationPipeline,\n type ZeroShotImageClassificationPipeline,\n type ZeroShotObjectDetectionPipeline,\n} from \"@sroussey/transformers\";\nimport type {\n AiProviderRunFn,\n BackgroundRemovalTaskExecuteInput,\n BackgroundRemovalTaskExecuteOutput,\n DownloadModelTaskExecuteInput,\n DownloadModelTaskExecuteOutput,\n ImageClassificationTaskExecuteInput,\n ImageClassificationTaskExecuteOutput,\n ImageEmbeddingTaskExecuteInput,\n ImageEmbeddingTaskExecuteOutput,\n ImageSegmentationTaskExecuteInput,\n ImageSegmentationTaskExecuteOutput,\n ImageToTextTaskExecuteInput,\n ImageToTextTaskExecuteOutput,\n ObjectDetectionTaskExecuteInput,\n ObjectDetectionTaskExecuteOutput,\n TextClassificationTaskExecuteInput,\n TextClassificationTaskExecuteOutput,\n TextEmbeddingTaskExecuteInput,\n TextEmbeddingTaskExecuteOutput,\n TextFillMaskTaskExecuteInput,\n TextFillMaskTaskExecuteOutput,\n TextGenerationTaskExecuteInput,\n TextGenerationTaskExecuteOutput,\n TextLanguageDetectionTaskExecuteInput,\n TextLanguageDetectionTaskExecuteOutput,\n TextNamedEntityRecognitionTaskExecuteInput,\n TextNamedEntityRecognitionTaskExecuteOutput,\n TextQuestionAnswerTaskExecuteInput,\n TextQuestionAnswerTaskExecuteOutput,\n TextRewriterTaskExecuteInput,\n TextRewriterTaskExecuteOutput,\n TextSummaryTaskExecuteInput,\n TextSummaryTaskExecuteOutput,\n TextTranslationTaskExecuteInput,\n TextTranslationTaskExecuteOutput,\n TypedArray,\n UnloadModelTaskExecuteInput,\n UnloadModelTaskExecuteOutput,\n} from \"@workglow/ai\";\nimport { CallbackStatus } from \"./HFT_CallbackStatus\";\nimport { HTF_CACHE_NAME } from \"./HFT_Constants\";\nimport { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\n\nconst pipelines = new Map<string, any>();\n\n/**\n * Clear all cached pipelines\n */\nexport function clearPipelineCache(): void {\n pipelines.clear();\n}\n\n/**\n * Generate a cache key for a pipeline that includes all configuration options\n * that affect pipeline creation (modelPath, pipeline, dType, device)\n */\nfunction getPipelineCacheKey(model: HfTransformersOnnxModelConfig): string {\n const dType = model.provider_config.dType || \"q8\";\n const device = model.provider_config.device || \"\";\n return `${model.provider_config.modelPath}:${model.provider_config.pipeline}:${dType}:${device}`;\n}\n\n/**\n * Helper function to get a pipeline for a model\n * @param progressScaleMax - Maximum progress value for download phase (100 for download-only, 10 for download+run)\n */\nconst getPipeline = async (\n model: HfTransformersOnnxModelConfig,\n onProgress: (progress: number, message?: string, details?: any) => void,\n options: PretrainedModelOptions = {},\n progressScaleMax: number = 10\n) => {\n const cacheKey = getPipelineCacheKey(model);\n if (pipelines.has(cacheKey)) {\n return pipelines.get(cacheKey);\n }\n\n // Track file sizes and progress for weighted calculation\n const fileSizes = new Map<string, number>();\n const fileProgress = new Map<string, number>();\n const fileCompleted = new Set<string>();\n const fileFirstSent = new Set<string>();\n const fileLastSent = new Set<string>();\n const fileLastEventTime = new Map<string, number>();\n const pendingProgressByFile = new Map<\n string,\n { progress: number; file: string; fileProgress: number }\n >();\n let throttleTimer: ReturnType<typeof setTimeout> | null = null;\n const THROTTLE_MS = 160;\n\n // Pre-estimate total download size based on typical model structure:\n // 3 tiny files (~1KB each) + 1 medium file (~20MB) + 0-2 large files (~1GB each if present)\n const estimatedTinyFiles = 3;\n const estimatedMediumFiles = 1;\n const estimatedTinySize = 1024; // 1KB\n const estimatedMediumSize = 20 * 1024 * 1024; // 20MB\n const estimatedLargeSize = 1024 * 1024 * 1024; // 1GB\n\n // Start with minimum estimate (4 files), add large files dynamically as we discover them\n const baseEstimate =\n estimatedTinyFiles * estimatedTinySize + estimatedMediumFiles * estimatedMediumSize;\n\n /**\n * Sends a progress event, respecting throttling but always sending first/last per file\n */\n const sendProgress = (\n overallProgress: number,\n file: string,\n fileProgressValue: number,\n isFirst: boolean,\n isLast: boolean\n ): void => {\n const now = Date.now();\n const lastTime = fileLastEventTime.get(file) || 0;\n const timeSinceLastEvent = now - lastTime;\n const shouldThrottle = !isFirst && !isLast && timeSinceLastEvent < THROTTLE_MS;\n\n if (shouldThrottle) {\n // Store pending progress for this file\n pendingProgressByFile.set(file, {\n progress: overallProgress,\n file,\n fileProgress: fileProgressValue,\n });\n // Schedule sending if not already scheduled\n if (!throttleTimer) {\n const timeRemaining = Math.max(1, THROTTLE_MS - timeSinceLastEvent);\n throttleTimer = setTimeout(() => {\n // Send all pending progress events\n for (const [pendingFile, pending] of pendingProgressByFile.entries()) {\n onProgress(Math.round(pending.progress), \"Downloading model\", {\n file: pendingFile,\n progress: pending.fileProgress,\n });\n fileLastEventTime.set(pendingFile, Date.now());\n }\n pendingProgressByFile.clear();\n throttleTimer = null;\n }, timeRemaining);\n }\n return;\n }\n\n // Send immediately\n onProgress(Math.round(overallProgress), \"Downloading model\", {\n file,\n progress: fileProgressValue,\n });\n fileLastEventTime.set(file, now);\n // Clear any pending progress for this file since we're sending it now\n pendingProgressByFile.delete(file);\n if (throttleTimer && pendingProgressByFile.size === 0) {\n clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n };\n\n // Track whether we've seen a substantial file (to avoid premature progress reports for tiny config files)\n let hasSeenSubstantialFile = false;\n const substantialFileThreshold = 1024 * 1024; // 1MB - files larger than this are substantial\n\n // Get the abort signal from options if provided\n const abortSignal = options.abort_signal;\n\n // Create a callback status object for progress tracking\n const progressCallback = (status: CallbackStatus) => {\n // Check if operation has been aborted before processing progress\n if (abortSignal?.aborted) {\n return; // Don't process progress for aborted operations\n }\n\n if (status.status === \"progress\") {\n const file = status.file;\n const fileTotal = status.total;\n const fileProgressValue = status.progress;\n\n // Track file size on first progress event\n if (!fileSizes.has(file)) {\n fileSizes.set(file, fileTotal);\n fileProgress.set(file, 0);\n\n // Check if this is a substantial file\n if (fileTotal >= substantialFileThreshold) {\n hasSeenSubstantialFile = true;\n }\n }\n\n // Update file progress\n fileProgress.set(file, fileProgressValue);\n\n // Check if file is complete\n const isComplete = fileProgressValue >= 100;\n if (isComplete && !fileCompleted.has(file)) {\n fileCompleted.add(file);\n fileProgress.set(file, 100);\n }\n\n // Calculate actual loaded bytes and adjust estimated total\n let actualLoadedSize = 0;\n let actualTotalSize = 0;\n\n // Categorize seen files and track their actual sizes\n const tinyThreshold = 100 * 1024; // 100KB - files smaller are config/vocab\n const mediumThreshold = 100 * 1024 * 1024; // 100MB - tokenizer and small models\n let seenTinyCount = 0;\n let seenMediumCount = 0;\n let seenLargeCount = 0;\n\n for (const [trackedFile, size] of fileSizes.entries()) {\n actualTotalSize += size;\n const progress = fileProgress.get(trackedFile) || 0;\n actualLoadedSize += (size * progress) / 100;\n\n // Categorize file\n if (size < tinyThreshold) {\n seenTinyCount++;\n } else if (size < mediumThreshold) {\n seenMediumCount++;\n } else {\n seenLargeCount++;\n }\n }\n\n // Adjust estimated total size:\n // - Start with actual sizes of seen files\n // - Add estimates for unseen tiny/medium files\n // - For large files: conservatively assume 1 until we've seen all expected files\n const unseenTinyFiles = Math.max(0, estimatedTinyFiles - seenTinyCount);\n const unseenMediumFiles = Math.max(0, estimatedMediumFiles - seenMediumCount);\n\n // Dynamically estimate large files:\n // - If we've seen a large file, assume up to 2 total\n // - Otherwise, conservatively assume 1 large file might exist to prevent premature 100% progress\n // - This prevents the progress from jumping when a large file appears unexpectedly\n let estimatedLargeFiles: number;\n if (seenLargeCount > 0) {\n estimatedLargeFiles = 2; // We've seen at least one, expect up to 2\n } else {\n estimatedLargeFiles = 1; // Haven't seen any large files yet, but assume 1 might exist\n }\n const unseenLargeFiles = Math.max(0, estimatedLargeFiles - seenLargeCount);\n\n const adjustedTotalSize =\n actualTotalSize +\n unseenTinyFiles * estimatedTinySize +\n unseenMediumFiles * estimatedMediumSize +\n unseenLargeFiles * estimatedLargeSize;\n\n // Scale progress to the configured range (0-100 for download-only, 0-10 for download+run)\n const rawProgress = adjustedTotalSize > 0 ? (actualLoadedSize / adjustedTotalSize) * 100 : 0;\n const overallProgress = (rawProgress * progressScaleMax) / 100;\n\n // Determine if this is first or last event for this file\n const isFirst = !fileFirstSent.has(file);\n const isLast = isComplete && !fileLastSent.has(file);\n\n if (isFirst) {\n fileFirstSent.add(file);\n }\n if (isLast) {\n fileLastSent.add(file);\n }\n\n // Only report progress if we've seen a substantial file (to avoid premature 100% for tiny config files)\n if (hasSeenSubstantialFile) {\n sendProgress(overallProgress, file, fileProgressValue, isFirst, isLast);\n }\n } else if (status.status === \"done\" || status.status === \"download\") {\n // Handle file completion from bookend events\n const file = status.file;\n\n // Check if this file should mark the start of substantial downloads\n const fileSize = fileSizes.get(file) || 0;\n if (fileSize >= substantialFileThreshold) {\n hasSeenSubstantialFile = true;\n }\n\n if (!fileCompleted.has(file)) {\n fileCompleted.add(file);\n fileProgress.set(file, 100);\n\n // Recalculate overall progress using same logic as progress handler\n let actualLoadedSize = 0;\n let actualTotalSize = 0;\n\n const tinyThreshold = 100 * 1024; // 100KB - files smaller are config/vocab\n const mediumThreshold = 100 * 1024 * 1024; // 100MB - tokenizer and small models\n let seenTinyCount = 0;\n let seenMediumCount = 0;\n let seenLargeCount = 0;\n\n for (const [trackedFile, size] of fileSizes.entries()) {\n actualTotalSize += size;\n const progress = fileProgress.get(trackedFile) || 0;\n actualLoadedSize += (size * progress) / 100;\n\n // Categorize file\n if (size < tinyThreshold) {\n seenTinyCount++;\n } else if (size < mediumThreshold) {\n seenMediumCount++;\n } else {\n seenLargeCount++;\n }\n }\n\n // Adjust estimated total size (same logic as progress handler)\n const unseenTinyFiles = Math.max(0, estimatedTinyFiles - seenTinyCount);\n const unseenMediumFiles = Math.max(0, estimatedMediumFiles - seenMediumCount);\n\n // Dynamically estimate large files (same logic as progress handler)\n let estimatedLargeFiles: number;\n if (seenLargeCount > 0) {\n estimatedLargeFiles = 2;\n } else {\n estimatedLargeFiles = 1;\n }\n const unseenLargeFiles = Math.max(0, estimatedLargeFiles - seenLargeCount);\n\n const adjustedTotalSize =\n actualTotalSize +\n unseenTinyFiles * estimatedTinySize +\n unseenMediumFiles * estimatedMediumSize +\n unseenLargeFiles * estimatedLargeSize;\n\n // Scale progress to the configured range (0-100 for download-only, 0-10 for download+run)\n const rawProgress =\n adjustedTotalSize > 0 ? (actualLoadedSize / adjustedTotalSize) * 100 : 0;\n const overallProgress = (rawProgress * progressScaleMax) / 100;\n const isLast = !fileLastSent.has(file);\n if (isLast) {\n fileLastSent.add(file);\n // Only report if we've seen a substantial file\n if (hasSeenSubstantialFile) {\n sendProgress(overallProgress, file, 100, false, true);\n }\n }\n }\n }\n };\n\n const pipelineOptions: PretrainedModelOptions = {\n dtype: model.provider_config.dType || \"q8\",\n ...(model.provider_config.useExternalDataFormat\n ? { use_external_data_format: model.provider_config.useExternalDataFormat }\n : {}),\n ...(model.provider_config.device ? { device: model.provider_config.device as any } : {}),\n ...options,\n progress_callback: progressCallback,\n };\n\n // Check if already aborted before starting\n if (abortSignal?.aborted) {\n throw new Error(\"Operation aborted before pipeline creation\");\n }\n\n const pipelineType = model.provider_config.pipeline;\n\n // Wrap the pipeline call with abort handling\n // Create a promise that rejects when aborted\n const abortPromise = new Promise<never>((_, reject) => {\n if (abortSignal) {\n const handleAbort = () => {\n reject(new Error(\"Pipeline download aborted\"));\n };\n\n if (abortSignal.aborted) {\n handleAbort();\n } else {\n abortSignal.addEventListener(\"abort\", handleAbort, { once: true });\n }\n }\n });\n\n // Race between pipeline creation and abort\n const pipelinePromise = pipeline(pipelineType, model.provider_config.modelPath, pipelineOptions);\n\n try {\n const result = await (abortSignal\n ? Promise.race([pipelinePromise, abortPromise])\n : pipelinePromise);\n\n // Check if aborted after pipeline creation\n if (abortSignal?.aborted) {\n throw new Error(\"Operation aborted after pipeline creation\");\n }\n\n pipelines.set(cacheKey, result);\n return result;\n } catch (error: any) {\n // If aborted, throw a clean abort error rather than internal stream errors\n if (abortSignal?.aborted) {\n throw new Error(\"Pipeline download aborted\");\n }\n // Otherwise, re-throw the original error\n throw error;\n }\n};\n\n/**\n * Core implementation for downloading and caching a Hugging Face Transformers model.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_Download: AiProviderRunFn<\n DownloadModelTaskExecuteInput,\n DownloadModelTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n // Download the model by creating a pipeline\n // Use 100 as progressScaleMax since this is download-only (0-100%)\n await getPipeline(model!, onProgress, { abort_signal: signal }, 100);\n\n return {\n model: input.model!,\n };\n};\n\n/**\n * Core implementation for unloading a Hugging Face Transformers model.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_Unload: AiProviderRunFn<\n UnloadModelTaskExecuteInput,\n UnloadModelTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n // Delete the pipeline from the in-memory map\n const cacheKey = getPipelineCacheKey(model!);\n if (pipelines.has(cacheKey)) {\n pipelines.delete(cacheKey);\n onProgress(50, \"Pipeline removed from memory\");\n }\n\n // Delete model cache entries\n const modelPath = model!.provider_config.modelPath;\n await deleteModelCache(modelPath);\n onProgress(100, \"Model cache deleted\");\n\n return {\n model: input.model!,\n };\n};\n\n/**\n * Deletes all cache entries for a given model path\n * @param modelPath - The model path to delete from cache\n */\nconst deleteModelCache = async (modelPath: string): Promise<void> => {\n const cache = await caches.open(HTF_CACHE_NAME);\n const keys = await cache.keys();\n const prefix = `/${modelPath}/`;\n\n // Collect all matching requests first\n const requestsToDelete: Request[] = [];\n for (const request of keys) {\n const url = new URL(request.url);\n if (url.pathname.startsWith(prefix)) {\n requestsToDelete.push(request);\n }\n }\n\n // Delete all matching requests\n let deletedCount = 0;\n for (const request of requestsToDelete) {\n try {\n const deleted = await cache.delete(request);\n if (deleted) {\n deletedCount++;\n } else {\n // If delete returns false, try with URL string as fallback\n const deletedByUrl = await cache.delete(request.url);\n if (deletedByUrl) {\n deletedCount++;\n }\n }\n } catch (error) {\n console.error(`Failed to delete cache entry: ${request.url}`, error);\n }\n }\n};\n\n/**\n * Core implementation for text embedding using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\n\nexport const HFT_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskExecuteInput,\n TextEmbeddingTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateEmbedding: FeatureExtractionPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n // Generate the embedding\n const hfVector = await generateEmbedding(input.text, {\n pooling: \"mean\",\n normalize: model?.provider_config.normalize,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n // Validate the embedding dimensions\n if (hfVector.size !== model?.provider_config.nativeDimensions) {\n console.warn(\n `HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${model?.provider_config.nativeDimensions}`,\n input,\n hfVector\n );\n throw new Error(\n `HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${model?.provider_config.nativeDimensions}`\n );\n }\n\n return { vector: hfVector.data as TypedArray };\n};\n\nexport const HFT_TextClassification: AiProviderRunFn<\n TextClassificationTaskExecuteInput,\n TextClassificationTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.provider_config?.pipeline === \"zero-shot-classification\") {\n if (\n !input.candidateLabels ||\n !Array.isArray(input.candidateLabels) ||\n input.candidateLabels.length === 0\n ) {\n throw new Error(\"Zero-shot text classification requires candidate labels\");\n }\n\n const zeroShotClassifier: ZeroShotClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {\n abort_signal: signal,\n }\n );\n const result: any = await zeroShotClassifier(input.text, input.candidateLabels as string[], {});\n\n return {\n categories: result.labels.map((label: string, idx: number) => ({\n label,\n score: result.scores[idx],\n })),\n };\n }\n\n const TextClassification: TextClassificationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const result = await TextClassification(input.text, {\n top_k: input.maxCategories || undefined,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n if (Array.isArray(result[0])) {\n return {\n categories: result[0].map((category) => ({\n label: category.label,\n score: category.score,\n })),\n };\n }\n\n return {\n categories: (result as TextClassificationOutput).map((category) => ({\n label: category.label,\n score: category.score,\n })),\n };\n};\n\nexport const HFT_TextLanguageDetection: AiProviderRunFn<\n TextLanguageDetectionTaskExecuteInput,\n TextLanguageDetectionTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const TextClassification: TextClassificationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const result = await TextClassification(input.text, {\n top_k: input.maxLanguages || undefined,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n if (Array.isArray(result[0])) {\n return {\n languages: result[0].map((category) => ({\n language: category.label,\n score: category.score,\n })),\n };\n }\n\n return {\n languages: (result as TextClassificationOutput).map((category) => ({\n language: category.label,\n score: category.score,\n })),\n };\n};\n\nexport const HFT_TextNamedEntityRecognition: AiProviderRunFn<\n TextNamedEntityRecognitionTaskExecuteInput,\n TextNamedEntityRecognitionTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const textNamedEntityRecognition: TokenClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {\n abort_signal: signal,\n }\n );\n let results = await textNamedEntityRecognition(input.text, {\n ignore_labels: input.blockList as string[] | undefined,\n ...(signal ? { abort_signal: signal } : {}),\n });\n let entities: TokenClassificationSingle[] = [];\n if (!Array.isArray(results)) {\n entities = [results];\n } else {\n entities = results as TokenClassificationSingle[];\n }\n return {\n entities: entities.map((entity) => ({\n entity: entity.entity,\n score: entity.score,\n word: entity.word,\n })),\n };\n};\n\nexport const HFT_TextFillMask: AiProviderRunFn<\n TextFillMaskTaskExecuteInput,\n TextFillMaskTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const unmasker: FillMaskPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n let results = await unmasker(input.text);\n let predictions: FillMaskSingle[] = [];\n if (!Array.isArray(results)) {\n predictions = [results];\n } else {\n predictions = results as FillMaskSingle[];\n }\n return {\n predictions: predictions.map((prediction) => ({\n entity: prediction.token_str,\n score: prediction.score,\n sequence: prediction.sequence,\n })),\n };\n};\n\n/**\n * Core implementation for text generation using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextGeneration: AiProviderRunFn<\n TextGenerationTaskExecuteInput,\n TextGenerationTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateText: TextGenerationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n const streamer = createTextStreamer(generateText.tokenizer, onProgress, signal);\n\n let results = await generateText(input.prompt, {\n streamer,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n if (!Array.isArray(results)) {\n results = [results];\n }\n let text = (results[0] as TextGenerationSingle)?.generated_text;\n\n if (Array.isArray(text)) {\n text = text[text.length - 1]?.content;\n }\n return {\n text,\n };\n};\n\n/**\n * Core implementation for text translation using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextTranslation: AiProviderRunFn<\n TextTranslationTaskExecuteInput,\n TextTranslationTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const translate: TranslationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const streamer = createTextStreamer(translate.tokenizer, onProgress);\n\n const result = await translate(input.text, {\n src_lang: input.source_lang,\n tgt_lang: input.target_lang,\n streamer,\n ...(signal ? { abort_signal: signal } : {}),\n } as any);\n\n let translatedText: string | string[] = \"\";\n if (Array.isArray(result)) {\n translatedText = result.map((r) => (r as TranslationSingle)?.translation_text || \"\");\n } else {\n translatedText = (result as TranslationSingle)?.translation_text || \"\";\n }\n\n return {\n text: translatedText,\n target_lang: input.target_lang,\n };\n};\n\n/**\n * Core implementation for text rewriting using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextRewriter: AiProviderRunFn<\n TextRewriterTaskExecuteInput,\n TextRewriterTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateText: TextGenerationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const streamer = createTextStreamer(generateText.tokenizer, onProgress);\n\n // This lib doesn't support this kind of rewriting with a separate prompt vs text\n const promptedText = (input.prompt ? input.prompt + \"\\n\" : \"\") + input.text;\n\n let results = await generateText(promptedText, {\n streamer,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n if (!Array.isArray(results)) {\n results = [results];\n }\n\n let text = (results[0] as TextGenerationSingle)?.generated_text;\n if (Array.isArray(text)) {\n text = text[text.length - 1]?.content;\n }\n\n if (text === promptedText) {\n throw new Error(\"Rewriter failed to generate new text\");\n }\n\n return {\n text,\n };\n};\n\n/**\n * Core implementation for text summarization using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextSummary: AiProviderRunFn<\n TextSummaryTaskExecuteInput,\n TextSummaryTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const generateSummary: SummarizationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const streamer = createTextStreamer(generateSummary.tokenizer, onProgress);\n\n let result = await generateSummary(input.text, {\n streamer,\n ...(signal ? { abort_signal: signal } : {}),\n } as any);\n\n let summaryText = \"\";\n if (Array.isArray(result)) {\n summaryText = (result[0] as SummarizationSingle)?.summary_text || \"\";\n } else {\n summaryText = (result as SummarizationSingle)?.summary_text || \"\";\n }\n\n return {\n text: summaryText,\n };\n};\n\n/**\n * Core implementation for question answering using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextQuestionAnswer: AiProviderRunFn<\n TextQuestionAnswerTaskExecuteInput,\n TextQuestionAnswerTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n // Get the question answering pipeline\n const generateAnswer: QuestionAnsweringPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const streamer = createTextStreamer(generateAnswer.tokenizer, onProgress);\n\n const result = await generateAnswer(input.question, input.context, {\n streamer,\n ...(signal ? { abort_signal: signal } : {}),\n } as any);\n\n let answerText = \"\";\n if (Array.isArray(result)) {\n answerText = (result[0] as DocumentQuestionAnsweringSingle)?.answer || \"\";\n } else {\n answerText = (result as DocumentQuestionAnsweringSingle)?.answer || \"\";\n }\n\n return {\n text: answerText,\n };\n};\n\n/**\n * Core implementation for image segmentation using Hugging Face Transformers.\n */\nexport const HFT_ImageSegmentation: AiProviderRunFn<\n ImageSegmentationTaskExecuteInput,\n ImageSegmentationTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const segmenter: ImageSegmentationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n const result = await segmenter(input.image as any, {\n threshold: input.threshold,\n mask_threshold: input.maskThreshold,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n const masks = Array.isArray(result) ? result : [result];\n\n const processedMasks = await Promise.all(\n masks.map(async (mask) => ({\n label: mask.label || \"\",\n score: mask.score || 0,\n mask: {} as { [x: string]: unknown },\n }))\n );\n\n return {\n masks: processedMasks,\n };\n};\n\n/**\n * Core implementation for image to text using Hugging Face Transformers.\n */\nexport const HFT_ImageToText: AiProviderRunFn<\n ImageToTextTaskExecuteInput,\n ImageToTextTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const captioner: ImageToTextPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n const result: any = await captioner(input.image as string, {\n max_new_tokens: input.maxTokens,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n const text = Array.isArray(result) ? result[0]?.generated_text : result?.generated_text;\n\n return {\n text: text || \"\",\n };\n};\n\n/**\n * Core implementation for background removal using Hugging Face Transformers.\n */\nexport const HFT_BackgroundRemoval: AiProviderRunFn<\n BackgroundRemovalTaskExecuteInput,\n BackgroundRemovalTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const remover: BackgroundRemovalPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n const result = await remover(input.image as string, {\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n const resultImage = Array.isArray(result) ? result[0] : result;\n\n return {\n image: imageToBase64(resultImage),\n };\n};\n\n/**\n * Core implementation for image embedding using Hugging Face Transformers.\n */\nexport const HFT_ImageEmbedding: AiProviderRunFn<\n ImageEmbeddingTaskExecuteInput,\n ImageEmbeddingTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const embedder: ImageFeatureExtractionPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n\n const result: any = await embedder(input.image as string);\n\n return {\n vector: result.data as TypedArray,\n };\n};\n\n/**\n * Core implementation for image classification using Hugging Face Transformers.\n * Auto-selects between regular and zero-shot classification.\n */\nexport const HFT_ImageClassification: AiProviderRunFn<\n ImageClassificationTaskExecuteInput,\n ImageClassificationTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.provider_config?.pipeline === \"zero-shot-image-classification\") {\n if (!input.categories || !Array.isArray(input.categories) || input.categories.length === 0) {\n console.warn(\"Zero-shot image classification requires categories\", input);\n throw new Error(\"Zero-shot image classification requires categories\");\n }\n const zeroShotClassifier: ZeroShotImageClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {\n abort_signal: signal,\n }\n );\n const result: any = await zeroShotClassifier(\n input.image as string,\n input.categories! as string[],\n {}\n );\n\n const results = Array.isArray(result) ? result : [result];\n\n return {\n categories: results.map((r: any) => ({\n label: r.label,\n score: r.score,\n })),\n };\n }\n\n const classifier: ImageClassificationPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const result: any = await classifier(input.image as string, {\n top_k: (input as any).maxCategories,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n const results = Array.isArray(result) ? result : [result];\n\n return {\n categories: results.map((r: any) => ({\n label: r.label,\n score: r.score,\n })),\n };\n};\n\n/**\n * Core implementation for object detection using Hugging Face Transformers.\n * Auto-selects between regular and zero-shot detection.\n */\nexport const HFT_ObjectDetection: AiProviderRunFn<\n ObjectDetectionTaskExecuteInput,\n ObjectDetectionTaskExecuteOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.provider_config?.pipeline === \"zero-shot-object-detection\") {\n if (!input.labels || !Array.isArray(input.labels) || input.labels.length === 0) {\n throw new Error(\"Zero-shot object detection requires labels\");\n }\n const zeroShotDetector: ZeroShotObjectDetectionPipeline = await getPipeline(\n model!,\n onProgress,\n {\n abort_signal: signal,\n }\n );\n const result: any = await zeroShotDetector(input.image as string, Array.from(input.labels!), {\n threshold: (input as any).threshold,\n });\n\n const detections = Array.isArray(result) ? result : [result];\n\n return {\n detections: detections.map((d: any) => ({\n label: d.label,\n score: d.score,\n box: d.box,\n })),\n };\n }\n\n const detector: ObjectDetectionPipeline = await getPipeline(model!, onProgress, {\n abort_signal: signal,\n });\n const result: any = await detector(input.image as string, {\n threshold: (input as any).threshold,\n ...(signal ? { abort_signal: signal } : {}),\n });\n\n const detections = Array.isArray(result) ? result : [result];\n\n return {\n detections: detections.map((d: any) => ({\n label: d.label,\n score: d.score,\n box: d.box,\n })),\n };\n};\n/**\n * Helper function to convert RawImage to base64 PNG\n */\nfunction imageToBase64(image: RawImage): string {\n // Convert RawImage to base64 PNG\n // This is a simplified version - actual implementation would use canvas or similar\n return (image as any).toBase64?.() || \"\";\n}\n\n/**\n * Create a text streamer for a given tokenizer and update progress function\n * @param tokenizer - The tokenizer to use for the streamer\n * @param updateProgress - The function to call to update the progress\n * @param signal - The signal to use for the streamer for aborting\n * @returns The text streamer\n */\nfunction createTextStreamer(\n tokenizer: any,\n updateProgress: (progress: number, message?: string, details?: any) => void,\n signal?: AbortSignal\n) {\n let count = 0;\n return new TextStreamer(tokenizer, {\n skip_prompt: true,\n decode_kwargs: { skip_special_tokens: true },\n callback_function: (text: string) => {\n count++;\n const result = 100 * (1 - Math.exp(-0.05 * count));\n const progress = Math.round(Math.min(result, 100));\n updateProgress(progress, \"Generating\", { text, progress });\n },\n ...(signal ? { abort_signal: signal } : {}),\n });\n}\n",
7
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ModelConfigSchema, ModelRecordSchema } from \"@workglow/ai\";\nimport { DataPortSchemaObject, FromSchema } from \"@workglow/util\";\nimport { HF_TRANSFORMERS_ONNX, PipelineUseCase, QuantizationDataType } from \"./HFT_Constants\";\n\nexport const HfTransformersOnnxModelSchema = {\n type: \"object\",\n properties: {\n provider: {\n const: HF_TRANSFORMERS_ONNX,\n description: \"Discriminator: ONNX runtime backend.\",\n },\n provider_config: {\n type: \"object\",\n description: \"ONNX runtime-specific options.\",\n properties: {\n pipeline: {\n type: \"string\",\n enum: Object.values(PipelineUseCase),\n description: \"Pipeline type for the ONNX model.\",\n default: \"text-generation\",\n },\n modelPath: {\n type: \"string\",\n description: \"Filesystem path or URI for the ONNX model.\",\n },\n dType: {\n type: \"string\",\n enum: Object.values(QuantizationDataType),\n description: \"Data type for the ONNX model.\",\n default: \"auto\",\n },\n device: {\n type: \"string\",\n enum: [\"cpu\", \"gpu\", \"webgpu\", \"wasm\", \"metal\"],\n description: \"High-level device selection.\",\n default: \"webgpu\",\n },\n executionProviders: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Raw ONNX Runtime execution provider identifiers.\",\n \"x-ui-hidden\": true,\n },\n intraOpNumThreads: {\n type: \"integer\",\n minimum: 1,\n },\n interOpNumThreads: {\n type: \"integer\",\n minimum: 1,\n },\n useExternalDataFormat: {\n type: \"boolean\",\n description: \"Whether the model uses external data format.\",\n },\n nativeDimensions: {\n type: \"integer\",\n description: \"The native dimensions of the model.\",\n },\n normalize: {\n type: \"boolean\",\n description: \"Whether the model uses normalization.\",\n },\n languageStyle: {\n type: \"string\",\n description: \"The language style of the model.\",\n },\n },\n required: [\"modelPath\", \"pipeline\"],\n additionalProperties: false,\n if: {\n properties: {\n pipeline: {\n const: \"feature-extraction\",\n },\n },\n },\n then: {\n required: [\"nativeDimensions\"],\n },\n },\n },\n required: [\"provider\", \"provider_config\"],\n additionalProperties: true,\n} as const satisfies DataPortSchemaObject;\n\nexport const HfTransformersOnnxModelRecordSchema = {\n type: \"object\",\n properties: {\n ...ModelRecordSchema.properties,\n ...HfTransformersOnnxModelSchema.properties,\n },\n required: [...ModelRecordSchema.required, ...HfTransformersOnnxModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type HfTransformersOnnxModelRecord = FromSchema<typeof HfTransformersOnnxModelRecordSchema>;\n\nexport const HfTransformersOnnxModelConfigSchema = {\n type: \"object\",\n properties: {\n ...ModelConfigSchema.properties,\n ...HfTransformersOnnxModelSchema.properties,\n },\n required: [...ModelConfigSchema.required, ...HfTransformersOnnxModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type HfTransformersOnnxModelConfig = FromSchema<typeof HfTransformersOnnxModelConfigSchema>;\n",
8
8
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiJob, AiJobInput, getAiProviderRegistry } from \"@workglow/ai\";\nimport { ConcurrencyLimiter, JobQueueClient, JobQueueServer } from \"@workglow/job-queue\";\nimport { InMemoryQueueStorage } from \"@workglow/storage\";\nimport { getTaskQueueRegistry, TaskInput, TaskOutput } from \"@workglow/task-graph\";\nimport { globalServiceRegistry, WORKER_MANAGER } from \"@workglow/util\";\nimport { HF_TRANSFORMERS_ONNX } from \"../common/HFT_Constants\";\n\n/**\n * Registers the HuggingFace Transformers client job functions with a web worker.\n * If no client is provided, creates a default in-memory queue and registers it.\n *\n * @param worker - The web worker to use for job execution\n * @param client - Optional existing JobQueueClient. If not provided, creates a default in-memory queue.\n */\nexport async function register_HFT_ClientJobFns(\n worker: Worker,\n client?: JobQueueClient<AiJobInput<TaskInput>, TaskOutput>\n): Promise<void> {\n const workerManager = globalServiceRegistry.get(WORKER_MANAGER);\n\n workerManager.registerWorker(HF_TRANSFORMERS_ONNX, worker);\n\n const ProviderRegistry = getAiProviderRegistry();\n const names = [\n \"DownloadModelTask\",\n \"UnloadModelTask\",\n \"TextEmbeddingTask\",\n \"TextLanguageDetectionTask\",\n \"TextClassificationTask\",\n \"TextFillMaskTask\",\n \"TextNamedEntityRecognitionTask\",\n \"TextGenerationTask\",\n \"TextTranslationTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"TextQuestionAnswerTask\",\n \"ImageSegmentationTask\",\n \"ImageToTextTask\",\n \"BackgroundRemovalTask\",\n \"ImageEmbeddingTask\",\n \"ImageClassificationTask\",\n \"ObjectDetectionTask\",\n ];\n for (const name of names) {\n ProviderRegistry.registerAsWorkerRunFn(HF_TRANSFORMERS_ONNX, name);\n }\n // If no client provided, create a default in-memory queue\n if (!client) {\n const storage = new InMemoryQueueStorage<AiJobInput<TaskInput>, TaskOutput>(\n HF_TRANSFORMERS_ONNX\n );\n\n const server = new JobQueueServer<AiJobInput<TaskInput>, TaskOutput>(AiJob, {\n storage,\n queueName: HF_TRANSFORMERS_ONNX,\n limiter: new ConcurrencyLimiter(1, 100),\n });\n\n client = new JobQueueClient<AiJobInput<TaskInput>, TaskOutput>({\n storage,\n queueName: HF_TRANSFORMERS_ONNX,\n });\n\n client.attach(server);\n\n getTaskQueueRegistry().registerQueue({ server, client, storage });\n // await server.start();\n }\n}\n",
9
9
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { env } from \"@sroussey/transformers\";\nimport { AiJob, AiJobInput, AiProviderRunFn, getAiProviderRegistry } from \"@workglow/ai\";\nimport { ConcurrencyLimiter, JobQueueClient, JobQueueServer } from \"@workglow/job-queue\";\nimport { InMemoryQueueStorage } from \"@workglow/storage\";\nimport { getTaskQueueRegistry, TaskInput, TaskOutput } from \"@workglow/task-graph\";\nimport { HF_TRANSFORMERS_ONNX } from \"../common/HFT_Constants\";\nimport {\n HFT_BackgroundRemoval,\n HFT_Download,\n HFT_ImageClassification,\n HFT_ImageEmbedding,\n HFT_ImageSegmentation,\n HFT_ImageToText,\n HFT_ObjectDetection,\n HFT_TextClassification,\n HFT_TextEmbedding,\n HFT_TextFillMask,\n HFT_TextGeneration,\n HFT_TextLanguageDetection,\n HFT_TextNamedEntityRecognition,\n HFT_TextQuestionAnswer,\n HFT_TextRewriter,\n HFT_TextSummary,\n HFT_TextTranslation,\n HFT_Unload,\n} from \"../common/HFT_JobRunFns\";\n\n/**\n * Registers the HuggingFace Transformers inline job functions for same-thread execution.\n * If no client is provided, creates a default in-memory queue and registers it.\n *\n * @param client - Optional existing JobQueueClient. If not provided, creates a default in-memory queue.\n */\nexport async function register_HFT_InlineJobFns(\n client?: JobQueueClient<AiJobInput<TaskInput>, TaskOutput>\n): Promise<void> {\n // @ts-ignore\n env.backends.onnx.wasm.proxy = true;\n const ProviderRegistry = getAiProviderRegistry();\n const fns: Record<string, AiProviderRunFn<any, any, any>> = {\n [\"DownloadModelTask\"]: HFT_Download,\n [\"UnloadModelTask\"]: HFT_Unload,\n [\"TextEmbeddingTask\"]: HFT_TextEmbedding,\n [\"TextGenerationTask\"]: HFT_TextGeneration,\n [\"TextQuestionAnswerTask\"]: HFT_TextQuestionAnswer,\n [\"TextLanguageDetectionTask\"]: HFT_TextLanguageDetection,\n [\"TextClassificationTask\"]: HFT_TextClassification,\n [\"TextFillMaskTask\"]: HFT_TextFillMask,\n [\"TextNamedEntityRecognitionTask\"]: HFT_TextNamedEntityRecognition,\n [\"TextRewriterTask\"]: HFT_TextRewriter,\n [\"TextSummaryTask\"]: HFT_TextSummary,\n [\"TextTranslationTask\"]: HFT_TextTranslation,\n [\"ImageSegmentationTask\"]: HFT_ImageSegmentation,\n [\"ImageToTextTask\"]: HFT_ImageToText,\n [\"BackgroundRemovalTask\"]: HFT_BackgroundRemoval,\n [\"ImageEmbeddingTask\"]: HFT_ImageEmbedding,\n [\"ImageClassificationTask\"]: HFT_ImageClassification,\n [\"ObjectDetectionTask\"]: HFT_ObjectDetection,\n };\n for (const [jobName, fn] of Object.entries(fns)) {\n ProviderRegistry.registerRunFn<any, any>(HF_TRANSFORMERS_ONNX, jobName, fn);\n }\n\n // If no client provided, create a default in-memory queue\n if (!client) {\n const storage = new InMemoryQueueStorage<AiJobInput<TaskInput>, TaskOutput>(\n HF_TRANSFORMERS_ONNX\n );\n await storage.setupDatabase();\n\n const server = new JobQueueServer<AiJobInput<TaskInput>, TaskOutput>(AiJob, {\n storage,\n queueName: HF_TRANSFORMERS_ONNX,\n limiter: new ConcurrencyLimiter(1, 100),\n });\n\n client = new JobQueueClient<AiJobInput<TaskInput>, TaskOutput>({\n storage,\n queueName: HF_TRANSFORMERS_ONNX,\n });\n\n client.attach(server);\n\n getTaskQueueRegistry().registerQueue({ server, client, storage });\n await server.start();\n }\n}\n",
10
10
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n createServiceToken,\n globalServiceRegistry,\n parentPort,\n WORKER_SERVER,\n} from \"@workglow/util\";\nimport {\n HFT_BackgroundRemoval,\n HFT_Download,\n HFT_ImageClassification,\n HFT_ImageEmbedding,\n HFT_ImageSegmentation,\n HFT_ImageToText,\n HFT_ObjectDetection,\n HFT_TextClassification,\n HFT_TextEmbedding,\n HFT_TextFillMask,\n HFT_TextGeneration,\n HFT_TextLanguageDetection,\n HFT_TextNamedEntityRecognition,\n HFT_TextQuestionAnswer,\n HFT_TextRewriter,\n HFT_TextSummary,\n HFT_TextTranslation,\n HFT_Unload,\n} from \"../common/HFT_JobRunFns\";\n\nexport const HFT_WORKER_JOBRUN = createServiceToken(\"worker.ai-provider.hft\");\n\nexport const HFT_WORKER_JOBRUN_REGISTER = globalServiceRegistry.register(\n HFT_WORKER_JOBRUN,\n () => {\n const workerServer = globalServiceRegistry.get(WORKER_SERVER);\n workerServer.registerFunction(\"DownloadModelTask\", HFT_Download);\n workerServer.registerFunction(\"UnloadModelTask\", HFT_Unload);\n workerServer.registerFunction(\"TextEmbeddingTask\", HFT_TextEmbedding);\n workerServer.registerFunction(\"TextGenerationTask\", HFT_TextGeneration);\n workerServer.registerFunction(\"TextLanguageDetectionTask\", HFT_TextLanguageDetection);\n workerServer.registerFunction(\"TextClassificationTask\", HFT_TextClassification);\n workerServer.registerFunction(\"TextFillMaskTask\", HFT_TextFillMask);\n workerServer.registerFunction(\"TextNamedEntityRecognitionTask\", HFT_TextNamedEntityRecognition);\n workerServer.registerFunction(\"TextTranslationTask\", HFT_TextTranslation);\n workerServer.registerFunction(\"TextRewriterTask\", HFT_TextRewriter);\n workerServer.registerFunction(\"TextSummaryTask\", HFT_TextSummary);\n workerServer.registerFunction(\"TextQuestionAnswerTask\", HFT_TextQuestionAnswer);\n workerServer.registerFunction(\"ImageSegmentationTask\", HFT_ImageSegmentation);\n workerServer.registerFunction(\"ImageToTextTask\", HFT_ImageToText);\n workerServer.registerFunction(\"BackgroundRemovalTask\", HFT_BackgroundRemoval);\n workerServer.registerFunction(\"ImageEmbeddingTask\", HFT_ImageEmbedding);\n workerServer.registerFunction(\"ImageClassificationTask\", HFT_ImageClassification);\n workerServer.registerFunction(\"ObjectDetectionTask\", HFT_ObjectDetection);\n parentPort.postMessage({ type: \"ready\" });\n console.log(\"HFT_WORKER_JOBRUN registered\");\n return workerServer;\n },\n true\n);\n",
11
11
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const TENSORFLOW_MEDIAPIPE = \"TENSORFLOW_MEDIAPIPE\";\n\nexport type TextPipelineTask =\n | \"text-embedder\"\n | \"text-classifier\"\n | \"text-language-detector\"\n | \"genai-text\"\n | \"audio-classifier\"\n | \"audio-embedder\"\n | \"vision-face-detector\"\n | \"vision-face-landmarker\"\n | \"vision-face-stylizer\"\n | \"vision-gesture-recognizer\"\n | \"vision-hand-landmarker\"\n | \"vision-holistic-landmarker\"\n | \"vision-image-classifier\"\n | \"vision-image-embedder\"\n | \"vision-image-segmenter\"\n | \"vision-image-interactive-segmenter\"\n | \"vision-object-detector\"\n | \"vision-pose-landmarker\";\n\nexport const TextPipelineTask = {\n \"text-embedder\": \"text-embedder\",\n \"text-classifier\": \"text-classifier\",\n \"text-language-detector\": \"text-language-detector\",\n \"genai-text\": \"genai-text\",\n \"audio-classifier\": \"audio-classifier\",\n \"audio-embedder\": \"audio-embedder\",\n \"vision-face-detector\": \"vision-face-detector\",\n \"vision-face-landmarker\": \"vision-face-landmarker\",\n \"vision-face-stylizer\": \"vision-face-stylizer\",\n \"vision-gesture-recognizer\": \"vision-gesture-recognizer\",\n \"vision-hand-landmarker\": \"vision-hand-landmarker\",\n \"vision-holistic-landmarker\": \"vision-holistic-landmarker\",\n \"vision-image-classifier\": \"vision-image-classifier\",\n \"vision-image-embedder\": \"vision-image-embedder\",\n \"vision-image-segmenter\": \"vision-image-segmenter\",\n \"vision-image-interactive-segmenter\": \"vision-image-interactive-segmenter\",\n \"vision-object-detector\": \"vision-object-detector\",\n \"vision-pose-landmarker\": \"vision-pose-landmarker\",\n} as const satisfies Record<TextPipelineTask, TextPipelineTask>;\n",
12
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n FilesetResolver,\n LanguageDetector,\n TextClassifier,\n TextEmbedder,\n} from \"@mediapipe/tasks-text\";\nimport {\n FaceDetector,\n FaceLandmarker,\n GestureRecognizer,\n HandLandmarker,\n ImageClassifier,\n ImageEmbedder,\n ImageSegmenter,\n ObjectDetector,\n PoseLandmarker,\n} from \"@mediapipe/tasks-vision\";\nimport type {\n AiProviderRunFn,\n DownloadModelTaskExecuteInput,\n DownloadModelTaskExecuteOutput,\n FaceDetectorTaskExecuteInput,\n FaceDetectorTaskExecuteOutput,\n FaceLandmarkerTaskExecuteInput,\n FaceLandmarkerTaskExecuteOutput,\n GestureRecognizerTaskExecuteInput,\n GestureRecognizerTaskExecuteOutput,\n HandLandmarkerTaskExecuteInput,\n HandLandmarkerTaskExecuteOutput,\n ImageClassificationTaskExecuteInput,\n ImageClassificationTaskExecuteOutput,\n ImageEmbeddingTaskExecuteInput,\n ImageEmbeddingTaskExecuteOutput,\n ImageSegmentationTaskExecuteInput,\n ImageSegmentationTaskExecuteOutput,\n ObjectDetectionTaskExecuteInput,\n ObjectDetectionTaskExecuteOutput,\n PoseLandmarkerTaskExecuteInput,\n PoseLandmarkerTaskExecuteOutput,\n TextClassificationTaskExecuteInput,\n TextClassificationTaskExecuteOutput,\n TextEmbeddingTaskExecuteInput,\n TextEmbeddingTaskExecuteOutput,\n TextLanguageDetectionTaskExecuteInput,\n TextLanguageDetectionTaskExecuteOutput,\n UnloadModelTaskExecuteInput,\n UnloadModelTaskExecuteOutput,\n} from \"@workglow/ai\";\nimport { PermanentJobError } from \"@workglow/job-queue\";\nimport { TFMPModelConfig } from \"./TFMP_ModelSchema\";\n\ninterface TFMPWasmFileset {\n /** The path to the Wasm loader script. */\n wasmLoaderPath: string;\n /** The path to the Wasm binary. */\n wasmBinaryPath: string;\n /** The optional path to the asset loader script. */\n assetLoaderPath?: string;\n /** The optional path to the assets binary. */\n assetBinaryPath?: string;\n}\n\n/**\n * Cache for WASM filesets by task engine (text, audio, vision, genai).\n * Multiple models may share the same WASM fileset.\n */\nconst wasm_tasks = new Map<string, TFMPWasmFileset>();\n\n/**\n * Reference counts tracking how many models are using each WASM fileset.\n * When count reaches 0, the WASM fileset can be safely unloaded.\n */\nconst wasm_reference_counts = new Map<string, number>();\n\n/**\n * Helper function to get a WASM task for a model\n */\nconst getWasmTask = async (\n model: TFMPModelConfig,\n onProgress: (progress: number, message?: string, details?: any) => void,\n signal: AbortSignal\n): Promise<TFMPWasmFileset> => {\n const taskEngine = model.providerConfig.taskEngine;\n\n if (wasm_tasks.has(taskEngine)) {\n return wasm_tasks.get(taskEngine)!;\n }\n\n if (signal.aborted) {\n throw new PermanentJobError(\"Aborted job\");\n }\n\n onProgress(0.1, \"Loading WASM task\");\n\n let wasmFileset: TFMPWasmFileset;\n\n switch (taskEngine) {\n case \"text\":\n wasmFileset = await FilesetResolver.forTextTasks(\n \"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-text@latest/wasm\"\n );\n break;\n case \"audio\":\n wasmFileset = await FilesetResolver.forAudioTasks(\n \"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-audio@latest/wasm\"\n );\n break;\n case \"vision\":\n wasmFileset = await FilesetResolver.forVisionTasks(\n \"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm\"\n );\n break;\n case \"genai\":\n wasmFileset = await FilesetResolver.forGenAiTasks(\n \"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm\"\n );\n break;\n default:\n throw new PermanentJobError(\"Invalid task engine\");\n }\n\n wasm_tasks.set(taskEngine, wasmFileset);\n return wasmFileset;\n};\n\ntype TaskType =\n | typeof TextEmbedder\n | typeof TextClassifier\n | typeof LanguageDetector\n | typeof ImageClassifier\n | typeof ImageEmbedder\n | typeof ImageSegmenter\n | typeof ObjectDetector\n | typeof GestureRecognizer\n | typeof HandLandmarker\n | typeof FaceDetector\n | typeof FaceLandmarker\n | typeof PoseLandmarker;\n\ntype TaskInstance =\n | TextEmbedder\n | TextClassifier\n | LanguageDetector\n | ImageClassifier\n | ImageEmbedder\n | ImageSegmenter\n | ObjectDetector\n | GestureRecognizer\n | HandLandmarker\n | FaceDetector\n | FaceLandmarker\n | PoseLandmarker;\n\ninterface CachedModelTask {\n readonly task: TaskInstance;\n readonly options: Record<string, unknown>;\n readonly taskEngine: string;\n}\n\nconst modelTaskCache = new Map<string, CachedModelTask[]>();\n\ntype InferTaskInstance<T> = T extends typeof TextEmbedder\n ? TextEmbedder\n : T extends typeof TextClassifier\n ? TextClassifier\n : T extends typeof LanguageDetector\n ? LanguageDetector\n : T extends typeof ImageClassifier\n ? ImageClassifier\n : T extends typeof ImageEmbedder\n ? ImageEmbedder\n : T extends typeof ImageSegmenter\n ? ImageSegmenter\n : T extends typeof ObjectDetector\n ? ObjectDetector\n : T extends typeof GestureRecognizer\n ? GestureRecognizer\n : T extends typeof HandLandmarker\n ? HandLandmarker\n : T extends typeof FaceDetector\n ? FaceDetector\n : T extends typeof FaceLandmarker\n ? FaceLandmarker\n : T extends typeof PoseLandmarker\n ? PoseLandmarker\n : never;\n\n/**\n * Checks if two option objects are deeply equal.\n */\nconst optionsMatch = (opts1: Record<string, unknown>, opts2: Record<string, unknown>): boolean => {\n const keys1 = Object.keys(opts1).sort();\n const keys2 = Object.keys(opts2).sort();\n\n if (keys1.length !== keys2.length) return false;\n\n return keys1.every((key) => {\n const val1 = opts1[key];\n const val2 = opts2[key];\n\n if (Array.isArray(val1) && Array.isArray(val2)) {\n return JSON.stringify(val1) === JSON.stringify(val2);\n }\n\n return val1 === val2;\n });\n};\n\nconst getModelTask = async <T extends TaskType>(\n model: TFMPModelConfig,\n options: Record<string, unknown>,\n onProgress: (progress: number, message?: string, details?: any) => void,\n signal: AbortSignal,\n TaskType: T\n): Promise<InferTaskInstance<T>> => {\n const modelPath = model.providerConfig.modelPath;\n const taskEngine = model.providerConfig.taskEngine;\n\n // Check if we have a cached instance with matching options\n const cachedTasks = modelTaskCache.get(modelPath);\n if (cachedTasks) {\n const matchedTask = cachedTasks.find((cached) => optionsMatch(cached.options, options));\n if (matchedTask) {\n return matchedTask.task as InferTaskInstance<T>;\n }\n }\n\n // Load WASM if needed\n const wasmFileset = await getWasmTask(model, onProgress, signal);\n\n onProgress(0.2, \"Creating model task\");\n\n // Create new model instance\n const task = await TaskType.createFromOptions(wasmFileset, {\n baseOptions: {\n modelAssetPath: modelPath,\n },\n ...options,\n });\n\n // Cache the task with its options and task engine\n const cachedTask: CachedModelTask = { task, options, taskEngine };\n if (!modelTaskCache.has(modelPath)) {\n modelTaskCache.set(modelPath, []);\n }\n modelTaskCache.get(modelPath)!.push(cachedTask);\n\n // Increment WASM reference count for this cached task\n wasm_reference_counts.set(taskEngine, (wasm_reference_counts.get(taskEngine) || 0) + 1);\n\n return task as any;\n};\n\n/**\n * Core implementation for downloading and caching a MediaPipe TFJS model.\n * This is shared between inline and worker implementations.\n */\nexport const TFMP_Download: AiProviderRunFn<\n DownloadModelTaskExecuteInput,\n DownloadModelTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n let task: TaskInstance;\n switch (model?.providerConfig.pipeline) {\n // Text pipelines\n case \"text-embedder\":\n task = await getModelTask(model, {}, onProgress, signal, TextEmbedder);\n break;\n case \"text-classifier\":\n task = await getModelTask(model, {}, onProgress, signal, TextClassifier);\n break;\n case \"text-language-detector\":\n task = await getModelTask(model, {}, onProgress, signal, LanguageDetector);\n break;\n // Vision pipelines\n case \"vision-image-classifier\":\n task = await getModelTask(model, {}, onProgress, signal, ImageClassifier);\n break;\n case \"vision-image-embedder\":\n task = await getModelTask(model, {}, onProgress, signal, ImageEmbedder);\n break;\n case \"vision-image-segmenter\":\n task = await getModelTask(model, {}, onProgress, signal, ImageSegmenter);\n break;\n case \"vision-object-detector\":\n task = await getModelTask(model, {}, onProgress, signal, ObjectDetector);\n break;\n case \"vision-face-detector\":\n task = await getModelTask(model, {}, onProgress, signal, FaceDetector);\n break;\n case \"vision-face-landmarker\":\n task = await getModelTask(model, {}, onProgress, signal, FaceLandmarker);\n break;\n case \"vision-gesture-recognizer\":\n task = await getModelTask(model, {}, onProgress, signal, GestureRecognizer);\n break;\n case \"vision-hand-landmarker\":\n task = await getModelTask(model, {}, onProgress, signal, HandLandmarker);\n break;\n case \"vision-pose-landmarker\":\n task = await getModelTask(model, {}, onProgress, signal, PoseLandmarker);\n break;\n default:\n throw new PermanentJobError(\n `Invalid pipeline: ${model?.providerConfig.pipeline}. Supported pipelines: text-embedder, text-classifier, text-language-detector, vision-image-classifier, vision-image-embedder, vision-image-segmenter, vision-object-detector, vision-face-detector, vision-face-landmarker, vision-gesture-recognizer, vision-hand-landmarker, vision-pose-landmarker`\n );\n }\n onProgress(0.9, \"Pipeline loaded\");\n task.close(); // Close the task to release the resources, but it is still in the browser cache\n // Decrease reference count for WASM fileset for this cached task since this is a fake model cache entry\n const taskEngine = model?.providerConfig.taskEngine;\n wasm_reference_counts.set(taskEngine, wasm_reference_counts.get(taskEngine)! - 1);\n\n return {\n model: input.model,\n };\n};\n\n/**\n * Core implementation for text embedding using MediaPipe TFJS.\n * This is shared between inline and worker implementations.\n */\nexport const TFMP_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskExecuteInput,\n TextEmbeddingTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const textEmbedder = await getModelTask(model!, {}, onProgress, signal, TextEmbedder);\n const result = textEmbedder.embed(input.text);\n\n if (!result.embeddings?.[0]?.floatEmbedding) {\n throw new PermanentJobError(\"Failed to generate embedding: Empty result\");\n }\n\n const embedding = Float32Array.from(result.embeddings[0].floatEmbedding);\n\n return {\n vector: embedding,\n };\n};\n\n/**\n * Core implementation for text classification using MediaPipe TFJS.\n * This is shared between inline and worker implementations.\n */\nexport const TFMP_TextClassification: AiProviderRunFn<\n TextClassificationTaskExecuteInput,\n TextClassificationTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const TextClassification = await getModelTask(\n model!,\n {\n maxCategories: input.maxCategories,\n // scoreThreshold: input.scoreThreshold,\n // allowList: input.allowList,\n // blockList: input.blockList,\n },\n onProgress,\n signal,\n TextClassifier\n );\n const result = TextClassification.classify(input.text);\n\n if (!result.classifications?.[0]?.categories) {\n throw new PermanentJobError(\"Failed to classify text: Empty result\");\n }\n\n const categories = result.classifications[0].categories.map((category) => ({\n label: category.categoryName,\n score: category.score,\n }));\n\n return {\n categories,\n };\n};\n\n/**\n * Core implementation for language detection using MediaPipe TFJS.\n * This is shared between inline and worker implementations.\n */\nexport const TFMP_TextLanguageDetection: AiProviderRunFn<\n TextLanguageDetectionTaskExecuteInput,\n TextLanguageDetectionTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const maxLanguages = input.maxLanguages === 0 ? -1 : input.maxLanguages;\n\n const textLanguageDetector = await getModelTask(\n model!,\n {\n maxLanguages,\n // scoreThreshold: input.scoreThreshold,\n // allowList: input.allowList,\n // blockList: input.blockList,\n },\n onProgress,\n signal,\n LanguageDetector\n );\n const result = textLanguageDetector.detect(input.text);\n\n if (!result.languages?.[0]?.languageCode) {\n throw new PermanentJobError(\"Failed to detect language: Empty result\");\n }\n\n const languages = result.languages.map((language) => ({\n language: language.languageCode,\n score: language.probability,\n }));\n\n return {\n languages,\n };\n};\n\n/**\n * Core implementation for unloading a MediaPipe TFJS model.\n * This is shared between inline and worker implementations.\n *\n * When a model is unloaded, this function:\n * 1. Disposes of all cached model instances for the given model path\n * 2. Decrements the reference count for the associated WASM fileset for each instance\n * 3. If no other models are using the WASM fileset (count reaches 0), unloads the WASM\n */\nexport const TFMP_Unload: AiProviderRunFn<\n UnloadModelTaskExecuteInput,\n UnloadModelTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const modelPath = model!.providerConfig.modelPath;\n onProgress(10, \"Unloading model\");\n // Dispose of all cached model tasks if they exist\n if (modelTaskCache.has(modelPath)) {\n const cachedTasks = modelTaskCache.get(modelPath)!;\n\n for (const cachedTask of cachedTasks) {\n const task = cachedTask.task;\n if (\"close\" in task && typeof task.close === \"function\") task.close();\n\n // Decrease reference count for WASM fileset for this cached task\n const taskEngine = cachedTask.taskEngine;\n const currentCount = wasm_reference_counts.get(taskEngine) || 0;\n const newCount = currentCount - 1;\n\n if (newCount <= 0) {\n // No more models using this WASM fileset, unload it\n wasm_tasks.delete(taskEngine);\n wasm_reference_counts.delete(taskEngine);\n } else {\n wasm_reference_counts.set(taskEngine, newCount);\n }\n }\n\n modelTaskCache.delete(modelPath);\n }\n\n return {\n model: input.model,\n };\n};\n\n/**\n * Core implementation for image segmentation using MediaPipe.\n */\nexport const TFMP_ImageSegmentation: AiProviderRunFn<\n ImageSegmentationTaskExecuteInput,\n ImageSegmentationTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const imageSegmenter = await getModelTask(model!, {}, onProgress, signal, ImageSegmenter);\n const result = imageSegmenter.segment(input.image as any);\n\n if (!result.categoryMask) {\n throw new PermanentJobError(\"Failed to segment image: Empty result\");\n }\n\n // MediaPipe returns a single mask, create a placeholder result\n const masks = [\n {\n label: \"segment\",\n score: 1.0,\n mask: {\n data: result.categoryMask.canvas,\n width: result.categoryMask.width,\n height: result.categoryMask.height,\n },\n },\n ];\n\n return {\n masks,\n };\n};\n\n/**\n * Core implementation for image embedding using MediaPipe.\n */\nexport const TFMP_ImageEmbedding: AiProviderRunFn<\n ImageEmbeddingTaskExecuteInput,\n ImageEmbeddingTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const imageEmbedder = await getModelTask(model!, {}, onProgress, signal, ImageEmbedder);\n const result = imageEmbedder.embed(input.image as any);\n\n if (!result.embeddings?.[0]?.floatEmbedding) {\n throw new PermanentJobError(\"Failed to generate embedding: Empty result\");\n }\n\n const embedding = Float32Array.from(result.embeddings[0].floatEmbedding);\n\n return {\n vector: embedding,\n };\n};\n\n/**\n * Core implementation for image classification using MediaPipe.\n */\nexport const TFMP_ImageClassification: AiProviderRunFn<\n ImageClassificationTaskExecuteInput,\n ImageClassificationTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const imageClassifier = await getModelTask(\n model!,\n {\n maxResults: (input as any).maxCategories,\n },\n onProgress,\n signal,\n ImageClassifier\n );\n const result = imageClassifier.classify(input.image as any);\n\n if (!result.classifications?.[0]?.categories) {\n throw new PermanentJobError(\"Failed to classify image: Empty result\");\n }\n\n const categories = result.classifications[0].categories.map((category: any) => ({\n label: category.categoryName,\n score: category.score,\n }));\n\n return {\n categories,\n };\n};\n\n/**\n * Core implementation for object detection using MediaPipe.\n */\nexport const TFMP_ObjectDetection: AiProviderRunFn<\n ObjectDetectionTaskExecuteInput,\n ObjectDetectionTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const objectDetector = await getModelTask(\n model!,\n {\n scoreThreshold: (input as any).threshold,\n },\n onProgress,\n signal,\n ObjectDetector\n );\n const result = objectDetector.detect(input.image as any);\n\n if (!result.detections) {\n throw new PermanentJobError(\"Failed to detect objects: Empty result\");\n }\n\n const detections = result.detections.map((detection: any) => ({\n label: detection.categories?.[0]?.categoryName || \"unknown\",\n score: detection.categories?.[0]?.score || 0,\n box: {\n x: detection.boundingBox?.originX || 0,\n y: detection.boundingBox?.originY || 0,\n width: detection.boundingBox?.width || 0,\n height: detection.boundingBox?.height || 0,\n },\n }));\n\n return {\n detections,\n };\n};\n\n/**\n * Core implementation for gesture recognition using MediaPipe.\n */\nexport const TFMP_GestureRecognizer: AiProviderRunFn<\n GestureRecognizerTaskExecuteInput,\n GestureRecognizerTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const gestureRecognizer = await getModelTask(\n model!,\n {\n numHands: (input as any).numHands,\n minHandDetectionConfidence: (input as any).minHandDetectionConfidence,\n minHandPresenceConfidence: (input as any).minHandPresenceConfidence,\n minTrackingConfidence: (input as any).minTrackingConfidence,\n },\n onProgress,\n signal,\n GestureRecognizer\n );\n const result = gestureRecognizer.recognize(input.image as any);\n\n if (!result.gestures || !result.landmarks) {\n throw new PermanentJobError(\"Failed to recognize gestures: Empty result\");\n }\n\n const hands = result.gestures.map((gestures: any, index: number) => ({\n gestures: gestures.map((g: any) => ({\n label: g.categoryName,\n score: g.score,\n })),\n handedness: result.handedness[index].map((h: any) => ({\n label: h.categoryName,\n score: h.score,\n })),\n landmarks: result.landmarks[index].map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n })),\n worldLandmarks: result.worldLandmarks[index].map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n })),\n }));\n\n return {\n hands,\n };\n};\n\n/**\n * Core implementation for hand landmark detection using MediaPipe.\n */\nexport const TFMP_HandLandmarker: AiProviderRunFn<\n HandLandmarkerTaskExecuteInput,\n HandLandmarkerTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const handLandmarker = await getModelTask(\n model!,\n {\n numHands: (input as any).numHands,\n minHandDetectionConfidence: (input as any).minHandDetectionConfidence,\n minHandPresenceConfidence: (input as any).minHandPresenceConfidence,\n minTrackingConfidence: (input as any).minTrackingConfidence,\n },\n onProgress,\n signal,\n HandLandmarker\n );\n const result = handLandmarker.detect(input.image as any);\n\n if (!result.landmarks) {\n throw new PermanentJobError(\"Failed to detect hand landmarks: Empty result\");\n }\n\n const hands = result.landmarks.map((landmarks: any, index: number) => ({\n handedness: result.handedness[index].map((h: any) => ({\n label: h.categoryName,\n score: h.score,\n })),\n landmarks: landmarks.map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n })),\n worldLandmarks: result.worldLandmarks[index].map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n })),\n }));\n\n return {\n hands,\n };\n};\n\n/**\n * Core implementation for face detection using MediaPipe.\n */\nexport const TFMP_FaceDetector: AiProviderRunFn<\n FaceDetectorTaskExecuteInput,\n FaceDetectorTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const faceDetector = await getModelTask(\n model!,\n {\n minDetectionConfidence: (input as any).minDetectionConfidence,\n minSuppressionThreshold: (input as any).minSuppressionThreshold,\n },\n onProgress,\n signal,\n FaceDetector\n );\n const result = faceDetector.detect(input.image as any);\n\n if (!result.detections) {\n throw new PermanentJobError(\"Failed to detect faces: Empty result\");\n }\n\n const faces = result.detections.map((detection: any) => ({\n box: {\n x: detection.boundingBox?.originX || 0,\n y: detection.boundingBox?.originY || 0,\n width: detection.boundingBox?.width || 0,\n height: detection.boundingBox?.height || 0,\n },\n keypoints:\n detection.keypoints?.map((kp: any) => ({\n x: kp.x,\n y: kp.y,\n label: kp.label,\n })) || [],\n score: detection.categories?.[0]?.score || 0,\n }));\n\n return {\n faces,\n };\n};\n\n/**\n * Core implementation for face landmark detection using MediaPipe.\n */\nexport const TFMP_FaceLandmarker: AiProviderRunFn<\n FaceLandmarkerTaskExecuteInput,\n FaceLandmarkerTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const faceLandmarker = await getModelTask(\n model!,\n {\n numFaces: (input as any).numFaces,\n minFaceDetectionConfidence: (input as any).minFaceDetectionConfidence,\n minFacePresenceConfidence: (input as any).minFacePresenceConfidence,\n minTrackingConfidence: (input as any).minTrackingConfidence,\n outputFaceBlendshapes: (input as any).outputFaceBlendshapes,\n outputFacialTransformationMatrixes: (input as any).outputFacialTransformationMatrixes,\n },\n onProgress,\n signal,\n FaceLandmarker\n );\n const result = faceLandmarker.detect(input.image as any);\n\n if (!result.faceLandmarks) {\n throw new PermanentJobError(\"Failed to detect face landmarks: Empty result\");\n }\n\n const faces = result.faceLandmarks.map((landmarks: any, index: number) => {\n const face: any = {\n landmarks: landmarks.map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n })),\n };\n\n if (result.faceBlendshapes && result.faceBlendshapes[index]) {\n face.blendshapes = result.faceBlendshapes[index].categories.map((b: any) => ({\n label: b.categoryName,\n score: b.score,\n }));\n }\n\n if (result.facialTransformationMatrixes && result.facialTransformationMatrixes[index]) {\n face.transformationMatrix = Array.from(result.facialTransformationMatrixes[index].data);\n }\n\n return face;\n });\n\n return {\n faces,\n };\n};\n\n/**\n * Core implementation for pose landmark detection using MediaPipe.\n */\nexport const TFMP_PoseLandmarker: AiProviderRunFn<\n PoseLandmarkerTaskExecuteInput,\n PoseLandmarkerTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const poseLandmarker = await getModelTask(\n model!,\n {\n numPoses: (input as any).numPoses,\n minPoseDetectionConfidence: (input as any).minPoseDetectionConfidence,\n minPosePresenceConfidence: (input as any).minPosePresenceConfidence,\n minTrackingConfidence: (input as any).minTrackingConfidence,\n outputSegmentationMasks: (input as any).outputSegmentationMasks,\n },\n onProgress,\n signal,\n PoseLandmarker\n );\n const result = poseLandmarker.detect(input.image as any);\n\n if (!result.landmarks) {\n throw new PermanentJobError(\"Failed to detect pose landmarks: Empty result\");\n }\n\n const poses = result.landmarks.map((landmarks: any, index: number) => {\n const pose: any = {\n landmarks: landmarks.map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n visibility: l.visibility,\n presence: l.presence,\n })),\n worldLandmarks: result.worldLandmarks[index].map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n visibility: l.visibility,\n presence: l.presence,\n })),\n };\n\n if (result.segmentationMasks && result.segmentationMasks[index]) {\n const mask = result.segmentationMasks[index];\n pose.segmentationMask = {\n data: mask.canvas || mask,\n width: mask.width,\n height: mask.height,\n };\n }\n\n return pose;\n });\n\n return {\n poses,\n };\n};\n",
13
- "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ModelConfigSchema, ModelRecordSchema } from \"@workglow/ai\";\nimport { DataPortSchemaObject, FromSchema } from \"@workglow/util\";\nimport { TENSORFLOW_MEDIAPIPE, TextPipelineTask } from \"../common/TFMP_Constants\";\n\nexport const TFMPModelSchema = {\n type: \"object\",\n properties: {\n provider: {\n const: TENSORFLOW_MEDIAPIPE,\n description: \"Discriminator: TensorFlow MediaPipe backend.\",\n },\n providerConfig: {\n type: \"object\",\n description: \"TensorFlow MediaPipe-specific options.\",\n properties: {\n modelPath: {\n type: \"string\",\n description: \"Filesystem path or URI for the ONNX model.\",\n },\n taskEngine: {\n type: \"string\",\n enum: [\"text\", \"audio\", \"vision\", \"genai\"],\n description: \"Task engine for the MediaPipe model.\",\n },\n pipeline: {\n type: \"string\",\n enum: Object.values(TextPipelineTask),\n description: \"Pipeline task type for the MediaPipe model.\",\n },\n },\n required: [\"modelPath\", \"taskEngine\", \"pipeline\"],\n additionalProperties: false,\n },\n },\n required: [\"provider\", \"providerConfig\"],\n additionalProperties: true,\n} as const satisfies DataPortSchemaObject;\n\nconst ExtendedModelRecordSchema = {\n type: \"object\",\n properties: {\n ...ModelRecordSchema.properties,\n ...TFMPModelSchema.properties,\n },\n required: [...ModelRecordSchema.required, ...TFMPModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type TFMPModelRecord = FromSchema<typeof ExtendedModelRecordSchema>;\n\nconst ExtendedModelConfigSchema = {\n type: \"object\",\n properties: {\n ...ModelConfigSchema.properties,\n ...TFMPModelSchema.properties,\n },\n required: [...ModelConfigSchema.required, ...TFMPModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type TFMPModelConfig = FromSchema<typeof ExtendedModelConfigSchema>;\n",
12
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n FilesetResolver,\n LanguageDetector,\n TextClassifier,\n TextEmbedder,\n} from \"@mediapipe/tasks-text\";\nimport {\n FaceDetector,\n FaceLandmarker,\n GestureRecognizer,\n HandLandmarker,\n ImageClassifier,\n ImageEmbedder,\n ImageSegmenter,\n ObjectDetector,\n PoseLandmarker,\n} from \"@mediapipe/tasks-vision\";\nimport type {\n AiProviderRunFn,\n DownloadModelTaskExecuteInput,\n DownloadModelTaskExecuteOutput,\n FaceDetectorTaskExecuteInput,\n FaceDetectorTaskExecuteOutput,\n FaceLandmarkerTaskExecuteInput,\n FaceLandmarkerTaskExecuteOutput,\n GestureRecognizerTaskExecuteInput,\n GestureRecognizerTaskExecuteOutput,\n HandLandmarkerTaskExecuteInput,\n HandLandmarkerTaskExecuteOutput,\n ImageClassificationTaskExecuteInput,\n ImageClassificationTaskExecuteOutput,\n ImageEmbeddingTaskExecuteInput,\n ImageEmbeddingTaskExecuteOutput,\n ImageSegmentationTaskExecuteInput,\n ImageSegmentationTaskExecuteOutput,\n ObjectDetectionTaskExecuteInput,\n ObjectDetectionTaskExecuteOutput,\n PoseLandmarkerTaskExecuteInput,\n PoseLandmarkerTaskExecuteOutput,\n TextClassificationTaskExecuteInput,\n TextClassificationTaskExecuteOutput,\n TextEmbeddingTaskExecuteInput,\n TextEmbeddingTaskExecuteOutput,\n TextLanguageDetectionTaskExecuteInput,\n TextLanguageDetectionTaskExecuteOutput,\n UnloadModelTaskExecuteInput,\n UnloadModelTaskExecuteOutput,\n} from \"@workglow/ai\";\nimport { PermanentJobError } from \"@workglow/job-queue\";\nimport { TFMPModelConfig } from \"./TFMP_ModelSchema\";\n\ninterface TFMPWasmFileset {\n /** The path to the Wasm loader script. */\n wasmLoaderPath: string;\n /** The path to the Wasm binary. */\n wasmBinaryPath: string;\n /** The optional path to the asset loader script. */\n assetLoaderPath?: string;\n /** The optional path to the assets binary. */\n assetBinaryPath?: string;\n}\n\n/**\n * Cache for WASM filesets by task engine (text, audio, vision, genai).\n * Multiple models may share the same WASM fileset.\n */\nconst wasm_tasks = new Map<string, TFMPWasmFileset>();\n\n/**\n * Reference counts tracking how many models are using each WASM fileset.\n * When count reaches 0, the WASM fileset can be safely unloaded.\n */\nconst wasm_reference_counts = new Map<string, number>();\n\n/**\n * Helper function to get a WASM task for a model\n */\nconst getWasmTask = async (\n model: TFMPModelConfig,\n onProgress: (progress: number, message?: string, details?: any) => void,\n signal: AbortSignal\n): Promise<TFMPWasmFileset> => {\n const taskEngine = model.provider_config.taskEngine;\n\n if (wasm_tasks.has(taskEngine)) {\n return wasm_tasks.get(taskEngine)!;\n }\n\n if (signal.aborted) {\n throw new PermanentJobError(\"Aborted job\");\n }\n\n onProgress(0.1, \"Loading WASM task\");\n\n let wasmFileset: TFMPWasmFileset;\n\n switch (taskEngine) {\n case \"text\":\n wasmFileset = await FilesetResolver.forTextTasks(\n \"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-text@latest/wasm\"\n );\n break;\n case \"audio\":\n wasmFileset = await FilesetResolver.forAudioTasks(\n \"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-audio@latest/wasm\"\n );\n break;\n case \"vision\":\n wasmFileset = await FilesetResolver.forVisionTasks(\n \"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm\"\n );\n break;\n case \"genai\":\n wasmFileset = await FilesetResolver.forGenAiTasks(\n \"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm\"\n );\n break;\n default:\n throw new PermanentJobError(\"Invalid task engine\");\n }\n\n wasm_tasks.set(taskEngine, wasmFileset);\n return wasmFileset;\n};\n\ntype TaskType =\n | typeof TextEmbedder\n | typeof TextClassifier\n | typeof LanguageDetector\n | typeof ImageClassifier\n | typeof ImageEmbedder\n | typeof ImageSegmenter\n | typeof ObjectDetector\n | typeof GestureRecognizer\n | typeof HandLandmarker\n | typeof FaceDetector\n | typeof FaceLandmarker\n | typeof PoseLandmarker;\n\ntype TaskInstance =\n | TextEmbedder\n | TextClassifier\n | LanguageDetector\n | ImageClassifier\n | ImageEmbedder\n | ImageSegmenter\n | ObjectDetector\n | GestureRecognizer\n | HandLandmarker\n | FaceDetector\n | FaceLandmarker\n | PoseLandmarker;\n\ninterface CachedModelTask {\n readonly task: TaskInstance;\n readonly options: Record<string, unknown>;\n readonly taskEngine: string;\n}\n\nconst modelTaskCache = new Map<string, CachedModelTask[]>();\n\ntype InferTaskInstance<T> = T extends typeof TextEmbedder\n ? TextEmbedder\n : T extends typeof TextClassifier\n ? TextClassifier\n : T extends typeof LanguageDetector\n ? LanguageDetector\n : T extends typeof ImageClassifier\n ? ImageClassifier\n : T extends typeof ImageEmbedder\n ? ImageEmbedder\n : T extends typeof ImageSegmenter\n ? ImageSegmenter\n : T extends typeof ObjectDetector\n ? ObjectDetector\n : T extends typeof GestureRecognizer\n ? GestureRecognizer\n : T extends typeof HandLandmarker\n ? HandLandmarker\n : T extends typeof FaceDetector\n ? FaceDetector\n : T extends typeof FaceLandmarker\n ? FaceLandmarker\n : T extends typeof PoseLandmarker\n ? PoseLandmarker\n : never;\n\n/**\n * Checks if two option objects are deeply equal.\n */\nconst optionsMatch = (opts1: Record<string, unknown>, opts2: Record<string, unknown>): boolean => {\n const keys1 = Object.keys(opts1).sort();\n const keys2 = Object.keys(opts2).sort();\n\n if (keys1.length !== keys2.length) return false;\n\n return keys1.every((key) => {\n const val1 = opts1[key];\n const val2 = opts2[key];\n\n if (Array.isArray(val1) && Array.isArray(val2)) {\n return JSON.stringify(val1) === JSON.stringify(val2);\n }\n\n return val1 === val2;\n });\n};\n\nconst getModelTask = async <T extends TaskType>(\n model: TFMPModelConfig,\n options: Record<string, unknown>,\n onProgress: (progress: number, message?: string, details?: any) => void,\n signal: AbortSignal,\n TaskType: T\n): Promise<InferTaskInstance<T>> => {\n const modelPath = model.provider_config.modelPath;\n const taskEngine = model.provider_config.taskEngine;\n\n // Check if we have a cached instance with matching options\n const cachedTasks = modelTaskCache.get(modelPath);\n if (cachedTasks) {\n const matchedTask = cachedTasks.find((cached) => optionsMatch(cached.options, options));\n if (matchedTask) {\n return matchedTask.task as InferTaskInstance<T>;\n }\n }\n\n // Load WASM if needed\n const wasmFileset = await getWasmTask(model, onProgress, signal);\n\n onProgress(0.2, \"Creating model task\");\n\n // Create new model instance\n const task = await TaskType.createFromOptions(wasmFileset, {\n baseOptions: {\n modelAssetPath: modelPath,\n },\n ...options,\n });\n\n // Cache the task with its options and task engine\n const cachedTask: CachedModelTask = { task, options, taskEngine };\n if (!modelTaskCache.has(modelPath)) {\n modelTaskCache.set(modelPath, []);\n }\n modelTaskCache.get(modelPath)!.push(cachedTask);\n\n // Increment WASM reference count for this cached task\n wasm_reference_counts.set(taskEngine, (wasm_reference_counts.get(taskEngine) || 0) + 1);\n\n return task as any;\n};\n\n/**\n * Core implementation for downloading and caching a MediaPipe TFJS model.\n * This is shared between inline and worker implementations.\n */\nexport const TFMP_Download: AiProviderRunFn<\n DownloadModelTaskExecuteInput,\n DownloadModelTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n let task: TaskInstance;\n switch (model?.provider_config.pipeline) {\n // Text pipelines\n case \"text-embedder\":\n task = await getModelTask(model, {}, onProgress, signal, TextEmbedder);\n break;\n case \"text-classifier\":\n task = await getModelTask(model, {}, onProgress, signal, TextClassifier);\n break;\n case \"text-language-detector\":\n task = await getModelTask(model, {}, onProgress, signal, LanguageDetector);\n break;\n // Vision pipelines\n case \"vision-image-classifier\":\n task = await getModelTask(model, {}, onProgress, signal, ImageClassifier);\n break;\n case \"vision-image-embedder\":\n task = await getModelTask(model, {}, onProgress, signal, ImageEmbedder);\n break;\n case \"vision-image-segmenter\":\n task = await getModelTask(model, {}, onProgress, signal, ImageSegmenter);\n break;\n case \"vision-object-detector\":\n task = await getModelTask(model, {}, onProgress, signal, ObjectDetector);\n break;\n case \"vision-face-detector\":\n task = await getModelTask(model, {}, onProgress, signal, FaceDetector);\n break;\n case \"vision-face-landmarker\":\n task = await getModelTask(model, {}, onProgress, signal, FaceLandmarker);\n break;\n case \"vision-gesture-recognizer\":\n task = await getModelTask(model, {}, onProgress, signal, GestureRecognizer);\n break;\n case \"vision-hand-landmarker\":\n task = await getModelTask(model, {}, onProgress, signal, HandLandmarker);\n break;\n case \"vision-pose-landmarker\":\n task = await getModelTask(model, {}, onProgress, signal, PoseLandmarker);\n break;\n default:\n throw new PermanentJobError(\n `Invalid pipeline: ${model?.provider_config.pipeline}. Supported pipelines: text-embedder, text-classifier, text-language-detector, vision-image-classifier, vision-image-embedder, vision-image-segmenter, vision-object-detector, vision-face-detector, vision-face-landmarker, vision-gesture-recognizer, vision-hand-landmarker, vision-pose-landmarker`\n );\n }\n onProgress(0.9, \"Pipeline loaded\");\n task.close(); // Close the task to release the resources, but it is still in the browser cache\n // Decrease reference count for WASM fileset for this cached task since this is a fake model cache entry\n const taskEngine = model?.provider_config.taskEngine;\n wasm_reference_counts.set(taskEngine, wasm_reference_counts.get(taskEngine)! - 1);\n\n return {\n model: input.model,\n };\n};\n\n/**\n * Core implementation for text embedding using MediaPipe TFJS.\n * This is shared between inline and worker implementations.\n */\nexport const TFMP_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskExecuteInput,\n TextEmbeddingTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const textEmbedder = await getModelTask(model!, {}, onProgress, signal, TextEmbedder);\n const result = textEmbedder.embed(input.text);\n\n if (!result.embeddings?.[0]?.floatEmbedding) {\n throw new PermanentJobError(\"Failed to generate embedding: Empty result\");\n }\n\n const embedding = Float32Array.from(result.embeddings[0].floatEmbedding);\n\n return {\n vector: embedding,\n };\n};\n\n/**\n * Core implementation for text classification using MediaPipe TFJS.\n * This is shared between inline and worker implementations.\n */\nexport const TFMP_TextClassification: AiProviderRunFn<\n TextClassificationTaskExecuteInput,\n TextClassificationTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const TextClassification = await getModelTask(\n model!,\n {\n maxCategories: input.maxCategories,\n // scoreThreshold: input.scoreThreshold,\n // allowList: input.allowList,\n // blockList: input.blockList,\n },\n onProgress,\n signal,\n TextClassifier\n );\n const result = TextClassification.classify(input.text);\n\n if (!result.classifications?.[0]?.categories) {\n throw new PermanentJobError(\"Failed to classify text: Empty result\");\n }\n\n const categories = result.classifications[0].categories.map((category) => ({\n label: category.categoryName,\n score: category.score,\n }));\n\n return {\n categories,\n };\n};\n\n/**\n * Core implementation for language detection using MediaPipe TFJS.\n * This is shared between inline and worker implementations.\n */\nexport const TFMP_TextLanguageDetection: AiProviderRunFn<\n TextLanguageDetectionTaskExecuteInput,\n TextLanguageDetectionTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const maxLanguages = input.maxLanguages === 0 ? -1 : input.maxLanguages;\n\n const textLanguageDetector = await getModelTask(\n model!,\n {\n maxLanguages,\n // scoreThreshold: input.scoreThreshold,\n // allowList: input.allowList,\n // blockList: input.blockList,\n },\n onProgress,\n signal,\n LanguageDetector\n );\n const result = textLanguageDetector.detect(input.text);\n\n if (!result.languages?.[0]?.languageCode) {\n throw new PermanentJobError(\"Failed to detect language: Empty result\");\n }\n\n const languages = result.languages.map((language) => ({\n language: language.languageCode,\n score: language.probability,\n }));\n\n return {\n languages,\n };\n};\n\n/**\n * Core implementation for unloading a MediaPipe TFJS model.\n * This is shared between inline and worker implementations.\n *\n * When a model is unloaded, this function:\n * 1. Disposes of all cached model instances for the given model path\n * 2. Decrements the reference count for the associated WASM fileset for each instance\n * 3. If no other models are using the WASM fileset (count reaches 0), unloads the WASM\n */\nexport const TFMP_Unload: AiProviderRunFn<\n UnloadModelTaskExecuteInput,\n UnloadModelTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const modelPath = model!.provider_config.modelPath;\n onProgress(10, \"Unloading model\");\n // Dispose of all cached model tasks if they exist\n if (modelTaskCache.has(modelPath)) {\n const cachedTasks = modelTaskCache.get(modelPath)!;\n\n for (const cachedTask of cachedTasks) {\n const task = cachedTask.task;\n if (\"close\" in task && typeof task.close === \"function\") task.close();\n\n // Decrease reference count for WASM fileset for this cached task\n const taskEngine = cachedTask.taskEngine;\n const currentCount = wasm_reference_counts.get(taskEngine) || 0;\n const newCount = currentCount - 1;\n\n if (newCount <= 0) {\n // No more models using this WASM fileset, unload it\n wasm_tasks.delete(taskEngine);\n wasm_reference_counts.delete(taskEngine);\n } else {\n wasm_reference_counts.set(taskEngine, newCount);\n }\n }\n\n modelTaskCache.delete(modelPath);\n }\n\n return {\n model: input.model,\n };\n};\n\n/**\n * Core implementation for image segmentation using MediaPipe.\n */\nexport const TFMP_ImageSegmentation: AiProviderRunFn<\n ImageSegmentationTaskExecuteInput,\n ImageSegmentationTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const imageSegmenter = await getModelTask(model!, {}, onProgress, signal, ImageSegmenter);\n const result = imageSegmenter.segment(input.image as any);\n\n if (!result.categoryMask) {\n throw new PermanentJobError(\"Failed to segment image: Empty result\");\n }\n\n // MediaPipe returns a single mask, create a placeholder result\n const masks = [\n {\n label: \"segment\",\n score: 1.0,\n mask: {\n data: result.categoryMask.canvas,\n width: result.categoryMask.width,\n height: result.categoryMask.height,\n },\n },\n ];\n\n return {\n masks,\n };\n};\n\n/**\n * Core implementation for image embedding using MediaPipe.\n */\nexport const TFMP_ImageEmbedding: AiProviderRunFn<\n ImageEmbeddingTaskExecuteInput,\n ImageEmbeddingTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const imageEmbedder = await getModelTask(model!, {}, onProgress, signal, ImageEmbedder);\n const result = imageEmbedder.embed(input.image as any);\n\n if (!result.embeddings?.[0]?.floatEmbedding) {\n throw new PermanentJobError(\"Failed to generate embedding: Empty result\");\n }\n\n const embedding = Float32Array.from(result.embeddings[0].floatEmbedding);\n\n return {\n vector: embedding,\n };\n};\n\n/**\n * Core implementation for image classification using MediaPipe.\n */\nexport const TFMP_ImageClassification: AiProviderRunFn<\n ImageClassificationTaskExecuteInput,\n ImageClassificationTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const imageClassifier = await getModelTask(\n model!,\n {\n maxResults: (input as any).maxCategories,\n },\n onProgress,\n signal,\n ImageClassifier\n );\n const result = imageClassifier.classify(input.image as any);\n\n if (!result.classifications?.[0]?.categories) {\n throw new PermanentJobError(\"Failed to classify image: Empty result\");\n }\n\n const categories = result.classifications[0].categories.map((category: any) => ({\n label: category.categoryName,\n score: category.score,\n }));\n\n return {\n categories,\n };\n};\n\n/**\n * Core implementation for object detection using MediaPipe.\n */\nexport const TFMP_ObjectDetection: AiProviderRunFn<\n ObjectDetectionTaskExecuteInput,\n ObjectDetectionTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const objectDetector = await getModelTask(\n model!,\n {\n scoreThreshold: (input as any).threshold,\n },\n onProgress,\n signal,\n ObjectDetector\n );\n const result = objectDetector.detect(input.image as any);\n\n if (!result.detections) {\n throw new PermanentJobError(\"Failed to detect objects: Empty result\");\n }\n\n const detections = result.detections.map((detection: any) => ({\n label: detection.categories?.[0]?.categoryName || \"unknown\",\n score: detection.categories?.[0]?.score || 0,\n box: {\n x: detection.boundingBox?.originX || 0,\n y: detection.boundingBox?.originY || 0,\n width: detection.boundingBox?.width || 0,\n height: detection.boundingBox?.height || 0,\n },\n }));\n\n return {\n detections,\n };\n};\n\n/**\n * Core implementation for gesture recognition using MediaPipe.\n */\nexport const TFMP_GestureRecognizer: AiProviderRunFn<\n GestureRecognizerTaskExecuteInput,\n GestureRecognizerTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const gestureRecognizer = await getModelTask(\n model!,\n {\n numHands: (input as any).numHands,\n minHandDetectionConfidence: (input as any).minHandDetectionConfidence,\n minHandPresenceConfidence: (input as any).minHandPresenceConfidence,\n minTrackingConfidence: (input as any).minTrackingConfidence,\n },\n onProgress,\n signal,\n GestureRecognizer\n );\n const result = gestureRecognizer.recognize(input.image as any);\n\n if (!result.gestures || !result.landmarks) {\n throw new PermanentJobError(\"Failed to recognize gestures: Empty result\");\n }\n\n const hands = result.gestures.map((gestures: any, index: number) => ({\n gestures: gestures.map((g: any) => ({\n label: g.categoryName,\n score: g.score,\n })),\n handedness: result.handedness[index].map((h: any) => ({\n label: h.categoryName,\n score: h.score,\n })),\n landmarks: result.landmarks[index].map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n })),\n worldLandmarks: result.worldLandmarks[index].map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n })),\n }));\n\n return {\n hands,\n };\n};\n\n/**\n * Core implementation for hand landmark detection using MediaPipe.\n */\nexport const TFMP_HandLandmarker: AiProviderRunFn<\n HandLandmarkerTaskExecuteInput,\n HandLandmarkerTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const handLandmarker = await getModelTask(\n model!,\n {\n numHands: (input as any).numHands,\n minHandDetectionConfidence: (input as any).minHandDetectionConfidence,\n minHandPresenceConfidence: (input as any).minHandPresenceConfidence,\n minTrackingConfidence: (input as any).minTrackingConfidence,\n },\n onProgress,\n signal,\n HandLandmarker\n );\n const result = handLandmarker.detect(input.image as any);\n\n if (!result.landmarks) {\n throw new PermanentJobError(\"Failed to detect hand landmarks: Empty result\");\n }\n\n const hands = result.landmarks.map((landmarks: any, index: number) => ({\n handedness: result.handedness[index].map((h: any) => ({\n label: h.categoryName,\n score: h.score,\n })),\n landmarks: landmarks.map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n })),\n worldLandmarks: result.worldLandmarks[index].map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n })),\n }));\n\n return {\n hands,\n };\n};\n\n/**\n * Core implementation for face detection using MediaPipe.\n */\nexport const TFMP_FaceDetector: AiProviderRunFn<\n FaceDetectorTaskExecuteInput,\n FaceDetectorTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const faceDetector = await getModelTask(\n model!,\n {\n minDetectionConfidence: (input as any).minDetectionConfidence,\n minSuppressionThreshold: (input as any).minSuppressionThreshold,\n },\n onProgress,\n signal,\n FaceDetector\n );\n const result = faceDetector.detect(input.image as any);\n\n if (!result.detections) {\n throw new PermanentJobError(\"Failed to detect faces: Empty result\");\n }\n\n const faces = result.detections.map((detection: any) => ({\n box: {\n x: detection.boundingBox?.originX || 0,\n y: detection.boundingBox?.originY || 0,\n width: detection.boundingBox?.width || 0,\n height: detection.boundingBox?.height || 0,\n },\n keypoints:\n detection.keypoints?.map((kp: any) => ({\n x: kp.x,\n y: kp.y,\n label: kp.label,\n })) || [],\n score: detection.categories?.[0]?.score || 0,\n }));\n\n return {\n faces,\n };\n};\n\n/**\n * Core implementation for face landmark detection using MediaPipe.\n */\nexport const TFMP_FaceLandmarker: AiProviderRunFn<\n FaceLandmarkerTaskExecuteInput,\n FaceLandmarkerTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const faceLandmarker = await getModelTask(\n model!,\n {\n numFaces: (input as any).numFaces,\n minFaceDetectionConfidence: (input as any).minFaceDetectionConfidence,\n minFacePresenceConfidence: (input as any).minFacePresenceConfidence,\n minTrackingConfidence: (input as any).minTrackingConfidence,\n outputFaceBlendshapes: (input as any).outputFaceBlendshapes,\n outputFacialTransformationMatrixes: (input as any).outputFacialTransformationMatrixes,\n },\n onProgress,\n signal,\n FaceLandmarker\n );\n const result = faceLandmarker.detect(input.image as any);\n\n if (!result.faceLandmarks) {\n throw new PermanentJobError(\"Failed to detect face landmarks: Empty result\");\n }\n\n const faces = result.faceLandmarks.map((landmarks: any, index: number) => {\n const face: any = {\n landmarks: landmarks.map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n })),\n };\n\n if (result.faceBlendshapes && result.faceBlendshapes[index]) {\n face.blendshapes = result.faceBlendshapes[index].categories.map((b: any) => ({\n label: b.categoryName,\n score: b.score,\n }));\n }\n\n if (result.facialTransformationMatrixes && result.facialTransformationMatrixes[index]) {\n face.transformationMatrix = Array.from(result.facialTransformationMatrixes[index].data);\n }\n\n return face;\n });\n\n return {\n faces,\n };\n};\n\n/**\n * Core implementation for pose landmark detection using MediaPipe.\n */\nexport const TFMP_PoseLandmarker: AiProviderRunFn<\n PoseLandmarkerTaskExecuteInput,\n PoseLandmarkerTaskExecuteOutput,\n TFMPModelConfig\n> = async (input, model, onProgress, signal) => {\n const poseLandmarker = await getModelTask(\n model!,\n {\n numPoses: (input as any).numPoses,\n minPoseDetectionConfidence: (input as any).minPoseDetectionConfidence,\n minPosePresenceConfidence: (input as any).minPosePresenceConfidence,\n minTrackingConfidence: (input as any).minTrackingConfidence,\n outputSegmentationMasks: (input as any).outputSegmentationMasks,\n },\n onProgress,\n signal,\n PoseLandmarker\n );\n const result = poseLandmarker.detect(input.image as any);\n\n if (!result.landmarks) {\n throw new PermanentJobError(\"Failed to detect pose landmarks: Empty result\");\n }\n\n const poses = result.landmarks.map((landmarks: any, index: number) => {\n const pose: any = {\n landmarks: landmarks.map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n visibility: l.visibility,\n presence: l.presence,\n })),\n worldLandmarks: result.worldLandmarks[index].map((l: any) => ({\n x: l.x,\n y: l.y,\n z: l.z,\n visibility: l.visibility,\n presence: l.presence,\n })),\n };\n\n if (result.segmentationMasks && result.segmentationMasks[index]) {\n const mask = result.segmentationMasks[index];\n pose.segmentationMask = {\n data: mask.canvas || mask,\n width: mask.width,\n height: mask.height,\n };\n }\n\n return pose;\n });\n\n return {\n poses,\n };\n};\n",
13
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ModelConfigSchema, ModelRecordSchema } from \"@workglow/ai\";\nimport { DataPortSchemaObject, FromSchema } from \"@workglow/util\";\nimport { TENSORFLOW_MEDIAPIPE, TextPipelineTask } from \"../common/TFMP_Constants\";\n\nexport const TFMPModelSchema = {\n type: \"object\",\n properties: {\n provider: {\n const: TENSORFLOW_MEDIAPIPE,\n description: \"Discriminator: TensorFlow MediaPipe backend.\",\n },\n provider_config: {\n type: \"object\",\n description: \"TensorFlow MediaPipe-specific options.\",\n properties: {\n modelPath: {\n type: \"string\",\n description: \"Filesystem path or URI for the ONNX model.\",\n },\n taskEngine: {\n type: \"string\",\n enum: [\"text\", \"audio\", \"vision\", \"genai\"],\n description: \"Task engine for the MediaPipe model.\",\n },\n pipeline: {\n type: \"string\",\n enum: Object.values(TextPipelineTask),\n description: \"Pipeline task type for the MediaPipe model.\",\n },\n },\n required: [\"modelPath\", \"taskEngine\", \"pipeline\"],\n additionalProperties: false,\n },\n },\n required: [\"provider\", \"provider_config\"],\n additionalProperties: true,\n} as const satisfies DataPortSchemaObject;\n\nexport const TFMPModelRecordSchema = {\n type: \"object\",\n properties: {\n ...ModelRecordSchema.properties,\n ...TFMPModelSchema.properties,\n },\n required: [...ModelRecordSchema.required, ...TFMPModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type TFMPModelRecord = FromSchema<typeof TFMPModelRecordSchema>;\n\nexport const TFMPModelConfigSchema = {\n type: \"object\",\n properties: {\n ...ModelConfigSchema.properties,\n ...TFMPModelSchema.properties,\n },\n required: [...ModelConfigSchema.required, ...TFMPModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type TFMPModelConfig = FromSchema<typeof TFMPModelConfigSchema>;\n",
14
14
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiJob, AiJobInput, getAiProviderRegistry } from \"@workglow/ai\";\nimport { ConcurrencyLimiter, JobQueueClient, JobQueueServer } from \"@workglow/job-queue\";\nimport { InMemoryQueueStorage } from \"@workglow/storage\";\nimport { getTaskQueueRegistry, TaskInput, TaskOutput } from \"@workglow/task-graph\";\nimport { globalServiceRegistry, WORKER_MANAGER } from \"@workglow/util\";\nimport { TENSORFLOW_MEDIAPIPE } from \"../common/TFMP_Constants\";\n\n/**\n * Registers the TensorFlow MediaPipe client job functions with a web worker.\n * If no client is provided, creates a default in-memory queue and registers it.\n *\n * @param worker - The web worker to use for job execution\n * @param client - Optional existing JobQueueClient. If not provided, creates a default in-memory queue.\n */\nexport async function register_TFMP_ClientJobFns(\n worker: Worker,\n client?: JobQueueClient<AiJobInput<TaskInput>, TaskOutput>\n): Promise<void> {\n const workerManager = globalServiceRegistry.get(WORKER_MANAGER);\n workerManager.registerWorker(TENSORFLOW_MEDIAPIPE, worker);\n\n const aiProviderRegistry = getAiProviderRegistry();\n const names = [\n \"DownloadModelTask\",\n \"UnloadModelTask\",\n \"TextEmbeddingTask\",\n \"TextLanguageDetectionTask\",\n \"TextClassificationTask\",\n \"ImageSegmentationTask\",\n \"ImageEmbeddingTask\",\n \"ImageClassificationTask\",\n \"ObjectDetectionTask\",\n ];\n for (const name of names) {\n aiProviderRegistry.registerAsWorkerRunFn(TENSORFLOW_MEDIAPIPE, name);\n }\n\n // If no client provided, create a default in-memory queue\n if (!client) {\n const storage = new InMemoryQueueStorage<AiJobInput<TaskInput>, TaskOutput>(\n TENSORFLOW_MEDIAPIPE\n );\n await storage.setupDatabase();\n\n const server = new JobQueueServer<AiJobInput<TaskInput>, TaskOutput>(AiJob, {\n storage,\n queueName: TENSORFLOW_MEDIAPIPE,\n limiter: new ConcurrencyLimiter(1, 100),\n });\n\n client = new JobQueueClient<AiJobInput<TaskInput>, TaskOutput>({\n storage,\n queueName: TENSORFLOW_MEDIAPIPE,\n });\n\n client.attach(server);\n\n getTaskQueueRegistry().registerQueue({ server, client, storage });\n await server.start();\n }\n}\n",
15
15
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiJob, AiJobInput, getAiProviderRegistry } from \"@workglow/ai\";\nimport { ConcurrencyLimiter, JobQueueClient, JobQueueServer } from \"@workglow/job-queue\";\nimport { InMemoryQueueStorage } from \"@workglow/storage\";\nimport { getTaskQueueRegistry, TaskInput, TaskOutput } from \"@workglow/task-graph\";\nimport { TENSORFLOW_MEDIAPIPE } from \"../common/TFMP_Constants\";\nimport {\n TFMP_Download,\n TFMP_FaceDetector,\n TFMP_FaceLandmarker,\n TFMP_GestureRecognizer,\n TFMP_HandLandmarker,\n TFMP_ImageClassification,\n TFMP_ImageEmbedding,\n TFMP_ImageSegmentation,\n TFMP_ObjectDetection,\n TFMP_PoseLandmarker,\n TFMP_TextClassification,\n TFMP_TextEmbedding,\n TFMP_TextLanguageDetection,\n TFMP_Unload,\n} from \"../common/TFMP_JobRunFns\";\n\n/**\n * Registers the TensorFlow MediaPipe inline job functions for same-thread execution.\n * If no client is provided, creates a default in-memory queue and registers it.\n *\n * @param client - Optional existing JobQueueClient. If not provided, creates a default in-memory queue.\n */\nexport async function register_TFMP_InlineJobFns(\n client?: JobQueueClient<AiJobInput<TaskInput>, TaskOutput>\n): Promise<void> {\n const aiProviderRegistry = getAiProviderRegistry();\n\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"DownloadModelTask\",\n TFMP_Download as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"UnloadModelTask\",\n TFMP_Unload as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"TextEmbeddingTask\",\n TFMP_TextEmbedding as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"TextLanguageDetectionTask\",\n TFMP_TextLanguageDetection as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"TextClassificationTask\",\n TFMP_TextClassification as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"ImageSegmentationTask\",\n TFMP_ImageSegmentation as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"ImageEmbeddingTask\",\n TFMP_ImageEmbedding as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"ImageClassificationTask\",\n TFMP_ImageClassification as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"ObjectDetectionTask\",\n TFMP_ObjectDetection as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"GestureRecognizerTask\",\n TFMP_GestureRecognizer as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"HandLandmarkerTask\",\n TFMP_HandLandmarker as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"FaceDetectorTask\",\n TFMP_FaceDetector as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"FaceLandmarkerTask\",\n TFMP_FaceLandmarker as any\n );\n aiProviderRegistry.registerRunFn<any, any>(\n TENSORFLOW_MEDIAPIPE,\n \"PoseLandmarkerTask\",\n TFMP_PoseLandmarker as any\n );\n\n // If no client provided, create a default in-memory queue\n if (!client) {\n const storage = new InMemoryQueueStorage<AiJobInput<TaskInput>, TaskOutput>(\n TENSORFLOW_MEDIAPIPE\n );\n await storage.setupDatabase();\n\n const server = new JobQueueServer<AiJobInput<TaskInput>, TaskOutput>(AiJob, {\n storage,\n queueName: TENSORFLOW_MEDIAPIPE,\n limiter: new ConcurrencyLimiter(1, 100),\n });\n\n client = new JobQueueClient<AiJobInput<TaskInput>, TaskOutput>({\n storage,\n queueName: TENSORFLOW_MEDIAPIPE,\n });\n\n client.attach(server);\n\n getTaskQueueRegistry().registerQueue({ server, client, storage });\n await server.start();\n }\n}\n",
16
16
  "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n createServiceToken,\n globalServiceRegistry,\n parentPort,\n WORKER_SERVER,\n} from \"@workglow/util\";\nimport {\n TFMP_Download,\n TFMP_ImageClassification,\n TFMP_ImageEmbedding,\n TFMP_ImageSegmentation,\n TFMP_ObjectDetection,\n TFMP_TextClassification,\n TFMP_TextEmbedding,\n TFMP_TextLanguageDetection,\n TFMP_Unload,\n} from \"../common/TFMP_JobRunFns\";\n\n// Register the worker functions\nexport const TFMP_WORKER_JOBRUN = createServiceToken(\"worker.ai-provider.tfmp\");\n\nexport const TFMP_WORKER_JOBRUN_REGISTER = globalServiceRegistry.register(\n TFMP_WORKER_JOBRUN,\n () => {\n const workerServer = globalServiceRegistry.get(WORKER_SERVER);\n workerServer.registerFunction(\"DownloadModelTask\", TFMP_Download);\n workerServer.registerFunction(\"UnloadModelTask\", TFMP_Unload);\n workerServer.registerFunction(\"TextEmbeddingTask\", TFMP_TextEmbedding);\n workerServer.registerFunction(\"TextLanguageDetectionTask\", TFMP_TextLanguageDetection);\n workerServer.registerFunction(\"TextClassificationTask\", TFMP_TextClassification);\n workerServer.registerFunction(\"ImageSegmentationTask\", TFMP_ImageSegmentation);\n workerServer.registerFunction(\"ImageEmbeddingTask\", TFMP_ImageEmbedding);\n workerServer.registerFunction(\"ImageClassificationTask\", TFMP_ImageClassification);\n workerServer.registerFunction(\"ObjectDetectionTask\", TFMP_ObjectDetection);\n parentPort.postMessage({ type: \"ready\" });\n console.log(\"TFMP_WORKER_JOBRUN registered\");\n return workerServer;\n },\n true\n);\n"
17
17
  ],
18
- "mappings": "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",
19
- "debugId": "75F5396ABB47DC9E64756E2164756E21",
18
+ "mappings": "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",
19
+ "debugId": "F3006E11D0637B7464756E2164756E21",
20
20
  "names": []
21
21
  }
@@ -11,7 +11,7 @@ export declare const TFMPModelSchema: {
11
11
  readonly const: "TENSORFLOW_MEDIAPIPE";
12
12
  readonly description: "Discriminator: TensorFlow MediaPipe backend.";
13
13
  };
14
- readonly providerConfig: {
14
+ readonly provider_config: {
15
15
  readonly type: "object";
16
16
  readonly description: "TensorFlow MediaPipe-specific options.";
17
17
  readonly properties: {
@@ -34,17 +34,17 @@ export declare const TFMPModelSchema: {
34
34
  readonly additionalProperties: false;
35
35
  };
36
36
  };
37
- readonly required: readonly ["provider", "providerConfig"];
37
+ readonly required: readonly ["provider", "provider_config"];
38
38
  readonly additionalProperties: true;
39
39
  };
40
- declare const ExtendedModelRecordSchema: {
40
+ export declare const TFMPModelRecordSchema: {
41
41
  readonly type: "object";
42
42
  readonly properties: {
43
43
  readonly provider: {
44
44
  readonly const: "TENSORFLOW_MEDIAPIPE";
45
45
  readonly description: "Discriminator: TensorFlow MediaPipe backend.";
46
46
  };
47
- readonly providerConfig: {
47
+ readonly provider_config: {
48
48
  readonly type: "object";
49
49
  readonly description: "TensorFlow MediaPipe-specific options.";
50
50
  readonly properties: {
@@ -74,30 +74,33 @@ declare const ExtendedModelRecordSchema: {
74
74
  readonly items: {
75
75
  readonly type: "string";
76
76
  };
77
+ readonly "x-ui-editor": "multiselect";
77
78
  };
78
79
  readonly title: {
79
80
  readonly type: "string";
80
81
  };
81
82
  readonly description: {
82
83
  readonly type: "string";
84
+ readonly "x-ui-editor": "textarea";
83
85
  };
84
86
  readonly metadata: {
85
87
  readonly type: "object";
86
88
  readonly default: {};
89
+ readonly "x-ui-hidden": true;
87
90
  };
88
91
  };
89
- readonly required: readonly ["model_id", "tasks", "provider", "title", "description", "providerConfig", "metadata", "provider", "providerConfig"];
92
+ readonly required: readonly ["model_id", "tasks", "provider", "title", "description", "provider_config", "metadata", "provider", "provider_config"];
90
93
  readonly additionalProperties: false;
91
94
  };
92
- export type TFMPModelRecord = FromSchema<typeof ExtendedModelRecordSchema>;
93
- declare const ExtendedModelConfigSchema: {
95
+ export type TFMPModelRecord = FromSchema<typeof TFMPModelRecordSchema>;
96
+ export declare const TFMPModelConfigSchema: {
94
97
  readonly type: "object";
95
98
  readonly properties: {
96
99
  readonly provider: {
97
100
  readonly const: "TENSORFLOW_MEDIAPIPE";
98
101
  readonly description: "Discriminator: TensorFlow MediaPipe backend.";
99
102
  };
100
- readonly providerConfig: {
103
+ readonly provider_config: {
101
104
  readonly type: "object";
102
105
  readonly description: "TensorFlow MediaPipe-specific options.";
103
106
  readonly properties: {
@@ -127,21 +130,23 @@ declare const ExtendedModelConfigSchema: {
127
130
  readonly items: {
128
131
  readonly type: "string";
129
132
  };
133
+ readonly "x-ui-editor": "multiselect";
130
134
  };
131
135
  readonly title: {
132
136
  readonly type: "string";
133
137
  };
134
138
  readonly description: {
135
139
  readonly type: "string";
140
+ readonly "x-ui-editor": "textarea";
136
141
  };
137
142
  readonly metadata: {
138
143
  readonly type: "object";
139
144
  readonly default: {};
145
+ readonly "x-ui-hidden": true;
140
146
  };
141
147
  };
142
- readonly required: readonly ["provider", "providerConfig", "provider", "providerConfig"];
148
+ readonly required: readonly ["provider", "provider_config", "provider", "provider_config"];
143
149
  readonly additionalProperties: false;
144
150
  };
145
- export type TFMPModelConfig = FromSchema<typeof ExtendedModelConfigSchema>;
146
- export {};
151
+ export type TFMPModelConfig = FromSchema<typeof TFMPModelConfigSchema>;
147
152
  //# sourceMappingURL=TFMP_ModelSchema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TFMP_ModelSchema.d.ts","sourceRoot":"","sources":["../../../src/tf-mediapipe/common/TFMP_ModelSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAwB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGlE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCa,CAAC;AAE1C,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQU,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE3E,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQU,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
1
+ {"version":3,"file":"TFMP_ModelSchema.d.ts","sourceRoot":"","sources":["../../../src/tf-mediapipe/common/TFMP_ModelSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAwB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGlE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCa,CAAC;AAE1C,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQO,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEvE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAQO,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workglow/ai-provider",
3
3
  "type": "module",
4
- "version": "0.0.81",
4
+ "version": "0.0.83",
5
5
  "description": "AI provider integrations for Workglow, supporting OpenAI, Hugging Face Transformers, MediaPipe, and GGML models.",
6
6
  "scripts": {
7
7
  "watch": "concurrently -c 'auto' 'bun:watch-*'",
@@ -30,11 +30,11 @@
30
30
  "access": "public"
31
31
  },
32
32
  "peerDependencies": {
33
- "@workglow/ai": "0.0.81",
34
- "@workglow/job-queue": "0.0.81",
35
- "@workglow/storage": "0.0.81",
36
- "@workglow/task-graph": "0.0.81",
37
- "@workglow/util": "0.0.81",
33
+ "@workglow/ai": "0.0.83",
34
+ "@workglow/job-queue": "0.0.83",
35
+ "@workglow/storage": "0.0.83",
36
+ "@workglow/task-graph": "0.0.83",
37
+ "@workglow/util": "0.0.83",
38
38
  "@sroussey/transformers": "3.8.2",
39
39
  "@mediapipe/tasks-text": "^0.10.22-rc.20250304",
40
40
  "@mediapipe/tasks-vision": "^0.10.22-rc.20250304",
@@ -59,11 +59,11 @@
59
59
  }
60
60
  },
61
61
  "devDependencies": {
62
- "@workglow/ai": "0.0.81",
63
- "@workglow/job-queue": "0.0.81",
64
- "@workglow/storage": "0.0.81",
65
- "@workglow/task-graph": "0.0.81",
66
- "@workglow/util": "0.0.81",
62
+ "@workglow/ai": "0.0.83",
63
+ "@workglow/job-queue": "0.0.83",
64
+ "@workglow/storage": "0.0.83",
65
+ "@workglow/task-graph": "0.0.83",
66
+ "@workglow/util": "0.0.83",
67
67
  "@sroussey/transformers": "3.8.2",
68
68
  "@mediapipe/tasks-text": "^0.10.22-rc.20250304",
69
69
  "@mediapipe/tasks-vision": "^0.10.22-rc.20250304",