@workglow/ai-provider 0.0.126 → 0.1.1

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.
Files changed (172) hide show
  1. package/dist/provider-anthropic/AnthropicProvider.d.ts +1 -1
  2. package/dist/provider-anthropic/AnthropicProvider.d.ts.map +1 -1
  3. package/dist/provider-anthropic/AnthropicQueuedProvider.d.ts +4 -4
  4. package/dist/provider-anthropic/AnthropicQueuedProvider.d.ts.map +1 -1
  5. package/dist/provider-anthropic/common/Anthropic_Client.d.ts.map +1 -1
  6. package/dist/provider-anthropic/common/Anthropic_CountTokens.d.ts.map +1 -1
  7. package/dist/provider-anthropic/common/Anthropic_JobRunFns.d.ts.map +1 -1
  8. package/dist/provider-anthropic/common/Anthropic_TextGeneration.d.ts.map +1 -1
  9. package/dist/provider-anthropic/common/Anthropic_TextRewriter.d.ts.map +1 -1
  10. package/dist/provider-anthropic/common/Anthropic_TextSummary.d.ts.map +1 -1
  11. package/dist/provider-anthropic/index.js +3 -4
  12. package/dist/provider-anthropic/index.js.map +3 -3
  13. package/dist/provider-anthropic/runtime.js +19 -291
  14. package/dist/provider-anthropic/runtime.js.map +11 -12
  15. package/dist/provider-chrome/common/WebBrowser_TextGeneration.d.ts.map +1 -1
  16. package/dist/provider-chrome/common/WebBrowser_TextLanguageDetection.d.ts.map +1 -1
  17. package/dist/provider-chrome/common/WebBrowser_TextRewriter.d.ts.map +1 -1
  18. package/dist/provider-chrome/common/WebBrowser_TextSummary.d.ts.map +1 -1
  19. package/dist/provider-chrome/common/WebBrowser_TextTranslation.d.ts.map +1 -1
  20. package/dist/provider-chrome/runtime.js +3 -97
  21. package/dist/provider-chrome/runtime.js.map +8 -8
  22. package/dist/provider-gemini/GoogleGeminiProvider.d.ts +1 -1
  23. package/dist/provider-gemini/GoogleGeminiProvider.d.ts.map +1 -1
  24. package/dist/provider-gemini/GoogleGeminiQueuedProvider.d.ts +4 -4
  25. package/dist/provider-gemini/GoogleGeminiQueuedProvider.d.ts.map +1 -1
  26. package/dist/provider-gemini/common/Gemini_CountTokens.d.ts.map +1 -1
  27. package/dist/provider-gemini/common/Gemini_JobRunFns.d.ts.map +1 -1
  28. package/dist/provider-gemini/common/Gemini_TextEmbedding.d.ts.map +1 -1
  29. package/dist/provider-gemini/common/Gemini_TextGeneration.d.ts.map +1 -1
  30. package/dist/provider-gemini/common/Gemini_TextRewriter.d.ts.map +1 -1
  31. package/dist/provider-gemini/common/Gemini_TextSummary.d.ts.map +1 -1
  32. package/dist/provider-gemini/index.js +3 -4
  33. package/dist/provider-gemini/index.js.map +3 -3
  34. package/dist/provider-gemini/runtime.js +12 -257
  35. package/dist/provider-gemini/runtime.js.map +11 -12
  36. package/dist/provider-hf-inference/HfInferenceProvider.d.ts +1 -1
  37. package/dist/provider-hf-inference/HfInferenceProvider.d.ts.map +1 -1
  38. package/dist/provider-hf-inference/HfInferenceQueuedProvider.d.ts +4 -4
  39. package/dist/provider-hf-inference/HfInferenceQueuedProvider.d.ts.map +1 -1
  40. package/dist/provider-hf-inference/common/HFI_Client.d.ts.map +1 -1
  41. package/dist/provider-hf-inference/common/HFI_JobRunFns.d.ts.map +1 -1
  42. package/dist/provider-hf-inference/common/HFI_TextEmbedding.d.ts.map +1 -1
  43. package/dist/provider-hf-inference/common/HFI_TextGeneration.d.ts.map +1 -1
  44. package/dist/provider-hf-inference/common/HFI_TextRewriter.d.ts.map +1 -1
  45. package/dist/provider-hf-inference/common/HFI_TextSummary.d.ts.map +1 -1
  46. package/dist/provider-hf-inference/index.js +3 -4
  47. package/dist/provider-hf-inference/index.js.map +3 -3
  48. package/dist/provider-hf-inference/runtime.js +13 -206
  49. package/dist/provider-hf-inference/runtime.js.map +11 -12
  50. package/dist/provider-hf-transformers/HuggingFaceTransformersProvider.d.ts +1 -1
  51. package/dist/provider-hf-transformers/HuggingFaceTransformersProvider.d.ts.map +1 -1
  52. package/dist/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.d.ts +13 -3
  53. package/dist/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.d.ts.map +1 -1
  54. package/dist/provider-hf-transformers/common/HFT_Constants.d.ts +4 -0
  55. package/dist/provider-hf-transformers/common/HFT_Constants.d.ts.map +1 -1
  56. package/dist/provider-hf-transformers/common/HFT_CountTokens.d.ts.map +1 -1
  57. package/dist/provider-hf-transformers/common/HFT_Download.d.ts.map +1 -1
  58. package/dist/provider-hf-transformers/common/HFT_ImageEmbedding.d.ts.map +1 -1
  59. package/dist/provider-hf-transformers/common/HFT_JobRunFns.d.ts +116 -87
  60. package/dist/provider-hf-transformers/common/HFT_JobRunFns.d.ts.map +1 -1
  61. package/dist/provider-hf-transformers/common/HFT_ModelInfo.d.ts.map +1 -1
  62. package/dist/provider-hf-transformers/common/HFT_ModelSchema.d.ts +30 -0
  63. package/dist/provider-hf-transformers/common/HFT_ModelSchema.d.ts.map +1 -1
  64. package/dist/provider-hf-transformers/common/HFT_OnnxDtypes.d.ts.map +1 -1
  65. package/dist/provider-hf-transformers/common/HFT_Pipeline.d.ts +9 -2
  66. package/dist/provider-hf-transformers/common/HFT_Pipeline.d.ts.map +1 -1
  67. package/dist/provider-hf-transformers/common/HFT_Streaming.d.ts +2 -2
  68. package/dist/provider-hf-transformers/common/HFT_Streaming.d.ts.map +1 -1
  69. package/dist/provider-hf-transformers/common/HFT_TextClassification.d.ts.map +1 -1
  70. package/dist/provider-hf-transformers/common/HFT_TextFillMask.d.ts.map +1 -1
  71. package/dist/provider-hf-transformers/common/HFT_TextGeneration.d.ts.map +1 -1
  72. package/dist/provider-hf-transformers/common/HFT_TextLanguageDetection.d.ts.map +1 -1
  73. package/dist/provider-hf-transformers/common/HFT_TextNamedEntityRecognition.d.ts.map +1 -1
  74. package/dist/provider-hf-transformers/common/HFT_TextQuestionAnswer.d.ts.map +1 -1
  75. package/dist/provider-hf-transformers/common/HFT_TextRewriter.d.ts.map +1 -1
  76. package/dist/provider-hf-transformers/common/HFT_TextSummary.d.ts.map +1 -1
  77. package/dist/provider-hf-transformers/common/HFT_TextTranslation.d.ts.map +1 -1
  78. package/dist/provider-hf-transformers/index.d.ts +0 -1
  79. package/dist/provider-hf-transformers/index.d.ts.map +1 -1
  80. package/dist/provider-hf-transformers/index.js +49 -177
  81. package/dist/provider-hf-transformers/index.js.map +8 -9
  82. package/dist/provider-hf-transformers/registerHuggingFaceTransformersWorker.d.ts.map +1 -1
  83. package/dist/provider-hf-transformers/runtime.d.ts +0 -1
  84. package/dist/provider-hf-transformers/runtime.d.ts.map +1 -1
  85. package/dist/provider-hf-transformers/runtime.js +226 -515
  86. package/dist/provider-hf-transformers/runtime.js.map +27 -29
  87. package/dist/provider-llamacpp/LlamaCppProvider.d.ts +1 -1
  88. package/dist/provider-llamacpp/LlamaCppProvider.d.ts.map +1 -1
  89. package/dist/provider-llamacpp/LlamaCppQueuedProvider.d.ts +1 -1
  90. package/dist/provider-llamacpp/LlamaCppQueuedProvider.d.ts.map +1 -1
  91. package/dist/provider-llamacpp/common/LlamaCpp_CountTokens.d.ts.map +1 -1
  92. package/dist/provider-llamacpp/common/LlamaCpp_JobRunFns.d.ts.map +1 -1
  93. package/dist/provider-llamacpp/common/LlamaCpp_ModelSchema.d.ts +15 -0
  94. package/dist/provider-llamacpp/common/LlamaCpp_ModelSchema.d.ts.map +1 -1
  95. package/dist/provider-llamacpp/common/LlamaCpp_Runtime.d.ts +10 -0
  96. package/dist/provider-llamacpp/common/LlamaCpp_Runtime.d.ts.map +1 -1
  97. package/dist/provider-llamacpp/common/LlamaCpp_StructuredGeneration.d.ts.map +1 -1
  98. package/dist/provider-llamacpp/common/LlamaCpp_TextEmbedding.d.ts.map +1 -1
  99. package/dist/provider-llamacpp/common/LlamaCpp_TextGeneration.d.ts.map +1 -1
  100. package/dist/provider-llamacpp/common/LlamaCpp_TextRewriter.d.ts.map +1 -1
  101. package/dist/provider-llamacpp/common/LlamaCpp_TextSummary.d.ts.map +1 -1
  102. package/dist/provider-llamacpp/index.js +6 -2
  103. package/dist/provider-llamacpp/index.js.map +4 -4
  104. package/dist/provider-llamacpp/runtime.js +82 -230
  105. package/dist/provider-llamacpp/runtime.js.map +13 -14
  106. package/dist/provider-ollama/OllamaProvider.d.ts +1 -1
  107. package/dist/provider-ollama/OllamaProvider.d.ts.map +1 -1
  108. package/dist/provider-ollama/OllamaQueuedProvider.d.ts +4 -4
  109. package/dist/provider-ollama/OllamaQueuedProvider.d.ts.map +1 -1
  110. package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts +13 -71
  111. package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts.map +1 -1
  112. package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts +13 -71
  113. package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts.map +1 -1
  114. package/dist/provider-ollama/common/Ollama_TextGeneration.d.ts.map +1 -1
  115. package/dist/provider-ollama/common/Ollama_TextRewriter.d.ts.map +1 -1
  116. package/dist/provider-ollama/common/Ollama_TextSummary.d.ts.map +1 -1
  117. package/dist/provider-ollama/index.browser.js +3 -4
  118. package/dist/provider-ollama/index.browser.js.map +3 -3
  119. package/dist/provider-ollama/index.js +3 -4
  120. package/dist/provider-ollama/index.js.map +3 -3
  121. package/dist/provider-ollama/runtime.browser.js +8 -179
  122. package/dist/provider-ollama/runtime.browser.js.map +9 -10
  123. package/dist/provider-ollama/runtime.js +8 -174
  124. package/dist/provider-ollama/runtime.js.map +9 -10
  125. package/dist/provider-openai/OpenAiProvider.d.ts +1 -1
  126. package/dist/provider-openai/OpenAiProvider.d.ts.map +1 -1
  127. package/dist/provider-openai/OpenAiQueuedProvider.d.ts +4 -4
  128. package/dist/provider-openai/OpenAiQueuedProvider.d.ts.map +1 -1
  129. package/dist/provider-openai/common/OpenAI_Client.d.ts.map +1 -1
  130. package/dist/provider-openai/common/OpenAI_CountTokens.browser.d.ts.map +1 -1
  131. package/dist/provider-openai/common/OpenAI_CountTokens.d.ts.map +1 -1
  132. package/dist/provider-openai/common/OpenAI_JobRunFns.browser.d.ts.map +1 -1
  133. package/dist/provider-openai/common/OpenAI_JobRunFns.d.ts.map +1 -1
  134. package/dist/provider-openai/common/OpenAI_TextEmbedding.d.ts.map +1 -1
  135. package/dist/provider-openai/common/OpenAI_TextGeneration.d.ts.map +1 -1
  136. package/dist/provider-openai/common/OpenAI_TextRewriter.d.ts.map +1 -1
  137. package/dist/provider-openai/common/OpenAI_TextSummary.d.ts.map +1 -1
  138. package/dist/provider-openai/index.browser.js +3 -4
  139. package/dist/provider-openai/index.browser.js.map +3 -3
  140. package/dist/provider-openai/index.js +3 -4
  141. package/dist/provider-openai/index.js.map +3 -3
  142. package/dist/provider-openai/runtime.browser.js +22 -224
  143. package/dist/provider-openai/runtime.browser.js.map +12 -13
  144. package/dist/provider-openai/runtime.js +22 -224
  145. package/dist/provider-openai/runtime.js.map +12 -13
  146. package/dist/provider-tf-mediapipe/TensorFlowMediaPipeQueuedProvider.d.ts +3 -3
  147. package/dist/provider-tf-mediapipe/TensorFlowMediaPipeQueuedProvider.d.ts.map +1 -1
  148. package/dist/provider-tf-mediapipe/common/TFMP_ImageEmbedding.d.ts.map +1 -1
  149. package/dist/provider-tf-mediapipe/common/TFMP_JobRunFns.d.ts +17 -10
  150. package/dist/provider-tf-mediapipe/common/TFMP_JobRunFns.d.ts.map +1 -1
  151. package/dist/provider-tf-mediapipe/common/TFMP_Unload.d.ts.map +1 -1
  152. package/dist/provider-tf-mediapipe/index.js +3 -3
  153. package/dist/provider-tf-mediapipe/index.js.map +3 -3
  154. package/dist/provider-tf-mediapipe/runtime.js +16 -5
  155. package/dist/provider-tf-mediapipe/runtime.js.map +5 -5
  156. package/package.json +19 -19
  157. package/dist/provider-anthropic/common/Anthropic_ToolCalling.d.ts +0 -10
  158. package/dist/provider-anthropic/common/Anthropic_ToolCalling.d.ts.map +0 -1
  159. package/dist/provider-gemini/common/Gemini_ToolCalling.d.ts +0 -10
  160. package/dist/provider-gemini/common/Gemini_ToolCalling.d.ts.map +0 -1
  161. package/dist/provider-hf-inference/common/HFI_ToolCalling.d.ts +0 -10
  162. package/dist/provider-hf-inference/common/HFI_ToolCalling.d.ts.map +0 -1
  163. package/dist/provider-hf-transformers/common/HFT_ToolCalling.d.ts +0 -10
  164. package/dist/provider-hf-transformers/common/HFT_ToolCalling.d.ts.map +0 -1
  165. package/dist/provider-hf-transformers/common/HFT_ToolMarkup.d.ts +0 -40
  166. package/dist/provider-hf-transformers/common/HFT_ToolMarkup.d.ts.map +0 -1
  167. package/dist/provider-llamacpp/common/LlamaCpp_ToolCalling.d.ts +0 -10
  168. package/dist/provider-llamacpp/common/LlamaCpp_ToolCalling.d.ts.map +0 -1
  169. package/dist/provider-ollama/common/Ollama_ToolCalling.d.ts +0 -16
  170. package/dist/provider-ollama/common/Ollama_ToolCalling.d.ts.map +0 -1
  171. package/dist/provider-openai/common/OpenAI_ToolCalling.d.ts +0 -10
  172. package/dist/provider-openai/common/OpenAI_ToolCalling.d.ts.map +0 -1
