@workglow/huggingface-inference 0.2.28

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 (53) hide show
  1. package/dist/ai-provider/HfInferenceProvider.d.ts +27 -0
  2. package/dist/ai-provider/HfInferenceProvider.d.ts.map +1 -0
  3. package/dist/ai-provider/HfInferenceQueuedProvider.d.ts +18 -0
  4. package/dist/ai-provider/HfInferenceQueuedProvider.d.ts.map +1 -0
  5. package/dist/ai-provider/common/HFI_AspectRatio.d.ts +15 -0
  6. package/dist/ai-provider/common/HFI_AspectRatio.d.ts.map +1 -0
  7. package/dist/ai-provider/common/HFI_Client.d.ts +12 -0
  8. package/dist/ai-provider/common/HFI_Client.d.ts.map +1 -0
  9. package/dist/ai-provider/common/HFI_Constants.d.ts +7 -0
  10. package/dist/ai-provider/common/HFI_Constants.d.ts.map +1 -0
  11. package/dist/ai-provider/common/HFI_ImageEdit.d.ts +14 -0
  12. package/dist/ai-provider/common/HFI_ImageEdit.d.ts.map +1 -0
  13. package/dist/ai-provider/common/HFI_ImageGenerate.d.ts +14 -0
  14. package/dist/ai-provider/common/HFI_ImageGenerate.d.ts.map +1 -0
  15. package/dist/ai-provider/common/HFI_ImageValidation.d.ts +7 -0
  16. package/dist/ai-provider/common/HFI_ImageValidation.d.ts.map +1 -0
  17. package/dist/ai-provider/common/HFI_JobRunFns.d.ts +11 -0
  18. package/dist/ai-provider/common/HFI_JobRunFns.d.ts.map +1 -0
  19. package/dist/ai-provider/common/HFI_ModelInfo.d.ts +9 -0
  20. package/dist/ai-provider/common/HFI_ModelInfo.d.ts.map +1 -0
  21. package/dist/ai-provider/common/HFI_ModelSchema.d.ts +152 -0
  22. package/dist/ai-provider/common/HFI_ModelSchema.d.ts.map +1 -0
  23. package/dist/ai-provider/common/HFI_ModelSearch.d.ts +8 -0
  24. package/dist/ai-provider/common/HFI_ModelSearch.d.ts.map +1 -0
  25. package/dist/ai-provider/common/HFI_TextEmbedding.d.ts +9 -0
  26. package/dist/ai-provider/common/HFI_TextEmbedding.d.ts.map +1 -0
  27. package/dist/ai-provider/common/HFI_TextGeneration.d.ts +10 -0
  28. package/dist/ai-provider/common/HFI_TextGeneration.d.ts.map +1 -0
  29. package/dist/ai-provider/common/HFI_TextRewriter.d.ts +10 -0
  30. package/dist/ai-provider/common/HFI_TextRewriter.d.ts.map +1 -0
  31. package/dist/ai-provider/common/HFI_TextSummary.d.ts +10 -0
  32. package/dist/ai-provider/common/HFI_TextSummary.d.ts.map +1 -0
  33. package/dist/ai-provider/common/HFI_ToolCalling.d.ts +10 -0
  34. package/dist/ai-provider/common/HFI_ToolCalling.d.ts.map +1 -0
  35. package/dist/ai-provider/index.d.ts +12 -0
  36. package/dist/ai-provider/index.d.ts.map +1 -0
  37. package/dist/ai-provider/registerHfInference.d.ts +10 -0
  38. package/dist/ai-provider/registerHfInference.d.ts.map +1 -0
  39. package/dist/ai-provider/registerHfInferenceInline.d.ts +8 -0
  40. package/dist/ai-provider/registerHfInferenceInline.d.ts.map +1 -0
  41. package/dist/ai-provider/registerHfInferenceWorker.d.ts +7 -0
  42. package/dist/ai-provider/registerHfInferenceWorker.d.ts.map +1 -0
  43. package/dist/ai-provider/runtime.d.ts +16 -0
  44. package/dist/ai-provider/runtime.d.ts.map +1 -0
  45. package/dist/ai-provider-runtime.d.ts +7 -0
  46. package/dist/ai-provider-runtime.d.ts.map +1 -0
  47. package/dist/ai-provider-runtime.js +670 -0
  48. package/dist/ai-provider-runtime.js.map +27 -0
  49. package/dist/ai-provider.d.ts +7 -0
  50. package/dist/ai-provider.d.ts.map +1 -0
  51. package/dist/ai-provider.js +199 -0
  52. package/dist/ai-provider.js.map +16 -0
  53. package/package.json +60 -0
