@workglow/ai-provider 0.0.109 → 0.0.111
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/{HFT_JobRunFns-n802m09b.js → HFT_JobRunFns-8w9nnh1n.js} +1 -1
- package/dist/anthropic/common/Anthropic_JobRunFns.d.ts.map +1 -1
- package/dist/anthropic/index.js +53 -1
- package/dist/anthropic/index.js.map +3 -3
- package/dist/google-gemini/common/Gemini_JobRunFns.d.ts.map +1 -1
- package/dist/google-gemini/index.js +53 -1
- package/dist/google-gemini/index.js.map +3 -3
- package/dist/hf-transformers/common/HFT_JobRunFns.d.ts +42 -56
- package/dist/hf-transformers/common/HFT_JobRunFns.d.ts.map +1 -1
- package/dist/hf-transformers/index.js +2 -2
- package/dist/{index-zjd89edn.js → index-5ybwzmh6.js} +1 -1
- package/dist/{index-y0yn7yrm.js → index-qv377n6c.js} +269 -182
- package/dist/index-qv377n6c.js.map +10 -0
- package/dist/index.js +1 -1
- package/dist/provider-hf-inference/common/HFI_JobRunFns.d.ts.map +1 -1
- package/dist/provider-hf-inference/index.js +43 -1
- package/dist/provider-hf-inference/index.js.map +3 -3
- package/dist/provider-llamacpp/common/LlamaCpp_JobRunFns.d.ts.map +1 -1
- package/dist/provider-llamacpp/index.js +56 -3
- package/dist/provider-llamacpp/index.js.map +3 -3
- package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts.map +1 -1
- package/dist/provider-ollama/index.browser.js +44 -2
- package/dist/provider-ollama/index.browser.js.map +3 -3
- package/dist/provider-ollama/index.js +46 -4
- package/dist/provider-ollama/index.js.map +3 -3
- package/dist/provider-openai/common/OpenAI_JobRunFns.d.ts.map +1 -1
- package/dist/provider-openai/index.js +53 -1
- package/dist/provider-openai/index.js.map +3 -3
- package/dist/tf-mediapipe/common/TFMP_JobRunFns.d.ts +11 -4
- package/dist/tf-mediapipe/common/TFMP_JobRunFns.d.ts.map +1 -1
- package/package.json +13 -11
- package/dist/index-y0yn7yrm.js.map +0 -10
- /package/dist/{HFT_JobRunFns-n802m09b.js.map → HFT_JobRunFns-8w9nnh1n.js.map} +0 -0
- /package/dist/{index-zjd89edn.js.map → index-5ybwzmh6.js.map} +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/hf-transformers/common/HFT_JobRunFns.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n BackgroundRemovalPipeline,\n DocumentQuestionAnsweringOutput,\n FeatureExtractionPipeline,\n FillMaskOutput,\n FillMaskPipeline,\n ImageClassificationPipeline,\n ImageFeatureExtractionPipeline,\n ImageSegmentationPipeline,\n ImageToTextPipeline,\n Message,\n ObjectDetectionPipeline,\n PretrainedModelOptions,\n ProgressInfo,\n QuestionAnsweringPipeline,\n RawImage,\n SummarizationOutput,\n SummarizationPipeline,\n TextClassificationOutput,\n TextClassificationPipeline,\n TextGenerationOutput,\n TextGenerationPipeline,\n TokenClassificationOutput,\n TokenClassificationPipeline,\n TranslationOutput,\n TranslationPipeline,\n ZeroShotClassificationPipeline,\n ZeroShotImageClassificationPipeline,\n ZeroShotObjectDetectionPipeline,\n} from \"@huggingface/transformers\";\nimport type {\n AiProviderReactiveRunFn,\n AiProviderRunFn,\n AiProviderStreamFn,\n BackgroundRemovalTaskInput,\n BackgroundRemovalTaskOutput,\n CountTokensTaskInput,\n CountTokensTaskOutput,\n DownloadModelTaskRunInput,\n DownloadModelTaskRunOutput,\n ImageClassificationTaskInput,\n ImageClassificationTaskOutput,\n ImageEmbeddingTaskInput,\n ImageEmbeddingTaskOutput,\n ImageSegmentationTaskInput,\n ImageSegmentationTaskOutput,\n ImageToTextTaskInput,\n ImageToTextTaskOutput,\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n ObjectDetectionTaskInput,\n ObjectDetectionTaskOutput,\n TextClassificationTaskInput,\n TextClassificationTaskOutput,\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n TextFillMaskTaskInput,\n TextFillMaskTaskOutput,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n TextLanguageDetectionTaskInput,\n TextLanguageDetectionTaskOutput,\n TextNamedEntityRecognitionTaskInput,\n TextNamedEntityRecognitionTaskOutput,\n TextQuestionAnswerTaskInput,\n TextQuestionAnswerTaskOutput,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n TextTranslationTaskInput,\n TextTranslationTaskOutput,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolDefinition,\n UnloadModelTaskRunInput,\n UnloadModelTaskRunOutput,\n} from \"@workglow/ai\";\nimport { buildToolDescription, filterValidToolCalls } from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\n\nlet _transformersSdk: typeof import(\"@huggingface/transformers\") | undefined;\nasync function loadTransformersSDK() {\n if (!_transformersSdk) {\n try {\n _transformersSdk = await import(\"@huggingface/transformers\");\n _transformersSdk.env.fetch = abortableFetch as typeof fetch;\n } catch {\n throw new Error(\n \"@huggingface/transformers is required for HuggingFace Transformers tasks. Install it with: bun add @huggingface/transformers\"\n );\n }\n }\n return _transformersSdk;\n}\n\nimport { getLogger, TypedArray } from \"@workglow/util\";\nimport { HTF_CACHE_NAME } from \"./HFT_Constants\";\nimport { HfTransformersOnnxModelConfig } from \"./HFT_ModelSchema\";\n\n/** Per-model AbortControllers used by abortableFetch; keyed by model_path. */\nconst modelAbortControllers = new Map<string, AbortController>();\n\nfunction abortableFetch(url: string, options: RequestInit): Promise<Response> {\n let signal: AbortSignal | undefined;\n try {\n const pathname = new URL(url).pathname;\n for (const [modelPath, controller] of modelAbortControllers) {\n if (pathname.includes(`/${modelPath}/`)) {\n signal = controller.signal;\n break;\n }\n }\n } catch {\n /* not a parseable URL, proceed without abort */\n }\n return fetch(url, { ...options, ...(signal ? { signal } : {}) });\n}\n\nconst pipelines = new Map<string, any>();\n\n/** In-flight pipeline loads by cache key. Ensures only one load per model at a time to avoid corrupt ONNX files (Protobuf parsing failed). */\nconst pipelineLoadPromises = new Map<string, Promise<any>>();\n\n/**\n * Clear all cached pipelines\n */\nexport function clearPipelineCache(): void {\n pipelines.clear();\n}\n\n/**\n * Generate a cache key for a pipeline that includes all configuration options\n * that affect pipeline creation (model_path, pipeline, dtype, device)\n */\nfunction getPipelineCacheKey(model: HfTransformersOnnxModelConfig): string {\n const dtype = model.provider_config.dtype || \"q8\";\n const device = model.provider_config.device || \"\";\n return `${model.provider_config.model_path}:${model.provider_config.pipeline}:${dtype}:${device}`;\n}\n\n/**\n * Helper function to get a pipeline for a model\n * @param progressScaleMax - Maximum progress value for download phase (100 for download-only, 10 for download+run)\n */\nconst getPipeline = async (\n model: HfTransformersOnnxModelConfig,\n onProgress: (progress: number, message?: string, details?: any) => void,\n options: PretrainedModelOptions = {},\n signal?: AbortSignal,\n progressScaleMax: number = 10\n) => {\n const cacheKey = getPipelineCacheKey(model);\n if (pipelines.has(cacheKey)) {\n getLogger().debug(\"HFT pipeline cache hit\", { cacheKey });\n return pipelines.get(cacheKey);\n }\n\n // Output[number]-flight: only one load per model at a time to avoid concurrent writes to the same\n // ONNX cache path (which can yield \"Protobuf parsing failed\" when one process reads while another writes).\n const inFlight = pipelineLoadPromises.get(cacheKey);\n if (inFlight) {\n await inFlight;\n const cached = pipelines.get(cacheKey);\n if (cached) return cached;\n // Load failed for the other caller; fall through to retry (we remove from map in finally).\n }\n\n const loadPromise = doGetPipeline(\n model,\n onProgress,\n options,\n progressScaleMax,\n cacheKey,\n signal\n ).finally(() => {\n pipelineLoadPromises.delete(cacheKey);\n });\n pipelineLoadPromises.set(cacheKey, loadPromise);\n return loadPromise;\n};\n\nconst doGetPipeline = async (\n model: HfTransformersOnnxModelConfig,\n onProgress: (progress: number, message?: string, details?: any) => void,\n options: PretrainedModelOptions,\n progressScaleMax: number,\n cacheKey: string,\n signal?: AbortSignal\n) => {\n // Throttle state for progress events\n let lastProgressTime = 0;\n let pendingProgress: { progress: number; file: string; fileProgress: number } | null = null;\n let throttleTimer: ReturnType<typeof setTimeout> | null = null;\n const THROTTLE_MS = 160;\n\n /**\n * Sends a progress event, throttled to avoid flooding the worker channel.\n * Always sends first event and final (>=progressScaleMax) immediately.\n */\n const sendProgress = (progress: number, file: string, fileProgress: number): void => {\n const now = Date.now();\n const timeSinceLastEvent = now - lastProgressTime;\n const isFirst = lastProgressTime === 0;\n const isFinal = progress >= progressScaleMax;\n\n if (isFirst || isFinal) {\n if (throttleTimer) {\n clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n pendingProgress = null;\n onProgress(Math.round(progress), \"Downloading model\", { file, progress: fileProgress });\n lastProgressTime = now;\n return;\n }\n\n if (timeSinceLastEvent < THROTTLE_MS) {\n pendingProgress = { progress, file, fileProgress };\n if (!throttleTimer) {\n const timeRemaining = Math.max(1, THROTTLE_MS - timeSinceLastEvent);\n throttleTimer = setTimeout(() => {\n throttleTimer = null;\n if (pendingProgress) {\n onProgress(Math.round(pendingProgress.progress), \"Downloading model\", {\n file: pendingProgress.file,\n progress: pendingProgress.fileProgress,\n });\n lastProgressTime = Date.now();\n pendingProgress = null;\n }\n }, timeRemaining);\n }\n return;\n }\n\n onProgress(Math.round(progress), \"Downloading model\", { file, progress: fileProgress });\n lastProgressTime = now;\n pendingProgress = null;\n };\n\n // Get the abort signal from the signal parameter\n const abortSignal = signal;\n\n // Register a per-model AbortController so abortableFetch can cancel in-flight fetches\n const modelPath = model.provider_config.model_path;\n const modelController = new AbortController();\n modelAbortControllers.set(modelPath, modelController);\n if (abortSignal) {\n if (abortSignal.aborted) {\n modelController.abort();\n } else {\n abortSignal.addEventListener(\"abort\", () => modelController.abort(), { once: true });\n }\n }\n\n // Use aggregate progress_total event from @huggingface/transformers v4 pipeline()\n const progressCallback = (status: ProgressInfo) => {\n if (abortSignal?.aborted) return;\n\n if ((status as any).status === \"progress_total\") {\n const totalStatus = status as any;\n const scaledProgress = (totalStatus.progress * progressScaleMax) / 100;\n\n // Find the currently active file (one still downloading)\n let activeFile = \"\";\n let activeFileProgress = 0;\n const files: Record<string, { loaded: number; total: number }> | undefined =\n totalStatus.files;\n if (files) {\n for (const [file, info] of Object.entries(files)) {\n if (info.loaded < info.total) {\n activeFile = file;\n activeFileProgress = info.total > 0 ? (info.loaded / info.total) * 100 : 0;\n break;\n }\n }\n if (!activeFile) {\n const fileNames = Object.keys(files);\n if (fileNames.length > 0) {\n activeFile = fileNames[fileNames.length - 1];\n activeFileProgress = 100;\n }\n }\n }\n\n sendProgress(scaledProgress, activeFile, activeFileProgress);\n }\n };\n\n const pipelineOptions: PretrainedModelOptions = {\n dtype: model.provider_config.dtype || \"q8\",\n ...(model.provider_config.use_external_data_format\n ? { useExternalDataFormat: model.provider_config.use_external_data_format }\n : {}),\n ...(model.provider_config.device ? { device: model.provider_config.device as any } : {}),\n ...options,\n progress_callback: progressCallback,\n };\n\n // Check if already aborted before starting\n if (abortSignal?.aborted) {\n modelAbortControllers.delete(modelPath);\n throw new Error(\"Operation aborted before pipeline creation\");\n }\n\n const pipelineType = model.provider_config.pipeline;\n\n const { pipeline } = await loadTransformersSDK();\n\n const logger = getLogger();\n const pipelineTimerLabel = `hft:pipeline:${cacheKey}`;\n logger.time(pipelineTimerLabel, { pipelineType, modelPath });\n\n try {\n const result = await pipeline(pipelineType, model.provider_config.model_path, pipelineOptions);\n\n // Flush pending throttled progress and clean up timer\n if (throttleTimer) {\n clearTimeout(throttleTimer);\n throttleTimer = null;\n }\n // pendingProgress may have been set by progressCallback during the pipeline() await\n const finalPending = pendingProgress as {\n progress: number;\n file: string;\n fileProgress: number;\n } | null;\n if (finalPending) {\n onProgress(Math.round(finalPending.progress), \"Downloading model\", {\n file: finalPending.file,\n progress: finalPending.fileProgress,\n });\n pendingProgress = null;\n }\n\n // Check if aborted after pipeline creation\n if (abortSignal?.aborted) {\n logger.timeEnd(pipelineTimerLabel, { status: \"aborted\" });\n throw new Error(\"Operation aborted after pipeline creation\");\n }\n\n logger.timeEnd(pipelineTimerLabel, { status: \"loaded\" });\n pipelines.set(cacheKey, result);\n return result;\n } catch (error: any) {\n logger.timeEnd(pipelineTimerLabel, { status: \"error\", error: String(error) });\n // If aborted, throw a clean abort error rather than internal stream errors\n if (abortSignal?.aborted || modelController.signal.aborted) {\n throw new Error(\"Pipeline download aborted\");\n }\n throw error;\n } finally {\n modelAbortControllers.delete(modelPath);\n }\n};\n\n/**\n * Core implementation for downloading and caching a Hugging Face Transformers model.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_Download: AiProviderRunFn<\n DownloadModelTaskRunInput,\n DownloadModelTaskRunOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const logger = getLogger();\n const timerLabel = `hft:Download:${model?.provider_config.model_path}`;\n logger.time(timerLabel, { model: model?.provider_config.model_path });\n\n // Download the model by creating a pipeline\n // Use 100 as progressScaleMax since this is download-only (0-100%)\n await getPipeline(model!, onProgress, {}, signal, 100);\n\n logger.timeEnd(timerLabel, { model: model?.provider_config.model_path });\n return {\n model: input.model!,\n };\n};\n\n/**\n * Core implementation for unloading a Hugging Face Transformers model.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_Unload: AiProviderRunFn<\n UnloadModelTaskRunInput,\n UnloadModelTaskRunOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n // Delete the pipeline from the in-memory map\n const cacheKey = getPipelineCacheKey(model!);\n if (pipelines.has(cacheKey)) {\n pipelines.delete(cacheKey);\n onProgress(50, \"Pipeline removed from memory\");\n }\n\n // Delete model cache entries\n const model_path = model!.provider_config.model_path;\n await deleteModelCache(model_path);\n onProgress(100, \"Model cache deleted\");\n\n return {\n model: input.model!,\n };\n};\n\n/**\n * Deletes all cache entries for a given model path\n * @param model_path - The model path to delete from cache\n */\nconst deleteModelCache = async (model_path: string): Promise<void> => {\n const cache = await caches.open(HTF_CACHE_NAME);\n const keys = await cache.keys();\n const prefix = `/${model_path}/`;\n\n // Collect all matching requests first\n const requestsToDelete: Request[] = [];\n for (const request of keys) {\n const url = new URL(request.url);\n if (url.pathname.startsWith(prefix)) {\n requestsToDelete.push(request);\n }\n }\n\n // Delete all matching requests\n let deletedCount = 0;\n for (const request of requestsToDelete) {\n try {\n const deleted = await cache.delete(request);\n if (deleted) {\n deletedCount++;\n } else {\n // If delete returns false, try with URL string as fallback\n const deletedByUrl = await cache.delete(request.url);\n if (deletedByUrl) {\n deletedCount++;\n }\n }\n } catch (error) {\n console.error(`Failed to delete cache entry: ${request.url}`, error);\n }\n }\n};\n\n/**\n * Core implementation for text embedding using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\n\nexport const HFT_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const logger = getLogger();\n const timerLabel = `hft:TextEmbedding:${model?.provider_config.model_path}`;\n logger.time(timerLabel, { model: model?.provider_config.model_path });\n\n const generateEmbedding: FeatureExtractionPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n\n logger.debug(\"HFT TextEmbedding: pipeline ready, generating embedding\", {\n model: model?.provider_config.model_path,\n inputLength: Array.isArray(input.text) ? input.text.length : input.text?.length,\n });\n\n // Generate the embedding\n const hfVector = await generateEmbedding(input.text, {\n pooling: model?.provider_config.pooling || \"mean\",\n normalize: model?.provider_config.normalize,\n });\n\n const isArrayInput = Array.isArray(input.text);\n const embeddingDim = model?.provider_config.native_dimensions;\n\n // If the input is an array, the tensor will have multiple dimensions (e.g., [10, 384])\n // We need to split it into separate vectors for each input text\n if (isArrayInput && hfVector.dims.length > 1) {\n const [numTexts, vectorDim] = hfVector.dims;\n\n // Validate that the number of texts matches\n if (numTexts !== input.text.length) {\n throw new Error(\n `HuggingFace Embedding tensor batch size does not match input array length: ${numTexts} != ${input.text.length}`\n );\n }\n\n // Validate dimensions\n if (vectorDim !== embeddingDim) {\n throw new Error(\n `HuggingFace Embedding vector dimension does not match model dimensions: ${vectorDim} != ${embeddingDim}`\n );\n }\n\n // Extract each embedding vector using tensor indexing\n // hfVector[i] returns a sub-tensor for the i-th text\n // .slice() is required to create independent TypedArrays with their own ArrayBuffers,\n // because sub-tensor views all share the same backing buffer, which causes DataCloneError\n // when postMessage tries to transfer the same ArrayBuffer multiple times.\n const vectors: TypedArray[] = Array.from({ length: numTexts }, (_, i) =>\n ((hfVector as any)[i].data as TypedArray).slice()\n );\n\n logger.timeEnd(timerLabel, { batchSize: numTexts, dimensions: vectorDim });\n return { vector: vectors };\n }\n\n // Output[number] text input - validate dimensions\n if (hfVector.size !== embeddingDim) {\n logger.timeEnd(timerLabel, { status: \"error\", reason: \"dimension mismatch\" });\n console.warn(\n `HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${embeddingDim}`,\n input,\n hfVector\n );\n throw new Error(\n `HuggingFace Embedding vector length does not match model dimensions v${hfVector.size} != m${embeddingDim}`\n );\n }\n\n logger.timeEnd(timerLabel, { dimensions: hfVector.size });\n return { vector: hfVector.data as TypedArray };\n};\n\nexport const HFT_TextClassification: AiProviderRunFn<\n TextClassificationTaskInput,\n TextClassificationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const isArrayInput = Array.isArray(input.text);\n\n if (model?.provider_config?.pipeline === \"zero-shot-classification\") {\n if (\n !input.candidateLabels ||\n !Array.isArray(input.candidateLabels) ||\n input.candidateLabels.length === 0\n ) {\n throw new Error(\"Zero-shot text classification requires candidate labels\");\n }\n\n const zeroShotClassifier: ZeroShotClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result: any = await zeroShotClassifier(\n input.text as any,\n input.candidateLabels as string[],\n {}\n );\n\n if (isArrayInput) {\n // Batch result: result is an array of { labels, scores } per input\n const results = Array.isArray(result) && Array.isArray(result[0]?.labels) ? result : [result];\n return {\n categories: results.map((r: any) =>\n r.labels.map((label: string, idx: number) => ({\n label,\n score: r.scores[idx],\n }))\n ),\n };\n }\n\n return {\n categories: result.labels.map((label: string, idx: number) => ({\n label,\n score: result.scores[idx],\n })),\n };\n }\n\n const TextClassification: TextClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result = await TextClassification(input.text as any, {\n top_k: input.maxCategories || undefined,\n });\n\n if (isArrayInput) {\n // Batch result: outer array per input, inner array of categories\n return {\n categories: (result as any[]).map((perInput: any) => {\n const items = Array.isArray(perInput) ? perInput : [perInput];\n return items.map((category: any) => ({\n label: category.label as string,\n score: category.score as number,\n }));\n }),\n };\n }\n\n if (Array.isArray(result[0])) {\n return {\n categories: result[0].map((category) => ({\n label: category.label,\n score: category.score,\n })),\n };\n }\n\n return {\n categories: (result as TextClassificationOutput).map((category) => ({\n label: category.label,\n score: category.score,\n })),\n };\n};\n\nexport const HFT_TextLanguageDetection: AiProviderRunFn<\n TextLanguageDetectionTaskInput,\n TextLanguageDetectionTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const isArrayInput = Array.isArray(input.text);\n\n const TextClassification: TextClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result = await TextClassification(input.text as any, {\n top_k: input.maxLanguages || undefined,\n });\n\n if (isArrayInput) {\n return {\n languages: (result as any[]).map((perInput: any) => {\n const items = Array.isArray(perInput) ? perInput : [perInput];\n return items.map((category: any) => ({\n language: category.label as string,\n score: category.score as number,\n }));\n }),\n };\n }\n\n if (Array.isArray(result[0])) {\n return {\n languages: result[0].map((category) => ({\n language: category.label,\n score: category.score,\n })),\n };\n }\n\n return {\n languages: (result as TextClassificationOutput).map((category) => ({\n language: category.label,\n score: category.score,\n })),\n };\n};\n\nexport const HFT_TextNamedEntityRecognition: AiProviderRunFn<\n TextNamedEntityRecognitionTaskInput,\n TextNamedEntityRecognitionTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const isArrayInput = Array.isArray(input.text);\n\n const textNamedEntityRecognition: TokenClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const results = await textNamedEntityRecognition(input.text as any, {\n ignore_labels: input.blockList as string[] | undefined,\n });\n\n if (isArrayInput) {\n return {\n entities: (results as unknown as TokenClassificationOutput[]).map((perInput) => {\n const items = Array.isArray(perInput) ? perInput : [perInput];\n return items.map((entity) => ({\n entity: entity.entity,\n score: entity.score,\n word: entity.word,\n }));\n }),\n };\n }\n\n let entities: TokenClassificationOutput = [];\n if (!Array.isArray(results)) {\n entities = [results];\n } else {\n entities = results as TokenClassificationOutput;\n }\n return {\n entities: entities.map((entity) => ({\n entity: entity.entity,\n score: entity.score,\n word: entity.word,\n })),\n };\n};\n\nexport const HFT_TextFillMask: AiProviderRunFn<\n TextFillMaskTaskInput,\n TextFillMaskTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const isArrayInput = Array.isArray(input.text);\n\n const unmasker: FillMaskPipeline = await getPipeline(model!, onProgress, {}, signal);\n const results = await unmasker(input.text as any);\n\n if (isArrayInput) {\n return {\n predictions: (results as unknown as FillMaskOutput[]).map((perInput) => {\n const items = Array.isArray(perInput) ? perInput : [perInput];\n return items.map((prediction) => ({\n entity: prediction.token_str,\n score: prediction.score,\n sequence: prediction.sequence,\n }));\n }),\n };\n }\n\n let predictions: FillMaskOutput = [];\n if (!Array.isArray(results)) {\n predictions = [results];\n } else {\n predictions = results as FillMaskOutput;\n }\n return {\n predictions: predictions.map((prediction) => ({\n entity: prediction.token_str,\n score: prediction.score,\n sequence: prediction.sequence,\n })),\n };\n};\n\n/**\n * Core implementation for text generation using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const logger = getLogger();\n const timerLabel = `hft:TextGeneration:${model?.provider_config.model_path}`;\n logger.time(timerLabel, { model: model?.provider_config.model_path });\n\n const isArrayInput = Array.isArray(input.prompt);\n\n const generateText: TextGenerationPipeline = await getPipeline(model!, onProgress, {}, signal);\n\n logger.debug(\"HFT TextGeneration: pipeline ready, generating text\", {\n model: model?.provider_config.model_path,\n promptLength: isArrayInput ? (input.prompt as string[]).length : input.prompt?.length,\n });\n\n const streamer = isArrayInput\n ? undefined\n : createTextStreamer(generateText.tokenizer, onProgress);\n\n let results = await generateText(input.prompt as any, {\n ...(streamer ? { streamer } : {}),\n });\n\n if (isArrayInput) {\n // Batch result: results is an array, one entry per prompt\n const batchResults = Array.isArray(results) ? results : [results];\n const texts = batchResults.map((r) => {\n const seqs = Array.isArray(r) ? r : [r];\n return extractGeneratedText((seqs[0] as TextGenerationOutput[number])?.generated_text);\n });\n logger.timeEnd(timerLabel, { batchSize: texts.length });\n return { text: texts };\n }\n\n if (!Array.isArray(results)) {\n results = [results];\n }\n const text = extractGeneratedText((results[0] as TextGenerationOutput[number])?.generated_text);\n logger.timeEnd(timerLabel, { outputLength: text?.length });\n return {\n text,\n };\n};\n\n/**\n * Core implementation for text translation using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextTranslation: AiProviderRunFn<\n TextTranslationTaskInput,\n TextTranslationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const isArrayInput = Array.isArray(input.text);\n\n const translate: TranslationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const streamer = isArrayInput ? undefined : createTextStreamer(translate.tokenizer, onProgress);\n\n const result = await translate(\n input.text as any,\n {\n src_lang: input.source_lang,\n tgt_lang: input.target_lang,\n ...(streamer ? { streamer } : {}),\n } as any\n );\n\n if (isArrayInput) {\n const batchResults = Array.isArray(result) ? result : [result];\n return {\n text: batchResults.map((r) => (r as TranslationOutput[number])?.translation_text || \"\"),\n target_lang: input.target_lang,\n };\n }\n\n const translatedText = Array.isArray(result)\n ? (result[0] as TranslationOutput[number])?.translation_text || \"\"\n : (result as TranslationOutput[number])?.translation_text || \"\";\n\n return {\n text: translatedText,\n target_lang: input.target_lang,\n };\n};\n\n/**\n * Core implementation for text rewriting using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const isArrayInput = Array.isArray(input.text);\n\n const generateText: TextGenerationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const streamer = isArrayInput\n ? undefined\n : createTextStreamer(generateText.tokenizer, onProgress);\n\n if (isArrayInput) {\n const texts = input.text as string[];\n const promptedTexts = texts.map((t) => (input.prompt ? input.prompt + \"\\n\" : \"\") + t);\n\n let results = await generateText(promptedTexts, {});\n\n const batchResults = Array.isArray(results) ? results : [results];\n const outputTexts = batchResults.map((r, i) => {\n const seqs = Array.isArray(r) ? r : [r];\n const text = extractGeneratedText((seqs[0] as TextGenerationOutput[number])?.generated_text);\n if (text === promptedTexts[i]) {\n throw new Error(\"Rewriter failed to generate new text\");\n }\n return text;\n });\n\n return { text: outputTexts };\n }\n\n // This lib doesn't support this kind of rewriting with a separate prompt vs text\n const promptedText = (input.prompt ? input.prompt + \"\\n\" : \"\") + input.text;\n\n let results = await generateText(promptedText, {\n ...(streamer ? { streamer } : {}),\n });\n\n if (!Array.isArray(results)) {\n results = [results];\n }\n\n const text = extractGeneratedText((results[0] as TextGenerationOutput[number])?.generated_text);\n\n if (text === promptedText) {\n throw new Error(\"Rewriter failed to generate new text\");\n }\n\n return {\n text,\n };\n};\n\n/**\n * Core implementation for text summarization using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const isArrayInput = Array.isArray(input.text);\n\n const generateSummary: SummarizationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const streamer = isArrayInput\n ? undefined\n : createTextStreamer(generateSummary.tokenizer, onProgress);\n\n const result = await generateSummary(\n input.text as any,\n {\n ...(streamer ? { streamer } : {}),\n } as any\n );\n\n if (isArrayInput) {\n const batchResults = Array.isArray(result) ? result : [result];\n return {\n text: batchResults.map((r) => (r as SummarizationOutput[number])?.summary_text || \"\"),\n };\n }\n\n let summaryText = \"\";\n if (Array.isArray(result)) {\n summaryText = (result[0] as SummarizationOutput[number])?.summary_text || \"\";\n } else {\n summaryText = (result as SummarizationOutput[number])?.summary_text || \"\";\n }\n\n return {\n text: summaryText,\n };\n};\n\n/**\n * Core implementation for question answering using Hugging Face Transformers.\n * This is shared between inline and worker implementations.\n */\nexport const HFT_TextQuestionAnswer: AiProviderRunFn<\n TextQuestionAnswerTaskInput,\n TextQuestionAnswerTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const isArrayInput = Array.isArray(input.question);\n\n // Get the question answering pipeline\n const generateAnswer: QuestionAnsweringPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n\n if (isArrayInput) {\n const questions = input.question as string[];\n const contexts = input.context as string[];\n if (questions.length !== contexts.length) {\n throw new Error(\n `question[] and context[] must have the same length: ${questions.length} != ${contexts.length}`\n );\n }\n\n const answers: string[] = [];\n for (let i = 0; i < questions.length; i++) {\n const result = await generateAnswer(questions[i], contexts[i], {} as any);\n let answerText = \"\";\n if (Array.isArray(result)) {\n answerText = (result[0] as DocumentQuestionAnsweringOutput[number])?.answer || \"\";\n } else {\n answerText = (result as DocumentQuestionAnsweringOutput[number])?.answer || \"\";\n }\n answers.push(answerText);\n }\n\n return { text: answers };\n }\n\n const streamer = createTextStreamer(generateAnswer.tokenizer, onProgress);\n\n const result = await generateAnswer(\n input.question as string,\n input.context as string,\n {\n streamer,\n } as any\n );\n\n let answerText = \"\";\n if (Array.isArray(result)) {\n answerText = (result[0] as DocumentQuestionAnsweringOutput[number])?.answer || \"\";\n } else {\n answerText = (result as DocumentQuestionAnsweringOutput[number])?.answer || \"\";\n }\n\n return {\n text: answerText,\n };\n};\n\n/**\n * Core implementation for image segmentation using Hugging Face Transformers.\n */\nexport const HFT_ImageSegmentation: AiProviderRunFn<\n ImageSegmentationTaskInput,\n ImageSegmentationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const segmenter: ImageSegmentationPipeline = await getPipeline(model!, onProgress, {}, signal);\n\n const result = await segmenter(input.image as any, {\n threshold: input.threshold,\n mask_threshold: input.maskThreshold,\n });\n\n const masks = Array.isArray(result) ? result : [result];\n\n const processedMasks = await Promise.all(\n masks.map(async (mask) => ({\n label: mask.label || \"\",\n score: mask.score || 0,\n mask: {} as { [x: string]: unknown },\n }))\n );\n\n return {\n masks: processedMasks,\n };\n};\n\n/**\n * Core implementation for image to text using Hugging Face Transformers.\n */\nexport const HFT_ImageToText: AiProviderRunFn<\n ImageToTextTaskInput,\n ImageToTextTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const captioner: ImageToTextPipeline = await getPipeline(model!, onProgress, {}, signal);\n\n const result: any = await captioner(input.image as string, {\n max_new_tokens: input.maxTokens,\n });\n\n const text = Array.isArray(result) ? result[0]?.generated_text : result?.generated_text;\n\n return {\n text: text || \"\",\n };\n};\n\n/**\n * Core implementation for background removal using Hugging Face Transformers.\n */\nexport const HFT_BackgroundRemoval: AiProviderRunFn<\n BackgroundRemovalTaskInput,\n BackgroundRemovalTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const remover: BackgroundRemovalPipeline = await getPipeline(model!, onProgress, {}, signal);\n\n const result = await remover(input.image as string);\n\n const resultImage = Array.isArray(result) ? result[0] : result;\n\n return {\n image: imageToBase64(resultImage),\n };\n};\n\n/**\n * Core implementation for image embedding using Hugging Face Transformers.\n */\nexport const HFT_ImageEmbedding: AiProviderRunFn<\n ImageEmbeddingTaskInput,\n ImageEmbeddingTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const logger = getLogger();\n const timerLabel = `hft:ImageEmbedding:${model?.provider_config.model_path}`;\n logger.time(timerLabel, { model: model?.provider_config.model_path });\n\n const embedder: ImageFeatureExtractionPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n\n logger.debug(\"HFT ImageEmbedding: pipeline ready, generating embedding\", {\n model: model?.provider_config.model_path,\n });\n\n const result: any = await embedder(input.image as string);\n\n logger.timeEnd(timerLabel, { dimensions: result?.data?.length });\n return {\n vector: result.data as TypedArray,\n } as ImageEmbeddingTaskOutput;\n};\n\n/**\n * Core implementation for image classification using Hugging Face Transformers.\n * Auto-selects between regular and zero-shot classification.\n */\nexport const HFT_ImageClassification: AiProviderRunFn<\n ImageClassificationTaskInput,\n ImageClassificationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.provider_config?.pipeline === \"zero-shot-image-classification\") {\n if (!input.categories || !Array.isArray(input.categories) || input.categories.length === 0) {\n console.warn(\"Zero-shot image classification requires categories\", input);\n throw new Error(\"Zero-shot image classification requires categories\");\n }\n const zeroShotClassifier: ZeroShotImageClassificationPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result: any = await zeroShotClassifier(\n input.image as string,\n input.categories! as string[],\n {}\n );\n\n const results = Array.isArray(result) ? result : [result];\n\n return {\n categories: results.map((r: any) => ({\n label: r.label,\n score: r.score,\n })),\n };\n }\n\n const classifier: ImageClassificationPipeline = await getPipeline(model!, onProgress, {}, signal);\n const result: any = await classifier(input.image as string, {\n top_k: (input as any).maxCategories,\n });\n\n const results = Array.isArray(result) ? result : [result];\n\n return {\n categories: results.map((r: any) => ({\n label: r.label,\n score: r.score,\n })),\n };\n};\n\n/**\n * Core implementation for object detection using Hugging Face Transformers.\n * Auto-selects between regular and zero-shot detection.\n */\nexport const HFT_ObjectDetection: AiProviderRunFn<\n ObjectDetectionTaskInput,\n ObjectDetectionTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n if (model?.provider_config?.pipeline === \"zero-shot-object-detection\") {\n if (!input.labels || !Array.isArray(input.labels) || input.labels.length === 0) {\n throw new Error(\"Zero-shot object detection requires labels\");\n }\n const zeroShotDetector: ZeroShotObjectDetectionPipeline = await getPipeline(\n model!,\n onProgress,\n {},\n signal\n );\n const result: any = await zeroShotDetector(input.image as string, Array.from(input.labels!), {\n threshold: (input as any).threshold,\n });\n\n const detections = Array.isArray(result) ? result : [result];\n\n return {\n detections: detections.map((d: any) => ({\n label: d.label,\n score: d.score,\n box: d.box,\n })),\n };\n }\n\n const detector: ObjectDetectionPipeline = await getPipeline(model!, onProgress, {}, signal);\n const result: any = await detector(input.image as string, {\n threshold: (input as any).threshold,\n });\n\n const detections = Array.isArray(result) ? result : [result];\n\n return {\n detections: detections.map((d: any) => ({\n label: d.label,\n score: d.score,\n box: d.box,\n })),\n };\n};\n/**\n * Helper function to convert RawImage to base64 PNG\n */\nfunction imageToBase64(image: RawImage): string {\n // Convert RawImage to base64 PNG\n // This is a simplified version - actual implementation would use canvas or similar\n return (image as any).toBase64?.() || \"\";\n}\n\n/**\n * Create a text streamer for a given tokenizer and update progress function\n * @param tokenizer - The tokenizer to use for the streamer\n * @param updateProgress - The function to call to update the progress\n * @returns The text streamer\n */\nfunction createTextStreamer(\n tokenizer: any,\n updateProgress: (progress: number, message?: string, details?: any) => void\n) {\n const { TextStreamer } = _transformersSdk!;\n let count = 0;\n return new TextStreamer(tokenizer, {\n skip_prompt: true,\n decode_kwargs: { skip_special_tokens: true },\n callback_function: (text: string) => {\n count++;\n const result = 100 * (1 - Math.exp(-0.05 * count));\n const progress = Math.round(Math.min(result, 100));\n updateProgress(progress, \"Generating\", { text, progress });\n },\n });\n}\n\nfunction extractGeneratedText(generatedText: string | Message[] | undefined): string {\n if (generatedText == null) return \"\";\n if (typeof generatedText === \"string\") return generatedText;\n const lastMessage = generatedText[generatedText.length - 1];\n if (!lastMessage) return \"\";\n const content = lastMessage.content;\n if (typeof content === \"string\") return content;\n for (const part of content) {\n if (part.type === \"text\" && \"text\" in part) {\n return (part as { type: \"text\"; text: string }).text;\n }\n }\n return \"\";\n}\n\n// ========================================================================\n// Streaming support: converts TextStreamer callback to AsyncIterable\n// ========================================================================\n\ntype StreamEventQueue<T> = {\n push: (event: T) => void;\n done: () => void;\n error: (err: Error) => void;\n iterable: AsyncIterable<T>;\n};\n\nfunction createStreamEventQueue<T>(): StreamEventQueue<T> {\n const buffer: T[] = [];\n let resolve: ((value: IteratorResult<T>) => void) | null = null;\n let finished = false;\n let err: Error | null = null;\n\n const push = (event: T) => {\n if (resolve) {\n const r = resolve;\n resolve = null;\n r({ value: event, done: false });\n } else {\n buffer.push(event);\n }\n };\n\n const done = () => {\n finished = true;\n if (resolve) {\n const r = resolve;\n resolve = null;\n r({ value: undefined as any, done: true });\n }\n };\n\n const error = (e: Error) => {\n err = e;\n if (resolve) {\n const r = resolve;\n resolve = null;\n r({ value: undefined as any, done: true });\n }\n };\n\n const iterable: AsyncIterable<T> = {\n [Symbol.asyncIterator]() {\n return {\n next(): Promise<IteratorResult<T>> {\n if (err) return Promise.reject(err);\n if (buffer.length > 0) {\n return Promise.resolve({ value: buffer.shift()!, done: false });\n }\n if (finished) {\n return Promise.resolve({ value: undefined as any, done: true });\n }\n return new Promise<IteratorResult<T>>((r) => {\n resolve = r;\n });\n },\n };\n },\n };\n\n return { push, done, error, iterable };\n}\n\n/**\n * Creates a TextStreamer that pushes StreamEvents into an async queue.\n * The pipeline runs to completion and updates the queue; the caller\n * consumes the queue as an AsyncIterable<StreamEvent>.\n */\nfunction createStreamingTextStreamer(tokenizer: any, queue: StreamEventQueue<StreamEvent<any>>) {\n const { TextStreamer } = _transformersSdk!;\n return new TextStreamer(tokenizer, {\n skip_prompt: true,\n decode_kwargs: { skip_special_tokens: true },\n callback_function: (text: string) => {\n queue.push({ type: \"text-delta\", port: \"text\", textDelta: text });\n },\n });\n}\n\n/**\n * State machine that filters `<tool_call>…</tool_call>` markup out of a\n * stream of text-delta tokens. Tokens that are clearly outside markup are\n * flushed immediately; tokens that *might* be the start of a tag are held\n * in a lookahead buffer until they can be disambiguated.\n *\n * This only handles the XML-tag pattern (Pattern 1 in parseToolCallsFromText).\n * Bare-JSON tool calls (Pattern 2) cannot be reliably detected token-by-token\n * and are still cleaned up via the post-hoc `parseToolCallsFromText` pass on\n * the finish event.\n */\nexport function createToolCallMarkupFilter(emit: (text: string) => void) {\n const OPEN_TAG = \"<tool_call>\";\n const CLOSE_TAG = \"</tool_call>\";\n\n /** \"text\" = normal output, \"tag\" = inside a tool_call block */\n let state: \"text\" | \"tag\" = \"text\";\n /** Buffered text that might be a partial tag prefix */\n let pending = \"\";\n\n function feed(token: string) {\n if (state === \"tag\") {\n // Inside a tool_call block — suppress everything until we see the close tag\n pending += token;\n const closeIdx = pending.indexOf(CLOSE_TAG);\n if (closeIdx !== -1) {\n // End of the tool_call block; resume normal output after the close tag\n const afterClose = pending.slice(closeIdx + CLOSE_TAG.length);\n pending = \"\";\n state = \"text\";\n if (afterClose.length > 0) {\n feed(afterClose);\n }\n }\n // else: still inside the tag block, keep suppressing\n return;\n }\n\n // state === \"text\"\n const combined = pending + token;\n\n // Check for a complete open tag\n const openIdx = combined.indexOf(OPEN_TAG);\n if (openIdx !== -1) {\n // Emit everything before the tag\n const before = combined.slice(0, openIdx);\n if (before.length > 0) {\n emit(before);\n }\n // Switch to tag state; feed the remainder (after the open tag) back through\n pending = \"\";\n state = \"tag\";\n const afterOpen = combined.slice(openIdx + OPEN_TAG.length);\n if (afterOpen.length > 0) {\n feed(afterOpen);\n }\n return;\n }\n\n // Check if the tail of `combined` could be the start of \"<tool_call>\"\n // e.g. combined ends with \"<\", \"<t\", \"<to\", ..., \"<tool_call\"\n let prefixLen = 0;\n for (let len = Math.min(combined.length, OPEN_TAG.length - 1); len >= 1; len--) {\n if (combined.endsWith(OPEN_TAG.slice(0, len))) {\n prefixLen = len;\n break;\n }\n }\n\n if (prefixLen > 0) {\n // The tail is ambiguous — hold it back, flush the rest\n const safe = combined.slice(0, combined.length - prefixLen);\n if (safe.length > 0) {\n emit(safe);\n }\n pending = combined.slice(combined.length - prefixLen);\n } else {\n // No ambiguity — flush everything\n if (combined.length > 0) {\n emit(combined);\n }\n pending = \"\";\n }\n }\n\n /** Flush any remaining buffered text (called when the stream ends). */\n function flush() {\n if (pending.length > 0 && state === \"text\") {\n emit(pending);\n pending = \"\";\n }\n // If state === \"tag\", the pending content is suppressed tool-call markup\n pending = \"\";\n state = \"text\";\n }\n\n return { feed, flush };\n}\n\n// ========================================================================\n// Streaming implementations (append mode)\n// ========================================================================\n\nexport const HFT_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const noopProgress = () => {};\n const generateText: TextGenerationPipeline = await getPipeline(model!, noopProgress, {}, signal);\n\n const queue = createStreamEventQueue<StreamEvent<TextGenerationTaskOutput>>();\n const streamer = createStreamingTextStreamer(generateText.tokenizer, queue);\n\n const pipelinePromise = generateText(input.prompt as string, {\n streamer,\n }).then(\n () => queue.done(),\n (err: Error) => queue.error(err)\n );\n\n yield* queue.iterable;\n await pipelinePromise;\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n};\n\nexport const HFT_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const noopProgress = () => {};\n const generateText: TextGenerationPipeline = await getPipeline(model!, noopProgress, {}, signal);\n\n const queue = createStreamEventQueue<StreamEvent<TextRewriterTaskOutput>>();\n const streamer = createStreamingTextStreamer(generateText.tokenizer, queue);\n\n const promptedText = (input.prompt ? input.prompt + \"\\n\" : \"\") + (input.text as string);\n\n const pipelinePromise = generateText(promptedText, {\n streamer,\n }).then(\n () => queue.done(),\n (err: Error) => queue.error(err)\n );\n\n yield* queue.iterable;\n await pipelinePromise;\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n};\n\nexport const HFT_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const noopProgress = () => {};\n const generateSummary: SummarizationPipeline = await getPipeline(\n model!,\n noopProgress,\n {},\n signal\n );\n\n const queue = createStreamEventQueue<StreamEvent<TextSummaryTaskOutput>>();\n const streamer = createStreamingTextStreamer(generateSummary.tokenizer, queue);\n\n const pipelinePromise = generateSummary(\n input.text as string,\n {\n streamer,\n } as any\n ).then(\n () => queue.done(),\n (err: Error) => queue.error(err)\n );\n\n yield* queue.iterable;\n await pipelinePromise;\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n};\n\nexport const HFT_TextQuestionAnswer_Stream: AiProviderStreamFn<\n TextQuestionAnswerTaskInput,\n TextQuestionAnswerTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (\n input,\n model,\n signal\n): AsyncIterable<StreamEvent<TextQuestionAnswerTaskOutput>> {\n const noopProgress = () => {};\n const generateAnswer: QuestionAnsweringPipeline = await getPipeline(\n model!,\n noopProgress,\n {},\n signal\n );\n\n const queue = createStreamEventQueue<StreamEvent<TextQuestionAnswerTaskOutput>>();\n const streamer = createStreamingTextStreamer(generateAnswer.tokenizer, queue);\n\n let pipelineResult:\n | DocumentQuestionAnsweringOutput[number]\n | DocumentQuestionAnsweringOutput\n | undefined;\n const pipelinePromise = generateAnswer(\n input.question as string,\n input.context as string,\n {\n streamer,\n } as any\n ).then(\n (result) => {\n pipelineResult = result;\n queue.done();\n },\n (err: Error) => queue.error(err)\n );\n\n yield* queue.iterable;\n await pipelinePromise;\n\n let answerText = \"\";\n if (pipelineResult !== undefined) {\n if (Array.isArray(pipelineResult)) {\n answerText = (pipelineResult[0] as DocumentQuestionAnsweringOutput[number])?.answer ?? \"\";\n } else {\n answerText = (pipelineResult as DocumentQuestionAnsweringOutput[number])?.answer ?? \"\";\n }\n }\n yield { type: \"finish\", data: { text: answerText } as TextQuestionAnswerTaskOutput };\n};\n\nexport const HFT_TextTranslation_Stream: AiProviderStreamFn<\n TextTranslationTaskInput,\n TextTranslationTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextTranslationTaskOutput>> {\n const noopProgress = () => {};\n const translate: TranslationPipeline = await getPipeline(model!, noopProgress, {}, signal);\n\n const queue = createStreamEventQueue<StreamEvent<TextTranslationTaskOutput>>();\n const streamer = createStreamingTextStreamer(translate.tokenizer, queue);\n\n const pipelinePromise = translate(\n input.text as string,\n {\n src_lang: input.source_lang,\n tgt_lang: input.target_lang,\n streamer,\n } as any\n ).then(\n () => queue.done(),\n (err: Error) => queue.error(err)\n );\n\n yield* queue.iterable;\n await pipelinePromise;\n yield { type: \"finish\", data: { target_lang: input.target_lang } as TextTranslationTaskOutput };\n};\n\nexport const HFT_CountTokens: AiProviderRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const isArrayInput = Array.isArray(input.text);\n\n const { AutoTokenizer } = _transformersSdk!;\n const tokenizer = await AutoTokenizer.from_pretrained(model!.provider_config.model_path, {\n progress_callback: (progress: any) => onProgress(progress?.progress ?? 0),\n });\n\n if (isArrayInput) {\n const texts = input.text as string[];\n const counts = texts.map((t) => tokenizer.encode(t).length);\n return { count: counts };\n }\n\n // encode() returns number[] of token IDs for a single input string\n const tokenIds = tokenizer.encode(input.text as string);\n return { count: tokenIds.length };\n};\n\nexport const HFT_CountTokens_Reactive: AiProviderReactiveRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, _output, model) => {\n return HFT_CountTokens(input, model, () => {}, new AbortController().signal);\n};\n\n// ========================================================================\n// Tool calling implementations\n// ========================================================================\n\nfunction mapHFTTools(tools: ReadonlyArray<ToolDefinition>) {\n return tools.map((t) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: buildToolDescription(t),\n parameters: t.inputSchema as any,\n },\n }));\n}\n\n/**\n * Parse tool calls from model-generated text.\n *\n * Many instruct models (Qwen, Llama, Hermes, etc.) emit tool calls in one of\n * these formats:\n *\n * 1. `<tool_call>{\"name\":\"fn\",\"arguments\":{...}}</tool_call>` (Qwen/Hermes)\n * 2. Plain JSON objects with a \"name\" + \"arguments\" key\n * 3. `{\"function\":{\"name\":\"fn\",\"arguments\":{...}}}`\n *\n * This function extracts all such tool calls from the raw response text\n * and returns both the cleaned text (with tool-call markup removed) and\n * the parsed ToolCall array.\n */\nexport function parseToolCallsFromText(responseText: string): {\n text: string;\n toolCalls: Record<string, unknown>;\n} {\n const toolCalls: Record<string, unknown> = {};\n let callIndex = 0;\n let cleanedText = responseText;\n\n // Pattern 1: <tool_call>...</tool_call> blocks (Qwen, Hermes, etc.)\n const toolCallTagRegex = /<tool_call>([\\s\\S]*?)<\\/tool_call>/g;\n let tagMatch;\n while ((tagMatch = toolCallTagRegex.exec(responseText)) !== null) {\n try {\n const parsed = JSON.parse(tagMatch[1].trim());\n const id = `call_${callIndex++}`;\n toolCalls[id] = {\n id,\n name: parsed.name ?? parsed.function?.name ?? \"\",\n input: (parsed.arguments ??\n parsed.function?.arguments ??\n parsed.parameters ??\n {}) as Record<string, unknown>,\n };\n } catch {\n // Not valid JSON inside the tag, skip\n }\n }\n\n if (Object.keys(toolCalls).length > 0) {\n // Remove tool_call tags from the text output\n cleanedText = responseText.replace(/<tool_call>[\\s\\S]*?<\\/tool_call>/g, \"\").trim();\n return { text: cleanedText, toolCalls };\n }\n\n // Pattern 2: Use a brace-balanced scanner to correctly handle nested JSON objects.\n const jsonCandidates: Array<{ text: string; start: number; end: number }> = [];\n (function collectBalancedJsonBlocks(source: string) {\n const length = source.length;\n let i = 0;\n while (i < length) {\n if (source[i] !== \"{\") {\n i++;\n continue;\n }\n let depth = 1;\n let j = i + 1;\n let inString = false;\n let escape = false;\n while (j < length && depth > 0) {\n const ch = source[j];\n if (inString) {\n if (escape) {\n escape = false;\n } else if (ch === \"\\\\\") {\n escape = true;\n } else if (ch === '\"') {\n inString = false;\n }\n } else {\n if (ch === '\"') {\n inString = true;\n } else if (ch === \"{\") {\n depth++;\n } else if (ch === \"}\") {\n depth--;\n }\n }\n j++;\n }\n if (depth === 0) {\n jsonCandidates.push({ text: source.slice(i, j), start: i, end: j });\n i = j;\n } else {\n break;\n }\n }\n })(responseText);\n\n const matchedRanges: Array<{ start: number; end: number }> = [];\n for (const candidate of jsonCandidates) {\n try {\n const parsed = JSON.parse(candidate.text);\n if (parsed.name && (parsed.arguments !== undefined || parsed.parameters !== undefined)) {\n const id = `call_${callIndex++}`;\n toolCalls[id] = {\n id,\n name: parsed.name as string,\n input: (parsed.arguments ?? parsed.parameters ?? {}) as Record<string, unknown>,\n };\n matchedRanges.push({ start: candidate.start, end: candidate.end });\n } else if (parsed.function?.name) {\n let functionArgs: unknown = parsed.function.arguments ?? {};\n if (typeof functionArgs === \"string\") {\n try {\n functionArgs = JSON.parse(functionArgs);\n } catch (innerError) {\n console.warn(\"Failed to parse tool call function.arguments as JSON\", innerError);\n functionArgs = {};\n }\n }\n const id = `call_${callIndex++}`;\n toolCalls[id] = {\n id,\n name: parsed.function.name as string,\n input: (functionArgs ?? {}) as Record<string, unknown>,\n };\n matchedRanges.push({ start: candidate.start, end: candidate.end });\n }\n } catch {\n // Not valid JSON, skip\n }\n }\n\n if (Object.keys(toolCalls).length > 0) {\n // Remove only the matched JSON portions, preserving surrounding text\n let result = \"\";\n let lastIndex = 0;\n for (const range of matchedRanges) {\n result += responseText.slice(lastIndex, range.start);\n lastIndex = range.end;\n }\n result += responseText.slice(lastIndex);\n cleanedText = result.trim();\n }\n\n return { text: cleanedText, toolCalls };\n}\n\n/**\n * Resolve the tools list and optionally mutate the messages array based on the toolChoice option.\n * - \"none\": no tools\n * - \"required\": all tools + adds a system instruction so the model must call a tool\n * - specific name: filter to that tool (falls back to all tools if not found)\n * - \"auto\" / undefined: all tools\n */\nfunction resolveHFTToolsAndMessages(\n input: ToolCallingTaskInput,\n messages: Array<{ role: string; content: string }>\n): ReturnType<typeof mapHFTTools> | undefined {\n if (input.toolChoice === \"none\") {\n return undefined;\n }\n\n if (input.toolChoice === \"required\") {\n const requiredInstruction =\n \"You must call at least one tool from the provided tool list when answering.\";\n if (messages.length > 0 && messages[0].role === \"system\") {\n messages[0] = { ...messages[0], content: `${messages[0].content}\\n\\n${requiredInstruction}` };\n } else {\n messages.unshift({ role: \"system\", content: requiredInstruction });\n }\n return mapHFTTools(input.tools);\n }\n\n if (typeof input.toolChoice === \"string\" && input.toolChoice !== \"auto\") {\n // Specific tool name: filter to that tool if it exists\n const selectedTools = input.tools?.filter(\n (tool: ToolDefinition) => tool.name === input.toolChoice\n );\n const toolsToMap = selectedTools && selectedTools.length > 0 ? selectedTools : input.tools;\n return mapHFTTools(toolsToMap);\n }\n\n return mapHFTTools(input.tools);\n}\n\nexport const HFT_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model, onProgress, signal) => {\n const isArrayInput = Array.isArray(input.prompt);\n\n const generateText: TextGenerationPipeline = await getPipeline(model!, onProgress, {}, signal);\n\n if (isArrayInput) {\n const prompts = input.prompt as string[];\n const texts: string[] = [];\n const allToolCalls: Record<string, unknown>[] = [];\n\n for (const promptText of prompts) {\n const messages: Array<{ role: string; content: string }> = [];\n if (input.systemPrompt) {\n messages.push({ role: \"system\", content: input.systemPrompt as string });\n }\n messages.push({ role: \"user\", content: promptText });\n\n const singleInput = { ...input, prompt: promptText } as ToolCallingTaskInput;\n const tools = resolveHFTToolsAndMessages(singleInput, messages);\n\n const prompt = (generateText.tokenizer as any).apply_chat_template(messages, {\n tools,\n tokenize: false,\n add_generation_prompt: true,\n }) as string;\n\n let results = await generateText(prompt, {\n max_new_tokens: input.maxTokens ?? 1024,\n temperature: input.temperature ?? undefined,\n return_full_text: false,\n });\n\n if (!Array.isArray(results)) {\n results = [results];\n }\n\n const responseText = extractGeneratedText(\n (results[0] as TextGenerationOutput[number])?.generated_text\n ).trim();\n\n const parsed = parseToolCallsFromText(responseText);\n texts.push(parsed.text);\n allToolCalls.push(filterValidToolCalls(parsed.toolCalls, input.tools));\n }\n\n return { text: texts, toolCalls: allToolCalls };\n }\n\n const messages: Array<{ role: string; content: string }> = [];\n if (input.systemPrompt) {\n messages.push({ role: \"system\", content: input.systemPrompt as string });\n }\n messages.push({ role: \"user\", content: input.prompt as string });\n\n const tools = resolveHFTToolsAndMessages(input, messages);\n\n // Use the tokenizer's chat template to format the prompt with tool definitions\n const prompt = (generateText.tokenizer as any).apply_chat_template(messages, {\n tools,\n tokenize: false,\n add_generation_prompt: true,\n }) as string;\n\n const streamer = createTextStreamer(generateText.tokenizer, onProgress);\n\n let results = await generateText(prompt, {\n max_new_tokens: input.maxTokens ?? 1024,\n temperature: input.temperature ?? undefined,\n return_full_text: false,\n streamer,\n });\n\n if (!Array.isArray(results)) {\n results = [results];\n }\n\n const responseText = extractGeneratedText(\n (results[0] as TextGenerationOutput[number])?.generated_text\n ).trim();\n\n const { text, toolCalls } = parseToolCallsFromText(responseText);\n return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };\n};\n\nexport const HFT_ToolCalling_Stream: AiProviderStreamFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n HfTransformersOnnxModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ToolCallingTaskOutput>> {\n const noopProgress = () => {};\n const generateText: TextGenerationPipeline = await getPipeline(model!, noopProgress, {}, signal);\n\n const messages: Array<{ role: string; content: string }> = [];\n if (input.systemPrompt) {\n messages.push({ role: \"system\", content: input.systemPrompt as string });\n }\n messages.push({ role: \"user\", content: input.prompt as string });\n\n const tools = resolveHFTToolsAndMessages(input, messages);\n\n const prompt = (generateText.tokenizer as any).apply_chat_template(messages, {\n tools,\n tokenize: false,\n add_generation_prompt: true,\n }) as string;\n\n // Two queues: the inner queue receives raw tokens from the TextStreamer,\n // the outer queue receives filtered text-delta events (markup stripped).\n const innerQueue = createStreamEventQueue<StreamEvent<ToolCallingTaskOutput>>();\n const outerQueue = createStreamEventQueue<StreamEvent<ToolCallingTaskOutput>>();\n const streamer = createStreamingTextStreamer(generateText.tokenizer, innerQueue);\n\n let fullText = \"\";\n const filter = createToolCallMarkupFilter((text) => {\n outerQueue.push({ type: \"text-delta\", port: \"text\", textDelta: text });\n });\n\n // Intercept raw text-delta events: accumulate the full text for post-hoc\n // parsing and feed tokens through the markup filter before forwarding.\n const originalPush = innerQueue.push;\n innerQueue.push = (event: StreamEvent<ToolCallingTaskOutput>) => {\n if (event.type === \"text-delta\" && \"textDelta\" in event) {\n fullText += event.textDelta;\n filter.feed(event.textDelta);\n } else {\n outerQueue.push(event);\n }\n // Still call originalPush so the inner queue's done/error mechanics work\n originalPush(event);\n };\n\n const originalDone = innerQueue.done;\n innerQueue.done = () => {\n filter.flush();\n outerQueue.done();\n originalDone();\n };\n\n const originalError = innerQueue.error;\n innerQueue.error = (e: Error) => {\n filter.flush();\n outerQueue.error(e);\n originalError(e);\n };\n\n const pipelinePromise = generateText(prompt, {\n max_new_tokens: input.maxTokens ?? 1024,\n temperature: input.temperature ?? undefined,\n return_full_text: false,\n streamer,\n }).then(\n () => innerQueue.done(),\n (err: Error) => innerQueue.error(err)\n );\n\n yield* outerQueue.iterable;\n await pipelinePromise;\n\n // Parse the accumulated (unfiltered) text for tool calls. The filter already\n // stripped tag-based markup from text-delta events; this pass also handles\n // bare-JSON tool calls and produces the canonical cleanedText for the finish event.\n const { text: cleanedText, toolCalls } = parseToolCallsFromText(fullText);\n const validToolCalls = filterValidToolCalls(toolCalls, input.tools);\n\n if (Object.keys(validToolCalls).length > 0) {\n yield { type: \"object-delta\", port: \"toolCalls\", objectDelta: { ...validToolCalls } };\n }\n\n yield {\n type: \"finish\",\n data: { text: cleanedText, toolCalls: validToolCalls } as ToolCallingTaskOutput,\n };\n};\n\n// ========================================================================\n// Model info\n// ========================================================================\n\nexport const HFT_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n HfTransformersOnnxModelConfig\n> = async (input, model) => {\n const logger = getLogger();\n const { ModelRegistry } = await loadTransformersSDK();\n const timerLabel = `hft:ModelInfo:${model?.provider_config.model_path}`;\n logger.time(timerLabel, { model: model?.provider_config.model_path });\n\n const detail = input.detail;\n const is_loaded = pipelines.has(getPipelineCacheKey(model!));\n\n const { pipeline: pipelineType, model_path, dtype, device } = model!.provider_config;\n\n const cacheStatus = await ModelRegistry.is_pipeline_cached(pipelineType, model_path, {\n ...(dtype ? { dtype } : {}),\n });\n logger.debug(\"is_pipeline_cached\", {\n input: [\n pipelineType,\n model_path,\n {\n ...(dtype ? { dtype } : {}),\n },\n ],\n result: cacheStatus,\n });\n const is_cached = is_loaded || cacheStatus.allCached;\n\n // Build file_sizes based on requested detail level\n let file_sizes: Record<string, number> | null = null;\n if (detail === \"files\" && cacheStatus.files.length > 0) {\n // Return file names with zero sizes (no network calls)\n const sizes: Record<string, number> = {};\n for (const { file } of cacheStatus.files) {\n sizes[file] = 0;\n }\n file_sizes = sizes;\n } else if (detail === \"files_with_metadata\" && cacheStatus.files.length > 0) {\n // Full metadata fetch per file (N network calls)\n const sizes: Record<string, number> = {};\n await Promise.all(\n cacheStatus.files.map(async ({ file }) => {\n const metadata = await ModelRegistry.get_file_metadata(model_path, file);\n if (metadata.exists && metadata.size !== undefined) {\n sizes[file] = metadata.size;\n }\n })\n );\n if (Object.keys(sizes).length > 0) {\n file_sizes = sizes;\n }\n }\n\n logger.timeEnd(timerLabel, { model: model?.provider_config.model_path });\n\n return {\n model: input.model,\n is_local: true,\n is_remote: false,\n supports_browser: true,\n supports_node: true,\n is_cached,\n is_loaded,\n file_sizes,\n };\n};\n\n// ========================================================================\n// Task registries\n// ========================================================================\n\n/**\n * All HuggingFace Transformers task run functions, keyed by task type name.\n * Pass this to `new HuggingFaceTransformersProvider(HFT_TASKS, HFT_STREAM_TASKS, HFT_REACTIVE_TASKS)` when the\n * actual run function implementations are needed (inline mode, worker server).\n */\nexport const HFT_TASKS = {\n DownloadModelTask: HFT_Download,\n UnloadModelTask: HFT_Unload,\n ModelInfoTask: HFT_ModelInfo,\n CountTokensTask: HFT_CountTokens,\n TextEmbeddingTask: HFT_TextEmbedding,\n TextGenerationTask: HFT_TextGeneration,\n TextQuestionAnswerTask: HFT_TextQuestionAnswer,\n TextLanguageDetectionTask: HFT_TextLanguageDetection,\n TextClassificationTask: HFT_TextClassification,\n TextFillMaskTask: HFT_TextFillMask,\n TextNamedEntityRecognitionTask: HFT_TextNamedEntityRecognition,\n TextRewriterTask: HFT_TextRewriter,\n TextSummaryTask: HFT_TextSummary,\n TextTranslationTask: HFT_TextTranslation,\n ImageSegmentationTask: HFT_ImageSegmentation,\n ImageToTextTask: HFT_ImageToText,\n BackgroundRemovalTask: HFT_BackgroundRemoval,\n ImageEmbeddingTask: HFT_ImageEmbedding,\n ImageClassificationTask: HFT_ImageClassification,\n ObjectDetectionTask: HFT_ObjectDetection,\n ToolCallingTask: HFT_ToolCalling,\n} as const;\n\n/**\n * Streaming variants of HuggingFace Transformers task run functions.\n * Pass this as the second argument to `new HuggingFaceTransformersProvider(HFT_TASKS, HFT_STREAM_TASKS, HFT_REACTIVE_TASKS)`.\n */\nexport const HFT_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, HfTransformersOnnxModelConfig>\n> = {\n TextGenerationTask: HFT_TextGeneration_Stream,\n TextRewriterTask: HFT_TextRewriter_Stream,\n TextSummaryTask: HFT_TextSummary_Stream,\n TextQuestionAnswerTask: HFT_TextQuestionAnswer_Stream,\n TextTranslationTask: HFT_TextTranslation_Stream,\n ToolCallingTask: HFT_ToolCalling_Stream,\n};\n\nexport const HFT_REACTIVE_TASKS: Record<\n string,\n AiProviderReactiveRunFn<any, any, HfTransformersOnnxModelConfig>\n> = {\n CountTokensTask: HFT_CountTokens_Reactive,\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "35AEEC521C026A1E64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HFI_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/provider-hf-inference/common/HFI_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EAEtB,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAoDhE,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"HFI_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/provider-hf-inference/common/HFI_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EAEtB,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAoDhE,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,CAwCvB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAC7C,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,CAyCvB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAC5C,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,CAkCvB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,eAAe,CAC3C,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,CAkCvB,CAAC;AAMF,eAAO,MAAM,yBAAyB,EAAE,kBAAkB,CACxD,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,CA0BvB,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,kBAAkB,CACtD,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,CAyBvB,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,kBAAkB,CACrD,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,CAyBvB,CAAC;AAgBF,eAAO,MAAM,eAAe,EAAE,eAAe,CAC3C,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,CA6EvB,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,kBAAkB,CACrD,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,CAqGvB,CAAC;AAMF,eAAO,MAAM,aAAa,EAAE,eAAe,CACzC,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,CAYvB,CAAC;AAMF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,sBAAsB,CAAC,CAOvF,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CACnC,MAAM,EACN,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,sBAAsB,CAAC,CAMrD,CAAC"}
|
|
@@ -42,6 +42,16 @@ function getProvider(model) {
|
|
|
42
42
|
return model?.provider_config?.provider;
|
|
43
43
|
}
|
|
44
44
|
var HFI_TextGeneration = async (input, model, update_progress, signal) => {
|
|
45
|
+
if (Array.isArray(input.prompt)) {
|
|
46
|
+
getLogger().warn("HFI_TextGeneration: array input received; processing sequentially (no native batch support)");
|
|
47
|
+
const prompts = input.prompt;
|
|
48
|
+
const results = [];
|
|
49
|
+
for (const item of prompts) {
|
|
50
|
+
const r = await HFI_TextGeneration({ ...input, prompt: item }, model, update_progress, signal);
|
|
51
|
+
results.push(r.text);
|
|
52
|
+
}
|
|
53
|
+
return { text: results };
|
|
54
|
+
}
|
|
45
55
|
const logger = getLogger();
|
|
46
56
|
const timerLabel = `hfi:TextGeneration:${model?.provider_config?.model_name}`;
|
|
47
57
|
logger.time(timerLabel, { model: model?.provider_config?.model_name });
|
|
@@ -89,6 +99,16 @@ var HFI_TextEmbedding = async (input, model, update_progress, signal) => {
|
|
|
89
99
|
return { vector: new Float32Array(embedding) };
|
|
90
100
|
};
|
|
91
101
|
var HFI_TextRewriter = async (input, model, update_progress, signal) => {
|
|
102
|
+
if (Array.isArray(input.text)) {
|
|
103
|
+
getLogger().warn("HFI_TextRewriter: array input received; processing sequentially (no native batch support)");
|
|
104
|
+
const texts = input.text;
|
|
105
|
+
const results = [];
|
|
106
|
+
for (const item of texts) {
|
|
107
|
+
const r = await HFI_TextRewriter({ ...input, text: item }, model, update_progress, signal);
|
|
108
|
+
results.push(r.text);
|
|
109
|
+
}
|
|
110
|
+
return { text: results };
|
|
111
|
+
}
|
|
92
112
|
update_progress(0, "Starting HF Inference text rewriting");
|
|
93
113
|
const client = await getClient(model);
|
|
94
114
|
const modelName = getModelName(model);
|
|
@@ -105,6 +125,16 @@ var HFI_TextRewriter = async (input, model, update_progress, signal) => {
|
|
|
105
125
|
return { text: response.choices[0]?.message?.content ?? "" };
|
|
106
126
|
};
|
|
107
127
|
var HFI_TextSummary = async (input, model, update_progress, signal) => {
|
|
128
|
+
if (Array.isArray(input.text)) {
|
|
129
|
+
getLogger().warn("HFI_TextSummary: array input received; processing sequentially (no native batch support)");
|
|
130
|
+
const texts = input.text;
|
|
131
|
+
const results = [];
|
|
132
|
+
for (const item of texts) {
|
|
133
|
+
const r = await HFI_TextSummary({ ...input, text: item }, model, update_progress, signal);
|
|
134
|
+
results.push(r.text);
|
|
135
|
+
}
|
|
136
|
+
return { text: results };
|
|
137
|
+
}
|
|
108
138
|
update_progress(0, "Starting HF Inference text summarization");
|
|
109
139
|
const client = await getClient(model);
|
|
110
140
|
const modelName = getModelName(model);
|
|
@@ -191,6 +221,18 @@ function mapHFIToolChoice(toolChoice) {
|
|
|
191
221
|
return "auto";
|
|
192
222
|
}
|
|
193
223
|
var HFI_ToolCalling = async (input, model, update_progress, signal) => {
|
|
224
|
+
if (Array.isArray(input.prompt)) {
|
|
225
|
+
getLogger().warn("HFI_ToolCalling: array input received; processing sequentially (no native batch support)");
|
|
226
|
+
const prompts = input.prompt;
|
|
227
|
+
const texts = [];
|
|
228
|
+
const toolCallsList = [];
|
|
229
|
+
for (const item of prompts) {
|
|
230
|
+
const r = await HFI_ToolCalling({ ...input, prompt: item }, model, update_progress, signal);
|
|
231
|
+
texts.push(r.text);
|
|
232
|
+
toolCallsList.push(r.toolCalls);
|
|
233
|
+
}
|
|
234
|
+
return { text: texts, toolCalls: toolCallsList };
|
|
235
|
+
}
|
|
194
236
|
update_progress(0, "Starting HF Inference tool calling");
|
|
195
237
|
const client = await getClient(model);
|
|
196
238
|
const modelName = getModelName(model);
|
|
@@ -391,4 +433,4 @@ export {
|
|
|
391
433
|
HFI_ModelInfo
|
|
392
434
|
};
|
|
393
435
|
|
|
394
|
-
//# debugId=
|
|
436
|
+
//# debugId=1F594D11E4044E7A64756E2164756E21
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/provider-hf-inference/common/HFI_JobRunFns.ts", "../src/provider-hf-inference/HFI_Worker.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { InferenceProviderOrPolicy } from \"@huggingface/inference\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolDefinition,\n} from \"@workglow/ai\";\nimport { buildToolDescription, filterValidToolCalls } from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { getLogger, parsePartialJson } from \"@workglow/util\";\nimport type { HfInferenceModelConfig } from \"./HFI_ModelSchema\";\n\nlet _sdk: typeof import(\"@huggingface/inference\") | undefined;\nasync function loadHfInferenceSDK() {\n if (!_sdk) {\n try {\n _sdk = await import(\"@huggingface/inference\");\n } catch {\n throw new Error(\n \"@huggingface/inference is required for Hugging Face Inference tasks. Install it with: bun add @huggingface/inference\"\n );\n }\n }\n return _sdk;\n}\n\ninterface ResolvedProviderConfig {\n readonly credential_key?: string;\n readonly api_key?: string;\n readonly model_name?: string;\n readonly provider?: string;\n}\n\nasync function getClient(model: HfInferenceModelConfig | undefined) {\n const sdk = await loadHfInferenceSDK();\n const config = model?.provider_config as ResolvedProviderConfig | undefined;\n const apiKey =\n config?.credential_key ||\n config?.api_key ||\n (typeof process !== \"undefined\" ? process.env?.HF_TOKEN : undefined);\n if (!apiKey) {\n throw new Error(\n \"Missing Hugging Face API key: set provider_config.credential_key or the HF_TOKEN environment variable.\"\n );\n }\n return new sdk.InferenceClient(apiKey);\n}\n\nfunction getModelName(model: HfInferenceModelConfig | undefined): string {\n const name = model?.provider_config?.model_name;\n if (!name) {\n throw new Error(\"Missing model name in provider_config.model_name.\");\n }\n return name;\n}\n\nfunction getProvider(\n model: HfInferenceModelConfig | undefined\n): InferenceProviderOrPolicy | undefined {\n return model?.provider_config?.provider as InferenceProviderOrPolicy | undefined;\n}\n\nexport const HFI_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n HfInferenceModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timerLabel = `hfi:TextGeneration:${model?.provider_config?.model_name}`;\n logger.time(timerLabel, { model: model?.provider_config?.model_name });\n\n update_progress(0, \"Starting HF Inference text generation\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const response = await client.chatCompletion(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n max_tokens: input.maxTokens,\n temperature: input.temperature,\n top_p: input.topP,\n frequency_penalty: input.frequencyPenalty,\n provider,\n },\n { signal }\n );\n\n update_progress(100, \"Completed HF Inference text generation\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });\n return { text: response.choices[0]?.message?.content ?? \"\" };\n};\n\nexport const HFI_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n HfInferenceModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timerLabel = `hfi:TextEmbedding:${model?.provider_config?.model_name}`;\n logger.time(timerLabel, { model: model?.provider_config?.model_name });\n\n update_progress(0, \"Starting HF Inference text embedding\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n if (Array.isArray(input.text)) {\n const embeddings = await Promise.all(\n input.text.map((text) =>\n client.featureExtraction(\n {\n model: modelName,\n inputs: text,\n },\n { signal }\n )\n )\n );\n\n update_progress(100, \"Completed HF Inference text embedding\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name, batch: true });\n return {\n vector: embeddings.map((embedding) => new Float32Array(embedding as unknown as number[])),\n };\n }\n\n const embedding = await client.featureExtraction(\n {\n model: modelName,\n inputs: input.text,\n },\n { signal }\n );\n\n update_progress(100, \"Completed HF Inference text embedding\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });\n return { vector: new Float32Array(embedding as unknown as number[]) };\n};\n\nexport const HFI_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n HfInferenceModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting HF Inference text rewriting\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const response = await client.chatCompletion(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt },\n { role: \"user\", content: input.text },\n ],\n provider,\n },\n { signal }\n );\n\n update_progress(100, \"Completed HF Inference text rewriting\");\n return { text: response.choices[0]?.message?.content ?? \"\" };\n};\n\nexport const HFI_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n HfInferenceModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting HF Inference text summarization\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const response = await client.chatCompletion(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text },\n ],\n provider,\n },\n { signal }\n );\n\n update_progress(100, \"Completed HF Inference text summarization\");\n return { text: response.choices[0]?.message?.content ?? \"\" };\n};\n\n// ========================================================================\n// Streaming implementations (append mode)\n// ========================================================================\n\nexport const HFI_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n HfInferenceModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const stream = client.chatCompletionStream(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n max_tokens: input.maxTokens,\n temperature: input.temperature,\n top_p: input.topP,\n frequency_penalty: input.frequencyPenalty,\n provider,\n },\n { signal }\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content ?? \"\";\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n};\n\nexport const HFI_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n HfInferenceModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const stream = client.chatCompletionStream(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt },\n { role: \"user\", content: input.text },\n ],\n provider,\n },\n { signal }\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content ?? \"\";\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n};\n\nexport const HFI_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n HfInferenceModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const stream = client.chatCompletionStream(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text },\n ],\n provider,\n },\n { signal }\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content ?? \"\";\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n};\n\n// ========================================================================\n// Tool calling implementations\n// ========================================================================\n\nfunction mapHFIToolChoice(\n toolChoice: string | undefined\n): \"auto\" | \"none\" | \"required\" | undefined {\n if (!toolChoice || toolChoice === \"auto\") return \"auto\";\n if (toolChoice === \"none\") return \"none\";\n if (toolChoice === \"required\") return \"required\";\n // Specific tool names are not supported by HF Inference; fall back to \"auto\"\n return \"auto\";\n}\n\nexport const HFI_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n HfInferenceModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting HF Inference tool calling\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const tools = input.tools.map((t: ToolDefinition) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: buildToolDescription(t),\n parameters: t.inputSchema as any,\n },\n }));\n\n const messages: Array<{ role: \"system\" | \"user\"; content: string }> = [];\n if (input.systemPrompt) {\n messages.push({ role: \"system\", content: input.systemPrompt });\n }\n messages.push({ role: \"user\", content: input.prompt });\n\n const toolChoice = mapHFIToolChoice(input.toolChoice);\n\n const params: any = {\n model: modelName,\n messages,\n max_tokens: input.maxTokens,\n temperature: input.temperature,\n provider,\n };\n\n if (toolChoice !== \"none\") {\n params.tools = tools;\n params.tool_choice = toolChoice;\n }\n\n const response = await client.chatCompletion(params, { signal });\n\n const text = response.choices[0]?.message?.content ?? \"\";\n const toolCalls: Record<string, unknown> = {};\n let callIndex = 0;\n ((response.choices[0]?.message as any)?.tool_calls ?? []).forEach((tc: any) => {\n let parsedInput: Record<string, unknown> = {};\n const rawArgs = tc.function?.arguments;\n if (typeof rawArgs === \"string\") {\n try {\n parsedInput = JSON.parse(rawArgs);\n } catch {\n const partial = parsePartialJson(rawArgs);\n parsedInput = (partial as Record<string, unknown>) ?? {};\n }\n } else if (rawArgs != null) {\n parsedInput = rawArgs as Record<string, unknown>;\n }\n const id = (tc.id as string) ?? `call_${callIndex}`;\n callIndex++;\n toolCalls[id] = { id, name: tc.function.name as string, input: parsedInput };\n });\n\n update_progress(100, \"Completed HF Inference tool calling\");\n return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };\n};\n\nexport const HFI_ToolCalling_Stream: AiProviderStreamFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n HfInferenceModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ToolCallingTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const tools = input.tools.map((t: ToolDefinition) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: buildToolDescription(t),\n parameters: t.inputSchema as any,\n },\n }));\n\n const messages: Array<{ role: \"system\" | \"user\"; content: string }> = [];\n if (input.systemPrompt) {\n messages.push({ role: \"system\", content: input.systemPrompt });\n }\n messages.push({ role: \"user\", content: input.prompt });\n\n const toolChoice = mapHFIToolChoice(input.toolChoice);\n\n const params: any = {\n model: modelName,\n messages,\n max_tokens: input.maxTokens,\n temperature: input.temperature,\n provider,\n };\n\n if (toolChoice !== \"none\") {\n params.tools = tools;\n params.tool_choice = toolChoice;\n }\n\n const stream = client.chatCompletionStream(params, { signal });\n\n let accumulatedText = \"\";\n const toolCallAccumulator = new Map<number, { id: string; name: string; arguments: string }>();\n\n for await (const chunk of stream) {\n const choice = chunk.choices[0];\n if (!choice) continue;\n\n const contentDelta = choice.delta?.content ?? \"\";\n if (contentDelta) {\n accumulatedText += contentDelta;\n yield { type: \"text-delta\", port: \"text\", textDelta: contentDelta };\n }\n\n const tcDeltas = (choice.delta as any)?.tool_calls;\n if (Array.isArray(tcDeltas)) {\n for (const tcDelta of tcDeltas) {\n const idx = tcDelta.index as number;\n if (!toolCallAccumulator.has(idx)) {\n toolCallAccumulator.set(idx, {\n id: tcDelta.id ?? \"\",\n name: tcDelta.function?.name ?? \"\",\n arguments: \"\",\n });\n }\n const acc = toolCallAccumulator.get(idx)!;\n if (tcDelta.id) acc.id = tcDelta.id;\n if (tcDelta.function?.name) acc.name = tcDelta.function.name;\n if (tcDelta.function?.arguments) acc.arguments += tcDelta.function.arguments;\n }\n\n const snapshotObject: Record<string, unknown> = {};\n Array.from(toolCallAccumulator.entries()).forEach(([idx, tc]) => {\n let parsedInput: Record<string, unknown>;\n try {\n parsedInput = JSON.parse(tc.arguments);\n } catch {\n const partial = parsePartialJson(tc.arguments);\n parsedInput = (partial as Record<string, unknown>) ?? {};\n }\n const key = tc.id || String(idx);\n snapshotObject[key] = { id: tc.id, name: tc.name, input: parsedInput };\n });\n yield { type: \"object-delta\", port: \"toolCalls\", objectDelta: snapshotObject };\n }\n }\n\n const toolCalls: Record<string, unknown> = {};\n Array.from(toolCallAccumulator.entries()).forEach(([idx, tc]) => {\n let finalInput: Record<string, unknown>;\n try {\n finalInput = JSON.parse(tc.arguments);\n } catch {\n finalInput = (parsePartialJson(tc.arguments) as Record<string, unknown>) ?? {};\n }\n const key = tc.id || String(idx);\n toolCalls[key] = { id: tc.id, name: tc.name, input: finalInput };\n });\n\n const validToolCalls = filterValidToolCalls(toolCalls, input.tools);\n yield {\n type: \"finish\",\n data: { text: accumulatedText, toolCalls: validToolCalls } as ToolCallingTaskOutput,\n };\n};\n\n// ========================================================================\n// Model info\n// ========================================================================\n\nexport const HFI_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n HfInferenceModelConfig\n> = async (input) => {\n return {\n model: input.model,\n is_local: false,\n is_remote: true,\n supports_browser: true,\n supports_node: true,\n is_cached: false,\n is_loaded: false,\n file_sizes: null,\n };\n};\n\n// ========================================================================\n// Task registries\n// ========================================================================\n\nexport const HFI_TASKS: Record<string, AiProviderRunFn<any, any, HfInferenceModelConfig>> = {\n ModelInfoTask: HFI_ModelInfo,\n TextGenerationTask: HFI_TextGeneration,\n TextEmbeddingTask: HFI_TextEmbedding,\n TextRewriterTask: HFI_TextRewriter,\n TextSummaryTask: HFI_TextSummary,\n ToolCallingTask: HFI_ToolCalling,\n};\n\nexport const HFI_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, HfInferenceModelConfig>\n> = {\n TextGenerationTask: HFI_TextGeneration_Stream,\n TextRewriterTask: HFI_TextRewriter_Stream,\n TextSummaryTask: HFI_TextSummary_Stream,\n ToolCallingTask: HFI_ToolCalling_Stream,\n};\n",
|
|
5
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { InferenceProviderOrPolicy } from \"@huggingface/inference\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolDefinition,\n} from \"@workglow/ai\";\nimport { buildToolDescription, filterValidToolCalls } from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { getLogger, parsePartialJson } from \"@workglow/util\";\nimport type { HfInferenceModelConfig } from \"./HFI_ModelSchema\";\n\nlet _sdk: typeof import(\"@huggingface/inference\") | undefined;\nasync function loadHfInferenceSDK() {\n if (!_sdk) {\n try {\n _sdk = await import(\"@huggingface/inference\");\n } catch {\n throw new Error(\n \"@huggingface/inference is required for Hugging Face Inference tasks. Install it with: bun add @huggingface/inference\"\n );\n }\n }\n return _sdk;\n}\n\ninterface ResolvedProviderConfig {\n readonly credential_key?: string;\n readonly api_key?: string;\n readonly model_name?: string;\n readonly provider?: string;\n}\n\nasync function getClient(model: HfInferenceModelConfig | undefined) {\n const sdk = await loadHfInferenceSDK();\n const config = model?.provider_config as ResolvedProviderConfig | undefined;\n const apiKey =\n config?.credential_key ||\n config?.api_key ||\n (typeof process !== \"undefined\" ? process.env?.HF_TOKEN : undefined);\n if (!apiKey) {\n throw new Error(\n \"Missing Hugging Face API key: set provider_config.credential_key or the HF_TOKEN environment variable.\"\n );\n }\n return new sdk.InferenceClient(apiKey);\n}\n\nfunction getModelName(model: HfInferenceModelConfig | undefined): string {\n const name = model?.provider_config?.model_name;\n if (!name) {\n throw new Error(\"Missing model name in provider_config.model_name.\");\n }\n return name;\n}\n\nfunction getProvider(\n model: HfInferenceModelConfig | undefined\n): InferenceProviderOrPolicy | undefined {\n return model?.provider_config?.provider as InferenceProviderOrPolicy | undefined;\n}\n\nexport const HFI_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n HfInferenceModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.prompt)) {\n getLogger().warn(\n \"HFI_TextGeneration: array input received; processing sequentially (no native batch support)\"\n );\n const prompts = input.prompt as string[];\n const results: string[] = [];\n for (const item of prompts) {\n const r = await HFI_TextGeneration({ ...input, prompt: item }, model, update_progress, signal);\n results.push(r.text as string);\n }\n return { text: results };\n }\n\n const logger = getLogger();\n const timerLabel = `hfi:TextGeneration:${model?.provider_config?.model_name}`;\n logger.time(timerLabel, { model: model?.provider_config?.model_name });\n\n update_progress(0, \"Starting HF Inference text generation\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const response = await client.chatCompletion(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt as string }],\n max_tokens: input.maxTokens,\n temperature: input.temperature,\n top_p: input.topP,\n frequency_penalty: input.frequencyPenalty,\n provider,\n },\n { signal }\n );\n\n update_progress(100, \"Completed HF Inference text generation\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });\n return { text: response.choices[0]?.message?.content ?? \"\" };\n};\n\nexport const HFI_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n HfInferenceModelConfig\n> = async (input, model, update_progress, signal) => {\n const logger = getLogger();\n const timerLabel = `hfi:TextEmbedding:${model?.provider_config?.model_name}`;\n logger.time(timerLabel, { model: model?.provider_config?.model_name });\n\n update_progress(0, \"Starting HF Inference text embedding\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n if (Array.isArray(input.text)) {\n const embeddings = await Promise.all(\n input.text.map((text) =>\n client.featureExtraction(\n {\n model: modelName,\n inputs: text,\n },\n { signal }\n )\n )\n );\n\n update_progress(100, \"Completed HF Inference text embedding\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name, batch: true });\n return {\n vector: embeddings.map((embedding) => new Float32Array(embedding as unknown as number[])),\n };\n }\n\n const embedding = await client.featureExtraction(\n {\n model: modelName,\n inputs: input.text,\n },\n { signal }\n );\n\n update_progress(100, \"Completed HF Inference text embedding\");\n logger.timeEnd(timerLabel, { model: model?.provider_config?.model_name });\n return { vector: new Float32Array(embedding as unknown as number[]) };\n};\n\nexport const HFI_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n HfInferenceModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.text)) {\n getLogger().warn(\n \"HFI_TextRewriter: array input received; processing sequentially (no native batch support)\"\n );\n const texts = input.text as string[];\n const results: string[] = [];\n for (const item of texts) {\n const r = await HFI_TextRewriter({ ...input, text: item }, model, update_progress, signal);\n results.push(r.text as string);\n }\n return { text: results };\n }\n\n update_progress(0, \"Starting HF Inference text rewriting\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const response = await client.chatCompletion(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt as string },\n { role: \"user\", content: input.text as string },\n ],\n provider,\n },\n { signal }\n );\n\n update_progress(100, \"Completed HF Inference text rewriting\");\n return { text: response.choices[0]?.message?.content ?? \"\" };\n};\n\nexport const HFI_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n HfInferenceModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.text)) {\n getLogger().warn(\n \"HFI_TextSummary: array input received; processing sequentially (no native batch support)\"\n );\n const texts = input.text as string[];\n const results: string[] = [];\n for (const item of texts) {\n const r = await HFI_TextSummary({ ...input, text: item }, model, update_progress, signal);\n results.push(r.text as string);\n }\n return { text: results };\n }\n\n update_progress(0, \"Starting HF Inference text summarization\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const response = await client.chatCompletion(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text as string },\n ],\n provider,\n },\n { signal }\n );\n\n update_progress(100, \"Completed HF Inference text summarization\");\n return { text: response.choices[0]?.message?.content ?? \"\" };\n};\n\n// ========================================================================\n// Streaming implementations (append mode)\n// ========================================================================\n\nexport const HFI_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n HfInferenceModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const stream = client.chatCompletionStream(\n {\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt as string }],\n max_tokens: input.maxTokens,\n temperature: input.temperature,\n top_p: input.topP,\n frequency_penalty: input.frequencyPenalty,\n provider,\n },\n { signal }\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content ?? \"\";\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n};\n\nexport const HFI_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n HfInferenceModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const stream = client.chatCompletionStream(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt as string },\n { role: \"user\", content: input.text as string },\n ],\n provider,\n },\n { signal }\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content ?? \"\";\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n};\n\nexport const HFI_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n HfInferenceModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const stream = client.chatCompletionStream(\n {\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text as string },\n ],\n provider,\n },\n { signal }\n );\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta?.content ?? \"\";\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n};\n\n// ========================================================================\n// Tool calling implementations\n// ========================================================================\n\nfunction mapHFIToolChoice(\n toolChoice: string | undefined\n): \"auto\" | \"none\" | \"required\" | undefined {\n if (!toolChoice || toolChoice === \"auto\") return \"auto\";\n if (toolChoice === \"none\") return \"none\";\n if (toolChoice === \"required\") return \"required\";\n // Specific tool names are not supported by HF Inference; fall back to \"auto\"\n return \"auto\";\n}\n\nexport const HFI_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n HfInferenceModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.prompt)) {\n getLogger().warn(\n \"HFI_ToolCalling: array input received; processing sequentially (no native batch support)\"\n );\n const prompts = input.prompt as string[];\n const texts: string[] = [];\n const toolCallsList: Record<string, unknown>[] = [];\n for (const item of prompts) {\n const r = await HFI_ToolCalling({ ...input, prompt: item }, model, update_progress, signal);\n texts.push(r.text as string);\n toolCallsList.push(r.toolCalls as Record<string, unknown>);\n }\n return { text: texts, toolCalls: toolCallsList };\n }\n\n update_progress(0, \"Starting HF Inference tool calling\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const tools = input.tools.map((t: ToolDefinition) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: buildToolDescription(t),\n parameters: t.inputSchema as any,\n },\n }));\n\n const messages: Array<{ role: \"system\" | \"user\"; content: string }> = [];\n if (input.systemPrompt) {\n messages.push({ role: \"system\", content: input.systemPrompt });\n }\n messages.push({ role: \"user\", content: input.prompt as string });\n\n const toolChoice = mapHFIToolChoice(input.toolChoice);\n\n const params: any = {\n model: modelName,\n messages,\n max_tokens: input.maxTokens,\n temperature: input.temperature,\n provider,\n };\n\n if (toolChoice !== \"none\") {\n params.tools = tools;\n params.tool_choice = toolChoice;\n }\n\n const response = await client.chatCompletion(params, { signal });\n\n const text = response.choices[0]?.message?.content ?? \"\";\n const toolCalls: Record<string, unknown> = {};\n let callIndex = 0;\n ((response.choices[0]?.message as any)?.tool_calls ?? []).forEach((tc: any) => {\n let parsedInput: Record<string, unknown> = {};\n const rawArgs = tc.function?.arguments;\n if (typeof rawArgs === \"string\") {\n try {\n parsedInput = JSON.parse(rawArgs);\n } catch {\n const partial = parsePartialJson(rawArgs);\n parsedInput = (partial as Record<string, unknown>) ?? {};\n }\n } else if (rawArgs != null) {\n parsedInput = rawArgs as Record<string, unknown>;\n }\n const id = (tc.id as string) ?? `call_${callIndex}`;\n callIndex++;\n toolCalls[id] = { id, name: tc.function.name as string, input: parsedInput };\n });\n\n update_progress(100, \"Completed HF Inference tool calling\");\n return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };\n};\n\nexport const HFI_ToolCalling_Stream: AiProviderStreamFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n HfInferenceModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ToolCallingTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n const provider = getProvider(model);\n\n const tools = input.tools.map((t: ToolDefinition) => ({\n type: \"function\" as const,\n function: {\n name: t.name,\n description: buildToolDescription(t),\n parameters: t.inputSchema as any,\n },\n }));\n\n const messages: Array<{ role: \"system\" | \"user\"; content: string }> = [];\n if (input.systemPrompt) {\n messages.push({ role: \"system\", content: input.systemPrompt });\n }\n messages.push({ role: \"user\", content: input.prompt as string });\n\n const toolChoice = mapHFIToolChoice(input.toolChoice);\n\n const params: any = {\n model: modelName,\n messages,\n max_tokens: input.maxTokens,\n temperature: input.temperature,\n provider,\n };\n\n if (toolChoice !== \"none\") {\n params.tools = tools;\n params.tool_choice = toolChoice;\n }\n\n const stream = client.chatCompletionStream(params, { signal });\n\n let accumulatedText = \"\";\n const toolCallAccumulator = new Map<number, { id: string; name: string; arguments: string }>();\n\n for await (const chunk of stream) {\n const choice = chunk.choices[0];\n if (!choice) continue;\n\n const contentDelta = choice.delta?.content ?? \"\";\n if (contentDelta) {\n accumulatedText += contentDelta;\n yield { type: \"text-delta\", port: \"text\", textDelta: contentDelta };\n }\n\n const tcDeltas = (choice.delta as any)?.tool_calls;\n if (Array.isArray(tcDeltas)) {\n for (const tcDelta of tcDeltas) {\n const idx = tcDelta.index as number;\n if (!toolCallAccumulator.has(idx)) {\n toolCallAccumulator.set(idx, {\n id: tcDelta.id ?? \"\",\n name: tcDelta.function?.name ?? \"\",\n arguments: \"\",\n });\n }\n const acc = toolCallAccumulator.get(idx)!;\n if (tcDelta.id) acc.id = tcDelta.id;\n if (tcDelta.function?.name) acc.name = tcDelta.function.name;\n if (tcDelta.function?.arguments) acc.arguments += tcDelta.function.arguments;\n }\n\n const snapshotObject: Record<string, unknown> = {};\n Array.from(toolCallAccumulator.entries()).forEach(([idx, tc]) => {\n let parsedInput: Record<string, unknown>;\n try {\n parsedInput = JSON.parse(tc.arguments);\n } catch {\n const partial = parsePartialJson(tc.arguments);\n parsedInput = (partial as Record<string, unknown>) ?? {};\n }\n const key = tc.id || String(idx);\n snapshotObject[key] = { id: tc.id, name: tc.name, input: parsedInput };\n });\n yield { type: \"object-delta\", port: \"toolCalls\", objectDelta: snapshotObject };\n }\n }\n\n const toolCalls: Record<string, unknown> = {};\n Array.from(toolCallAccumulator.entries()).forEach(([idx, tc]) => {\n let finalInput: Record<string, unknown>;\n try {\n finalInput = JSON.parse(tc.arguments);\n } catch {\n finalInput = (parsePartialJson(tc.arguments) as Record<string, unknown>) ?? {};\n }\n const key = tc.id || String(idx);\n toolCalls[key] = { id: tc.id, name: tc.name, input: finalInput };\n });\n\n const validToolCalls = filterValidToolCalls(toolCalls, input.tools);\n yield {\n type: \"finish\",\n data: { text: accumulatedText, toolCalls: validToolCalls } as ToolCallingTaskOutput,\n };\n};\n\n// ========================================================================\n// Model info\n// ========================================================================\n\nexport const HFI_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n HfInferenceModelConfig\n> = async (input) => {\n return {\n model: input.model,\n is_local: false,\n is_remote: true,\n supports_browser: true,\n supports_node: true,\n is_cached: false,\n is_loaded: false,\n file_sizes: null,\n };\n};\n\n// ========================================================================\n// Task registries\n// ========================================================================\n\nexport const HFI_TASKS: Record<string, AiProviderRunFn<any, any, HfInferenceModelConfig>> = {\n ModelInfoTask: HFI_ModelInfo,\n TextGenerationTask: HFI_TextGeneration,\n TextEmbeddingTask: HFI_TextEmbedding,\n TextRewriterTask: HFI_TextRewriter,\n TextSummaryTask: HFI_TextSummary,\n ToolCallingTask: HFI_ToolCalling,\n};\n\nexport const HFI_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, HfInferenceModelConfig>\n> = {\n TextGenerationTask: HFI_TextGeneration_Stream,\n TextRewriterTask: HFI_TextRewriter_Stream,\n TextSummaryTask: HFI_TextSummary_Stream,\n ToolCallingTask: HFI_ToolCalling_Stream,\n};\n",
|
|
6
6
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { globalServiceRegistry, WORKER_SERVER } from \"@workglow/util\";\nimport { HFI_STREAM_TASKS, HFI_TASKS } from \"./common/HFI_JobRunFns\";\nimport { HfInferenceProvider } from \"./HfInferenceProvider\";\n\nexport function HFI_WORKER_JOBRUN_REGISTER() {\n const workerServer = globalServiceRegistry.get(WORKER_SERVER);\n new HfInferenceProvider(HFI_TASKS, HFI_STREAM_TASKS).registerOnWorkerServer(workerServer);\n workerServer.sendReady();\n console.log(\"HFI_WORKER_JOBRUN registered\");\n}\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "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",
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "1F594D11E4044E7A64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LlamaCpp_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/provider-llamacpp/common/LlamaCpp_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EAErB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"LlamaCpp_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/provider-llamacpp/common/LlamaCpp_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EAErB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,cAAc,CAAC;AAKtB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AA2KlE,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAC7C,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,CAoCpB,CAAC;AAMF,eAAO,MAAM,eAAe,EAAE,eAAe,CAC3C,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,CAiCpB,CAAC;AAMF,eAAO,MAAM,uBAAuB,EAAE,eAAe,CACnD,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,CAqCpB,CAAC;AAMF,eAAO,MAAM,8BAA8B,EAAE,kBAAkB,CAC7D,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,CAsBpB,CAAC;AAMF,eAAO,MAAM,sBAAsB,EAAE,eAAe,CAClD,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,CAoBpB,CAAC;AAMF,eAAO,MAAM,qBAAqB,EAAE,eAAe,CACjD,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,CAgCpB,CAAC;AAMF,eAAO,MAAM,4BAA4B,EAAE,kBAAkB,CAC3D,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,CAgBpB,CAAC;AAMF,eAAO,MAAM,oBAAoB,EAAE,eAAe,CAChD,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,CAmCpB,CAAC;AAMF,eAAO,MAAM,2BAA2B,EAAE,kBAAkB,CAC1D,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,CAmBpB,CAAC;AAMF,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkB9D;AAED,eAAO,MAAM,oBAAoB,EAAE,eAAe,CAChD,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,CAmBpB,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,uBAAuB,CACjE,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,CAGpB,CAAC;AA+BF,eAAO,MAAM,oBAAoB,EAAE,eAAe,CAChD,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,CAuDpB,CAAC;AAMF,eAAO,MAAM,2BAA2B,EAAE,kBAAkB,CAC1D,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,CA8FpB,CAAC;AAMF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,CAkCpB,CAAC;AAMF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAUzF,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CACxC,MAAM,EACN,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAMlD,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAC1C,MAAM,EACN,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAGvD,CAAC"}
|