@@ -30,7 +30,8 @@ __export(exports_HFT_Pipeline, {
30
30
  hasCachedPipeline: () => hasCachedPipeline,
31
31
  getPipelineCacheKey: () => getPipelineCacheKey,
32
32
  getPipeline: () => getPipeline,
33
- clearPipelineCache: () => clearPipelineCache
33
+ clearPipelineCache: () => clearPipelineCache,
34
+ HFT_NULL_PROCESSOR_PREFIX: () => HFT_NULL_PROCESSOR_PREFIX
34
35
  });
35
36
  import { getLogger } from "@workglow/util/worker";
36
37
  function setHftCacheDir(dir) {
@@ -53,18 +54,110 @@ async function loadTransformersSDK() {
53
54
  }
54
55
  return _transformersSdk;
55
56
  }
57
+ function combineAbortSignals(existingSignal, modelSignal) {
58
+ if (!existingSignal) {
59
+ return modelSignal;
60
+ }
61
+ if (!modelSignal) {
62
+ return existingSignal;
63
+ }
64
+ if (existingSignal.aborted || modelSignal.aborted) {
65
+ return AbortSignal.abort(existingSignal.reason ?? modelSignal.reason);
66
+ }
67
+ if (typeof AbortSignal.any === "function") {
68
+ return AbortSignal.any([existingSignal, modelSignal]);
69
+ }
70
+ const controller = new AbortController;
71
+ const abort = (event) => {
72
+ const signal = event.target;
73
+ controller.abort(signal.reason);
74
+ };
75
+ existingSignal.addEventListener("abort", abort, { once: true });
76
+ modelSignal.addEventListener("abort", abort, { once: true });
77
+ return controller.signal;
78
+ }
79
+ function createAbortError(signal) {
80
+ const reason = signal.reason;
81
+ if (reason instanceof Error) {
82
+ return reason;
83
+ }
84
+ return new Error(String(reason ?? "Fetch aborted"));
85
+ }
86
+ function wrapAbortableResponse(response, signal) {
87
+ if (!signal || !response.body) {
88
+ return response;
89
+ }
90
+ const contentLengthHeader = response.headers.get("content-length");
91
+ const expectedSize = contentLengthHeader && /^\d+$/.test(contentLengthHeader) ? Number.parseInt(contentLengthHeader, 10) : undefined;
92
+ const sourceBody = response.body;
93
+ let reader;
94
+ let abortHandler;
95
+ let loaded = 0;
96
+ const cleanup = () => {
97
+ if (abortHandler) {
98
+ signal.removeEventListener("abort", abortHandler);
99
+ abortHandler = undefined;
100
+ }
101
+ reader?.releaseLock();
102
+ };
103
+ const body = new ReadableStream({
104
+ start(controller) {
105
+ reader = sourceBody.getReader();
106
+ if (signal.aborted) {
107
+ controller.error(createAbortError(signal));
108
+ return;
109
+ }
110
+ abortHandler = () => controller.error(createAbortError(signal));
111
+ signal.addEventListener("abort", abortHandler, { once: true });
112
+ },
113
+ async pull(controller) {
114
+ try {
115
+ if (signal.aborted) {
116
+ throw createAbortError(signal);
117
+ }
118
+ const { done, value } = await reader.read();
119
+ if (done) {
120
+ if (signal.aborted) {
121
+ throw createAbortError(signal);
122
+ }
123
+ if (expectedSize !== undefined && loaded < expectedSize) {
124
+ throw new Error(`Fetch ended before reading the full response body (${loaded}/${expectedSize} bytes)`);
125
+ }
126
+ cleanup();
127
+ controller.close();
128
+ return;
129
+ }
130
+ loaded += value.length;
131
+ controller.enqueue(value);
132
+ } catch (error) {
133
+ cleanup();
134
+ controller.error(error);
135
+ }
136
+ },
137
+ cancel(reason) {
138
+ cleanup();
139
+ return sourceBody.cancel(reason);
140
+ }
141
+ });
142
+ return new Response(body, {
143
+ headers: new Headers(response.headers),
144
+ status: response.status,
145
+ statusText: response.statusText
146
+ });
147
+ }
56
148
  function abortableFetch(url, options) {
57
- let signal;
149
+ let modelSignal;
58
150
  try {
59
151
  const pathname = new URL(url).pathname;
60
152
  for (const [modelPath, controller] of modelAbortControllers) {
61
153
  if (pathname.includes(`/${modelPath}/`)) {
62
- signal = controller.signal;
154
+ modelSignal = controller.signal;
63
155
  break;
64
156
  }
65
157
  }
66
158
  } catch {}
67
- return fetch(url, { ...options, ...signal ? { signal } : {} });
159
+ const combinedSignal = options?.signal ? combineAbortSignals(options.signal, modelSignal) : modelSignal;
160
+ return fetch(url, { ...options, ...combinedSignal ? { signal: combinedSignal } : {} }).then((response) => wrapAbortableResponse(response, combinedSignal));
68
161
  }