@@ -0,0 +1,670 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined")
5
+ return require.apply(this, arguments);
6
+ throw Error('Dynamic require of "' + x + '" is not supported');
7
+ });
8
+
9
+ // src/ai-provider/common/HFI_Client.ts
10
+ var _sdk;
11
+ async function loadHfInferenceSDK() {
12
+ if (!_sdk) {
13
+ try {
14
+ _sdk = await import("@huggingface/inference");
15
+ } catch {
16
+ throw new Error("@huggingface/inference is required for Hugging Face Inference tasks. Install it with: bun add @huggingface/inference");
17
+ }
18
+ }
19
+ return _sdk;
20
+ }
21
+ async function getClient(model) {
22
+ const sdk = await loadHfInferenceSDK();
23
+ const config = model?.provider_config;
24
+ const apiKey = config?.credential_key || config?.api_key || (typeof process !== "undefined" ? process.env?.HF_TOKEN : undefined);
25
+ if (!apiKey) {
26
+ throw new Error("Missing Hugging Face API key: set provider_config.credential_key or the HF_TOKEN environment variable.");
27
+ }
28
+ try {
29
+ return new sdk.InferenceClient(apiKey);
30
+ } catch (err) {
31
+ throw new Error(`Failed to create HuggingFace Inference client: ${err instanceof Error ? err.message : "unknown error"}`);
32
+ }
33
+ }
34
+ function getModelName(model) {
35
+ const name = model?.provider_config?.model_name;
36
+ if (!name) {
37
+ throw new Error("Missing model name in provider_config.model_name.");
38
+ }
39
+ return name;
40
+ }
41
+ function getProvider(model) {
42
+ return model?.provider_config?.provider;
43
+ }
44
+
45
+ // src/ai-provider/registerHfInferenceInline.ts
46
+ import { registerProviderInline } from "@workglow/ai-provider/common";
47
+
48
+ // src/ai-provider/common/HFI_ModelSearch.ts
49
+ import { mapHfModelResult, searchHfModels } from "@workglow/ai-provider/common";
50
+ import { filterLabeledModelsByQuery } from "@workglow/ai-provider/common";
51
+
52
+ // src/ai-provider/common/HFI_Constants.ts
53
+ var HF_INFERENCE = "HF_INFERENCE";
54
+
55
+ // src/ai-provider/common/HFI_ModelSearch.ts
56
+ var HFI_IMAGE_MODELS = [
57
+ { id: "black-forest-labs/FLUX.1-schnell", tasks: ["ImageGenerateTask"] },
58
+ { id: "black-forest-labs/FLUX.1-Kontext-dev", tasks: ["ImageEditTask"] }
59
+ ];
60
+ function buildFallbackResults() {
61
+ return HFI_IMAGE_MODELS.map((m) => ({
62
+ id: m.id,
63
+ label: m.id,
64
+ description: "",
65
+ record: {
66
+ model_id: m.id,
67
+ provider: HF_INFERENCE,
68
+ title: m.id.split("/").pop() ?? m.id,
69
+ description: "",
70
+ tasks: m.tasks,
71
+ provider_config: { model_name: m.id },
72
+ metadata: {}
73
+ },
74
+ raw: m
75
+ }));
76
+ }
77
+ var HFI_ModelSearch = async (input, _model, _onProgress, signal) => {
78
+ const query = input.query?.trim() ?? "";
79
+ if (!input.credential_key) {
80
+ const fallback = buildFallbackResults();
81
+ const labeled = fallback.map((r) => ({ label: r.label, value: r.id }));
82
+ const filtered = filterLabeledModelsByQuery(labeled, query).map((m) => fallback.find((r) => r.id === m.value));
83
+ return { results: filtered };
84
+ }
85
+ const entries = await searchHfModels(query, undefined, undefined, signal, input.credential_key);
86
+ const results = entries.map((entry) => {
87
+ const imageEntry = HFI_IMAGE_MODELS.find((m) => m.id === entry.id);
88
+ const mapped = mapHfModelResult(entry, HF_INFERENCE);
89
+ if (imageEntry) {
90
+ mapped.record.tasks = imageEntry.tasks;
91
+ }
92
+ return mapped;
93
+ });
94
+ return { results };
95
+ };
96
+
97
+ // src/ai-provider/common/HFI_ImageEdit.ts
98
+ import { ImageGenerationContentPolicyError, ImageGenerationProviderError } from "@workglow/ai";
99
+ import { getLogger } from "@workglow/util/worker";
100
+ import { blobToImageValue, imageValueToPngBytes } from "@workglow/ai-provider/common";
101
+
102
+ // src/ai-provider/common/HFI_AspectRatio.ts
103
+ var FLUX_DIMS = {
104
+ "1:1": { width: 1024, height: 1024 },
105
+ "16:9": { width: 1344, height: 768 },
106
+ "9:16": { width: 768, height: 1344 },
107
+ "4:3": { width: 1152, height: 896 },
108
+ "3:4": { width: 896, height: 1152 }
109
+ };
110
+ var SDXL_DIMS = {
111
+ "1:1": { width: 1024, height: 1024 },
112
+ "16:9": { width: 1280, height: 720 },
113
+ "9:16": { width: 720, height: 1280 },
114
+ "4:3": { width: 1024, height: 768 },
115
+ "3:4": { width: 768, height: 1024 }
116
+ };
117
+ var DEFAULT_DIMS = SDXL_DIMS;
118
+ var MODEL_DIM_TABLE = [
119
+ { pattern: /^black-forest-labs\/FLUX/i, dims: FLUX_DIMS },
120
+ { pattern: /^stabilityai\/.*-xl/i, dims: SDXL_DIMS }
121
+ ];
122
+ function resolveHfImageDims(modelId, aspectRatio) {
123
+ const entry = MODEL_DIM_TABLE.find((e) => e.pattern.test(modelId));
124
+ return (entry?.dims ?? DEFAULT_DIMS)[aspectRatio];
125
+ }
126
+ function isHfInpaintingModel(modelId) {
127
+ return /inpaint|kontext/i.test(modelId);
128
+ }
129
+
130
+ // src/ai-provider/common/HFI_ImageEdit.ts
131
+ function modelIdOf(model) {
132
+ return model?.model_id ?? model?.provider_config?.model_name ?? "huggingface";
133
+ }
134
+ async function gpuImageToBlob(image) {
135
+ const bytes = await imageValueToPngBytes(image);
136
+ const buffer = bytes.buffer instanceof ArrayBuffer ? bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) : new Uint8Array(bytes).buffer;
137
+ return new Blob([buffer], { type: "image/png" });
138
+ }
139
+ var HFI_ImageEdit = async (input, model, update_progress, signal) => {
140
+ const logger = getLogger();
141
+ const timer = `hfi:ImageEdit:${getModelName(model)}`;
142
+ logger.time(timer);
143
+ update_progress(0, "Starting HF image edit");
144
+ try {
145
+ const client = await getClient(model);
146
+ const modelName = getModelName(model);
147
+ const dims = resolveHfImageDims(modelName, input.aspectRatio ?? "1:1");
148
+ const inputBlob = await gpuImageToBlob(input.image);
149
+ const params = {
150
+ width: dims.width,
151
+ height: dims.height,
152
+ seed: input.seed,
153
+ negative_prompt: input.negativePrompt,
154
+ prompt: input.prompt,
155
+ ...input.providerOptions ?? {}
156
+ };
157
+ if (input.mask) {
158
+ const maskBlob = await gpuImageToBlob(input.mask);
159
+ params.mask_image = maskBlob;
160
+ }
161
+ const blob = await client.imageToImage({
162
+ model: modelName,
163
+ inputs: inputBlob,
164
+ parameters: params
165
+ }, { signal });
166
+ const image = await blobToImageValue(blob);
167
+ update_progress(100, "Completed HF image edit");
168
+ logger.timeEnd(timer);
169
+ return { image };
170
+ } catch (err) {
171
+ if (err instanceof ImageGenerationProviderError || err instanceof ImageGenerationContentPolicyError)
172
+ throw err;
173
+ const msg = err instanceof Error ? err.message : "unknown error";
174
+ if (/NSFW|safety|policy/i.test(msg))
175
+ throw new ImageGenerationContentPolicyError(modelIdOf(model), msg);
176
+ throw new ImageGenerationProviderError(modelIdOf(model), msg, { cause: err });
177
+ }
178
+ };
179
+ var HFI_ImageEdit_Stream = async function* (input, model, signal) {
180
+ const result = await HFI_ImageEdit(input, model, () => {}, signal);
181
+ if (signal.aborted)
182
+ return;
183
+ yield { type: "snapshot", data: result };
184
+ yield { type: "finish", data: {} };
185
+ };
186
+
187
+ // src/ai-provider/common/HFI_ImageGenerate.ts
188
+ import { ImageGenerationContentPolicyError as ImageGenerationContentPolicyError2, ImageGenerationProviderError as ImageGenerationProviderError2 } from "@workglow/ai";
189
+ import { getLogger as getLogger2 } from "@workglow/util/worker";
190
+ import { blobToImageValue as blobToImageValue2 } from "@workglow/ai-provider/common";
191
+ function modelIdOf2(model) {
192
+ return model?.model_id ?? model?.provider_config?.model_name ?? "huggingface";
193
+ }
194
+ var HFI_ImageGenerate = async (input, model, update_progress, signal) => {
195
+ const logger = getLogger2();
196
+ const timer = `hfi:ImageGenerate:${getModelName(model)}`;
197
+ logger.time(timer);
198
+ update_progress(0, "Starting HF image generation");
199
+ try {
200
+ const client = await getClient(model);
201
+ const modelName = getModelName(model);
202
+ const dims = resolveHfImageDims(modelName, input.aspectRatio ?? "1:1");
203
+ const blob = await client.textToImage({
204
+ model: modelName,
205
+ inputs: input.prompt,
206
+ parameters: {
207
+ width: dims.width,
208
+ height: dims.height,
209
+ seed: input.seed,
210
+ negative_prompt: input.negativePrompt,
211
+ ...input.providerOptions ?? {}
212
+ }
213
+ }, { outputType: "blob", signal });
214
+ const image = await blobToImageValue2(blob);
215
+ update_progress(100, "Completed HF image generation");
216
+ logger.timeEnd(timer);
217
+ return { image };
218
+ } catch (err) {
219
+ if (err instanceof ImageGenerationProviderError2 || err instanceof ImageGenerationContentPolicyError2)
220
+ throw err;
221
+ const msg = err instanceof Error ? err.message : "unknown error";
222
+ if (/NSFW|safety|policy/i.test(msg))
223
+ throw new ImageGenerationContentPolicyError2(modelIdOf2(model), msg);
224
+ throw new ImageGenerationProviderError2(modelIdOf2(model), msg, { cause: err });
225
+ }
226
+ };
227
+ var HFI_ImageGenerate_Stream = async function* (input, model, signal) {
228
+ const result = await HFI_ImageGenerate(input, model, () => {}, signal);
229
+ if (signal.aborted)
230
+ return;
231
+ yield { type: "snapshot", data: result };
232
+ yield { type: "finish", data: {} };
233
+ };
234
+
235
+ // src/ai-provider/common/HFI_ModelInfo.ts
236
+ var HFI_ModelInfo = async (input, model) => {
237
+ if (input.detail === "dimensions") {
238
+ const pc = model?.provider_config;
239
+ const native_dimensions = typeof pc?.native_dimensions === "number" ? pc.native_dimensions : undefined;
240
+ const mrl = typeof pc?.mrl === "boolean" ? pc.mrl : false;
241
+ return {
242
+ model: input.model,
243
+ is_local: false,
244
+ is_remote: true,
245
+ supports_browser: true,
246
+ supports_node: true,
247
+ is_cached: false,
248
+ is_loaded: false,
249
+ file_sizes: null,
250
+ ...native_dimensions !== undefined ? { native_dimensions } : {},
251
+ ...mrl ? { mrl } : {}
252
+ };
253
+ }
254
+ return {
255
+ model: input.model,
256
+ is_local: false,
257
+ is_remote: true,
258
+ supports_browser: true,
259
+ supports_node: true,
260
+ is_cached: false,
261
+ is_loaded: false,
262
+ file_sizes: null
263
+ };
264
+ };
265
+
266
+ // src/ai-provider/common/HFI_TextEmbedding.ts
267
+ import { getLogger as getLogger3 } from "@workglow/util/worker";
268
+ var HFI_TextEmbedding = async (input, model, update_progress, signal) => {
269
+ const logger = getLogger3();
270
+ const timerLabel = `hfi:TextEmbedding:${model?.provider_config?.model_name}`;
271
+ logger.time(timerLabel, { model: model?.provider_config?.model_name });
272
+ update_progress(0, "Starting HF Inference text embedding");
273
+ const client = await getClient(model);
274
+ const modelName = getModelName(model);
275
+ if (Array.isArray(input.text)) {
276
+ const embeddings = await Promise.all(input.text.map((text) => client.featureExtraction({
277
+ model: modelName,
278
+ inputs: text
279
+ }, { signal })));
280
+ update_progress(100, "Completed HF Inference text embedding");
281
+ logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name, batch: true });
282
+ return {
283
+ vector: embeddings.map((embedding2) => new Float32Array(embedding2))
284
+ };
285
+ }
286
+ const embedding = await client.featureExtraction({
287
+ model: modelName,
288
+ inputs: input.text
289
+ }, { signal });
290
+ update_progress(100, "Completed HF Inference text embedding");
291
+ logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });
292
+ return { vector: new Float32Array(embedding) };
293
+ };
294
+
295
+ // src/ai-provider/common/HFI_TextGeneration.ts
296
+ import { getLogger as getLogger4 } from "@workglow/util/worker";
297
+ var HFI_TextGeneration = async (input, model, update_progress, signal) => {
298
+ const logger = getLogger4();
299
+ const timerLabel = `hfi:TextGeneration:${model?.provider_config?.model_name}`;
300
+ logger.time(timerLabel, { model: model?.provider_config?.model_name });
301
+ update_progress(0, "Starting HF Inference text generation");
302
+ const client = await getClient(model);
303
+ const modelName = getModelName(model);
304
+ const provider = getProvider(model);
305
+ const response = await client.chatCompletion({
306
+ model: modelName,
307
+ messages: [{ role: "user", content: input.prompt }],
308
+ max_tokens: input.maxTokens,
309
+ temperature: input.temperature,
310
+ top_p: input.topP,
311
+ frequency_penalty: input.frequencyPenalty,
312
+ provider
313
+ }, { signal });
314
+ update_progress(100, "Completed HF Inference text generation");
315
+ logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });
316
+ return { text: response.choices[0]?.message?.content ?? "" };
317
+ };
318
+ var HFI_TextGeneration_Stream = async function* (input, model, signal) {
319
+ const client = await getClient(model);
320
+ const modelName = getModelName(model);
321
+ const provider = getProvider(model);
322
+ const stream = client.chatCompletionStream({
323
+ model: modelName,
324
+ messages: [{ role: "user", content: input.prompt }],
325
+ max_tokens: input.maxTokens,
326
+ temperature: input.temperature,
327
+ top_p: input.topP,
328
+ frequency_penalty: input.frequencyPenalty,
329
+ provider
330
+ }, { signal });
331
+ for await (const chunk of stream) {
332
+ const delta = chunk.choices[0]?.delta?.content ?? "";
333
+ if (delta) {
334
+ yield { type: "text-delta", port: "text", textDelta: delta };
335
+ }
336
+ }
337
+ yield { type: "finish", data: {} };
338
+ };
339
+
340
+ // src/ai-provider/common/HFI_TextRewriter.ts
341
+ var HFI_TextRewriter = async (input, model, update_progress, signal) => {
342
+ update_progress(0, "Starting HF Inference text rewriting");
343
+ const client = await getClient(model);
344
+ const modelName = getModelName(model);
345
+ const provider = getProvider(model);
346
+ const response = await client.chatCompletion({
347
+ model: modelName,
348
+ messages: [
349
+ { role: "system", content: input.prompt },
350
+ { role: "user", content: input.text }
351
+ ],
352
+ provider
353
+ }, { signal });
354
+ update_progress(100, "Completed HF Inference text rewriting");
355
+ return { text: response.choices[0]?.message?.content ?? "" };
356
+ };
357
+ var HFI_TextRewriter_Stream = async function* (input, model, signal) {
358
+ const client = await getClient(model);
359
+ const modelName = getModelName(model);
360
+ const provider = getProvider(model);
361
+ const stream = client.chatCompletionStream({
362
+ model: modelName,
363
+ messages: [
364
+ { role: "system", content: input.prompt },
365
+ { role: "user", content: input.text }
366
+ ],
367
+ provider
368
+ }, { signal });
369
+ for await (const chunk of stream) {
370
+ const delta = chunk.choices[0]?.delta?.content ?? "";
371
+ if (delta) {
372
+ yield { type: "text-delta", port: "text", textDelta: delta };
373
+ }
374
+ }
375
+ yield { type: "finish", data: {} };
376
+ };
377
+
378
+ // src/ai-provider/common/HFI_TextSummary.ts
379
+ var HFI_TextSummary = async (input, model, update_progress, signal) => {
380
+ update_progress(0, "Starting HF Inference text summarization");
381
+ const client = await getClient(model);
382
+ const modelName = getModelName(model);
383
+ const provider = getProvider(model);
384
+ const response = await client.chatCompletion({
385
+ model: modelName,
386
+ messages: [
387
+ { role: "system", content: "Summarize the following text concisely." },
388
+ { role: "user", content: input.text }
389
+ ],
390
+ provider
391
+ }, { signal });
392
+ update_progress(100, "Completed HF Inference text summarization");
393
+ return { text: response.choices[0]?.message?.content ?? "" };
394
+ };
395
+ var HFI_TextSummary_Stream = async function* (input, model, signal) {
396
+ const client = await getClient(model);
397
+ const modelName = getModelName(model);
398
+ const provider = getProvider(model);
399
+ const stream = client.chatCompletionStream({
400
+ model: modelName,
401
+ messages: [
402
+ { role: "system", content: "Summarize the following text concisely." },
403
+ { role: "user", content: input.text }
404
+ ],
405
+ provider
406
+ }, { signal });
407
+ for await (const chunk of stream) {
408
+ const delta = chunk.choices[0]?.delta?.content ?? "";
409
+ if (delta) {
410
+ yield { type: "text-delta", port: "text", textDelta: delta };
411
+ }
412
+ }
413
+ yield { type: "finish", data: {} };
414
+ };
415
+
416
+ // src/ai-provider/common/HFI_ToolCalling.ts
417
+ import { buildToolDescription, filterValidToolCalls, toOpenAIMessages } from "@workglow/ai/worker";
418
+ import { parsePartialJson } from "@workglow/util/worker";
419
+ function mapHFIToolChoice(toolChoice) {
420
+ if (!toolChoice || toolChoice === "auto")
421
+ return "auto";
422
+ if (toolChoice === "none")
423
+ return "none";
424
+ if (toolChoice === "required")
425
+ return "required";
426
+ return "auto";
427
+ }
428
+ var HFI_ToolCalling = async (input, model, update_progress, signal) => {
429
+ update_progress(0, "Starting HF Inference tool calling");
430
+ const client = await getClient(model);
431
+ const modelName = getModelName(model);
432
+ const provider = getProvider(model);
433
+ const tools = input.tools.map((t) => ({
434
+ type: "function",
435
+ function: {
436
+ name: t.name,
437
+ description: buildToolDescription(t),
438
+ parameters: t.inputSchema
439
+ }
440
+ }));
441
+ const messages = toOpenAIMessages(input);
442
+ const toolChoice = mapHFIToolChoice(input.toolChoice);
443
+ const params = {
444
+ model: modelName,
445
+ messages,
446
+ max_tokens: input.maxTokens,
447
+ temperature: input.temperature,
448
+ provider
449
+ };
450
+ if (toolChoice !== "none") {
451
+ params.tools = tools;
452
+ params.tool_choice = toolChoice;
453
+ }
454
+ const response = await client.chatCompletion(params, { signal });
455
+ const text = response.choices[0]?.message?.content ?? "";
456
+ const toolCalls = [];
457
+ let callIndex = 0;
458
+ (response.choices[0]?.message?.tool_calls ?? []).forEach((tc) => {
459
+ let parsedInput = {};
460
+ const rawArgs = tc.function?.arguments;
461
+ if (typeof rawArgs === "string") {
462
+ try {
463
+ parsedInput = JSON.parse(rawArgs);
464
+ } catch {
465
+ const partial = parsePartialJson(rawArgs);
466
+ parsedInput = partial ?? {};
467
+ }
468
+ } else if (rawArgs != null) {
469
+ parsedInput = rawArgs;
470
+ }
471
+ const id = tc.id ?? `call_${callIndex}`;
472
+ callIndex++;
473
+ toolCalls.push({ id, name: tc.function.name, input: parsedInput });
474
+ });
475
+ update_progress(100, "Completed HF Inference tool calling");
476
+ return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };
477
+ };
478
+ var HFI_ToolCalling_Stream = async function* (input, model, signal) {
479
+ const client = await getClient(model);
480
+ const modelName = getModelName(model);
481
+ const provider = getProvider(model);
482
+ const tools = input.tools.map((t) => ({
483
+ type: "function",
484
+ function: {
485
+ name: t.name,
486
+ description: buildToolDescription(t),
487
+ parameters: t.inputSchema
488
+ }
489
+ }));
490
+ const messages = toOpenAIMessages(input);
491
+ const toolChoice = mapHFIToolChoice(input.toolChoice);
492
+ const params = {
493
+ model: modelName,
494
+ messages,
495
+ max_tokens: input.maxTokens,
496
+ temperature: input.temperature,
497
+ provider
498
+ };
499
+ if (toolChoice !== "none") {
500
+ params.tools = tools;
501
+ params.tool_choice = toolChoice;
502
+ }
503
+ const stream = client.chatCompletionStream(params, { signal });
504
+ let accumulatedText = "";
505
+ const toolCallAccumulator = new Map;
506
+ for await (const chunk of stream) {
507
+ const choice = chunk.choices[0];
508
+ if (!choice)
509
+ continue;
510
+ const contentDelta = choice.delta?.content ?? "";
511
+ if (contentDelta) {
512
+ accumulatedText += contentDelta;
513
+ yield { type: "text-delta", port: "text", textDelta: contentDelta };
514
+ }
515
+ const tcDeltas = choice.delta?.tool_calls;
516
+ if (Array.isArray(tcDeltas)) {
517
+ for (const tcDelta of tcDeltas) {
518
+ const idx = tcDelta.index;
519
+ if (!toolCallAccumulator.has(idx)) {
520
+ toolCallAccumulator.set(idx, {
521
+ id: tcDelta.id ?? "",
522
+ name: tcDelta.function?.name ?? "",
523
+ arguments: ""
524
+ });
525
+ }
526
+ const acc = toolCallAccumulator.get(idx);
527
+ if (tcDelta.id)
528
+ acc.id = tcDelta.id;
529
+ if (tcDelta.function?.name)
530
+ acc.name = tcDelta.function.name;
531
+ if (tcDelta.function?.arguments)
532
+ acc.arguments += tcDelta.function.arguments;
533
+ }
534
+ const snapshot = [];
535
+ for (const [, tc] of toolCallAccumulator) {
536
+ let parsedInput;
537
+ try {
538
+ parsedInput = JSON.parse(tc.arguments);
539
+ } catch {
540
+ const partial = parsePartialJson(tc.arguments);
541
+ parsedInput = partial ?? {};
542
+ }
543
+ snapshot.push({ id: tc.id, name: tc.name, input: parsedInput });
544
+ }
545
+ yield { type: "object-delta", port: "toolCalls", objectDelta: snapshot };
546
+ }
547
+ }
548
+ const toolCalls = [];
549
+ for (const [, tc] of toolCallAccumulator) {
550
+ let finalInput;
551
+ try {
552
+ finalInput = JSON.parse(tc.arguments);
553
+ } catch {
554
+ finalInput = parsePartialJson(tc.arguments) ?? {};
555
+ }
556
+ toolCalls.push({ id: tc.id, name: tc.name, input: finalInput });
557
+ }
558
+ const validToolCalls = filterValidToolCalls(toolCalls, input.tools);
559
+ yield {
560
+ type: "finish",
561
+ data: { text: accumulatedText, toolCalls: validToolCalls }
562
+ };
563
+ };
564
+
565
+ // src/ai-provider/common/HFI_JobRunFns.ts
566
+ var HFI_TASKS = {
567
+ ModelInfoTask: HFI_ModelInfo,
568
+ TextGenerationTask: HFI_TextGeneration,
569
+ TextEmbeddingTask: HFI_TextEmbedding,
570
+ TextRewriterTask: HFI_TextRewriter,
571
+ TextSummaryTask: HFI_TextSummary,
572
+ ToolCallingTask: HFI_ToolCalling,
573
+ ModelSearchTask: HFI_ModelSearch,
574
+ ImageGenerateTask: HFI_ImageGenerate,
575
+ ImageEditTask: HFI_ImageEdit
576
+ };
577
+ var HFI_STREAM_TASKS = {
578
+ TextGenerationTask: HFI_TextGeneration_Stream,
579
+ TextRewriterTask: HFI_TextRewriter_Stream,
580
+ TextSummaryTask: HFI_TextSummary_Stream,
581
+ ToolCallingTask: HFI_ToolCalling_Stream,
582
+ ImageGenerateTask: HFI_ImageGenerate_Stream,
583
+ ImageEditTask: HFI_ImageEdit_Stream
584
+ };
585
+
586
+ // src/ai-provider/HfInferenceQueuedProvider.ts
587
+ import { AiProvider } from "@workglow/ai";
588
+ class HfInferenceQueuedProvider extends AiProvider {
589
+ name = HF_INFERENCE;
590
+ displayName = "Hugging Face Inference";
591
+ isLocal = false;
592
+ supportsBrowser = true;
593
+ taskTypes = [
594
+ "ModelInfoTask",
595
+ "TextGenerationTask",
596
+ "TextEmbeddingTask",
597
+ "TextRewriterTask",
598
+ "TextSummaryTask",
599
+ "ToolCallingTask",
600
+ "ModelSearchTask",
601
+ "ImageGenerateTask",
602
+ "ImageEditTask"
603
+ ];
604
+ constructor(tasks, streamTasks, previewTasks) {
605
+ super(tasks, streamTasks, previewTasks);
606
+ }
607
+ }
608
+
609
+ // src/ai-provider/common/HFI_ImageValidation.ts
610
+ import { AiImageOutputTask, ProviderUnsupportedFeatureError } from "@workglow/ai";
611
+ function registerHfImageValidator() {
612
+ AiImageOutputTask.registerProviderImageValidator(HF_INFERENCE, (taskType, input, model) => {
613
+ if (taskType !== "ImageEditTask")
614
+ return;
615
+ const modelId = model.model_id ?? "";
616
+ const modelName = model.provider_config?.model_name ?? modelId;
617
+ const additional = input["additionalImages"];
618
+ if (Array.isArray(additional) && additional.length > 0) {
619
+ throw new ProviderUnsupportedFeatureError("additionalImages", modelId, "HF Inference image-to-image only supports a single input image");
620
+ }
621
+ if (input["mask"] !== undefined && input["mask"] !== null && !isHfInpaintingModel(modelName)) {
622
+ throw new ProviderUnsupportedFeatureError("mask", modelId, "Mask is only supported on HF inpainting models (e.g., FLUX.1-Kontext-dev)");
623
+ }
624
+ });
625
+ }
626
+
627
+ // src/ai-provider/registerHfInferenceInline.ts
628
+ async function registerHfInferenceInline(options) {
629
+ registerHfImageValidator();
630
+ await registerProviderInline(new HfInferenceQueuedProvider(HFI_TASKS, HFI_STREAM_TASKS), "Hugging Face Inference", options);
631
+ }
632
+
633
+ // src/ai-provider/registerHfInferenceWorker.ts
634
+ import { registerProviderWorker } from "@workglow/ai-provider/common";
635
+
636
+ // src/ai-provider/HfInferenceProvider.ts
637
+ import { AiProvider as AiProvider2 } from "@workglow/ai/worker";
638
+ class HfInferenceProvider extends AiProvider2 {
639
+ name = HF_INFERENCE;
640
+ displayName = "Hugging Face Inference";
641
+ isLocal = false;
642
+ supportsBrowser = true;
643
+ taskTypes = [
644
+ "ModelInfoTask",
645
+ "TextGenerationTask",
646
+ "TextEmbeddingTask",
647
+ "TextRewriterTask",
648
+ "TextSummaryTask",
649
+ "ToolCallingTask",
650
+ "ModelSearchTask"
651
+ ];
652
+ constructor(tasks, streamTasks, previewTasks) {
653
+ super(tasks, streamTasks, previewTasks);
654
+ }
655
+ }
656
+
657
+ // src/ai-provider/registerHfInferenceWorker.ts
658
+ async function registerHfInferenceWorker() {
659
+ await registerProviderWorker((ws) => new HfInferenceProvider(HFI_TASKS, HFI_STREAM_TASKS).registerOnWorkerServer(ws), "Hugging Face Inference");
660
+ }
661
+ export {
662
+ registerHfInferenceWorker,
663
+ registerHfInferenceInline,
664
+ loadHfInferenceSDK,
665
+ getProvider,
666
+ getModelName,
667
+ getClient
668
+ };
669
+
670
+ //# debugId=73A7815234272E4A64756E2164756E21