@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.
- package/dist/provider-anthropic/AnthropicProvider.d.ts +1 -1
- package/dist/provider-anthropic/AnthropicProvider.d.ts.map +1 -1
- package/dist/provider-anthropic/AnthropicQueuedProvider.d.ts +4 -4
- package/dist/provider-anthropic/AnthropicQueuedProvider.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_Client.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_CountTokens.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_JobRunFns.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_TextGeneration.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_TextRewriter.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_TextSummary.d.ts.map +1 -1
- package/dist/provider-anthropic/index.js +3 -4
- package/dist/provider-anthropic/index.js.map +3 -3
- package/dist/provider-anthropic/runtime.js +19 -291
- package/dist/provider-anthropic/runtime.js.map +11 -12
- package/dist/provider-chrome/common/WebBrowser_TextGeneration.d.ts.map +1 -1
- package/dist/provider-chrome/common/WebBrowser_TextLanguageDetection.d.ts.map +1 -1
- package/dist/provider-chrome/common/WebBrowser_TextRewriter.d.ts.map +1 -1
- package/dist/provider-chrome/common/WebBrowser_TextSummary.d.ts.map +1 -1
- package/dist/provider-chrome/common/WebBrowser_TextTranslation.d.ts.map +1 -1
- package/dist/provider-chrome/runtime.js +3 -97
- package/dist/provider-chrome/runtime.js.map +8 -8
- package/dist/provider-gemini/GoogleGeminiProvider.d.ts +1 -1
- package/dist/provider-gemini/GoogleGeminiProvider.d.ts.map +1 -1
- package/dist/provider-gemini/GoogleGeminiQueuedProvider.d.ts +4 -4
- package/dist/provider-gemini/GoogleGeminiQueuedProvider.d.ts.map +1 -1
- package/dist/provider-gemini/common/Gemini_CountTokens.d.ts.map +1 -1
- package/dist/provider-gemini/common/Gemini_JobRunFns.d.ts.map +1 -1
- package/dist/provider-gemini/common/Gemini_TextEmbedding.d.ts.map +1 -1
- package/dist/provider-gemini/common/Gemini_TextGeneration.d.ts.map +1 -1
- package/dist/provider-gemini/common/Gemini_TextRewriter.d.ts.map +1 -1
- package/dist/provider-gemini/common/Gemini_TextSummary.d.ts.map +1 -1
- package/dist/provider-gemini/index.js +3 -4
- package/dist/provider-gemini/index.js.map +3 -3
- package/dist/provider-gemini/runtime.js +12 -257
- package/dist/provider-gemini/runtime.js.map +11 -12
- package/dist/provider-hf-inference/HfInferenceProvider.d.ts +1 -1
- package/dist/provider-hf-inference/HfInferenceProvider.d.ts.map +1 -1
- package/dist/provider-hf-inference/HfInferenceQueuedProvider.d.ts +4 -4
- package/dist/provider-hf-inference/HfInferenceQueuedProvider.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_Client.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_JobRunFns.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_TextEmbedding.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_TextGeneration.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_TextRewriter.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_TextSummary.d.ts.map +1 -1
- package/dist/provider-hf-inference/index.js +3 -4
- package/dist/provider-hf-inference/index.js.map +3 -3
- package/dist/provider-hf-inference/runtime.js +13 -206
- package/dist/provider-hf-inference/runtime.js.map +11 -12
- package/dist/provider-hf-transformers/HuggingFaceTransformersProvider.d.ts +1 -1
- package/dist/provider-hf-transformers/HuggingFaceTransformersProvider.d.ts.map +1 -1
- package/dist/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.d.ts +13 -3
- package/dist/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_Constants.d.ts +4 -0
- package/dist/provider-hf-transformers/common/HFT_Constants.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_CountTokens.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_Download.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_ImageEmbedding.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_JobRunFns.d.ts +116 -87
- package/dist/provider-hf-transformers/common/HFT_JobRunFns.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_ModelInfo.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_ModelSchema.d.ts +30 -0
- package/dist/provider-hf-transformers/common/HFT_ModelSchema.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_OnnxDtypes.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_Pipeline.d.ts +9 -2
- package/dist/provider-hf-transformers/common/HFT_Pipeline.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_Streaming.d.ts +2 -2
- package/dist/provider-hf-transformers/common/HFT_Streaming.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextClassification.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextFillMask.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextGeneration.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextLanguageDetection.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextNamedEntityRecognition.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextQuestionAnswer.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextRewriter.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextSummary.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextTranslation.d.ts.map +1 -1
- package/dist/provider-hf-transformers/index.d.ts +0 -1
- package/dist/provider-hf-transformers/index.d.ts.map +1 -1
- package/dist/provider-hf-transformers/index.js +49 -177
- package/dist/provider-hf-transformers/index.js.map +8 -9
- package/dist/provider-hf-transformers/registerHuggingFaceTransformersWorker.d.ts.map +1 -1
- package/dist/provider-hf-transformers/runtime.d.ts +0 -1
- package/dist/provider-hf-transformers/runtime.d.ts.map +1 -1
- package/dist/provider-hf-transformers/runtime.js +226 -515
- package/dist/provider-hf-transformers/runtime.js.map +27 -29
- package/dist/provider-llamacpp/LlamaCppProvider.d.ts +1 -1
- package/dist/provider-llamacpp/LlamaCppProvider.d.ts.map +1 -1
- package/dist/provider-llamacpp/LlamaCppQueuedProvider.d.ts +1 -1
- package/dist/provider-llamacpp/LlamaCppQueuedProvider.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_CountTokens.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_JobRunFns.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_ModelSchema.d.ts +15 -0
- package/dist/provider-llamacpp/common/LlamaCpp_ModelSchema.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_Runtime.d.ts +10 -0
- package/dist/provider-llamacpp/common/LlamaCpp_Runtime.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_StructuredGeneration.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_TextEmbedding.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_TextGeneration.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_TextRewriter.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_TextSummary.d.ts.map +1 -1
- package/dist/provider-llamacpp/index.js +6 -2
- package/dist/provider-llamacpp/index.js.map +4 -4
- package/dist/provider-llamacpp/runtime.js +82 -230
- package/dist/provider-llamacpp/runtime.js.map +13 -14
- package/dist/provider-ollama/OllamaProvider.d.ts +1 -1
- package/dist/provider-ollama/OllamaProvider.d.ts.map +1 -1
- package/dist/provider-ollama/OllamaQueuedProvider.d.ts +4 -4
- package/dist/provider-ollama/OllamaQueuedProvider.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts +13 -71
- package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts +13 -71
- package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_TextGeneration.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_TextRewriter.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_TextSummary.d.ts.map +1 -1
- package/dist/provider-ollama/index.browser.js +3 -4
- package/dist/provider-ollama/index.browser.js.map +3 -3
- package/dist/provider-ollama/index.js +3 -4
- package/dist/provider-ollama/index.js.map +3 -3
- package/dist/provider-ollama/runtime.browser.js +8 -179
- package/dist/provider-ollama/runtime.browser.js.map +9 -10
- package/dist/provider-ollama/runtime.js +8 -174
- package/dist/provider-ollama/runtime.js.map +9 -10
- package/dist/provider-openai/OpenAiProvider.d.ts +1 -1
- package/dist/provider-openai/OpenAiProvider.d.ts.map +1 -1
- package/dist/provider-openai/OpenAiQueuedProvider.d.ts +4 -4
- package/dist/provider-openai/OpenAiQueuedProvider.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_Client.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_CountTokens.browser.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_CountTokens.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_JobRunFns.browser.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_JobRunFns.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_TextEmbedding.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_TextGeneration.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_TextRewriter.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_TextSummary.d.ts.map +1 -1
- package/dist/provider-openai/index.browser.js +3 -4
- package/dist/provider-openai/index.browser.js.map +3 -3
- package/dist/provider-openai/index.js +3 -4
- package/dist/provider-openai/index.js.map +3 -3
- package/dist/provider-openai/runtime.browser.js +22 -224
- package/dist/provider-openai/runtime.browser.js.map +12 -13
- package/dist/provider-openai/runtime.js +22 -224
- package/dist/provider-openai/runtime.js.map +12 -13
- package/dist/provider-tf-mediapipe/TensorFlowMediaPipeQueuedProvider.d.ts +3 -3
- package/dist/provider-tf-mediapipe/TensorFlowMediaPipeQueuedProvider.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/common/TFMP_ImageEmbedding.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/common/TFMP_JobRunFns.d.ts +17 -10
- package/dist/provider-tf-mediapipe/common/TFMP_JobRunFns.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/common/TFMP_Unload.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/index.js +3 -3
- package/dist/provider-tf-mediapipe/index.js.map +3 -3
- package/dist/provider-tf-mediapipe/runtime.js +16 -5
- package/dist/provider-tf-mediapipe/runtime.js.map +5 -5
- package/package.json +19 -19
- package/dist/provider-anthropic/common/Anthropic_ToolCalling.d.ts +0 -10
- package/dist/provider-anthropic/common/Anthropic_ToolCalling.d.ts.map +0 -1
- package/dist/provider-gemini/common/Gemini_ToolCalling.d.ts +0 -10
- package/dist/provider-gemini/common/Gemini_ToolCalling.d.ts.map +0 -1
- package/dist/provider-hf-inference/common/HFI_ToolCalling.d.ts +0 -10
- package/dist/provider-hf-inference/common/HFI_ToolCalling.d.ts.map +0 -1
- package/dist/provider-hf-transformers/common/HFT_ToolCalling.d.ts +0 -10
- package/dist/provider-hf-transformers/common/HFT_ToolCalling.d.ts.map +0 -1
- package/dist/provider-hf-transformers/common/HFT_ToolMarkup.d.ts +0 -40
- package/dist/provider-hf-transformers/common/HFT_ToolMarkup.d.ts.map +0 -1
- package/dist/provider-llamacpp/common/LlamaCpp_ToolCalling.d.ts +0 -10
- package/dist/provider-llamacpp/common/LlamaCpp_ToolCalling.d.ts.map +0 -1
- package/dist/provider-ollama/common/Ollama_ToolCalling.d.ts +0 -16
- package/dist/provider-ollama/common/Ollama_ToolCalling.d.ts.map +0 -1
- package/dist/provider-openai/common/OpenAI_ToolCalling.d.ts +0 -10
- 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
|
|
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
|
-
|
|
154
|
+
modelSignal = controller.signal;
|
|
63
155
|
break;
|
|
64
156
|
}
|
|
65
157
|
}
|
|
66
158
|
} catch {}
|
|
67
|
-
|
|
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 || "
|
|
181
|
+
const dtype = model.provider_config.dtype || "";
|
|
89
182
|
const device = model.provider_config.device || "";
|
|
90
|
-
|
|
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
|
-
|
|
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 = "
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
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:
|
|
1257
|
+
promptLength: input.prompt?.length
|
|
1341
1258
|
});
|
|
1342
|
-
const streamer =
|
|
1343
|
-
|
|
1344
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
1422
|
+
const streamer = createTextStreamer(generateSummary.tokenizer, onProgress, TextStreamer, signal);
|
|
1575
1423
|
const result = await generateSummary(input.text, {
|
|
1576
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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=
|
|
1736
|
+
//# debugId=569221876AC5558564756E2164756E21
|