69
162
  function clearPipelineCache() {
70
163
  pipelines.clear();
@@ -85,9 +178,10 @@ function isBrowserEnv() {
85
178
  return false;
86
179
  }
87
180
  function getPipelineCacheKey(model) {
88
- const dtype = model.provider_config.dtype || "q8";
181
+ const dtype = model.provider_config.dtype || "";
89
182
  const device = model.provider_config.device || "";
90
- return `${model.provider_config.model_path}:${model.provider_config.pipeline}:${dtype}:${device}`;
183
+ const revision = model.provider_config.revision || "main";
184
+ return `${model.provider_config.model_path}:${model.provider_config.pipeline}:${dtype}:${device}:${revision}`;
91
185
  }
92
186
  async function getPipeline(model, onProgress, options = {}, signal, progressScaleMax = 10) {
93
187
  const cacheKey = getPipelineCacheKey(model);
@@ -97,7 +191,9 @@ async function getPipeline(model, onProgress, options = {}, signal, progressScal
97
191
  }
98
192
  const inFlight = pipelineLoadPromises.get(cacheKey);
99
193
  if (inFlight) {
100
- await inFlight;
194
+ try {
195
+ await inFlight;
196
+ } catch {}
101
197
  const cached = pipelines.get(cacheKey);
102
198
  if (cached)
103
199
  return cached;
@@ -108,7 +204,7 @@ async function getPipeline(model, onProgress, options = {}, signal, progressScal
108
204
  pipelineLoadPromises.set(cacheKey, loadPromise);
109
205
  return loadPromise;
110
206
  }
111
- var _transformersSdk, _cacheDir, modelAbortControllers, pipelines, pipelineLoadPromises, doGetPipeline = async (model, onProgress, options, progressScaleMax, cacheKey, signal) => {
207
+ var _transformersSdk, _cacheDir, modelAbortControllers, pipelines, pipelineLoadPromises, IMAGE_PIPELINE_TYPES, HFT_NULL_PROCESSOR_PREFIX = "HFT_NULL_PROCESSOR:", doGetPipeline = async (model, onProgress, options, progressScaleMax, cacheKey, signal) => {
112
208
  let lastProgressTime = 0;
113
209
  let pendingProgress = null;
114
210
  let throttleTimer = null;
@@ -206,16 +302,18 @@ var _transformersSdk, _cacheDir, modelAbortControllers, pipelines, pipelineLoadP
206
302
  device = "wasm";
207
303
  }
208
304
  if (device !== "wasm" && device !== "webgpu") {
209
- device = "webgpu";
305
+ device = "wasm";
210
306
  }
211
307
  } else {
212
308
  if (device === "wasm" || device === "webgpu") {
213
309
  device = undefined;
214
310
  }
215
311
  }
312
+ const dtype = model.provider_config.dtype || "";
216
313
  const pipelineOptions = {
217
- dtype: model.provider_config.dtype || "q8",
314
+ revision: model.provider_config.revision || "main",
218
315
  ...model.provider_config.use_external_data_format ? { useExternalDataFormat: model.provider_config.use_external_data_format } : {},
316
+ ...dtype ? { dtype } : {},
219
317
  ...device ? { device } : {},
220
318
  ...options,
221
319
  progress_callback: progressCallback
@@ -244,27 +342,44 @@ var _transformersSdk, _cacheDir, modelAbortControllers, pipelines, pipelineLoadP
244
342
  logger.timeEnd(pipelineTimerLabel, { status: "aborted" });
245
343
  throw new Error("Operation aborted after pipeline creation");
246
344
  }
345
+ if (IMAGE_PIPELINE_TYPES.has(pipelineType) && result.processor == null) {
346
+ throw new Error(`${HFT_NULL_PROCESSOR_PREFIX} Image processor not initialized for ${pipelineType}/${modelPath}. Model cache may be incomplete.`);
347
+ }
247
348
  logger.timeEnd(pipelineTimerLabel, { status: "loaded" });
248
349
  pipelines.set(cacheKey, result);
249
350
  return result;
250
351
  } catch (error) {
251
352
  logger.timeEnd(pipelineTimerLabel, { status: "error", error: String(error) });
252
- if (abortSignal?.aborted || modelController.signal.aborted) {
353
+ if (!error?.message?.startsWith(HFT_NULL_PROCESSOR_PREFIX) && (abortSignal?.aborted || modelController.signal.aborted)) {
253
354
  throw new Error("Pipeline download aborted");
254
355
  }
255
356
  throw error;
256
357
  } finally {
257
358
  modelAbortControllers.delete(modelPath);
359
+ const { random } = await loadTransformersSDK();
360
+ random.seed(model.provider_config.seed ?? undefined);
258
361
  }
259
362
  };
260
363
  var init_HFT_Pipeline = __esm(() => {
261
364
  modelAbortControllers = new Map;
262
365
  pipelines = new Map;
263
366
  pipelineLoadPromises = new Map;
367
+ IMAGE_PIPELINE_TYPES = new Set([
368
+ "image-classification",
369
+ "image-segmentation",
370
+ "object-detection",
371
+ "image-to-text",
372
+ "image-feature-extraction",
373
+ "zero-shot-image-classification",
374
+ "depth-estimation",
375
+ "mask-generation"
376
+ ]);
264
377
  });
265
378
 
266
379
  // src/provider-hf-transformers/common/HFT_Constants.ts
267
380
  var HF_TRANSFORMERS_ONNX = "HF_TRANSFORMERS_ONNX";
381
+ var HF_TRANSFORMERS_ONNX_GPU = `${HF_TRANSFORMERS_ONNX}_gpu`;
382
+ var HF_TRANSFORMERS_ONNX_CPU = `${HF_TRANSFORMERS_ONNX}_cpu`;
268
383
  var HTF_CACHE_NAME = "transformers-cache";
269
384
  var QuantizationDataType = {
270
385
  auto: "auto",
@@ -340,6 +455,11 @@ var HfTransformersOnnxModelSchema = {
340
455
  type: "string",
341
456
  description: "Filesystem path or URI for the ONNX model."
342
457
  },
458
+ revision: {
459
+ type: "string",
460
+ description: "Git revision (branch, tag, or commit hash) of the model repository.",
461
+ default: "main"
462
+ },
343
463
  dtype: {
344
464
  type: "string",
345
465
  enum: Object.values(QuantizationDataType),
@@ -389,6 +509,11 @@ var HfTransformersOnnxModelSchema = {
389
509
  type: "string",
390
510
  description: "The language style of the model."
391
511
  },
512
+ seed: {
513
+ type: "integer",
514
+ description: "RNG seed passed to transformers.js sampling. Omit for time-based seeding; set for reproducible generation.",
515
+ minimum: 0
516
+ },
392
517
  mrl: {
393
518
  type: "boolean",
394
519
  description: "Whether the model uses matryoshka.",
@@ -487,178 +612,6 @@ function parseOnnxQuantizations(params) {
487
612
  return set !== undefined && set.size === allBaseNames.size;
488
613
  });
489
614
  }
490
- // src/provider-hf-transformers/common/HFT_ToolMarkup.ts
491
- function parseToolCallsFromText(responseText) {
492
- const toolCalls = [];
493
- let callIndex = 0;
494
- let cleanedText = responseText;
495
- const toolCallTagRegex = /<tool_call>([\s\S]*?)<\/tool_call>/g;
496
- let tagMatch;
497
- while ((tagMatch = toolCallTagRegex.exec(responseText)) !== null) {
498
- try {
499
- const parsed = JSON.parse(tagMatch[1].trim());
500
- const id = `call_${callIndex++}`;
501
- toolCalls.push({
502
- id,
503
- name: parsed.name ?? parsed.function?.name ?? "",
504
- input: parsed.arguments ?? parsed.function?.arguments ?? parsed.parameters ?? {}
505
- });
506
- } catch {}
507
- }
508
- if (toolCalls.length > 0) {
509
- cleanedText = responseText.replace(/<tool_call>[\s\S]*?<\/tool_call>/g, "").trim();
510
- return { text: cleanedText, toolCalls };
511
- }
512
- const jsonCandidates = [];
513
- (function collectBalancedJsonBlocks(source) {
514
- const length = source.length;
515
- let i = 0;
516
- while (i < length) {
517
- if (source[i] !== "{") {
518
- i++;
519
- continue;
520
- }
521
- let depth = 1;
522
- let j = i + 1;
523
- let inString = false;
524
- let escape = false;
525
- while (j < length && depth > 0) {
526
- const ch = source[j];
527
- if (inString) {
528
- if (escape) {
529
- escape = false;
530
- } else if (ch === "\\") {
531
- escape = true;
532
- } else if (ch === '"') {
533
- inString = false;
534
- }
535
- } else {
536
- if (ch === '"') {
537
- inString = true;
538
- } else if (ch === "{") {
539
- depth++;
540
- } else if (ch === "}") {
541
- depth--;
542
- }
543
- }
544
- j++;
545
- }
546
- if (depth === 0) {
547
- jsonCandidates.push({ text: source.slice(i, j), start: i, end: j });
548
- i = j;
549
- } else {
550
- break;
551
- }
552
- }
553
- })(responseText);
554
- const matchedRanges = [];
555
- for (const candidate of jsonCandidates) {
556
- try {
557
- const parsed = JSON.parse(candidate.text);
558
- if (parsed.name && (parsed.arguments !== undefined || parsed.parameters !== undefined)) {
559
- const id = `call_${callIndex++}`;
560
- toolCalls.push({
561
- id,
562
- name: parsed.name,
563
- input: parsed.arguments ?? parsed.parameters ?? {}
564
- });
565
- matchedRanges.push({ start: candidate.start, end: candidate.end });
566
- } else if (parsed.function?.name) {
567
- let functionArgs = parsed.function.arguments ?? {};
568
- if (typeof functionArgs === "string") {
569
- try {
570
- functionArgs = JSON.parse(functionArgs);
571
- } catch (innerError) {
572
- console.warn("Failed to parse tool call function.arguments as JSON", innerError);
573
- functionArgs = {};
574
- }
575
- }
576
- const id = `call_${callIndex++}`;
577
- toolCalls.push({
578
- id,
579
- name: parsed.function.name,
580
- input: functionArgs ?? {}
581
- });
582
- matchedRanges.push({ start: candidate.start, end: candidate.end });
583
- }
584
- } catch {}
585
- }
586
- if (toolCalls.length > 0) {
587
- let result = "";
588
- let lastIndex = 0;
589
- for (const range of matchedRanges) {
590
- result += responseText.slice(lastIndex, range.start);
591
- lastIndex = range.end;
592
- }
593
- result += responseText.slice(lastIndex);
594
- cleanedText = result.trim();
595
- }
596
- return { text: cleanedText, toolCalls };
597
- }
598
- function createToolCallMarkupFilter(emit) {
599
- const OPEN_TAG = "<tool_call>";
600
- const CLOSE_TAG = "</tool_call>";
601
- let state = "text";
602
- let pending = "";
603
- function feed(token) {
604
- if (state === "tag") {
605
- pending += token;
606
- const closeIdx = pending.indexOf(CLOSE_TAG);
607
- if (closeIdx !== -1) {
608
- const afterClose = pending.slice(closeIdx + CLOSE_TAG.length);
609
- pending = "";
610
- state = "text";
611
- if (afterClose.length > 0) {
612
- feed(afterClose);
613
- }
614
- }
615
- return;
616
- }
617
- const combined = pending + token;
618
- const openIdx = combined.indexOf(OPEN_TAG);
619
- if (openIdx !== -1) {
620
- const before = combined.slice(0, openIdx);
621
- if (before.length > 0) {
622
- emit(before);
623
- }
624
- pending = "";
625
- state = "tag";
626
- const afterOpen = combined.slice(openIdx + OPEN_TAG.length);
627
- if (afterOpen.length > 0) {
628
- feed(afterOpen);
629
- }
630
- return;
631
- }
632
- let prefixLen = 0;
633
- for (let len = Math.min(combined.length, OPEN_TAG.length - 1);len >= 1; len--) {
634
- if (combined.endsWith(OPEN_TAG.slice(0, len))) {
635
- prefixLen = len;
636
- break;
637
- }
638
- }
639
- if (prefixLen > 0) {
640
- const safe = combined.slice(0, combined.length - prefixLen);
641
- if (safe.length > 0) {
642
- emit(safe);
643
- }
644
- pending = combined.slice(combined.length - prefixLen);
645
- } else {
646
- if (combined.length > 0) {
647
- emit(combined);
648
- }
649
- pending = "";
650
- }
651
- }
652
- function flush() {
653
- if (pending.length > 0 && state === "text") {
654
- emit(pending);
655
- pending = "";
656
- }
657
- pending = "";
658
- state = "text";
659
- }
660
- return { feed, flush };
661
- }
662
615
  // src/provider-hf-transformers/common/HFT_InlineLifecycle.ts
663
616
  async function clearHftInlinePipelineCache() {
664
617
  const { clearPipelineCache: clearPipelineCache2 } = await Promise.resolve().then(() => (init_HFT_Pipeline(), exports_HFT_Pipeline));
@@ -792,16 +745,10 @@ var HFT_BackgroundRemoval = async (input, model, onProgress, signal) => {
792
745
  // src/provider-hf-transformers/common/HFT_CountTokens.ts
793
746
  init_HFT_Pipeline();
794
747
  var HFT_CountTokens = async (input, model, onProgress, _signal) => {
795
- const isArrayInput = Array.isArray(input.text);
796
748
  const { AutoTokenizer } = await loadTransformersSDK();
797
749
  const tokenizer = await AutoTokenizer.from_pretrained(model.provider_config.model_path, {
798
750
  progress_callback: (progress) => onProgress(progress?.progress ?? 0)
799
751
  });
800
- if (isArrayInput) {
801
- const texts = input.text;
802
- const counts = texts.map((t) => tokenizer.encode(t).length);
803
- return { count: counts };
804
- }
805
752
  const tokenIds = tokenizer.encode(input.text);
806
753
  return { count: tokenIds.length };
807
754
  };
@@ -865,6 +812,15 @@ var HFT_ImageEmbedding = async (input, model, onProgress, signal) => {
865
812
  logger.debug("HFT ImageEmbedding: pipeline ready, generating embedding", {
866
813
  model: model?.provider_config.model_path
867
814
  });
815
+ if (Array.isArray(input.image)) {
816
+ const vectors = [];
817
+ for (const image of input.image) {
818
+ const result2 = await embedder(image);
819
+ vectors.push(result2.data);
820
+ }
821
+ logger.timeEnd(timerLabel, { count: vectors.length });
822
+ return { vector: vectors };
823
+ }
868
824
  const result = await embedder(input.image);
869
825
  logger.timeEnd(timerLabel, { dimensions: result?.data?.length });
870
826
  return {
@@ -914,18 +870,14 @@ var HFT_ModelInfo = async (input, model) => {
914
870
  logger.time(timerLabel, { model: model?.provider_config.model_path });
915
871
  const detail = input.detail;
916
872
  const is_loaded = hasCachedPipeline(getPipelineCacheKey(model));
917
- const { pipeline: pipelineType, model_path, dtype } = model.provider_config;
918
- const cacheStatus = await ModelRegistry.is_pipeline_cached_files(pipelineType, model_path, {
919
- ...dtype ? { dtype } : {}
920
- });
873
+ const { pipeline: pipelineType, model_path, dtype, device } = model.provider_config;
874
+ const cacheOptions = {
875
+ ...dtype ? { dtype } : {},
876
+ ...device ? { device } : {}
877
+ };
878
+ const cacheStatus = await ModelRegistry.is_pipeline_cached_files(pipelineType, model_path, cacheOptions);
921
879
  logger.debug("is_pipeline_cached", {
922
- input: [
923
- pipelineType,
924
- model_path,
925
- {
926
- ...dtype ? { dtype } : {}
927
- }
928
- ],
880
+ input: [pipelineType, model_path, cacheOptions],
929
881
  result: cacheStatus
930
882
  });
931
883
  const is_cached = is_loaded || cacheStatus.allCached;
@@ -1009,6 +961,7 @@ init_HFT_Pipeline();
1009
961
  import { parsePartialJson } from "@workglow/util/worker";
1010
962
 
1011
963
  // src/provider-hf-transformers/common/HFT_Streaming.ts
964
+ import { TaskAbortedError } from "@workglow/task-graph";
1012
965
  function createStreamEventQueue() {
1013
966
  const buffer = [];
1014
967
  let resolve = null;
@@ -1060,21 +1013,27 @@ function createStreamEventQueue() {
1060
1013
  };
1061
1014
  return { push, done, error, iterable };
1062
1015
  }
1063
- function createStreamingTextStreamer(tokenizer, queue, textStreamer) {
1016
+ function createStreamingTextStreamer(tokenizer, queue, textStreamer, signal) {
1064
1017
  return new textStreamer(tokenizer, {
1065
1018
  skip_prompt: true,
1066
1019
  decode_kwargs: { skip_special_tokens: true },
1067
1020
  callback_function: (text) => {
1021
+ if (signal?.aborted) {
1022
+ throw signal.reason ?? new TaskAbortedError("Generation aborted");
1023
+ }
1068
1024
  queue.push({ type: "text-delta", port: "text", textDelta: text });
1069
1025
  }
1070
1026
  });
1071
1027
  }
1072
- function createTextStreamer(tokenizer, updateProgress, textStreamer) {
1028
+ function createTextStreamer(tokenizer, updateProgress, textStreamer, signal) {
1073
1029
  let count = 0;
1074
1030
  return new textStreamer(tokenizer, {
1075
1031
  skip_prompt: true,
1076
1032
  decode_kwargs: { skip_special_tokens: true },
1077
1033
  callback_function: (text) => {
1034
+ if (signal?.aborted) {
1035
+ throw signal.reason ?? new TaskAbortedError("Generation aborted");
1036
+ }
1078
1037
  count++;
1079
1038
  const result = 100 * (1 - Math.exp(-0.05 * count));
1080
1039
  const progress = Math.round(Math.min(result, 100));
@@ -1137,7 +1096,7 @@ var HFT_StructuredGeneration = async (input, model, onProgress, signal) => {
1137
1096
  tokenize: false,
1138
1097
  add_generation_prompt: true
1139
1098
  });
1140
- const streamer = createTextStreamer(generateText.tokenizer, onProgress, TextStreamer);
1099
+ const streamer = createTextStreamer(generateText.tokenizer, onProgress, TextStreamer, signal);
1141
1100
  let results = await generateText(formattedPrompt, {
1142
1101
  max_new_tokens: input.maxTokens ?? 1024,
1143
1102
  temperature: input.temperature ?? undefined,
@@ -1162,7 +1121,7 @@ var HFT_StructuredGeneration_Stream = async function* (input, model, signal) {
1162
1121
  add_generation_prompt: true
1163
1122
  });
1164
1123
  const queue = createStreamEventQueue();
1165
- const streamer = createStreamingTextStreamer(generateText.tokenizer, queue, TextStreamer);
1124
+ const streamer = createStreamingTextStreamer(generateText.tokenizer, queue, TextStreamer, signal);
1166
1125
  let fullText = "";
1167
1126
  const originalPush = queue.push;
1168
1127
  queue.push = (event) => {
@@ -1198,22 +1157,12 @@ var HFT_StructuredGeneration_Stream = async function* (input, model, signal) {
1198
1157
  // src/provider-hf-transformers/common/HFT_TextClassification.ts
1199
1158
  init_HFT_Pipeline();
1200
1159
  var HFT_TextClassification = async (input, model, onProgress, signal) => {
1201
- const isArrayInput = Array.isArray(input.text);
1202
1160
  if (model?.provider_config?.pipeline === "zero-shot-classification") {
1203
1161
  if (!input.candidateLabels || !Array.isArray(input.candidateLabels) || input.candidateLabels.length === 0) {
1204
1162
  throw new Error("Zero-shot text classification requires candidate labels");
1205
1163
  }
1206
1164
  const zeroShotClassifier = await getPipeline(model, onProgress, {}, signal);
1207
1165
  const result2 = await zeroShotClassifier(input.text, input.candidateLabels, {});
1208
- if (isArrayInput) {
1209
- const results = Array.isArray(result2) && Array.isArray(result2[0]?.labels) ? result2 : [result2];
1210
- return {
1211
- categories: results.map((r) => r.labels.map((label, idx) => ({
1212
- label,
1213
- score: r.scores[idx]
1214
- })))
1215
- };
1216
- }
1217
1166
  return {
1218
1167
  categories: result2.labels.map((label, idx) => ({
1219
1168
  label,
@@ -1225,27 +1174,9 @@ var HFT_TextClassification = async (input, model, onProgress, signal) => {
1225
1174
  const result = await TextClassification(input.text, {
1226
1175
  top_k: input.maxCategories || undefined
1227
1176
  });
1228
- if (isArrayInput) {
1229
- return {
1230
- categories: result.map((perInput) => {
1231
- const items = Array.isArray(perInput) ? perInput : [perInput];
1232
- return items.map((category) => ({
1233
- label: category.label,
1234
- score: category.score
1235
- }));
1236
- })
1237
- };
1238
- }
1239
- if (Array.isArray(result[0])) {
1240
- return {
1241
- categories: result[0].map((category) => ({
1242
- label: category.label,
1243
- score: category.score
1244
- }))
1245
- };
1246
- }
1177
+ const items = Array.isArray(result[0]) ? result[0] : result;
1247
1178
  return {
1248
- categories: result.map((category) => ({
1179
+ categories: items.map((category) => ({
1249
1180
  label: category.label,
1250
1181
  score: category.score
1251
1182
  }))
@@ -1295,21 +1226,8 @@ var HFT_TextEmbedding = async (input, model, onProgress, signal) => {
1295
1226
  // src/provider-hf-transformers/common/HFT_TextFillMask.ts
1296
1227
  init_HFT_Pipeline();
1297
1228
  var HFT_TextFillMask = async (input, model, onProgress, signal) => {
1298
- const isArrayInput = Array.isArray(input.text);
1299
1229
  const unmasker = await getPipeline(model, onProgress, {}, signal);
1300
1230
  const results = await unmasker(input.text);
1301
- if (isArrayInput) {
1302
- return {
1303
- predictions: results.map((perInput) => {
1304
- const items = Array.isArray(perInput) ? perInput : [perInput];
1305
- return items.map((prediction) => ({
1306
- entity: prediction.token_str,
1307
- score: prediction.score,
1308
- sequence: prediction.sequence
1309
- }));
1310
- })
1311
- };
1312
- }
1313
1231
  let predictions = [];
1314
1232
  if (!Array.isArray(results)) {
1315
1233
  predictions = [results];
@@ -1332,26 +1250,19 @@ var HFT_TextGeneration = async (input, model, onProgress, signal) => {
1332
1250
  const logger = getLogger6();
1333
1251
  const timerLabel = `hft:TextGeneration:${model?.provider_config.model_path}`;
1334
1252
  logger.time(timerLabel, { model: model?.provider_config.model_path });
1335
- const isArrayInput = Array.isArray(input.prompt);
1336
1253
  const generateText = await getPipeline(model, onProgress, {}, signal);
1337
1254
  const { TextStreamer } = await loadTransformersSDK();
1338
1255
  logger.debug("HFT TextGeneration: pipeline ready, generating text", {
1339
1256
  model: model?.provider_config.model_path,
1340
- promptLength: isArrayInput ? input.prompt.length : input.prompt?.length
1257
+ promptLength: input.prompt?.length
1341
1258
  });
1342
- const streamer = isArrayInput ? undefined : createTextStreamer(generateText.tokenizer, onProgress, TextStreamer);
1343
- let results = await generateText(input.prompt, {
1344
- ...streamer ? { streamer } : {}
1259
+ const streamer = createTextStreamer(generateText.tokenizer, onProgress, TextStreamer, signal);
1260
+ const messages = [{ role: "user", content: input.prompt }];
1261
+ let results = await generateText(messages, {
1262
+ streamer,
1263
+ do_sample: false,
1264
+ max_new_tokens: input.maxTokens ?? 4 * 1024
1345
1265
  });
1346
- if (isArrayInput) {
1347
- const batchResults = Array.isArray(results) ? results : [results];
1348
- const texts = batchResults.map((r) => {
1349
- const seqs = Array.isArray(r) ? r : [r];
1350
- return extractGeneratedText(seqs[0]?.generated_text);
1351
- });
1352
- logger.timeEnd(timerLabel, { batchSize: texts.length });
1353
- return { text: texts };
1354
- }
1355
1266
  if (!Array.isArray(results)) {
1356
1267
  results = [results];
1357
1268
  }
@@ -1366,7 +1277,7 @@ var HFT_TextGeneration_Stream = async function* (input, model, signal) {
1366
1277
  const generateText = await getPipeline(model, noopProgress, {}, signal);
1367
1278
  const { TextStreamer } = await loadTransformersSDK();
1368
1279
  const queue = createStreamEventQueue();
1369
- const streamer = createStreamingTextStreamer(generateText.tokenizer, queue, TextStreamer);
1280
+ const streamer = createStreamingTextStreamer(generateText.tokenizer, queue, TextStreamer, signal);
1370
1281
  const pipelinePromise = generateText(input.prompt, {
1371
1282
  streamer
1372
1283
  }).then(() => queue.done(), (err) => queue.error(err));
@@ -1378,22 +1289,10 @@ var HFT_TextGeneration_Stream = async function* (input, model, signal) {
1378
1289
  // src/provider-hf-transformers/common/HFT_TextLanguageDetection.ts
1379
1290
  init_HFT_Pipeline();
1380
1291
  var HFT_TextLanguageDetection = async (input, model, onProgress, signal) => {
1381
- const isArrayInput = Array.isArray(input.text);
1382
1292
  const TextClassification = await getPipeline(model, onProgress, {}, signal);
1383
1293
  const result = await TextClassification(input.text, {
1384
1294
  top_k: input.maxLanguages || undefined
1385
1295
  });
1386
- if (isArrayInput) {
1387
- return {
1388
- languages: result.map((perInput) => {
1389
- const items = Array.isArray(perInput) ? perInput : [perInput];
1390
- return items.map((category) => ({
1391
- language: category.label,
1392
- score: category.score
1393
- }));
1394
- })
1395
- };
1396
- }
1397
1296
  if (Array.isArray(result[0])) {
1398
1297
  return {
1399
1298
  languages: result[0].map((category) => ({
@@ -1413,23 +1312,10 @@ var HFT_TextLanguageDetection = async (input, model, onProgress, signal) => {
1413
1312
  // src/provider-hf-transformers/common/HFT_TextNamedEntityRecognition.ts
1414
1313
  init_HFT_Pipeline();
1415
1314
  var HFT_TextNamedEntityRecognition = async (input, model, onProgress, signal) => {
1416
- const isArrayInput = Array.isArray(input.text);
1417
1315
  const textNamedEntityRecognition = await getPipeline(model, onProgress, {}, signal);
1418
1316
  const results = await textNamedEntityRecognition(input.text, {
1419
1317
  ignore_labels: input.blockList
1420
1318
  });
1421
- if (isArrayInput) {
1422
- return {
1423
- entities: results.map((perInput) => {
1424
- const items = Array.isArray(perInput) ? perInput : [perInput];
1425
- return items.map((entity) => ({
1426
- entity: entity.entity,
1427
- score: entity.score,
1428
- word: entity.word
1429
- }));
1430
- })
1431
- };
1432
- }
1433
1319
  let entities = [];
1434
1320
  if (!Array.isArray(results)) {
1435
1321
  entities = [results];
@@ -1448,29 +1334,9 @@ var HFT_TextNamedEntityRecognition = async (input, model, onProgress, signal) =>
1448
1334
  // src/provider-hf-transformers/common/HFT_TextQuestionAnswer.ts
1449
1335
  init_HFT_Pipeline();
1450
1336
  var HFT_TextQuestionAnswer = async (input, model, onProgress, signal) => {
1451
- const isArrayInput = Array.isArray(input.question);
1452
1337
  const generateAnswer = await getPipeline(model, onProgress, {}, signal);
1453
- if (isArrayInput) {
1454
- const questions = input.question;
1455
- const contexts = input.context;
1456
- if (questions.length !== contexts.length) {
1457
- throw new Error(`question[] and context[] must have the same length: ${questions.length} != ${contexts.length}`);
1458
- }
1459
- const answers = [];
1460
- for (let i = 0;i < questions.length; i++) {
1461
- const result2 = await generateAnswer(questions[i], contexts[i], {});
1462
- let answerText2 = "";
1463
- if (Array.isArray(result2)) {
1464
- answerText2 = result2[0]?.answer || "";
1465
- } else {
1466
- answerText2 = result2?.answer || "";
1467
- }
1468
- answers.push(answerText2);
1469
- }
1470
- return { text: answers };
1471
- }
1472
1338
  const { TextStreamer } = await loadTransformersSDK();
1473
- const streamer = createTextStreamer(generateAnswer.tokenizer, onProgress, TextStreamer);
1339
+ const streamer = createTextStreamer(generateAnswer.tokenizer, onProgress, TextStreamer, signal);
1474
1340
  const result = await generateAnswer(input.question, input.context, {
1475
1341
  streamer
1476
1342
  });
@@ -1489,7 +1355,7 @@ var HFT_TextQuestionAnswer_Stream = async function* (input, model, signal) {
1489
1355
  const generateAnswer = await getPipeline(model, noopProgress, {}, signal);
1490
1356
  const { TextStreamer } = await loadTransformersSDK();
1491
1357
  const queue = createStreamEventQueue();
1492
- const streamer = createStreamingTextStreamer(generateAnswer.tokenizer, queue, TextStreamer);
1358
+ const streamer = createStreamingTextStreamer(generateAnswer.tokenizer, queue, TextStreamer, signal);
1493
1359
  let pipelineResult;
1494
1360
  const pipelinePromise = generateAnswer(input.question, input.context, {
1495
1361
  streamer
@@ -1513,30 +1379,13 @@ var HFT_TextQuestionAnswer_Stream = async function* (input, model, signal) {
1513
1379
  // src/provider-hf-transformers/common/HFT_TextRewriter.ts
1514
1380
  init_HFT_Pipeline();
1515
1381
  var HFT_TextRewriter = async (input, model, onProgress, signal) => {
1516
- const isArrayInput = Array.isArray(input.text);
1517
1382
  const generateText = await getPipeline(model, onProgress, {}, signal);
1518
1383
  const { TextStreamer } = await loadTransformersSDK();
1519
- const streamer = isArrayInput ? undefined : createTextStreamer(generateText.tokenizer, onProgress, TextStreamer);
1520
- if (isArrayInput) {
1521
- const texts = input.text;
1522
- const promptedTexts = texts.map((t) => (input.prompt ? input.prompt + `
1523
- ` : "") + t);
1524
- let results2 = await generateText(promptedTexts, {});
1525
- const batchResults = Array.isArray(results2) ? results2 : [results2];
1526
- const outputTexts = batchResults.map((r, i) => {
1527
- const seqs = Array.isArray(r) ? r : [r];
1528
- const text2 = extractGeneratedText(seqs[0]?.generated_text);
1529
- if (text2 === promptedTexts[i]) {
1530
- throw new Error("Rewriter failed to generate new text");
1531
- }
1532
- return text2;
1533
- });
1534
- return { text: outputTexts };
1535
- }
1384
+ const streamer = createTextStreamer(generateText.tokenizer, onProgress, TextStreamer, signal);
1536
1385
  const promptedText = (input.prompt ? input.prompt + `
1537
1386
  ` : "") + input.text;
1538
1387
  let results = await generateText(promptedText, {
1539
- ...streamer ? { streamer } : {}
1388
+ streamer
1540
1389
  });
1541
1390
  if (!Array.isArray(results)) {
1542
1391
  results = [results];
@@ -1554,7 +1403,7 @@ var HFT_TextRewriter_Stream = async function* (input, model, signal) {
1554
1403
  const generateText = await getPipeline(model, noopProgress, {}, signal);
1555
1404
  const { TextStreamer } = await loadTransformersSDK();
1556
1405
  const queue = createStreamEventQueue();
1557
- const streamer = createStreamingTextStreamer(generateText.tokenizer, queue, TextStreamer);
1406
+ const streamer = createStreamingTextStreamer(generateText.tokenizer, queue, TextStreamer, signal);
1558
1407
  const promptedText = (input.prompt ? input.prompt + `
1559
1408
  ` : "") + input.text;
1560
1409
  const pipelinePromise = generateText(promptedText, {
@@ -1568,19 +1417,12 @@ var HFT_TextRewriter_Stream = async function* (input, model, signal) {
1568
1417
  // src/provider-hf-transformers/common/HFT_TextSummary.ts
1569
1418
  init_HFT_Pipeline();
1570
1419
  var HFT_TextSummary = async (input, model, onProgress, signal) => {
1571
- const isArrayInput = Array.isArray(input.text);
1572
1420
  const generateSummary = await getPipeline(model, onProgress, {}, signal);
1573
1421
  const { TextStreamer } = await loadTransformersSDK();
1574
- const streamer = isArrayInput ? undefined : createTextStreamer(generateSummary.tokenizer, onProgress, TextStreamer);
1422
+ const streamer = createTextStreamer(generateSummary.tokenizer, onProgress, TextStreamer, signal);
1575
1423
  const result = await generateSummary(input.text, {
1576
- ...streamer ? { streamer } : {}
1424
+ streamer
1577
1425
  });
1578
- if (isArrayInput) {
1579
- const batchResults = Array.isArray(result) ? result : [result];
1580
- return {
1581
- text: batchResults.map((r) => r?.summary_text || "")
1582
- };
1583
- }
1584
1426
  let summaryText = "";
1585
1427
  if (Array.isArray(result)) {
1586
1428
  summaryText = result[0]?.summary_text || "";
@@ -1596,7 +1438,7 @@ var HFT_TextSummary_Stream = async function* (input, model, signal) {
1596
1438
  const generateSummary = await getPipeline(model, noopProgress, {}, signal);
1597
1439
  const { TextStreamer } = await loadTransformersSDK();
1598
1440
  const queue = createStreamEventQueue();
1599
- const streamer = createStreamingTextStreamer(generateSummary.tokenizer, queue, TextStreamer);
1441
+ const streamer = createStreamingTextStreamer(generateSummary.tokenizer, queue, TextStreamer, signal);
1600
1442
  const pipelinePromise = generateSummary(input.text, {
1601
1443
  streamer
1602
1444
  }).then(() => queue.done(), (err) => queue.error(err));
@@ -1608,22 +1450,14 @@ var HFT_TextSummary_Stream = async function* (input, model, signal) {
1608
1450
  // src/provider-hf-transformers/common/HFT_TextTranslation.ts
1609
1451
  init_HFT_Pipeline();
1610
1452
  var HFT_TextTranslation = async (input, model, onProgress, signal) => {
1611
- const isArrayInput = Array.isArray(input.text);
1612
1453
  const translate = await getPipeline(model, onProgress, {}, signal);
1613
1454
  const { TextStreamer } = await loadTransformersSDK();
1614
- const streamer = isArrayInput ? undefined : createTextStreamer(translate.tokenizer, onProgress, TextStreamer);
1455
+ const streamer = createTextStreamer(translate.tokenizer, onProgress, TextStreamer, signal);
1615
1456
  const result = await translate(input.text, {
1616
1457
  src_lang: input.source_lang,
1617
1458
  tgt_lang: input.target_lang,
1618
- ...streamer ? { streamer } : {}
1459
+ streamer
1619
1460
  });
1620
- if (isArrayInput) {
1621
- const batchResults = Array.isArray(result) ? result : [result];
1622
- return {
1623
- text: batchResults.map((r) => r?.translation_text || ""),
1624
- target_lang: input.target_lang
1625
- };
1626
- }
1627
1461
  const translatedText = Array.isArray(result) ? result[0]?.translation_text || "" : result?.translation_text || "";
1628
1462
  return {
1629
1463
  text: translatedText,
@@ -1635,7 +1469,7 @@ var HFT_TextTranslation_Stream = async function* (input, model, signal) {
1635
1469
  const translate = await getPipeline(model, noopProgress, {}, signal);
1636
1470
  const { TextStreamer } = await loadTransformersSDK();
1637
1471
  const queue = createStreamEventQueue();
1638
- const streamer = createStreamingTextStreamer(translate.tokenizer, queue, TextStreamer);
1472
+ const streamer = createStreamingTextStreamer(translate.tokenizer, queue, TextStreamer, signal);
1639
1473
  const pipelinePromise = translate(input.text, {
1640
1474
  src_lang: input.source_lang,
1641
1475
  tgt_lang: input.target_lang,
@@ -1646,162 +1480,6 @@ var HFT_TextTranslation_Stream = async function* (input, model, signal) {
1646
1480
  yield { type: "finish", data: { target_lang: input.target_lang } };
1647
1481
  };
1648
1482
 
1649
- // src/provider-hf-transformers/common/HFT_ToolCalling.ts
1650
- init_HFT_Pipeline();
1651
- import {
1652
- buildToolDescription,
1653
- filterValidToolCalls,
1654
- toTextFlatMessages
1655
- } from "@workglow/ai/worker";
1656
- function mapHFTTools(tools) {
1657
- return tools.map((t) => ({
1658
- type: "function",
1659
- function: {
1660
- name: t.name,
1661
- description: buildToolDescription(t),
1662
- parameters: t.inputSchema
1663
- }
1664
- }));
1665
- }
1666
- function resolveHFTToolsAndMessages(input, messages) {
1667
- if (input.toolChoice === "none") {
1668
- return;
1669
- }
1670
- if (input.toolChoice === "required") {
1671
- const requiredInstruction = "You must call at least one tool from the provided tool list when answering.";
1672
- if (messages.length > 0 && messages[0].role === "system") {
1673
- messages[0] = { ...messages[0], content: `${messages[0].content}
1674
-
1675
- ${requiredInstruction}` };
1676
- } else {
1677
- messages.unshift({ role: "system", content: requiredInstruction });
1678
- }
1679
- return mapHFTTools(input.tools);
1680
- }
1681
- if (typeof input.toolChoice === "string" && input.toolChoice !== "auto") {
1682
- const selectedTools = input.tools?.filter((tool) => tool.name === input.toolChoice);
1683
- const toolsToMap = selectedTools && selectedTools.length > 0 ? selectedTools : input.tools;
1684
- return mapHFTTools(toolsToMap);
1685
- }
1686
- return mapHFTTools(input.tools);
1687
- }
1688
- var HFT_ToolCalling = async (input, model, onProgress, signal) => {
1689
- const isArrayInput = Array.isArray(input.prompt);
1690
- const generateText = await getPipeline(model, onProgress, {}, signal);
1691
- const { TextStreamer } = await loadTransformersSDK();
1692
- if (isArrayInput) {
1693
- const prompts = input.prompt;
1694
- const texts = [];
1695
- const toolCallsList = [];
1696
- for (const singlePrompt of prompts) {
1697
- const singleInput = { ...input, prompt: singlePrompt };
1698
- const messages2 = toTextFlatMessages(singleInput);
1699
- const tools2 = resolveHFTToolsAndMessages(singleInput, messages2);
1700
- const prompt2 = generateText.tokenizer.apply_chat_template(messages2, {
1701
- tools: tools2,
1702
- tokenize: false,
1703
- add_generation_prompt: true
1704
- });
1705
- const streamer2 = createTextStreamer(generateText.tokenizer, onProgress, TextStreamer);
1706
- let results2 = await generateText(prompt2, {
1707
- max_new_tokens: input.maxTokens ?? 1024,
1708
- temperature: input.temperature ?? undefined,
1709
- return_full_text: false,
1710
- streamer: streamer2
1711
- });
1712
- if (!Array.isArray(results2)) {
1713
- results2 = [results2];
1714
- }
1715
- const responseText2 = extractGeneratedText(results2[0]?.generated_text).trim();
1716
- const { text: text2, toolCalls: toolCalls2 } = parseToolCallsFromText(responseText2);
1717
- texts.push(text2);
1718
- toolCallsList.push(filterValidToolCalls(toolCalls2, singleInput.tools));
1719
- }
1720
- return { text: texts, toolCalls: toolCallsList };
1721
- }
1722
- const messages = toTextFlatMessages(input);
1723
- const tools = resolveHFTToolsAndMessages(input, messages);
1724
- const prompt = generateText.tokenizer.apply_chat_template(messages, {
1725
- tools,
1726
- tokenize: false,
1727
- add_generation_prompt: true
1728
- });
1729
- const streamer = createTextStreamer(generateText.tokenizer, onProgress, TextStreamer);
1730
- let results = await generateText(prompt, {
1731
- max_new_tokens: input.maxTokens ?? 1024,
1732
- temperature: input.temperature ?? undefined,
1733
- return_full_text: false,
1734
- streamer
1735
- });
1736
- if (!Array.isArray(results)) {
1737
- results = [results];
1738
- }
1739
- const responseText = extractGeneratedText(results[0]?.generated_text).trim();
1740
- const { text, toolCalls } = parseToolCallsFromText(responseText);
1741
- return {
1742
- text,
1743
- toolCalls: filterValidToolCalls(toolCalls, input.tools)
1744
- };
1745
- };
1746
- var HFT_ToolCalling_Stream = async function* (input, model, signal) {
1747
- const noopProgress = () => {};
1748
- const generateText = await getPipeline(model, noopProgress, {}, signal);
1749
- const { TextStreamer } = await loadTransformersSDK();
1750
- const messages = toTextFlatMessages(input);
1751
- const tools = resolveHFTToolsAndMessages(input, messages);
1752
- const prompt = generateText.tokenizer.apply_chat_template(messages, {
1753
- tools,
1754
- tokenize: false,
1755
- add_generation_prompt: true
1756
- });
1757
- const innerQueue = createStreamEventQueue();
1758
- const outerQueue = createStreamEventQueue();
1759
- const streamer = createStreamingTextStreamer(generateText.tokenizer, innerQueue, TextStreamer);
1760
- let fullText = "";
1761
- const filter = createToolCallMarkupFilter((text) => {
1762
- outerQueue.push({ type: "text-delta", port: "text", textDelta: text });
1763
- });
1764
- const originalPush = innerQueue.push;
1765
- innerQueue.push = (event) => {
1766
- if (event.type === "text-delta" && "textDelta" in event) {
1767
- fullText += event.textDelta;
1768
- filter.feed(event.textDelta);
1769
- } else {
1770
- outerQueue.push(event);
1771
- }
1772
- originalPush(event);
1773
- };
1774
- const originalDone = innerQueue.done;
1775
- innerQueue.done = () => {
1776
- filter.flush();
1777
- outerQueue.done();
1778
- originalDone();
1779
- };
1780
- const originalError = innerQueue.error;
1781
- innerQueue.error = (e) => {
1782
- filter.flush();
1783
- outerQueue.error(e);
1784
- originalError(e);
1785
- };
1786
- const pipelinePromise = generateText(prompt, {
1787
- max_new_tokens: input.maxTokens ?? 1024,
1788
- temperature: input.temperature ?? undefined,
1789
- return_full_text: false,
1790
- streamer
1791
- }).then(() => innerQueue.done(), (err) => innerQueue.error(err));
1792
- yield* outerQueue.iterable;
1793
- await pipelinePromise;
1794
- const { text: cleanedText, toolCalls } = parseToolCallsFromText(fullText);
1795
- const validToolCalls = filterValidToolCalls(toolCalls, input.tools);
1796
- if (validToolCalls.length > 0) {
1797
- yield { type: "object-delta", port: "toolCalls", objectDelta: [...validToolCalls] };
1798
- }
1799
- yield {
1800
- type: "finish",
1801
- data: { text: cleanedText, toolCalls: validToolCalls }
1802
- };
1803
- };
1804
-
1805
1483
  // src/provider-hf-transformers/common/HFT_Unload.ts
1806
1484
  init_HFT_Pipeline();
1807
1485
  function hasBrowserCacheStorage() {
@@ -1877,7 +1555,6 @@ var HFT_TASKS = {
1877
1555
  ImageEmbeddingTask: HFT_ImageEmbedding,
1878
1556
  ImageClassificationTask: HFT_ImageClassification,
1879
1557
  ObjectDetectionTask: HFT_ObjectDetection,
1880
- ToolCallingTask: HFT_ToolCalling,
1881
1558
  StructuredGenerationTask: HFT_StructuredGeneration,
1882
1559
  ModelSearchTask: HFT_ModelSearch
1883
1560
  };
@@ -1887,7 +1564,6 @@ var HFT_STREAM_TASKS = {
1887
1564
  TextSummaryTask: HFT_TextSummary_Stream,
1888
1565
  TextQuestionAnswerTask: HFT_TextQuestionAnswer_Stream,
1889
1566
  TextTranslationTask: HFT_TextTranslation_Stream,
1890
- ToolCallingTask: HFT_ToolCalling_Stream,
1891
1567
  StructuredGenerationTask: HFT_StructuredGeneration_Stream
1892
1568
  };
1893
1569
  var HFT_REACTIVE_TASKS = {
@@ -1898,11 +1574,34 @@ var HFT_REACTIVE_TASKS = {
1898
1574
  import {
1899
1575
  QueuedAiProvider
1900
1576
  } from "@workglow/ai";
1577
+ var GPU_DEVICES = new Set(["webgpu", "gpu", "metal"]);
1578
+ var HFT_CPU_QUEUE_CONCURRENCY_PRODUCTION = 4;
1579
+ function hftIsAutomatedTestEnvironment() {
1580
+ if (typeof process === "undefined") {
1581
+ return false;
1582
+ }
1583
+ const e = process.env;
1584
+ return e.VITEST === "true" || e.NODE_ENV === "test" || e.BUN_TEST === "1" || e.JEST_WORKER_ID !== undefined;
1585
+ }
1586
+ function hftDefaultCpuQueueConcurrency() {
1587
+ return hftIsAutomatedTestEnvironment() ? 1 : HFT_CPU_QUEUE_CONCURRENCY_PRODUCTION;
1588
+ }
1589
+ function resolveHftCpuQueueConcurrency(concurrency, defaultCpu) {
1590
+ if (concurrency === undefined) {
1591
+ return defaultCpu();
1592
+ }
1593
+ if (typeof concurrency === "number") {
1594
+ return defaultCpu();
1595
+ }
1596
+ return concurrency.cpu ?? defaultCpu();
1597
+ }
1598
+
1901
1599
  class HuggingFaceTransformersQueuedProvider extends QueuedAiProvider {
1902
1600
  name = HF_TRANSFORMERS_ONNX;
1903
1601
  displayName = "Hugging Face Transformers (ONNX)";
1904
1602
  isLocal = true;
1905
1603
  supportsBrowser = true;
1604
+ cpuStrategy;
1906
1605
  taskTypes = [
1907
1606
  "DownloadModelTask",
1908
1607
  "UnloadModelTask",
@@ -1924,12 +1623,22 @@ class HuggingFaceTransformersQueuedProvider extends QueuedAiProvider {
1924
1623
  "ImageEmbeddingTask",
1925
1624
  "ImageClassificationTask",
1926
1625
  "ObjectDetectionTask",
1927
- "ToolCallingTask",
1928
1626
  "ModelSearchTask"
1929
1627
  ];
1930
1628
  constructor(tasks, streamTasks, reactiveTasks) {
1931
1629
  super(tasks, streamTasks, reactiveTasks);
1932
1630
  }
1631
+ async afterRegister(options) {
1632
+ await super.afterRegister(options);
1633
+ this.cpuStrategy = this.createQueuedStrategy(HF_TRANSFORMERS_ONNX_CPU, resolveHftCpuQueueConcurrency(options.queue?.concurrency, hftDefaultCpuQueueConcurrency), options);
1634
+ }
1635
+ getStrategyForModel(model) {
1636
+ const device = model.provider_config?.device;
1637
+ if (device && GPU_DEVICES.has(device)) {
1638
+ return this.queuedStrategy;
1639
+ }
1640
+ return this.cpuStrategy;
1641
+ }
1933
1642
  }
1934
1643
 
1935
1644
  // src/provider-hf-transformers/registerHuggingFaceTransformersInline.ts
@@ -1978,7 +1687,6 @@ class HuggingFaceTransformersProvider extends AiProvider {
1978
1687
  "ImageEmbeddingTask",
1979
1688
  "ImageClassificationTask",
1980
1689
  "ObjectDetectionTask",
1981
- "ToolCallingTask",
1982
1690
  "ModelSearchTask"
1983
1691
  ];
1984
1692
  constructor(tasks, streamTasks, reactiveTasks) {
@@ -1989,7 +1697,9 @@ class HuggingFaceTransformersProvider extends AiProvider {
1989
1697
  // src/provider-hf-transformers/registerHuggingFaceTransformersWorker.ts
1990
1698
  init_HFT_Pipeline();
1991
1699
  async function registerHuggingFaceTransformersWorker() {
1992
- const { env } = await loadTransformersSDK();
1700
+ const sdk = await loadTransformersSDK();
1701
+ globalThis.__HFT__ = sdk;
1702
+ const { env } = sdk;
1993
1703
  env.backends.onnx.wasm.proxy = true;
1994
1704
  const workerServer = globalServiceRegistry.get(WORKER_SERVER);
1995
1705
  new HuggingFaceTransformersProvider(HFT_TASKS, HFT_STREAM_TASKS, HFT_REACTIVE_TASKS).registerOnWorkerServer(workerServer);
@@ -2004,13 +1714,11 @@ export {
2004
1714
  removeCachedPipeline,
2005
1715
  registerHuggingFaceTransformersWorker,
2006
1716
  registerHuggingFaceTransformersInline,
2007
- parseToolCallsFromText,
2008
1717
  parseOnnxQuantizations,
2009
1718
  loadTransformersSDK,
2010
1719
  hasCachedPipeline,
2011
1720
  getPipelineCacheKey,
2012
1721
  getPipeline,
2013
- createToolCallMarkupFilter,
2014
1722
  clearPipelineCache,
2015
1723
  QuantizationDataType,
2016
1724
  PipelineUseCase,
@@ -2019,7 +1727,10 @@ export {
2019
1727
  HfTransformersOnnxModelRecordSchema,
2020
1728
  HfTransformersOnnxModelConfigSchema,
2021
1729
  HTF_CACHE_NAME,
2022
- HF_TRANSFORMERS_ONNX
1730
+ HF_TRANSFORMERS_ONNX_GPU,
1731
+ HF_TRANSFORMERS_ONNX_CPU,
1732
+ HF_TRANSFORMERS_ONNX,
1733
+ HFT_NULL_PROCESSOR_PREFIX
2023
1734
  };
2024
1735
 
2025
- //# debugId=6F10F5E049CF8D0264756E2164756E21
1736
+ //# debugId=569221876AC5558564756E2164756E21