@workglow/ai-provider 0.0.90 → 0.0.91
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/README.md +45 -45
- package/dist/anthropic/AnthropicProvider.d.ts +39 -0
- package/dist/anthropic/AnthropicProvider.d.ts.map +1 -0
- package/dist/anthropic/Anthropic_Worker.d.ts +7 -0
- package/dist/anthropic/Anthropic_Worker.d.ts.map +1 -0
- package/dist/anthropic/common/Anthropic_Constants.d.ts +7 -0
- package/dist/anthropic/common/Anthropic_Constants.d.ts.map +1 -0
- package/dist/anthropic/common/Anthropic_JobRunFns.d.ts +16 -0
- package/dist/anthropic/common/Anthropic_JobRunFns.d.ts.map +1 -0
- package/dist/anthropic/common/Anthropic_ModelSchema.d.ts +167 -0
- package/dist/anthropic/common/Anthropic_ModelSchema.d.ts.map +1 -0
- package/dist/anthropic/index.d.ts +11 -0
- package/dist/anthropic/index.d.ts.map +1 -0
- package/dist/anthropic/index.js +257 -0
- package/dist/anthropic/index.js.map +14 -0
- package/dist/google-gemini/Gemini_Worker.d.ts +7 -0
- package/dist/google-gemini/Gemini_Worker.d.ts.map +1 -0
- package/dist/google-gemini/GoogleGeminiProvider.d.ts +36 -0
- package/dist/google-gemini/GoogleGeminiProvider.d.ts.map +1 -0
- package/dist/google-gemini/common/Gemini_Constants.d.ts +7 -0
- package/dist/google-gemini/common/Gemini_Constants.d.ts.map +1 -0
- package/dist/google-gemini/common/Gemini_JobRunFns.d.ts +17 -0
- package/dist/google-gemini/common/Gemini_JobRunFns.d.ts.map +1 -0
- package/dist/google-gemini/common/Gemini_ModelSchema.d.ts +164 -0
- package/dist/google-gemini/common/Gemini_ModelSchema.d.ts.map +1 -0
- package/dist/google-gemini/index.d.ts +11 -0
- package/dist/google-gemini/index.d.ts.map +1 -0
- package/dist/google-gemini/index.js +300 -0
- package/dist/google-gemini/index.js.map +14 -0
- package/dist/hf-transformers/HFT_Worker.d.ts +7 -0
- package/dist/hf-transformers/HFT_Worker.d.ts.map +1 -0
- package/dist/hf-transformers/HuggingFaceTransformersProvider.d.ts +41 -0
- package/dist/hf-transformers/HuggingFaceTransformersProvider.d.ts.map +1 -0
- package/dist/hf-transformers/common/HFT_JobRunFns.d.ts +1218 -1
- package/dist/hf-transformers/common/HFT_JobRunFns.d.ts.map +1 -1
- package/dist/hf-transformers/index.d.ts +2 -3
- package/dist/hf-transformers/index.d.ts.map +1 -1
- package/dist/hf-transformers/index.js +1130 -0
- package/dist/hf-transformers/index.js.map +15 -0
- package/dist/index.d.ts +23 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +729 -865
- package/dist/index.js.map +20 -12
- package/dist/provider-ollama/OllamaProvider.d.ts +39 -0
- package/dist/provider-ollama/OllamaProvider.d.ts.map +1 -0
- package/dist/provider-ollama/Ollama_Worker.d.ts +7 -0
- package/dist/provider-ollama/Ollama_Worker.d.ts.map +1 -0
- package/dist/provider-ollama/common/Ollama_Constants.d.ts +8 -0
- package/dist/provider-ollama/common/Ollama_Constants.d.ts.map +1 -0
- package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts +17 -0
- package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts.map +1 -0
- package/dist/provider-ollama/common/Ollama_ModelSchema.d.ts +137 -0
- package/dist/provider-ollama/common/Ollama_ModelSchema.d.ts.map +1 -0
- package/dist/provider-ollama/index.d.ts +11 -0
- package/dist/provider-ollama/index.d.ts.map +1 -0
- package/dist/provider-ollama/index.js +274 -0
- package/dist/provider-ollama/index.js.map +14 -0
- package/dist/provider-openai/OpenAI_Worker.d.ts +7 -0
- package/dist/provider-openai/OpenAI_Worker.d.ts.map +1 -0
- package/dist/provider-openai/OpenAiProvider.d.ts +40 -0
- package/dist/provider-openai/OpenAiProvider.d.ts.map +1 -0
- package/dist/provider-openai/common/OpenAI_Constants.d.ts +7 -0
- package/dist/provider-openai/common/OpenAI_Constants.d.ts.map +1 -0
- package/dist/provider-openai/common/OpenAI_JobRunFns.d.ts +17 -0
- package/dist/provider-openai/common/OpenAI_JobRunFns.d.ts.map +1 -0
- package/dist/provider-openai/common/OpenAI_ModelSchema.d.ts +161 -0
- package/dist/provider-openai/common/OpenAI_ModelSchema.d.ts.map +1 -0
- package/dist/provider-openai/index.d.ts +11 -0
- package/dist/provider-openai/index.d.ts.map +1 -0
- package/dist/provider-openai/index.js +283 -0
- package/dist/provider-openai/index.js.map +14 -0
- package/dist/tf-mediapipe/TFMP_Worker.d.ts +7 -0
- package/dist/tf-mediapipe/TFMP_Worker.d.ts.map +1 -0
- package/dist/tf-mediapipe/TensorFlowMediaPipeProvider.d.ts +39 -0
- package/dist/tf-mediapipe/TensorFlowMediaPipeProvider.d.ts.map +1 -0
- package/dist/tf-mediapipe/common/TFMP_JobRunFns.d.ts +842 -0
- package/dist/tf-mediapipe/common/TFMP_JobRunFns.d.ts.map +1 -1
- package/dist/tf-mediapipe/index.d.ts +2 -3
- package/dist/tf-mediapipe/index.d.ts.map +1 -1
- package/dist/tf-mediapipe/index.js +674 -0
- package/dist/tf-mediapipe/index.js.map +14 -0
- package/package.json +83 -18
- package/dist/hf-transformers/registry/HFT_Client_RegisterJobFns.d.ts +0 -17
- package/dist/hf-transformers/registry/HFT_Client_RegisterJobFns.d.ts.map +0 -1
- package/dist/hf-transformers/registry/HFT_Inline_RegisterJobFns.d.ts +0 -16
- package/dist/hf-transformers/registry/HFT_Inline_RegisterJobFns.d.ts.map +0 -1
- package/dist/hf-transformers/registry/HFT_Worker_RegisterJobFns.d.ts +0 -8
- package/dist/hf-transformers/registry/HFT_Worker_RegisterJobFns.d.ts.map +0 -1
- package/dist/openai/provider/OpenAI_TaskRun.d.ts +0 -2
- package/dist/openai/provider/OpenAI_TaskRun.d.ts.map +0 -1
- package/dist/tf-mediapipe/registry/TFMP_Client_RegisterJobFns.d.ts +0 -17
- package/dist/tf-mediapipe/registry/TFMP_Client_RegisterJobFns.d.ts.map +0 -1
- package/dist/tf-mediapipe/registry/TFMP_Inline_RegisterJobFns.d.ts +0 -16
- package/dist/tf-mediapipe/registry/TFMP_Inline_RegisterJobFns.d.ts.map +0 -1
- package/dist/tf-mediapipe/registry/TFMP_Worker_RegisterJobFns.d.ts +0 -8
- package/dist/tf-mediapipe/registry/TFMP_Worker_RegisterJobFns.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TFMP_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/tf-mediapipe/common/TFMP_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"TFMP_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/tf-mediapipe/common/TFMP_JobRunFns.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
export * from "./common/TFMP_Constants";
|
|
7
7
|
export * from "./common/TFMP_JobRunFns";
|
|
8
8
|
export * from "./common/TFMP_ModelSchema";
|
|
9
|
-
export * from "./
|
|
10
|
-
export * from "./
|
|
11
|
-
export * from "./registry/TFMP_Worker_RegisterJobFns";
|
|
9
|
+
export * from "./TensorFlowMediaPipeProvider";
|
|
10
|
+
export * from "./TFMP_Worker";
|
|
12
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tf-mediapipe/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tf-mediapipe/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,674 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, {
|
|
5
|
+
get: all[name],
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
set: (newValue) => all[name] = () => newValue
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
12
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
13
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
14
|
+
}) : x)(function(x) {
|
|
15
|
+
if (typeof require !== "undefined")
|
|
16
|
+
return require.apply(this, arguments);
|
|
17
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// src/tf-mediapipe/common/TFMP_Constants.ts
|
|
21
|
+
var TENSORFLOW_MEDIAPIPE = "TENSORFLOW_MEDIAPIPE";
|
|
22
|
+
var TextPipelineTask = {
|
|
23
|
+
"text-embedder": "text-embedder",
|
|
24
|
+
"text-classifier": "text-classifier",
|
|
25
|
+
"text-language-detector": "text-language-detector",
|
|
26
|
+
"genai-text": "genai-text",
|
|
27
|
+
"audio-classifier": "audio-classifier",
|
|
28
|
+
"audio-embedder": "audio-embedder",
|
|
29
|
+
"vision-face-detector": "vision-face-detector",
|
|
30
|
+
"vision-face-landmarker": "vision-face-landmarker",
|
|
31
|
+
"vision-face-stylizer": "vision-face-stylizer",
|
|
32
|
+
"vision-gesture-recognizer": "vision-gesture-recognizer",
|
|
33
|
+
"vision-hand-landmarker": "vision-hand-landmarker",
|
|
34
|
+
"vision-holistic-landmarker": "vision-holistic-landmarker",
|
|
35
|
+
"vision-image-classifier": "vision-image-classifier",
|
|
36
|
+
"vision-image-embedder": "vision-image-embedder",
|
|
37
|
+
"vision-image-segmenter": "vision-image-segmenter",
|
|
38
|
+
"vision-image-interactive-segmenter": "vision-image-interactive-segmenter",
|
|
39
|
+
"vision-object-detector": "vision-object-detector",
|
|
40
|
+
"vision-pose-landmarker": "vision-pose-landmarker"
|
|
41
|
+
};
|
|
42
|
+
// src/tf-mediapipe/common/TFMP_JobRunFns.ts
|
|
43
|
+
import { PermanentJobError } from "@workglow/job-queue";
|
|
44
|
+
var _textSdk;
|
|
45
|
+
async function loadMediaPipeTextSDK() {
|
|
46
|
+
if (!_textSdk) {
|
|
47
|
+
try {
|
|
48
|
+
_textSdk = await import("@mediapipe/tasks-text");
|
|
49
|
+
} catch {
|
|
50
|
+
throw new Error("@mediapipe/tasks-text is required for MediaPipe text tasks. Install it with: bun add @mediapipe/tasks-text");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return _textSdk;
|
|
54
|
+
}
|
|
55
|
+
var _visionSdk;
|
|
56
|
+
async function loadMediaPipeVisionSDK() {
|
|
57
|
+
if (!_visionSdk) {
|
|
58
|
+
try {
|
|
59
|
+
_visionSdk = await import("@mediapipe/tasks-vision");
|
|
60
|
+
} catch {
|
|
61
|
+
throw new Error("@mediapipe/tasks-vision is required for MediaPipe vision tasks. Install it with: bun add @mediapipe/tasks-vision");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return _visionSdk;
|
|
65
|
+
}
|
|
66
|
+
var wasm_tasks = new Map;
|
|
67
|
+
var wasm_reference_counts = new Map;
|
|
68
|
+
var getWasmTask = async (model, onProgress, signal) => {
|
|
69
|
+
const task_engine = model.provider_config.task_engine;
|
|
70
|
+
if (wasm_tasks.has(task_engine)) {
|
|
71
|
+
return wasm_tasks.get(task_engine);
|
|
72
|
+
}
|
|
73
|
+
if (signal.aborted) {
|
|
74
|
+
throw new PermanentJobError("Aborted job");
|
|
75
|
+
}
|
|
76
|
+
onProgress(0.1, "Loading WASM task");
|
|
77
|
+
const { FilesetResolver } = await loadMediaPipeTextSDK();
|
|
78
|
+
let wasmFileset;
|
|
79
|
+
switch (task_engine) {
|
|
80
|
+
case "text":
|
|
81
|
+
wasmFileset = await FilesetResolver.forTextTasks("https://cdn.jsdelivr.net/npm/@mediapipe/tasks-text@latest/wasm");
|
|
82
|
+
break;
|
|
83
|
+
case "audio":
|
|
84
|
+
wasmFileset = await FilesetResolver.forAudioTasks("https://cdn.jsdelivr.net/npm/@mediapipe/tasks-audio@latest/wasm");
|
|
85
|
+
break;
|
|
86
|
+
case "vision":
|
|
87
|
+
wasmFileset = await FilesetResolver.forVisionTasks("https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm");
|
|
88
|
+
break;
|
|
89
|
+
case "genai":
|
|
90
|
+
wasmFileset = await FilesetResolver.forGenAiTasks("https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm");
|
|
91
|
+
break;
|
|
92
|
+
default:
|
|
93
|
+
throw new PermanentJobError("Invalid task engine");
|
|
94
|
+
}
|
|
95
|
+
wasm_tasks.set(task_engine, wasmFileset);
|
|
96
|
+
return wasmFileset;
|
|
97
|
+
};
|
|
98
|
+
var modelTaskCache = new Map;
|
|
99
|
+
var optionsMatch = (opts1, opts2) => {
|
|
100
|
+
const keys1 = Object.keys(opts1).sort();
|
|
101
|
+
const keys2 = Object.keys(opts2).sort();
|
|
102
|
+
if (keys1.length !== keys2.length)
|
|
103
|
+
return false;
|
|
104
|
+
return keys1.every((key) => {
|
|
105
|
+
const val1 = opts1[key];
|
|
106
|
+
const val2 = opts2[key];
|
|
107
|
+
if (Array.isArray(val1) && Array.isArray(val2)) {
|
|
108
|
+
return JSON.stringify(val1) === JSON.stringify(val2);
|
|
109
|
+
}
|
|
110
|
+
return val1 === val2;
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
var getModelTask = async (model, options, onProgress, signal, TaskType) => {
|
|
114
|
+
const model_path = model.provider_config.model_path;
|
|
115
|
+
const task_engine = model.provider_config.task_engine;
|
|
116
|
+
const cachedTasks = modelTaskCache.get(model_path);
|
|
117
|
+
if (cachedTasks) {
|
|
118
|
+
const matchedTask = cachedTasks.find((cached) => optionsMatch(cached.options, options));
|
|
119
|
+
if (matchedTask) {
|
|
120
|
+
return matchedTask.task;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const wasmFileset = await getWasmTask(model, onProgress, signal);
|
|
124
|
+
onProgress(0.2, "Creating model task");
|
|
125
|
+
const task = await TaskType.createFromOptions(wasmFileset, {
|
|
126
|
+
baseOptions: {
|
|
127
|
+
modelAssetPath: model_path
|
|
128
|
+
},
|
|
129
|
+
...options
|
|
130
|
+
});
|
|
131
|
+
const cachedTask = { task, options, task_engine };
|
|
132
|
+
if (!modelTaskCache.has(model_path)) {
|
|
133
|
+
modelTaskCache.set(model_path, []);
|
|
134
|
+
}
|
|
135
|
+
modelTaskCache.get(model_path).push(cachedTask);
|
|
136
|
+
wasm_reference_counts.set(task_engine, (wasm_reference_counts.get(task_engine) || 0) + 1);
|
|
137
|
+
return task;
|
|
138
|
+
};
|
|
139
|
+
var TFMP_Download = async (input, model, onProgress, signal) => {
|
|
140
|
+
let task;
|
|
141
|
+
switch (model?.provider_config.pipeline) {
|
|
142
|
+
case "text-embedder": {
|
|
143
|
+
const { TextEmbedder } = await loadMediaPipeTextSDK();
|
|
144
|
+
task = await getModelTask(model, {}, onProgress, signal, TextEmbedder);
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
case "text-classifier": {
|
|
148
|
+
const { TextClassifier } = await loadMediaPipeTextSDK();
|
|
149
|
+
task = await getModelTask(model, {}, onProgress, signal, TextClassifier);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
case "text-language-detector": {
|
|
153
|
+
const { LanguageDetector } = await loadMediaPipeTextSDK();
|
|
154
|
+
task = await getModelTask(model, {}, onProgress, signal, LanguageDetector);
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
case "vision-image-classifier": {
|
|
158
|
+
const { ImageClassifier } = await loadMediaPipeVisionSDK();
|
|
159
|
+
task = await getModelTask(model, {}, onProgress, signal, ImageClassifier);
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
case "vision-image-embedder": {
|
|
163
|
+
const { ImageEmbedder } = await loadMediaPipeVisionSDK();
|
|
164
|
+
task = await getModelTask(model, {}, onProgress, signal, ImageEmbedder);
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
case "vision-image-segmenter": {
|
|
168
|
+
const { ImageSegmenter } = await loadMediaPipeVisionSDK();
|
|
169
|
+
task = await getModelTask(model, {}, onProgress, signal, ImageSegmenter);
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
case "vision-object-detector": {
|
|
173
|
+
const { ObjectDetector } = await loadMediaPipeVisionSDK();
|
|
174
|
+
task = await getModelTask(model, {}, onProgress, signal, ObjectDetector);
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
case "vision-face-detector": {
|
|
178
|
+
const { FaceDetector } = await loadMediaPipeVisionSDK();
|
|
179
|
+
task = await getModelTask(model, {}, onProgress, signal, FaceDetector);
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
case "vision-face-landmarker": {
|
|
183
|
+
const { FaceLandmarker } = await loadMediaPipeVisionSDK();
|
|
184
|
+
task = await getModelTask(model, {}, onProgress, signal, FaceLandmarker);
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
case "vision-gesture-recognizer": {
|
|
188
|
+
const { GestureRecognizer } = await loadMediaPipeVisionSDK();
|
|
189
|
+
task = await getModelTask(model, {}, onProgress, signal, GestureRecognizer);
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case "vision-hand-landmarker": {
|
|
193
|
+
const { HandLandmarker } = await loadMediaPipeVisionSDK();
|
|
194
|
+
task = await getModelTask(model, {}, onProgress, signal, HandLandmarker);
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
case "vision-pose-landmarker": {
|
|
198
|
+
const { PoseLandmarker } = await loadMediaPipeVisionSDK();
|
|
199
|
+
task = await getModelTask(model, {}, onProgress, signal, PoseLandmarker);
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
default:
|
|
203
|
+
throw new PermanentJobError(`Invalid pipeline: ${model?.provider_config.pipeline}. Supported pipelines: text-embedder, text-classifier, text-language-detector, vision-image-classifier, vision-image-embedder, vision-image-segmenter, vision-object-detector, vision-face-detector, vision-face-landmarker, vision-gesture-recognizer, vision-hand-landmarker, vision-pose-landmarker`);
|
|
204
|
+
}
|
|
205
|
+
onProgress(0.9, "Pipeline loaded");
|
|
206
|
+
task.close();
|
|
207
|
+
const task_engine = model?.provider_config.task_engine;
|
|
208
|
+
wasm_reference_counts.set(task_engine, wasm_reference_counts.get(task_engine) - 1);
|
|
209
|
+
return {
|
|
210
|
+
model: input.model
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
var TFMP_TextEmbedding = async (input, model, onProgress, signal) => {
|
|
214
|
+
const { TextEmbedder } = await loadMediaPipeTextSDK();
|
|
215
|
+
const textEmbedder = await getModelTask(model, {}, onProgress, signal, TextEmbedder);
|
|
216
|
+
if (Array.isArray(input.text)) {
|
|
217
|
+
const embeddings = input.text.map((text) => {
|
|
218
|
+
const result2 = textEmbedder.embed(text);
|
|
219
|
+
if (!result2.embeddings?.[0]?.floatEmbedding) {
|
|
220
|
+
throw new PermanentJobError("Failed to generate embedding: Empty result");
|
|
221
|
+
}
|
|
222
|
+
return Float32Array.from(result2.embeddings[0].floatEmbedding);
|
|
223
|
+
});
|
|
224
|
+
return {
|
|
225
|
+
vector: embeddings
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
const result = textEmbedder.embed(input.text);
|
|
229
|
+
if (!result.embeddings?.[0]?.floatEmbedding) {
|
|
230
|
+
throw new PermanentJobError("Failed to generate embedding: Empty result");
|
|
231
|
+
}
|
|
232
|
+
const embedding = Float32Array.from(result.embeddings[0].floatEmbedding);
|
|
233
|
+
return {
|
|
234
|
+
vector: embedding
|
|
235
|
+
};
|
|
236
|
+
};
|
|
237
|
+
var TFMP_TextClassification = async (input, model, onProgress, signal) => {
|
|
238
|
+
const { TextClassifier } = await loadMediaPipeTextSDK();
|
|
239
|
+
const TextClassification = await getModelTask(model, {
|
|
240
|
+
maxCategories: input.maxCategories
|
|
241
|
+
}, onProgress, signal, TextClassifier);
|
|
242
|
+
const result = TextClassification.classify(input.text);
|
|
243
|
+
if (!result.classifications?.[0]?.categories) {
|
|
244
|
+
throw new PermanentJobError("Failed to classify text: Empty result");
|
|
245
|
+
}
|
|
246
|
+
const categories = result.classifications[0].categories.map((category) => ({
|
|
247
|
+
label: category.categoryName,
|
|
248
|
+
score: category.score
|
|
249
|
+
}));
|
|
250
|
+
return {
|
|
251
|
+
categories
|
|
252
|
+
};
|
|
253
|
+
};
|
|
254
|
+
var TFMP_TextLanguageDetection = async (input, model, onProgress, signal) => {
|
|
255
|
+
const maxLanguages = input.maxLanguages === 0 ? -1 : input.maxLanguages;
|
|
256
|
+
const { LanguageDetector } = await loadMediaPipeTextSDK();
|
|
257
|
+
const textLanguageDetector = await getModelTask(model, {
|
|
258
|
+
maxLanguages
|
|
259
|
+
}, onProgress, signal, LanguageDetector);
|
|
260
|
+
const result = textLanguageDetector.detect(input.text);
|
|
261
|
+
if (!result.languages?.[0]?.languageCode) {
|
|
262
|
+
throw new PermanentJobError("Failed to detect language: Empty result");
|
|
263
|
+
}
|
|
264
|
+
const languages = result.languages.map((language) => ({
|
|
265
|
+
language: language.languageCode,
|
|
266
|
+
score: language.probability
|
|
267
|
+
}));
|
|
268
|
+
return {
|
|
269
|
+
languages
|
|
270
|
+
};
|
|
271
|
+
};
|
|
272
|
+
var TFMP_Unload = async (input, model, onProgress, signal) => {
|
|
273
|
+
const model_path = model.provider_config.model_path;
|
|
274
|
+
onProgress(10, "Unloading model");
|
|
275
|
+
if (modelTaskCache.has(model_path)) {
|
|
276
|
+
const cachedTasks = modelTaskCache.get(model_path);
|
|
277
|
+
for (const cachedTask of cachedTasks) {
|
|
278
|
+
const task = cachedTask.task;
|
|
279
|
+
if ("close" in task && typeof task.close === "function")
|
|
280
|
+
task.close();
|
|
281
|
+
const task_engine = cachedTask.task_engine;
|
|
282
|
+
const currentCount = wasm_reference_counts.get(task_engine) || 0;
|
|
283
|
+
const newCount = currentCount - 1;
|
|
284
|
+
if (newCount <= 0) {
|
|
285
|
+
wasm_tasks.delete(task_engine);
|
|
286
|
+
wasm_reference_counts.delete(task_engine);
|
|
287
|
+
} else {
|
|
288
|
+
wasm_reference_counts.set(task_engine, newCount);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
modelTaskCache.delete(model_path);
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
model: input.model
|
|
295
|
+
};
|
|
296
|
+
};
|
|
297
|
+
var TFMP_ImageSegmentation = async (input, model, onProgress, signal) => {
|
|
298
|
+
const { ImageSegmenter } = await loadMediaPipeVisionSDK();
|
|
299
|
+
const imageSegmenter = await getModelTask(model, {}, onProgress, signal, ImageSegmenter);
|
|
300
|
+
const result = imageSegmenter.segment(input.image);
|
|
301
|
+
if (!result.categoryMask) {
|
|
302
|
+
throw new PermanentJobError("Failed to segment image: Empty result");
|
|
303
|
+
}
|
|
304
|
+
const masks = [
|
|
305
|
+
{
|
|
306
|
+
label: "segment",
|
|
307
|
+
score: 1,
|
|
308
|
+
mask: {
|
|
309
|
+
data: result.categoryMask.canvas,
|
|
310
|
+
width: result.categoryMask.width,
|
|
311
|
+
height: result.categoryMask.height
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
];
|
|
315
|
+
return {
|
|
316
|
+
masks
|
|
317
|
+
};
|
|
318
|
+
};
|
|
319
|
+
var TFMP_ImageEmbedding = async (input, model, onProgress, signal) => {
|
|
320
|
+
const { ImageEmbedder } = await loadMediaPipeVisionSDK();
|
|
321
|
+
const imageEmbedder = await getModelTask(model, {}, onProgress, signal, ImageEmbedder);
|
|
322
|
+
const result = imageEmbedder.embed(input.image);
|
|
323
|
+
if (!result.embeddings?.[0]?.floatEmbedding) {
|
|
324
|
+
throw new PermanentJobError("Failed to generate embedding: Empty result");
|
|
325
|
+
}
|
|
326
|
+
const embedding = Float32Array.from(result.embeddings[0].floatEmbedding);
|
|
327
|
+
return {
|
|
328
|
+
vector: embedding
|
|
329
|
+
};
|
|
330
|
+
};
|
|
331
|
+
var TFMP_ImageClassification = async (input, model, onProgress, signal) => {
|
|
332
|
+
const { ImageClassifier } = await loadMediaPipeVisionSDK();
|
|
333
|
+
const imageClassifier = await getModelTask(model, {
|
|
334
|
+
maxResults: input.maxCategories
|
|
335
|
+
}, onProgress, signal, ImageClassifier);
|
|
336
|
+
const result = imageClassifier.classify(input.image);
|
|
337
|
+
if (!result.classifications?.[0]?.categories) {
|
|
338
|
+
throw new PermanentJobError("Failed to classify image: Empty result");
|
|
339
|
+
}
|
|
340
|
+
const categories = result.classifications[0].categories.map((category) => ({
|
|
341
|
+
label: category.categoryName,
|
|
342
|
+
score: category.score
|
|
343
|
+
}));
|
|
344
|
+
return {
|
|
345
|
+
categories
|
|
346
|
+
};
|
|
347
|
+
};
|
|
348
|
+
var TFMP_ObjectDetection = async (input, model, onProgress, signal) => {
|
|
349
|
+
const { ObjectDetector } = await loadMediaPipeVisionSDK();
|
|
350
|
+
const objectDetector = await getModelTask(model, {
|
|
351
|
+
scoreThreshold: input.threshold
|
|
352
|
+
}, onProgress, signal, ObjectDetector);
|
|
353
|
+
const result = objectDetector.detect(input.image);
|
|
354
|
+
if (!result.detections) {
|
|
355
|
+
throw new PermanentJobError("Failed to detect objects: Empty result");
|
|
356
|
+
}
|
|
357
|
+
const detections = result.detections.map((detection) => ({
|
|
358
|
+
label: detection.categories?.[0]?.categoryName || "unknown",
|
|
359
|
+
score: detection.categories?.[0]?.score || 0,
|
|
360
|
+
box: {
|
|
361
|
+
x: detection.boundingBox?.originX || 0,
|
|
362
|
+
y: detection.boundingBox?.originY || 0,
|
|
363
|
+
width: detection.boundingBox?.width || 0,
|
|
364
|
+
height: detection.boundingBox?.height || 0
|
|
365
|
+
}
|
|
366
|
+
}));
|
|
367
|
+
return {
|
|
368
|
+
detections
|
|
369
|
+
};
|
|
370
|
+
};
|
|
371
|
+
var TFMP_GestureRecognizer = async (input, model, onProgress, signal) => {
|
|
372
|
+
const { GestureRecognizer } = await loadMediaPipeVisionSDK();
|
|
373
|
+
const gestureRecognizer = await getModelTask(model, {
|
|
374
|
+
numHands: input.numHands,
|
|
375
|
+
minHandDetectionConfidence: input.minHandDetectionConfidence,
|
|
376
|
+
minHandPresenceConfidence: input.minHandPresenceConfidence,
|
|
377
|
+
minTrackingConfidence: input.minTrackingConfidence
|
|
378
|
+
}, onProgress, signal, GestureRecognizer);
|
|
379
|
+
const result = gestureRecognizer.recognize(input.image);
|
|
380
|
+
if (!result.gestures || !result.landmarks) {
|
|
381
|
+
throw new PermanentJobError("Failed to recognize gestures: Empty result");
|
|
382
|
+
}
|
|
383
|
+
const hands = result.gestures.map((gestures, index) => ({
|
|
384
|
+
gestures: gestures.map((g) => ({
|
|
385
|
+
label: g.categoryName,
|
|
386
|
+
score: g.score
|
|
387
|
+
})),
|
|
388
|
+
handedness: result.handedness[index].map((h) => ({
|
|
389
|
+
label: h.categoryName,
|
|
390
|
+
score: h.score
|
|
391
|
+
})),
|
|
392
|
+
landmarks: result.landmarks[index].map((l) => ({
|
|
393
|
+
x: l.x,
|
|
394
|
+
y: l.y,
|
|
395
|
+
z: l.z
|
|
396
|
+
})),
|
|
397
|
+
worldLandmarks: result.worldLandmarks[index].map((l) => ({
|
|
398
|
+
x: l.x,
|
|
399
|
+
y: l.y,
|
|
400
|
+
z: l.z
|
|
401
|
+
}))
|
|
402
|
+
}));
|
|
403
|
+
return {
|
|
404
|
+
hands
|
|
405
|
+
};
|
|
406
|
+
};
|
|
407
|
+
var TFMP_HandLandmarker = async (input, model, onProgress, signal) => {
|
|
408
|
+
const { HandLandmarker } = await loadMediaPipeVisionSDK();
|
|
409
|
+
const handLandmarker = await getModelTask(model, {
|
|
410
|
+
numHands: input.numHands,
|
|
411
|
+
minHandDetectionConfidence: input.minHandDetectionConfidence,
|
|
412
|
+
minHandPresenceConfidence: input.minHandPresenceConfidence,
|
|
413
|
+
minTrackingConfidence: input.minTrackingConfidence
|
|
414
|
+
}, onProgress, signal, HandLandmarker);
|
|
415
|
+
const result = handLandmarker.detect(input.image);
|
|
416
|
+
if (!result.landmarks) {
|
|
417
|
+
throw new PermanentJobError("Failed to detect hand landmarks: Empty result");
|
|
418
|
+
}
|
|
419
|
+
const hands = result.landmarks.map((landmarks, index) => ({
|
|
420
|
+
handedness: result.handedness[index].map((h) => ({
|
|
421
|
+
label: h.categoryName,
|
|
422
|
+
score: h.score
|
|
423
|
+
})),
|
|
424
|
+
landmarks: landmarks.map((l) => ({
|
|
425
|
+
x: l.x,
|
|
426
|
+
y: l.y,
|
|
427
|
+
z: l.z
|
|
428
|
+
})),
|
|
429
|
+
worldLandmarks: result.worldLandmarks[index].map((l) => ({
|
|
430
|
+
x: l.x,
|
|
431
|
+
y: l.y,
|
|
432
|
+
z: l.z
|
|
433
|
+
}))
|
|
434
|
+
}));
|
|
435
|
+
return {
|
|
436
|
+
hands
|
|
437
|
+
};
|
|
438
|
+
};
|
|
439
|
+
var TFMP_FaceDetector = async (input, model, onProgress, signal) => {
|
|
440
|
+
const { FaceDetector } = await loadMediaPipeVisionSDK();
|
|
441
|
+
const faceDetector = await getModelTask(model, {
|
|
442
|
+
minDetectionConfidence: input.minDetectionConfidence,
|
|
443
|
+
minSuppressionThreshold: input.minSuppressionThreshold
|
|
444
|
+
}, onProgress, signal, FaceDetector);
|
|
445
|
+
const result = faceDetector.detect(input.image);
|
|
446
|
+
if (!result.detections) {
|
|
447
|
+
throw new PermanentJobError("Failed to detect faces: Empty result");
|
|
448
|
+
}
|
|
449
|
+
const faces = result.detections.map((detection) => ({
|
|
450
|
+
box: {
|
|
451
|
+
x: detection.boundingBox?.originX || 0,
|
|
452
|
+
y: detection.boundingBox?.originY || 0,
|
|
453
|
+
width: detection.boundingBox?.width || 0,
|
|
454
|
+
height: detection.boundingBox?.height || 0
|
|
455
|
+
},
|
|
456
|
+
keypoints: detection.keypoints?.map((kp) => ({
|
|
457
|
+
x: kp.x,
|
|
458
|
+
y: kp.y,
|
|
459
|
+
label: kp.label
|
|
460
|
+
})) || [],
|
|
461
|
+
score: detection.categories?.[0]?.score || 0
|
|
462
|
+
}));
|
|
463
|
+
return {
|
|
464
|
+
faces
|
|
465
|
+
};
|
|
466
|
+
};
|
|
467
|
+
var TFMP_FaceLandmarker = async (input, model, onProgress, signal) => {
|
|
468
|
+
const { FaceLandmarker } = await loadMediaPipeVisionSDK();
|
|
469
|
+
const faceLandmarker = await getModelTask(model, {
|
|
470
|
+
numFaces: input.numFaces,
|
|
471
|
+
minFaceDetectionConfidence: input.minFaceDetectionConfidence,
|
|
472
|
+
minFacePresenceConfidence: input.minFacePresenceConfidence,
|
|
473
|
+
minTrackingConfidence: input.minTrackingConfidence,
|
|
474
|
+
outputFaceBlendshapes: input.outputFaceBlendshapes,
|
|
475
|
+
outputFacialTransformationMatrixes: input.outputFacialTransformationMatrixes
|
|
476
|
+
}, onProgress, signal, FaceLandmarker);
|
|
477
|
+
const result = faceLandmarker.detect(input.image);
|
|
478
|
+
if (!result.faceLandmarks) {
|
|
479
|
+
throw new PermanentJobError("Failed to detect face landmarks: Empty result");
|
|
480
|
+
}
|
|
481
|
+
const faces = result.faceLandmarks.map((landmarks, index) => {
|
|
482
|
+
const face = {
|
|
483
|
+
landmarks: landmarks.map((l) => ({
|
|
484
|
+
x: l.x,
|
|
485
|
+
y: l.y,
|
|
486
|
+
z: l.z
|
|
487
|
+
}))
|
|
488
|
+
};
|
|
489
|
+
if (result.faceBlendshapes && result.faceBlendshapes[index]) {
|
|
490
|
+
face.blendshapes = result.faceBlendshapes[index].categories.map((b) => ({
|
|
491
|
+
label: b.categoryName,
|
|
492
|
+
score: b.score
|
|
493
|
+
}));
|
|
494
|
+
}
|
|
495
|
+
if (result.facialTransformationMatrixes && result.facialTransformationMatrixes[index]) {
|
|
496
|
+
face.transformationMatrix = Array.from(result.facialTransformationMatrixes[index].data);
|
|
497
|
+
}
|
|
498
|
+
return face;
|
|
499
|
+
});
|
|
500
|
+
return {
|
|
501
|
+
faces
|
|
502
|
+
};
|
|
503
|
+
};
|
|
504
|
+
var TFMP_PoseLandmarker = async (input, model, onProgress, signal) => {
|
|
505
|
+
const { PoseLandmarker } = await loadMediaPipeVisionSDK();
|
|
506
|
+
const poseLandmarker = await getModelTask(model, {
|
|
507
|
+
numPoses: input.numPoses,
|
|
508
|
+
minPoseDetectionConfidence: input.minPoseDetectionConfidence,
|
|
509
|
+
minPosePresenceConfidence: input.minPosePresenceConfidence,
|
|
510
|
+
minTrackingConfidence: input.minTrackingConfidence,
|
|
511
|
+
outputSegmentationMasks: input.outputSegmentationMasks
|
|
512
|
+
}, onProgress, signal, PoseLandmarker);
|
|
513
|
+
const result = poseLandmarker.detect(input.image);
|
|
514
|
+
if (!result.landmarks) {
|
|
515
|
+
throw new PermanentJobError("Failed to detect pose landmarks: Empty result");
|
|
516
|
+
}
|
|
517
|
+
const poses = result.landmarks.map((landmarks, index) => {
|
|
518
|
+
const pose = {
|
|
519
|
+
landmarks: landmarks.map((l) => ({
|
|
520
|
+
x: l.x,
|
|
521
|
+
y: l.y,
|
|
522
|
+
z: l.z,
|
|
523
|
+
visibility: l.visibility,
|
|
524
|
+
presence: l.presence
|
|
525
|
+
})),
|
|
526
|
+
worldLandmarks: result.worldLandmarks[index].map((l) => ({
|
|
527
|
+
x: l.x,
|
|
528
|
+
y: l.y,
|
|
529
|
+
z: l.z,
|
|
530
|
+
visibility: l.visibility,
|
|
531
|
+
presence: l.presence
|
|
532
|
+
}))
|
|
533
|
+
};
|
|
534
|
+
if (result.segmentationMasks && result.segmentationMasks[index]) {
|
|
535
|
+
const mask = result.segmentationMasks[index];
|
|
536
|
+
pose.segmentationMask = {
|
|
537
|
+
data: mask.canvas || mask,
|
|
538
|
+
width: mask.width,
|
|
539
|
+
height: mask.height
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
return pose;
|
|
543
|
+
});
|
|
544
|
+
return {
|
|
545
|
+
poses
|
|
546
|
+
};
|
|
547
|
+
};
|
|
548
|
+
var TFMP_TASKS = {
|
|
549
|
+
DownloadModelTask: TFMP_Download,
|
|
550
|
+
UnloadModelTask: TFMP_Unload,
|
|
551
|
+
TextEmbeddingTask: TFMP_TextEmbedding,
|
|
552
|
+
TextLanguageDetectionTask: TFMP_TextLanguageDetection,
|
|
553
|
+
TextClassificationTask: TFMP_TextClassification,
|
|
554
|
+
ImageSegmentationTask: TFMP_ImageSegmentation,
|
|
555
|
+
ImageEmbeddingTask: TFMP_ImageEmbedding,
|
|
556
|
+
ImageClassificationTask: TFMP_ImageClassification,
|
|
557
|
+
ObjectDetectionTask: TFMP_ObjectDetection,
|
|
558
|
+
GestureRecognizerTask: TFMP_GestureRecognizer,
|
|
559
|
+
HandLandmarkerTask: TFMP_HandLandmarker,
|
|
560
|
+
FaceDetectorTask: TFMP_FaceDetector,
|
|
561
|
+
FaceLandmarkerTask: TFMP_FaceLandmarker,
|
|
562
|
+
PoseLandmarkerTask: TFMP_PoseLandmarker
|
|
563
|
+
};
|
|
564
|
+
// src/tf-mediapipe/common/TFMP_ModelSchema.ts
|
|
565
|
+
import { ModelConfigSchema, ModelRecordSchema } from "@workglow/ai";
|
|
566
|
+
var TFMPModelSchema = {
|
|
567
|
+
type: "object",
|
|
568
|
+
properties: {
|
|
569
|
+
provider: {
|
|
570
|
+
const: TENSORFLOW_MEDIAPIPE,
|
|
571
|
+
description: "Discriminator: TensorFlow MediaPipe backend."
|
|
572
|
+
},
|
|
573
|
+
provider_config: {
|
|
574
|
+
type: "object",
|
|
575
|
+
description: "TensorFlow MediaPipe-specific options.",
|
|
576
|
+
properties: {
|
|
577
|
+
model_path: {
|
|
578
|
+
type: "string",
|
|
579
|
+
description: "Filesystem path or URI for the ONNX model."
|
|
580
|
+
},
|
|
581
|
+
task_engine: {
|
|
582
|
+
type: "string",
|
|
583
|
+
enum: ["text", "audio", "vision", "genai"],
|
|
584
|
+
description: "Task engine for the MediaPipe model."
|
|
585
|
+
},
|
|
586
|
+
pipeline: {
|
|
587
|
+
type: "string",
|
|
588
|
+
enum: Object.values(TextPipelineTask),
|
|
589
|
+
description: "Pipeline task type for the MediaPipe model."
|
|
590
|
+
}
|
|
591
|
+
},
|
|
592
|
+
required: ["model_path", "task_engine", "pipeline"],
|
|
593
|
+
additionalProperties: false
|
|
594
|
+
}
|
|
595
|
+
},
|
|
596
|
+
required: ["provider", "provider_config"],
|
|
597
|
+
additionalProperties: true
|
|
598
|
+
};
|
|
599
|
+
var TFMPModelRecordSchema = {
|
|
600
|
+
type: "object",
|
|
601
|
+
properties: {
|
|
602
|
+
...ModelRecordSchema.properties,
|
|
603
|
+
...TFMPModelSchema.properties
|
|
604
|
+
},
|
|
605
|
+
required: [...ModelRecordSchema.required, ...TFMPModelSchema.required],
|
|
606
|
+
additionalProperties: false
|
|
607
|
+
};
|
|
608
|
+
var TFMPModelConfigSchema = {
|
|
609
|
+
type: "object",
|
|
610
|
+
properties: {
|
|
611
|
+
...ModelConfigSchema.properties,
|
|
612
|
+
...TFMPModelSchema.properties
|
|
613
|
+
},
|
|
614
|
+
required: [...ModelConfigSchema.required, ...TFMPModelSchema.required],
|
|
615
|
+
additionalProperties: false
|
|
616
|
+
};
|
|
617
|
+
// src/tf-mediapipe/TensorFlowMediaPipeProvider.ts
|
|
618
|
+
import { AiProvider } from "@workglow/ai";
|
|
619
|
+
class TensorFlowMediaPipeProvider extends AiProvider {
|
|
620
|
+
name = TENSORFLOW_MEDIAPIPE;
|
|
621
|
+
taskTypes = [
|
|
622
|
+
"DownloadModelTask",
|
|
623
|
+
"UnloadModelTask",
|
|
624
|
+
"TextEmbeddingTask",
|
|
625
|
+
"TextLanguageDetectionTask",
|
|
626
|
+
"TextClassificationTask",
|
|
627
|
+
"ImageSegmentationTask",
|
|
628
|
+
"ImageEmbeddingTask",
|
|
629
|
+
"ImageClassificationTask",
|
|
630
|
+
"ObjectDetectionTask",
|
|
631
|
+
"GestureRecognizerTask",
|
|
632
|
+
"HandLandmarkerTask",
|
|
633
|
+
"FaceDetectorTask",
|
|
634
|
+
"FaceLandmarkerTask",
|
|
635
|
+
"PoseLandmarkerTask"
|
|
636
|
+
];
|
|
637
|
+
constructor(tasks) {
|
|
638
|
+
super(tasks);
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
// src/tf-mediapipe/TFMP_Worker.ts
|
|
642
|
+
import { globalServiceRegistry, parentPort, WORKER_SERVER } from "@workglow/util";
|
|
643
|
+
function TFMP_WORKER_JOBRUN_REGISTER() {
|
|
644
|
+
const workerServer = globalServiceRegistry.get(WORKER_SERVER);
|
|
645
|
+
new TensorFlowMediaPipeProvider(TFMP_TASKS).registerOnWorkerServer(workerServer);
|
|
646
|
+
parentPort.postMessage({ type: "ready" });
|
|
647
|
+
console.log("TFMP_WORKER_JOBRUN registered");
|
|
648
|
+
}
|
|
649
|
+
export {
|
|
650
|
+
TextPipelineTask,
|
|
651
|
+
TensorFlowMediaPipeProvider,
|
|
652
|
+
TFMP_WORKER_JOBRUN_REGISTER,
|
|
653
|
+
TFMP_Unload,
|
|
654
|
+
TFMP_TextLanguageDetection,
|
|
655
|
+
TFMP_TextEmbedding,
|
|
656
|
+
TFMP_TextClassification,
|
|
657
|
+
TFMP_TASKS,
|
|
658
|
+
TFMP_PoseLandmarker,
|
|
659
|
+
TFMP_ObjectDetection,
|
|
660
|
+
TFMP_ImageSegmentation,
|
|
661
|
+
TFMP_ImageEmbedding,
|
|
662
|
+
TFMP_ImageClassification,
|
|
663
|
+
TFMP_HandLandmarker,
|
|
664
|
+
TFMP_GestureRecognizer,
|
|
665
|
+
TFMP_FaceLandmarker,
|
|
666
|
+
TFMP_FaceDetector,
|
|
667
|
+
TFMP_Download,
|
|
668
|
+
TFMPModelSchema,
|
|
669
|
+
TFMPModelRecordSchema,
|
|
670
|
+
TFMPModelConfigSchema,
|
|
671
|
+
TENSORFLOW_MEDIAPIPE
|
|
672
|
+
};
|
|
673
|
+
|
|
674
|
+
//# debugId=0AF5B3FEF7B1A64464756E2164756E21
|