@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
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
} from "../index-6j5pq722.js";
|
|
12
12
|
// src/provider-llamacpp/common/LlamaCpp_JobRunFns.ts
|
|
13
13
|
import { filterValidToolCalls } from "@workglow/ai";
|
|
14
|
+
import { getLogger } from "@workglow/util";
|
|
14
15
|
var _sdk;
|
|
15
16
|
async function loadSdk() {
|
|
16
17
|
if (!_sdk) {
|
|
@@ -178,6 +179,16 @@ var LlamaCpp_Unload = async (input, model, update_progress, _signal) => {
|
|
|
178
179
|
return { model: input.model };
|
|
179
180
|
};
|
|
180
181
|
var LlamaCpp_TextGeneration = async (input, model, update_progress, signal) => {
|
|
182
|
+
if (Array.isArray(input.prompt)) {
|
|
183
|
+
getLogger().warn("LlamaCpp_TextGeneration: array input received; processing sequentially (no native batch support)");
|
|
184
|
+
const prompts = input.prompt;
|
|
185
|
+
const results = [];
|
|
186
|
+
for (const item of prompts) {
|
|
187
|
+
const r = await LlamaCpp_TextGeneration({ ...input, prompt: item }, model, update_progress, signal);
|
|
188
|
+
results.push(r.text);
|
|
189
|
+
}
|
|
190
|
+
return { text: results };
|
|
191
|
+
}
|
|
181
192
|
if (!model)
|
|
182
193
|
throw new Error("Model config is required for TextGenerationTask.");
|
|
183
194
|
const { LlamaChatSession } = await loadSdk();
|
|
@@ -235,6 +246,16 @@ var LlamaCpp_TextEmbedding = async (input, model, update_progress, _signal) => {
|
|
|
235
246
|
return { vector: embeddings[0] };
|
|
236
247
|
};
|
|
237
248
|
var LlamaCpp_TextRewriter = async (input, model, update_progress, signal) => {
|
|
249
|
+
if (Array.isArray(input.text)) {
|
|
250
|
+
getLogger().warn("LlamaCpp_TextRewriter: array input received; processing sequentially (no native batch support)");
|
|
251
|
+
const texts = input.text;
|
|
252
|
+
const results = [];
|
|
253
|
+
for (const item of texts) {
|
|
254
|
+
const r = await LlamaCpp_TextRewriter({ ...input, text: item }, model, update_progress, signal);
|
|
255
|
+
results.push(r.text);
|
|
256
|
+
}
|
|
257
|
+
return { text: results };
|
|
258
|
+
}
|
|
238
259
|
if (!model)
|
|
239
260
|
throw new Error("Model config is required for TextRewriterTask.");
|
|
240
261
|
const { LlamaChatSession } = await loadSdk();
|
|
@@ -267,6 +288,16 @@ var LlamaCpp_TextRewriter_Stream = async function* (input, model, signal) {
|
|
|
267
288
|
}
|
|
268
289
|
};
|
|
269
290
|
var LlamaCpp_TextSummary = async (input, model, update_progress, signal) => {
|
|
291
|
+
if (Array.isArray(input.text)) {
|
|
292
|
+
getLogger().warn("LlamaCpp_TextSummary: array input received; processing sequentially (no native batch support)");
|
|
293
|
+
const texts = input.text;
|
|
294
|
+
const results = [];
|
|
295
|
+
for (const item of texts) {
|
|
296
|
+
const r = await LlamaCpp_TextSummary({ ...input, text: item }, model, update_progress, signal);
|
|
297
|
+
results.push(r.text);
|
|
298
|
+
}
|
|
299
|
+
return { text: results };
|
|
300
|
+
}
|
|
270
301
|
if (!model)
|
|
271
302
|
throw new Error("Model config is required for TextSummaryTask.");
|
|
272
303
|
const { LlamaChatSession } = await loadSdk();
|
|
@@ -321,6 +352,16 @@ async function disposeLlamaCppResources() {
|
|
|
321
352
|
resolvedPaths.clear();
|
|
322
353
|
}
|
|
323
354
|
var LlamaCpp_CountTokens = async (input, model, onProgress, signal) => {
|
|
355
|
+
if (Array.isArray(input.text)) {
|
|
356
|
+
getLogger().warn("LlamaCpp_CountTokens: array input received; processing sequentially (no native batch support)");
|
|
357
|
+
const texts = input.text;
|
|
358
|
+
const counts = [];
|
|
359
|
+
for (const item of texts) {
|
|
360
|
+
const r = await LlamaCpp_CountTokens({ ...input, text: item }, model, onProgress, signal);
|
|
361
|
+
counts.push(r.count);
|
|
362
|
+
}
|
|
363
|
+
return { count: counts };
|
|
364
|
+
}
|
|
324
365
|
const loadedModel = await getOrLoadModel(model);
|
|
325
366
|
const tokens = loadedModel.tokenizer(input.text);
|
|
326
367
|
return { count: tokens.length };
|
|
@@ -345,6 +386,18 @@ function buildLlamaCppFunctions(tools, capturedCalls) {
|
|
|
345
386
|
return functions;
|
|
346
387
|
}
|
|
347
388
|
var LlamaCpp_ToolCalling = async (input, model, update_progress, signal) => {
|
|
389
|
+
if (Array.isArray(input.prompt)) {
|
|
390
|
+
getLogger().warn("LlamaCpp_ToolCalling: array input received; processing sequentially (no native batch support)");
|
|
391
|
+
const prompts = input.prompt;
|
|
392
|
+
const texts = [];
|
|
393
|
+
const toolCallsList = [];
|
|
394
|
+
for (const item of prompts) {
|
|
395
|
+
const r = await LlamaCpp_ToolCalling({ ...input, prompt: item }, model, update_progress, signal);
|
|
396
|
+
texts.push(r.text);
|
|
397
|
+
toolCallsList.push(r.toolCalls);
|
|
398
|
+
}
|
|
399
|
+
return { text: texts, toolCalls: toolCallsList };
|
|
400
|
+
}
|
|
348
401
|
if (!model)
|
|
349
402
|
throw new Error("Model config is required for ToolCallingTask.");
|
|
350
403
|
await loadSdk();
|
|
@@ -506,12 +559,12 @@ var LLAMACPP_REACTIVE_TASKS = {
|
|
|
506
559
|
CountTokensTask: LlamaCpp_CountTokens_Reactive
|
|
507
560
|
};
|
|
508
561
|
// src/provider-llamacpp/LlamaCpp_Worker.ts
|
|
509
|
-
import { getLogger, globalServiceRegistry, WORKER_SERVER } from "@workglow/util";
|
|
562
|
+
import { getLogger as getLogger2, globalServiceRegistry, WORKER_SERVER } from "@workglow/util";
|
|
510
563
|
function LLAMACPP_WORKER_JOBRUN_REGISTER() {
|
|
511
564
|
const workerServer = globalServiceRegistry.get(WORKER_SERVER);
|
|
512
565
|
new LlamaCppProvider(LLAMACPP_TASKS, LLAMACPP_STREAM_TASKS, LLAMACPP_REACTIVE_TASKS).registerOnWorkerServer(workerServer);
|
|
513
566
|
workerServer.sendReady();
|
|
514
|
-
|
|
567
|
+
getLogger2().info("LLAMACPP_WORKER_JOBRUN registered");
|
|
515
568
|
}
|
|
516
569
|
export {
|
|
517
570
|
disposeLlamaCppResources,
|
|
@@ -541,4 +594,4 @@ export {
|
|
|
541
594
|
LLAMACPP_DEFAULT_MODELS_DIR
|
|
542
595
|
};
|
|
543
596
|
|
|
544
|
-
//# debugId=
|
|
597
|
+
//# debugId=3B2BE18FF6F105A164756E2164756E21
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/provider-llamacpp/common/LlamaCpp_JobRunFns.ts", "../src/provider-llamacpp/LlamaCpp_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 {\n AiProviderReactiveRunFn,\n AiProviderRunFn,\n AiProviderStreamFn,\n CountTokensTaskInput,\n CountTokensTaskOutput,\n DownloadModelTaskRunInput,\n DownloadModelTaskRunOutput,\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolDefinition,\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n UnloadModelTaskRunInput,\n UnloadModelTaskRunOutput,\n} from \"@workglow/ai\";\nimport { filterValidToolCalls } from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { LLAMACPP_DEFAULT_MODELS_DIR } from \"./LlamaCpp_Constants\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\n\n// ========================================================================\n// Lazy SDK loading\n// ========================================================================\n\nlet _sdk: typeof import(\"node-llama-cpp\") | undefined;\n\nasync function loadSdk() {\n if (!_sdk) {\n try {\n _sdk = await import(\"node-llama-cpp\");\n } catch (err) {\n throw new Error(\n \"node-llama-cpp is required for LOCAL_LLAMACPP tasks. Install it with: bun add node-llama-cpp\"\n );\n }\n }\n return _sdk;\n}\n\n// ========================================================================\n// Module-level caches (shared across all task invocations)\n// ========================================================================\n\ntype LlamaInstance = Awaited<ReturnType<(typeof import(\"node-llama-cpp\"))[\"getLlama\"]>>;\ntype LlamaModel = Awaited<ReturnType<LlamaInstance[\"loadModel\"]>>;\ntype LlamaContext = Awaited<ReturnType<LlamaModel[\"createContext\"]>>;\ntype LlamaEmbeddingContext = Awaited<ReturnType<LlamaModel[\"createEmbeddingContext\"]>>;\n\nlet llamaInstance: LlamaInstance | undefined;\nconst models = new Map<string, LlamaModel>();\nconst textContexts = new Map<string, LlamaContext>();\nconst embeddingContexts = new Map<string, LlamaEmbeddingContext>();\n\n/** Maps model_url (or model_path when used as URI) to the actual downloaded filesystem path. */\nconst resolvedPaths = new Map<string, string>();\n\n// ========================================================================\n// Helpers\n// ========================================================================\n\nasync function getLlamaInstance(): Promise<LlamaInstance> {\n if (!llamaInstance) {\n const { getLlama } = await loadSdk();\n llamaInstance = await getLlama();\n }\n return llamaInstance;\n}\n\nfunction getConfigKey(model: LlamaCppModelConfig): string {\n return model.provider_config.model_url ?? model.provider_config.model_path;\n}\n\nfunction getActualModelPath(model: LlamaCppModelConfig): string {\n const key = getConfigKey(model);\n const resolved = resolvedPaths.get(key);\n return resolved ?? model.provider_config.model_path;\n}\n\nasync function getOrLoadModel(model: LlamaCppModelConfig): Promise<LlamaModel> {\n const modelPath = getActualModelPath(model);\n const cached = models.get(modelPath);\n if (cached) return cached;\n\n const llama = await getLlamaInstance();\n const config = model.provider_config;\n\n const loadedModel = await llama.loadModel({\n modelPath,\n ...(config.gpu_layers !== undefined && { gpuLayers: config.gpu_layers }),\n });\n\n models.set(modelPath, loadedModel);\n return loadedModel;\n}\n\nasync function getOrCreateTextContext(model: LlamaCppModelConfig): Promise<LlamaContext> {\n const modelPath = getActualModelPath(model);\n const cached = textContexts.get(modelPath);\n if (cached) return cached;\n\n const loadedModel = await getOrLoadModel(model);\n const config = model.provider_config;\n\n const context = await loadedModel.createContext({\n ...(config.context_size && { contextSize: config.context_size }),\n ...(config.flash_attention !== undefined && { flashAttention: config.flash_attention }),\n });\n\n textContexts.set(modelPath, context);\n return context;\n}\n\nasync function getOrCreateEmbeddingContext(\n model: LlamaCppModelConfig\n): Promise<LlamaEmbeddingContext> {\n const modelPath = getActualModelPath(model);\n const cached = embeddingContexts.get(modelPath);\n if (cached) return cached;\n\n const loadedModel = await getOrLoadModel(model);\n\n const context = await loadedModel.createEmbeddingContext();\n\n embeddingContexts.set(modelPath, context);\n return context;\n}\n\n/**\n * Bridges a node-llama-cpp session.prompt() call (callback-based) to an AsyncGenerator\n * of StreamEvents. Handles abort signals and errors cleanly.\n */\nasync function* streamFromSession<T extends Record<string, unknown>>(\n promptFn: (onTextChunk: (chunk: string) => void) => Promise<string>,\n signal: AbortSignal\n): AsyncGenerator<StreamEvent<T>> {\n const queue: string[] = [];\n let isComplete = false;\n let completionError: unknown;\n let resolveWait: (() => void) | null = null;\n\n const notifyWaiter = () => {\n resolveWait?.();\n resolveWait = null;\n };\n\n const promptPromise = promptFn((chunk: string) => {\n queue.push(chunk);\n notifyWaiter();\n })\n .then(() => {\n isComplete = true;\n notifyWaiter();\n })\n .catch((err: unknown) => {\n completionError = err;\n isComplete = true;\n notifyWaiter();\n });\n\n try {\n while (true) {\n while (queue.length > 0) {\n yield { type: \"text-delta\", port: \"text\", textDelta: queue.shift()! };\n }\n if (isComplete) break;\n await new Promise<void>((r) => {\n resolveWait = r;\n });\n }\n // Drain any remaining chunks after completion signal\n while (queue.length > 0) {\n yield { type: \"text-delta\", port: \"text\", textDelta: queue.shift()! };\n }\n } finally {\n await promptPromise.catch(() => {});\n }\n\n if (completionError) {\n if (signal.aborted) return;\n throw completionError;\n }\n\n yield { type: \"finish\", data: {} as T };\n}\n\n// ========================================================================\n// DownloadModelTask\n// ========================================================================\n\nexport const LlamaCpp_Download: AiProviderRunFn<\n DownloadModelTaskRunInput,\n DownloadModelTaskRunOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, signal) => {\n if (!model) throw new Error(\"Model config is required for DownloadModelTask.\");\n\n const { createModelDownloader } = await loadSdk();\n const config = model.provider_config;\n const modelUri = config.model_url ?? config.model_path;\n const dirPath = config.models_dir ?? LLAMACPP_DEFAULT_MODELS_DIR;\n\n update_progress(0, \"Creating model downloader\");\n\n const downloader = await createModelDownloader({ modelUri, dirPath });\n\n // Poll download progress via interval (ModelDownloader exposes downloadedSize / totalSize)\n const progressInterval = setInterval(() => {\n const total = (downloader as any).totalSize as number | undefined;\n const downloaded = (downloader as any).downloadedSize as number | undefined;\n if (total && total > 0 && downloaded !== undefined) {\n const pct = Math.min(99, Math.round((downloaded / total) * 100));\n update_progress(pct, \"Downloading model\", { file: modelUri, progress: pct / 100 });\n }\n }, 500);\n\n let modelPath: string;\n try {\n modelPath = await downloader.download();\n } finally {\n clearInterval(progressInterval);\n }\n\n // Store the resolved filesystem path for subsequent inference tasks\n resolvedPaths.set(getConfigKey(model), modelPath);\n\n update_progress(100, \"Model downloaded\", { file: modelUri, progress: 1 });\n\n return { model: input.model! };\n};\n\n// ========================================================================\n// UnloadModelTask\n// ========================================================================\n\nexport const LlamaCpp_Unload: AiProviderRunFn<\n UnloadModelTaskRunInput,\n UnloadModelTaskRunOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, _signal) => {\n if (!model) throw new Error(\"Model config is required for UnloadModelTask.\");\n\n const modelPath = getActualModelPath(model);\n\n // Dispose and remove the text context\n const ctx = textContexts.get(modelPath);\n if (ctx) {\n await ctx.dispose();\n textContexts.delete(modelPath);\n update_progress(33, \"Text context disposed\");\n }\n\n // Dispose and remove the embedding context\n const embCtx = embeddingContexts.get(modelPath);\n if (embCtx) {\n await embCtx.dispose();\n embeddingContexts.delete(modelPath);\n update_progress(66, \"Embedding context disposed\");\n }\n\n // Dispose and remove the model\n const cachedModel = models.get(modelPath);\n if (cachedModel) {\n await cachedModel.dispose();\n models.delete(modelPath);\n update_progress(100, \"Model unloaded from memory\");\n } else {\n update_progress(100, \"Model was not loaded\");\n }\n\n return { model: input.model! };\n};\n\n// ========================================================================\n// TextGenerationTask (non-streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, signal) => {\n if (!model) throw new Error(\"Model config is required for TextGenerationTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n update_progress(0, \"Loading model\");\n const context = await getOrCreateTextContext(model);\n\n update_progress(10, \"Generating text\");\n const sequence = context.getSequence();\n const session = new LlamaChatSession({ contextSequence: sequence });\n try {\n const text = await session.prompt(input.prompt, {\n signal,\n ...(input.temperature !== undefined && { temperature: input.temperature }),\n ...(input.maxTokens !== undefined && { maxTokens: input.maxTokens }),\n ...(input.topP !== undefined && { topP: input.topP }),\n });\n update_progress(100, \"Text generation complete\");\n return { text };\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// TextGenerationTask (streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n LlamaCppModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n if (!model) throw new Error(\"Model config is required for TextGenerationTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n const context = await getOrCreateTextContext(model);\n const sequence = context.getSequence();\n const session = new LlamaChatSession({ contextSequence: sequence });\n try {\n yield* streamFromSession<TextGenerationTaskOutput>((onTextChunk) => {\n return session.prompt(input.prompt, {\n signal,\n onTextChunk,\n ...(input.temperature !== undefined && { temperature: input.temperature }),\n ...(input.maxTokens !== undefined && { maxTokens: input.maxTokens }),\n ...(input.topP !== undefined && { topP: input.topP }),\n });\n }, signal);\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// TextEmbeddingTask\n// ========================================================================\n\nexport const LlamaCpp_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, _signal) => {\n if (!model) throw new Error(\"Model config is required for TextEmbeddingTask.\");\n\n update_progress(0, \"Loading embedding model\");\n const context = await getOrCreateEmbeddingContext(model);\n\n const texts = Array.isArray(input.text) ? input.text : [input.text];\n update_progress(10, \"Computing embeddings\");\n\n const embeddings = await Promise.all(\n texts.map((text) => context.getEmbeddingFor(text).then((e) => new Float32Array(e.vector)))\n );\n\n update_progress(100, \"Embeddings complete\");\n\n if (Array.isArray(input.text)) {\n return { vector: embeddings };\n }\n return { vector: embeddings[0] };\n};\n\n// ========================================================================\n// TextRewriterTask (non-streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, signal) => {\n if (!model) throw new Error(\"Model config is required for TextRewriterTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n update_progress(0, \"Loading model\");\n const context = await getOrCreateTextContext(model);\n\n update_progress(10, \"Rewriting text\");\n const sequence = context.getSequence();\n const session = new LlamaChatSession({ contextSequence: sequence, systemPrompt: input.prompt });\n try {\n const text = await session.prompt(input.text, { signal });\n update_progress(100, \"Text rewriting complete\");\n return { text };\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// TextRewriterTask (streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n LlamaCppModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n if (!model) throw new Error(\"Model config is required for TextRewriterTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n const context = await getOrCreateTextContext(model);\n const sequence = context.getSequence();\n const session = new LlamaChatSession({ contextSequence: sequence, systemPrompt: input.prompt });\n try {\n yield* streamFromSession<TextRewriterTaskOutput>((onTextChunk) => {\n return session.prompt(input.text, { signal, onTextChunk });\n }, signal);\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// TextSummaryTask (non-streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, signal) => {\n if (!model) throw new Error(\"Model config is required for TextSummaryTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n update_progress(0, \"Loading model\");\n const context = await getOrCreateTextContext(model);\n\n update_progress(10, \"Summarizing text\");\n const sequence = context.getSequence();\n const session = new LlamaChatSession({\n contextSequence: sequence,\n systemPrompt: \"Summarize the following text concisely, preserving the key points.\",\n });\n try {\n const text = await session.prompt(input.text, { signal });\n update_progress(100, \"Summarization complete\");\n return { text };\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// TextSummaryTask (streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n LlamaCppModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n if (!model) throw new Error(\"Model config is required for TextSummaryTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n const context = await getOrCreateTextContext(model);\n const sequence = context.getSequence();\n const session = new LlamaChatSession({\n contextSequence: sequence,\n systemPrompt: \"Summarize the following text concisely, preserving the key points.\",\n });\n try {\n yield* streamFromSession<TextSummaryTaskOutput>((onTextChunk) => {\n return session.prompt(input.text, { signal, onTextChunk });\n }, signal);\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// Dispose helper (called from LlamaCppProvider.dispose())\n// ========================================================================\n\nexport async function disposeLlamaCppResources(): Promise<void> {\n const disposeAll = async (map: Map<string, { dispose(): Promise<void> }>) => {\n for (const resource of map.values()) {\n await resource.dispose().catch(() => {});\n }\n map.clear();\n };\n\n await disposeAll(textContexts as Map<string, { dispose(): Promise<void> }>);\n await disposeAll(embeddingContexts as Map<string, { dispose(): Promise<void> }>);\n await disposeAll(models as Map<string, { dispose(): Promise<void> }>);\n\n if (llamaInstance) {\n await (llamaInstance as any).dispose?.().catch(() => {});\n llamaInstance = undefined;\n }\n\n resolvedPaths.clear();\n}\n\nexport const LlamaCpp_CountTokens: AiProviderRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, onProgress, signal) => {\n const loadedModel = await getOrLoadModel(model!);\n // model.tokenizer is itself the tokenize function (Tokenizer = tokenize[\"tokenize\"])\n const tokens = loadedModel.tokenizer(input.text);\n return { count: tokens.length };\n};\n\nexport const LlamaCpp_CountTokens_Reactive: AiProviderReactiveRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n LlamaCppModelConfig\n> = async (input, _output, model) => {\n return LlamaCpp_CountTokens(input, model, () => {}, new AbortController().signal);\n};\n\n// ========================================================================\n// ToolCallingTask (non-streaming)\n// ========================================================================\n\n/**\n * Builds function definitions for node-llama-cpp from ToolDefinition inputs.\n * Each function handler captures the call arguments and returns a simple\n * acknowledgment, allowing us to collect tool calls without side-effects.\n */\nfunction buildLlamaCppFunctions(\n tools: ReadonlyArray<ToolDefinition>,\n capturedCalls: Array<{ name: string; input: Record<string, unknown> }>\n) {\n const { defineChatSessionFunction } = _sdk!;\n const functions: Record<string, any> = {};\n for (const tool of tools) {\n const toolName = tool.name;\n functions[toolName] = defineChatSessionFunction({\n description: tool.description,\n params: tool.inputSchema as any,\n handler(params: any) {\n capturedCalls.push({ name: toolName, input: (params ?? {}) as Record<string, unknown> });\n return \"OK\";\n },\n } as any);\n }\n return functions;\n}\n\nexport const LlamaCpp_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, signal) => {\n if (!model) throw new Error(\"Model config is required for ToolCallingTask.\");\n\n await loadSdk();\n\n update_progress(0, \"Loading model\");\n const context = await getOrCreateTextContext(model);\n\n const capturedCalls: Array<{ name: string; input: Record<string, unknown> }> = [];\n const functions =\n input.toolChoice === \"none\" ? undefined : buildLlamaCppFunctions(input.tools, capturedCalls);\n\n update_progress(10, \"Running tool calling\");\n const sequence = context.getSequence();\n const { LlamaChatSession } = _sdk!;\n const session = new LlamaChatSession({\n contextSequence: sequence,\n ...(input.systemPrompt && { systemPrompt: input.systemPrompt }),\n });\n\n try {\n const text = await session.prompt(input.prompt, {\n signal,\n ...(functions && { functions }),\n ...(input.temperature !== undefined && { temperature: input.temperature }),\n ...(input.maxTokens !== undefined && { maxTokens: input.maxTokens }),\n });\n\n const toolCalls: Record<string, unknown> = {};\n capturedCalls.forEach((call, index) => {\n const id = `call_${index}`;\n toolCalls[id] = { id, name: call.name, input: call.input };\n });\n\n update_progress(100, \"Tool calling complete\");\n return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// ToolCallingTask (streaming)\n// ========================================================================\n\nexport const LlamaCpp_ToolCalling_Stream: AiProviderStreamFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n LlamaCppModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ToolCallingTaskOutput>> {\n if (!model) throw new Error(\"Model config is required for ToolCallingTask.\");\n\n await loadSdk();\n\n const context = await getOrCreateTextContext(model);\n\n const capturedCalls: Array<{ name: string; input: Record<string, unknown> }> = [];\n const functions =\n input.toolChoice === \"none\" ? undefined : buildLlamaCppFunctions(input.tools, capturedCalls);\n\n const sequence = context.getSequence();\n const { LlamaChatSession } = _sdk!;\n const session = new LlamaChatSession({\n contextSequence: sequence,\n ...(input.systemPrompt && { systemPrompt: input.systemPrompt }),\n });\n\n const queue: string[] = [];\n let isComplete = false;\n let completionError: unknown;\n let resolveWait: (() => void) | null = null;\n\n const notifyWaiter = () => {\n resolveWait?.();\n resolveWait = null;\n };\n\n let accumulatedText = \"\";\n const promptPromise = session\n .prompt(input.prompt, {\n signal,\n ...(functions && { functions }),\n onTextChunk: (chunk: string) => {\n queue.push(chunk);\n notifyWaiter();\n },\n ...(input.temperature !== undefined && { temperature: input.temperature }),\n ...(input.maxTokens !== undefined && { maxTokens: input.maxTokens }),\n })\n .then(() => {\n isComplete = true;\n notifyWaiter();\n })\n .catch((err: unknown) => {\n completionError = err;\n isComplete = true;\n notifyWaiter();\n });\n\n try {\n while (true) {\n while (queue.length > 0) {\n const chunk = queue.shift()!;\n accumulatedText += chunk;\n yield { type: \"text-delta\", port: \"text\", textDelta: chunk };\n }\n if (isComplete) break;\n await new Promise<void>((r) => {\n resolveWait = r;\n });\n }\n // Drain any remaining chunks after completion signal\n while (queue.length > 0) {\n const chunk = queue.shift()!;\n accumulatedText += chunk;\n yield { type: \"text-delta\", port: \"text\", textDelta: chunk };\n }\n } finally {\n await promptPromise.catch(() => {});\n sequence.dispose();\n }\n\n if (completionError) {\n if (!signal.aborted) throw completionError;\n return;\n }\n\n const toolCalls: Record<string, unknown> = {};\n capturedCalls.forEach((call, index) => {\n const id = `call_${index}`;\n toolCalls[id] = { id, name: call.name, input: call.input };\n });\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: accumulatedText, toolCalls: validToolCalls } as ToolCallingTaskOutput,\n };\n};\n\n// ========================================================================\n// Model info\n// ========================================================================\n\nexport const LlamaCpp_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n LlamaCppModelConfig\n> = async (input, model) => {\n if (!model) throw new Error(\"Model config is required for ModelInfoTask.\");\n\n const modelPath = getActualModelPath(model);\n const is_loaded = models.has(modelPath);\n\n let is_cached = is_loaded;\n let file_sizes: Record<string, number> | null = null;\n\n // Check if model file exists on disk\n try {\n const fs = await import(\"node:fs/promises\");\n const stat = await fs.stat(modelPath);\n is_cached = true;\n file_sizes = { model: stat.size };\n } catch {\n // File does not exist or fs not available\n // Fall back to checking if the path is in resolvedPaths\n if (resolvedPaths.has(getConfigKey(model))) {\n is_cached = true;\n }\n }\n\n return {\n model: input.model,\n is_local: true,\n is_remote: false,\n supports_browser: false,\n supports_node: true,\n is_cached,\n is_loaded,\n file_sizes,\n };\n};\n\n// ========================================================================\n// Task registries\n// ========================================================================\n\nexport const LLAMACPP_TASKS: Record<string, AiProviderRunFn<any, any, LlamaCppModelConfig>> = {\n DownloadModelTask: LlamaCpp_Download,\n UnloadModelTask: LlamaCpp_Unload,\n ModelInfoTask: LlamaCpp_ModelInfo,\n CountTokensTask: LlamaCpp_CountTokens,\n TextGenerationTask: LlamaCpp_TextGeneration,\n TextEmbeddingTask: LlamaCpp_TextEmbedding,\n TextRewriterTask: LlamaCpp_TextRewriter,\n TextSummaryTask: LlamaCpp_TextSummary,\n ToolCallingTask: LlamaCpp_ToolCalling,\n};\n\nexport const LLAMACPP_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, LlamaCppModelConfig>\n> = {\n TextGenerationTask: LlamaCpp_TextGeneration_Stream,\n TextRewriterTask: LlamaCpp_TextRewriter_Stream,\n TextSummaryTask: LlamaCpp_TextSummary_Stream,\n ToolCallingTask: LlamaCpp_ToolCalling_Stream,\n};\n\nexport const LLAMACPP_REACTIVE_TASKS: Record<\n string,\n AiProviderReactiveRunFn<any, any, LlamaCppModelConfig>\n> = {\n CountTokensTask: LlamaCpp_CountTokens_Reactive,\n};\n",
|
|
5
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderReactiveRunFn,\n AiProviderRunFn,\n AiProviderStreamFn,\n CountTokensTaskInput,\n CountTokensTaskOutput,\n DownloadModelTaskRunInput,\n DownloadModelTaskRunOutput,\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolDefinition,\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n UnloadModelTaskRunInput,\n UnloadModelTaskRunOutput,\n} from \"@workglow/ai\";\nimport { filterValidToolCalls } from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { getLogger } from \"@workglow/util\";\nimport { LLAMACPP_DEFAULT_MODELS_DIR } from \"./LlamaCpp_Constants\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\n\n// ========================================================================\n// Lazy SDK loading\n// ========================================================================\n\nlet _sdk: typeof import(\"node-llama-cpp\") | undefined;\n\nasync function loadSdk() {\n if (!_sdk) {\n try {\n _sdk = await import(\"node-llama-cpp\");\n } catch (err) {\n throw new Error(\n \"node-llama-cpp is required for LOCAL_LLAMACPP tasks. Install it with: bun add node-llama-cpp\"\n );\n }\n }\n return _sdk;\n}\n\n// ========================================================================\n// Module-level caches (shared across all task invocations)\n// ========================================================================\n\ntype LlamaInstance = Awaited<ReturnType<(typeof import(\"node-llama-cpp\"))[\"getLlama\"]>>;\ntype LlamaModel = Awaited<ReturnType<LlamaInstance[\"loadModel\"]>>;\ntype LlamaContext = Awaited<ReturnType<LlamaModel[\"createContext\"]>>;\ntype LlamaEmbeddingContext = Awaited<ReturnType<LlamaModel[\"createEmbeddingContext\"]>>;\n\nlet llamaInstance: LlamaInstance | undefined;\nconst models = new Map<string, LlamaModel>();\nconst textContexts = new Map<string, LlamaContext>();\nconst embeddingContexts = new Map<string, LlamaEmbeddingContext>();\n\n/** Maps model_url (or model_path when used as URI) to the actual downloaded filesystem path. */\nconst resolvedPaths = new Map<string, string>();\n\n// ========================================================================\n// Helpers\n// ========================================================================\n\nasync function getLlamaInstance(): Promise<LlamaInstance> {\n if (!llamaInstance) {\n const { getLlama } = await loadSdk();\n llamaInstance = await getLlama();\n }\n return llamaInstance;\n}\n\nfunction getConfigKey(model: LlamaCppModelConfig): string {\n return model.provider_config.model_url ?? model.provider_config.model_path;\n}\n\nfunction getActualModelPath(model: LlamaCppModelConfig): string {\n const key = getConfigKey(model);\n const resolved = resolvedPaths.get(key);\n return resolved ?? model.provider_config.model_path;\n}\n\nasync function getOrLoadModel(model: LlamaCppModelConfig): Promise<LlamaModel> {\n const modelPath = getActualModelPath(model);\n const cached = models.get(modelPath);\n if (cached) return cached;\n\n const llama = await getLlamaInstance();\n const config = model.provider_config;\n\n const loadedModel = await llama.loadModel({\n modelPath,\n ...(config.gpu_layers !== undefined && { gpuLayers: config.gpu_layers }),\n });\n\n models.set(modelPath, loadedModel);\n return loadedModel;\n}\n\nasync function getOrCreateTextContext(model: LlamaCppModelConfig): Promise<LlamaContext> {\n const modelPath = getActualModelPath(model);\n const cached = textContexts.get(modelPath);\n if (cached) return cached;\n\n const loadedModel = await getOrLoadModel(model);\n const config = model.provider_config;\n\n const context = await loadedModel.createContext({\n ...(config.context_size && { contextSize: config.context_size }),\n ...(config.flash_attention !== undefined && { flashAttention: config.flash_attention }),\n });\n\n textContexts.set(modelPath, context);\n return context;\n}\n\nasync function getOrCreateEmbeddingContext(\n model: LlamaCppModelConfig\n): Promise<LlamaEmbeddingContext> {\n const modelPath = getActualModelPath(model);\n const cached = embeddingContexts.get(modelPath);\n if (cached) return cached;\n\n const loadedModel = await getOrLoadModel(model);\n\n const context = await loadedModel.createEmbeddingContext();\n\n embeddingContexts.set(modelPath, context);\n return context;\n}\n\n/**\n * Bridges a node-llama-cpp session.prompt() call (callback-based) to an AsyncGenerator\n * of StreamEvents. Handles abort signals and errors cleanly.\n */\nasync function* streamFromSession<T extends Record<string, unknown>>(\n promptFn: (onTextChunk: (chunk: string) => void) => Promise<string>,\n signal: AbortSignal\n): AsyncGenerator<StreamEvent<T>> {\n const queue: string[] = [];\n let isComplete = false;\n let completionError: unknown;\n let resolveWait: (() => void) | null = null;\n\n const notifyWaiter = () => {\n resolveWait?.();\n resolveWait = null;\n };\n\n const promptPromise = promptFn((chunk: string) => {\n queue.push(chunk);\n notifyWaiter();\n })\n .then(() => {\n isComplete = true;\n notifyWaiter();\n })\n .catch((err: unknown) => {\n completionError = err;\n isComplete = true;\n notifyWaiter();\n });\n\n try {\n while (true) {\n while (queue.length > 0) {\n yield { type: \"text-delta\", port: \"text\", textDelta: queue.shift()! };\n }\n if (isComplete) break;\n await new Promise<void>((r) => {\n resolveWait = r;\n });\n }\n // Drain any remaining chunks after completion signal\n while (queue.length > 0) {\n yield { type: \"text-delta\", port: \"text\", textDelta: queue.shift()! };\n }\n } finally {\n await promptPromise.catch(() => {});\n }\n\n if (completionError) {\n if (signal.aborted) return;\n throw completionError;\n }\n\n yield { type: \"finish\", data: {} as T };\n}\n\n// ========================================================================\n// DownloadModelTask\n// ========================================================================\n\nexport const LlamaCpp_Download: AiProviderRunFn<\n DownloadModelTaskRunInput,\n DownloadModelTaskRunOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, signal) => {\n if (!model) throw new Error(\"Model config is required for DownloadModelTask.\");\n\n const { createModelDownloader } = await loadSdk();\n const config = model.provider_config;\n const modelUri = config.model_url ?? config.model_path;\n const dirPath = config.models_dir ?? LLAMACPP_DEFAULT_MODELS_DIR;\n\n update_progress(0, \"Creating model downloader\");\n\n const downloader = await createModelDownloader({ modelUri, dirPath });\n\n // Poll download progress via interval (ModelDownloader exposes downloadedSize / totalSize)\n const progressInterval = setInterval(() => {\n const total = (downloader as any).totalSize as number | undefined;\n const downloaded = (downloader as any).downloadedSize as number | undefined;\n if (total && total > 0 && downloaded !== undefined) {\n const pct = Math.min(99, Math.round((downloaded / total) * 100));\n update_progress(pct, \"Downloading model\", { file: modelUri, progress: pct / 100 });\n }\n }, 500);\n\n let modelPath: string;\n try {\n modelPath = await downloader.download();\n } finally {\n clearInterval(progressInterval);\n }\n\n // Store the resolved filesystem path for subsequent inference tasks\n resolvedPaths.set(getConfigKey(model), modelPath);\n\n update_progress(100, \"Model downloaded\", { file: modelUri, progress: 1 });\n\n return { model: input.model! };\n};\n\n// ========================================================================\n// UnloadModelTask\n// ========================================================================\n\nexport const LlamaCpp_Unload: AiProviderRunFn<\n UnloadModelTaskRunInput,\n UnloadModelTaskRunOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, _signal) => {\n if (!model) throw new Error(\"Model config is required for UnloadModelTask.\");\n\n const modelPath = getActualModelPath(model);\n\n // Dispose and remove the text context\n const ctx = textContexts.get(modelPath);\n if (ctx) {\n await ctx.dispose();\n textContexts.delete(modelPath);\n update_progress(33, \"Text context disposed\");\n }\n\n // Dispose and remove the embedding context\n const embCtx = embeddingContexts.get(modelPath);\n if (embCtx) {\n await embCtx.dispose();\n embeddingContexts.delete(modelPath);\n update_progress(66, \"Embedding context disposed\");\n }\n\n // Dispose and remove the model\n const cachedModel = models.get(modelPath);\n if (cachedModel) {\n await cachedModel.dispose();\n models.delete(modelPath);\n update_progress(100, \"Model unloaded from memory\");\n } else {\n update_progress(100, \"Model was not loaded\");\n }\n\n return { model: input.model! };\n};\n\n// ========================================================================\n// TextGenerationTask (non-streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.prompt)) {\n getLogger().warn(\n \"LlamaCpp_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 LlamaCpp_TextGeneration({ ...input, prompt: item }, model, update_progress, signal);\n results.push(r.text as string);\n }\n return { text: results };\n }\n\n if (!model) throw new Error(\"Model config is required for TextGenerationTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n update_progress(0, \"Loading model\");\n const context = await getOrCreateTextContext(model);\n\n update_progress(10, \"Generating text\");\n const sequence = context.getSequence();\n const session = new LlamaChatSession({ contextSequence: sequence });\n try {\n const text = await session.prompt(input.prompt as string, {\n signal,\n ...(input.temperature !== undefined && { temperature: input.temperature }),\n ...(input.maxTokens !== undefined && { maxTokens: input.maxTokens }),\n ...(input.topP !== undefined && { topP: input.topP }),\n });\n update_progress(100, \"Text generation complete\");\n return { text };\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// TextGenerationTask (streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n LlamaCppModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n if (!model) throw new Error(\"Model config is required for TextGenerationTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n const context = await getOrCreateTextContext(model);\n const sequence = context.getSequence();\n const session = new LlamaChatSession({ contextSequence: sequence });\n try {\n yield* streamFromSession<TextGenerationTaskOutput>((onTextChunk) => {\n return session.prompt(input.prompt as string, {\n signal,\n onTextChunk,\n ...(input.temperature !== undefined && { temperature: input.temperature }),\n ...(input.maxTokens !== undefined && { maxTokens: input.maxTokens }),\n ...(input.topP !== undefined && { topP: input.topP }),\n });\n }, signal);\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// TextEmbeddingTask\n// ========================================================================\n\nexport const LlamaCpp_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, _signal) => {\n if (!model) throw new Error(\"Model config is required for TextEmbeddingTask.\");\n\n update_progress(0, \"Loading embedding model\");\n const context = await getOrCreateEmbeddingContext(model);\n\n const texts = Array.isArray(input.text) ? input.text : [input.text];\n update_progress(10, \"Computing embeddings\");\n\n const embeddings = await Promise.all(\n texts.map((text) => context.getEmbeddingFor(text).then((e) => new Float32Array(e.vector)))\n );\n\n update_progress(100, \"Embeddings complete\");\n\n if (Array.isArray(input.text)) {\n return { vector: embeddings };\n }\n return { vector: embeddings[0] };\n};\n\n// ========================================================================\n// TextRewriterTask (non-streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.text)) {\n getLogger().warn(\n \"LlamaCpp_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 LlamaCpp_TextRewriter({ ...input, text: item }, model, update_progress, signal);\n results.push(r.text as string);\n }\n return { text: results };\n }\n\n if (!model) throw new Error(\"Model config is required for TextRewriterTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n update_progress(0, \"Loading model\");\n const context = await getOrCreateTextContext(model);\n\n update_progress(10, \"Rewriting text\");\n const sequence = context.getSequence();\n const session = new LlamaChatSession({ contextSequence: sequence, systemPrompt: input.prompt as string });\n try {\n const text = await session.prompt(input.text as string, { signal });\n update_progress(100, \"Text rewriting complete\");\n return { text };\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// TextRewriterTask (streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n LlamaCppModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n if (!model) throw new Error(\"Model config is required for TextRewriterTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n const context = await getOrCreateTextContext(model);\n const sequence = context.getSequence();\n const session = new LlamaChatSession({ contextSequence: sequence, systemPrompt: input.prompt as string });\n try {\n yield* streamFromSession<TextRewriterTaskOutput>((onTextChunk) => {\n return session.prompt(input.text as string, { signal, onTextChunk });\n }, signal);\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// TextSummaryTask (non-streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.text)) {\n getLogger().warn(\n \"LlamaCpp_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 LlamaCpp_TextSummary({ ...input, text: item }, model, update_progress, signal);\n results.push(r.text as string);\n }\n return { text: results };\n }\n\n if (!model) throw new Error(\"Model config is required for TextSummaryTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n update_progress(0, \"Loading model\");\n const context = await getOrCreateTextContext(model);\n\n update_progress(10, \"Summarizing text\");\n const sequence = context.getSequence();\n const session = new LlamaChatSession({\n contextSequence: sequence,\n systemPrompt: \"Summarize the following text concisely, preserving the key points.\",\n });\n try {\n const text = await session.prompt(input.text as string, { signal });\n update_progress(100, \"Summarization complete\");\n return { text };\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// TextSummaryTask (streaming)\n// ========================================================================\n\nexport const LlamaCpp_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n LlamaCppModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n if (!model) throw new Error(\"Model config is required for TextSummaryTask.\");\n\n const { LlamaChatSession } = await loadSdk();\n\n const context = await getOrCreateTextContext(model);\n const sequence = context.getSequence();\n const session = new LlamaChatSession({\n contextSequence: sequence,\n systemPrompt: \"Summarize the following text concisely, preserving the key points.\",\n });\n try {\n yield* streamFromSession<TextSummaryTaskOutput>((onTextChunk) => {\n return session.prompt(input.text as string, { signal, onTextChunk });\n }, signal);\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// Dispose helper (called from LlamaCppProvider.dispose())\n// ========================================================================\n\nexport async function disposeLlamaCppResources(): Promise<void> {\n const disposeAll = async (map: Map<string, { dispose(): Promise<void> }>) => {\n for (const resource of map.values()) {\n await resource.dispose().catch(() => {});\n }\n map.clear();\n };\n\n await disposeAll(textContexts as Map<string, { dispose(): Promise<void> }>);\n await disposeAll(embeddingContexts as Map<string, { dispose(): Promise<void> }>);\n await disposeAll(models as Map<string, { dispose(): Promise<void> }>);\n\n if (llamaInstance) {\n await (llamaInstance as any).dispose?.().catch(() => {});\n llamaInstance = undefined;\n }\n\n resolvedPaths.clear();\n}\n\nexport const LlamaCpp_CountTokens: AiProviderRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, onProgress, signal) => {\n if (Array.isArray(input.text)) {\n getLogger().warn(\n \"LlamaCpp_CountTokens: array input received; processing sequentially (no native batch support)\"\n );\n const texts = input.text as string[];\n const counts: number[] = [];\n for (const item of texts) {\n const r = await LlamaCpp_CountTokens({ ...input, text: item }, model, onProgress, signal);\n counts.push(r.count as number);\n }\n return { count: counts };\n }\n\n const loadedModel = await getOrLoadModel(model!);\n // model.tokenizer is itself the tokenize function (Tokenizer = tokenize[\"tokenize\"])\n const tokens = loadedModel.tokenizer(input.text as string);\n return { count: tokens.length };\n};\n\nexport const LlamaCpp_CountTokens_Reactive: AiProviderReactiveRunFn<\n CountTokensTaskInput,\n CountTokensTaskOutput,\n LlamaCppModelConfig\n> = async (input, _output, model) => {\n return LlamaCpp_CountTokens(input, model, () => {}, new AbortController().signal);\n};\n\n// ========================================================================\n// ToolCallingTask (non-streaming)\n// ========================================================================\n\n/**\n * Builds function definitions for node-llama-cpp from ToolDefinition inputs.\n * Each function handler captures the call arguments and returns a simple\n * acknowledgment, allowing us to collect tool calls without side-effects.\n */\nfunction buildLlamaCppFunctions(\n tools: ReadonlyArray<ToolDefinition>,\n capturedCalls: Array<{ name: string; input: Record<string, unknown> }>\n) {\n const { defineChatSessionFunction } = _sdk!;\n const functions: Record<string, any> = {};\n for (const tool of tools) {\n const toolName = tool.name;\n functions[toolName] = defineChatSessionFunction({\n description: tool.description,\n params: tool.inputSchema as any,\n handler(params: any) {\n capturedCalls.push({ name: toolName, input: (params ?? {}) as Record<string, unknown> });\n return \"OK\";\n },\n } as any);\n }\n return functions;\n}\n\nexport const LlamaCpp_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.prompt)) {\n getLogger().warn(\n \"LlamaCpp_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 LlamaCpp_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 if (!model) throw new Error(\"Model config is required for ToolCallingTask.\");\n\n await loadSdk();\n\n update_progress(0, \"Loading model\");\n const context = await getOrCreateTextContext(model);\n\n const capturedCalls: Array<{ name: string; input: Record<string, unknown> }> = [];\n const functions =\n input.toolChoice === \"none\" ? undefined : buildLlamaCppFunctions(input.tools, capturedCalls);\n\n update_progress(10, \"Running tool calling\");\n const sequence = context.getSequence();\n const { LlamaChatSession } = _sdk!;\n const session = new LlamaChatSession({\n contextSequence: sequence,\n ...(input.systemPrompt && { systemPrompt: input.systemPrompt }),\n });\n\n try {\n const text = await session.prompt(input.prompt as string, {\n signal,\n ...(functions && { functions }),\n ...(input.temperature !== undefined && { temperature: input.temperature }),\n ...(input.maxTokens !== undefined && { maxTokens: input.maxTokens }),\n });\n\n const toolCalls: Record<string, unknown> = {};\n capturedCalls.forEach((call, index) => {\n const id = `call_${index}`;\n toolCalls[id] = { id, name: call.name, input: call.input };\n });\n\n update_progress(100, \"Tool calling complete\");\n return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };\n } finally {\n sequence.dispose();\n }\n};\n\n// ========================================================================\n// ToolCallingTask (streaming)\n// ========================================================================\n\nexport const LlamaCpp_ToolCalling_Stream: AiProviderStreamFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n LlamaCppModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ToolCallingTaskOutput>> {\n if (!model) throw new Error(\"Model config is required for ToolCallingTask.\");\n\n await loadSdk();\n\n const context = await getOrCreateTextContext(model);\n\n const capturedCalls: Array<{ name: string; input: Record<string, unknown> }> = [];\n const functions =\n input.toolChoice === \"none\" ? undefined : buildLlamaCppFunctions(input.tools, capturedCalls);\n\n const sequence = context.getSequence();\n const { LlamaChatSession } = _sdk!;\n const session = new LlamaChatSession({\n contextSequence: sequence,\n ...(input.systemPrompt && { systemPrompt: input.systemPrompt }),\n });\n\n const queue: string[] = [];\n let isComplete = false;\n let completionError: unknown;\n let resolveWait: (() => void) | null = null;\n\n const notifyWaiter = () => {\n resolveWait?.();\n resolveWait = null;\n };\n\n let accumulatedText = \"\";\n const promptPromise = session\n .prompt(input.prompt as string, {\n signal,\n ...(functions && { functions }),\n onTextChunk: (chunk: string) => {\n queue.push(chunk);\n notifyWaiter();\n },\n ...(input.temperature !== undefined && { temperature: input.temperature }),\n ...(input.maxTokens !== undefined && { maxTokens: input.maxTokens }),\n })\n .then(() => {\n isComplete = true;\n notifyWaiter();\n })\n .catch((err: unknown) => {\n completionError = err;\n isComplete = true;\n notifyWaiter();\n });\n\n try {\n while (true) {\n while (queue.length > 0) {\n const chunk = queue.shift()!;\n accumulatedText += chunk;\n yield { type: \"text-delta\", port: \"text\", textDelta: chunk };\n }\n if (isComplete) break;\n await new Promise<void>((r) => {\n resolveWait = r;\n });\n }\n // Drain any remaining chunks after completion signal\n while (queue.length > 0) {\n const chunk = queue.shift()!;\n accumulatedText += chunk;\n yield { type: \"text-delta\", port: \"text\", textDelta: chunk };\n }\n } finally {\n await promptPromise.catch(() => {});\n sequence.dispose();\n }\n\n if (completionError) {\n if (!signal.aborted) throw completionError;\n return;\n }\n\n const toolCalls: Record<string, unknown> = {};\n capturedCalls.forEach((call, index) => {\n const id = `call_${index}`;\n toolCalls[id] = { id, name: call.name, input: call.input };\n });\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: accumulatedText, toolCalls: validToolCalls } as ToolCallingTaskOutput,\n };\n};\n\n// ========================================================================\n// Model info\n// ========================================================================\n\nexport const LlamaCpp_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n LlamaCppModelConfig\n> = async (input, model) => {\n if (!model) throw new Error(\"Model config is required for ModelInfoTask.\");\n\n const modelPath = getActualModelPath(model);\n const is_loaded = models.has(modelPath);\n\n let is_cached = is_loaded;\n let file_sizes: Record<string, number> | null = null;\n\n // Check if model file exists on disk\n try {\n const fs = await import(\"node:fs/promises\");\n const stat = await fs.stat(modelPath);\n is_cached = true;\n file_sizes = { model: stat.size };\n } catch {\n // File does not exist or fs not available\n // Fall back to checking if the path is in resolvedPaths\n if (resolvedPaths.has(getConfigKey(model))) {\n is_cached = true;\n }\n }\n\n return {\n model: input.model,\n is_local: true,\n is_remote: false,\n supports_browser: false,\n supports_node: true,\n is_cached,\n is_loaded,\n file_sizes,\n };\n};\n\n// ========================================================================\n// Task registries\n// ========================================================================\n\nexport const LLAMACPP_TASKS: Record<string, AiProviderRunFn<any, any, LlamaCppModelConfig>> = {\n DownloadModelTask: LlamaCpp_Download,\n UnloadModelTask: LlamaCpp_Unload,\n ModelInfoTask: LlamaCpp_ModelInfo,\n CountTokensTask: LlamaCpp_CountTokens,\n TextGenerationTask: LlamaCpp_TextGeneration,\n TextEmbeddingTask: LlamaCpp_TextEmbedding,\n TextRewriterTask: LlamaCpp_TextRewriter,\n TextSummaryTask: LlamaCpp_TextSummary,\n ToolCallingTask: LlamaCpp_ToolCalling,\n};\n\nexport const LLAMACPP_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, LlamaCppModelConfig>\n> = {\n TextGenerationTask: LlamaCpp_TextGeneration_Stream,\n TextRewriterTask: LlamaCpp_TextRewriter_Stream,\n TextSummaryTask: LlamaCpp_TextSummary_Stream,\n ToolCallingTask: LlamaCpp_ToolCalling_Stream,\n};\n\nexport const LLAMACPP_REACTIVE_TASKS: Record<\n string,\n AiProviderReactiveRunFn<any, any, LlamaCppModelConfig>\n> = {\n CountTokensTask: LlamaCpp_CountTokens_Reactive,\n};\n",
|
|
6
6
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { getLogger, globalServiceRegistry, WORKER_SERVER } from \"@workglow/util\";\nimport {\n LLAMACPP_REACTIVE_TASKS,\n LLAMACPP_STREAM_TASKS,\n LLAMACPP_TASKS,\n} from \"./common/LlamaCpp_JobRunFns\";\nimport { LlamaCppProvider } from \"./LlamaCppProvider\";\n\nexport function LLAMACPP_WORKER_JOBRUN_REGISTER() {\n const workerServer = globalServiceRegistry.get(WORKER_SERVER);\n new LlamaCppProvider(\n LLAMACPP_TASKS,\n LLAMACPP_STREAM_TASKS,\n LLAMACPP_REACTIVE_TASKS\n ).registerOnWorkerServer(workerServer);\n workerServer.sendReady();\n getLogger().info(\"LLAMACPP_WORKER_JOBRUN registered\");\n}\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": ";;;;;;;;;;;;AA8BA;AASA,IAAI;AAEJ,eAAe,OAAO,GAAG;AAAA,EACvB,IAAI,CAAC,MAAM;AAAA,IACT,IAAI;AAAA,MACF,OAAO,MAAa;AAAA,MACpB,OAAO,KAAK;AAAA,MACZ,MAAM,IAAI,MACR,8FACF;AAAA;AAAA,EAEJ;AAAA,EACA,OAAO;AAAA;AAYT,IAAI;AACJ,IAAM,SAAS,IAAI;AACnB,IAAM,eAAe,IAAI;AACzB,IAAM,oBAAoB,IAAI;AAG9B,IAAM,gBAAgB,IAAI;AAM1B,eAAe,gBAAgB,GAA2B;AAAA,EACxD,IAAI,CAAC,eAAe;AAAA,IAClB,QAAQ,aAAa,MAAM,QAAQ;AAAA,IACnC,gBAAgB,MAAM,SAAS;AAAA,EACjC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,YAAY,CAAC,OAAoC;AAAA,EACxD,OAAO,MAAM,gBAAgB,aAAa,MAAM,gBAAgB;AAAA;AAGlE,SAAS,kBAAkB,CAAC,OAAoC;AAAA,EAC9D,MAAM,MAAM,aAAa,KAAK;AAAA,EAC9B,MAAM,WAAW,cAAc,IAAI,GAAG;AAAA,EACtC,OAAO,YAAY,MAAM,gBAAgB;AAAA;AAG3C,eAAe,cAAc,CAAC,OAAiD;AAAA,EAC7E,MAAM,YAAY,mBAAmB,KAAK;AAAA,EAC1C,MAAM,SAAS,OAAO,IAAI,SAAS;AAAA,EACnC,IAAI;AAAA,IAAQ,OAAO;AAAA,EAEnB,MAAM,QAAQ,MAAM,iBAAiB;AAAA,EACrC,MAAM,SAAS,MAAM;AAAA,EAErB,MAAM,cAAc,MAAM,MAAM,UAAU;AAAA,IACxC;AAAA,OACI,OAAO,eAAe,aAAa,EAAE,WAAW,OAAO,WAAW;AAAA,EACxE,CAAC;AAAA,EAED,OAAO,IAAI,WAAW,WAAW;AAAA,EACjC,OAAO;AAAA;AAGT,eAAe,sBAAsB,CAAC,OAAmD;AAAA,EACvF,MAAM,YAAY,mBAAmB,KAAK;AAAA,EAC1C,MAAM,SAAS,aAAa,IAAI,SAAS;AAAA,EACzC,IAAI;AAAA,IAAQ,OAAO;AAAA,EAEnB,MAAM,cAAc,MAAM,eAAe,KAAK;AAAA,EAC9C,MAAM,SAAS,MAAM;AAAA,EAErB,MAAM,UAAU,MAAM,YAAY,cAAc;AAAA,OAC1C,OAAO,gBAAgB,EAAE,aAAa,OAAO,aAAa;AAAA,OAC1D,OAAO,oBAAoB,aAAa,EAAE,gBAAgB,OAAO,gBAAgB;AAAA,EACvF,CAAC;AAAA,EAED,aAAa,IAAI,WAAW,OAAO;AAAA,EACnC,OAAO;AAAA;AAGT,eAAe,2BAA2B,CACxC,OACgC;AAAA,EAChC,MAAM,YAAY,mBAAmB,KAAK;AAAA,EAC1C,MAAM,SAAS,kBAAkB,IAAI,SAAS;AAAA,EAC9C,IAAI;AAAA,IAAQ,OAAO;AAAA,EAEnB,MAAM,cAAc,MAAM,eAAe,KAAK;AAAA,EAE9C,MAAM,UAAU,MAAM,YAAY,uBAAuB;AAAA,EAEzD,kBAAkB,IAAI,WAAW,OAAO;AAAA,EACxC,OAAO;AAAA;AAOT,gBAAgB,iBAAoD,CAClE,UACA,QACgC;AAAA,EAChC,MAAM,QAAkB,CAAC;AAAA,EACzB,IAAI,aAAa;AAAA,EACjB,IAAI;AAAA,EACJ,IAAI,cAAmC;AAAA,EAEvC,MAAM,eAAe,MAAM;AAAA,IACzB,cAAc;AAAA,IACd,cAAc;AAAA;AAAA,EAGhB,MAAM,gBAAgB,SAAS,CAAC,UAAkB;AAAA,IAChD,MAAM,KAAK,KAAK;AAAA,IAChB,aAAa;AAAA,GACd,EACE,KAAK,MAAM;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,GACd,EACA,MAAM,CAAC,QAAiB;AAAA,IACvB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,aAAa;AAAA,GACd;AAAA,EAEH,IAAI;AAAA,IACF,OAAO,MAAM;AAAA,MACX,OAAO,MAAM,SAAS,GAAG;AAAA,QACvB,MAAM,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,MAAM,MAAM,EAAG;AAAA,MACtE;AAAA,MACA,IAAI;AAAA,QAAY;AAAA,MAChB,MAAM,IAAI,QAAc,CAAC,MAAM;AAAA,QAC7B,cAAc;AAAA,OACf;AAAA,IACH;AAAA,IAEA,OAAO,MAAM,SAAS,GAAG;AAAA,MACvB,MAAM,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,MAAM,MAAM,EAAG;AAAA,IACtE;AAAA,YACA;AAAA,IACA,MAAM,cAAc,MAAM,MAAM,EAAE;AAAA;AAAA,EAGpC,IAAI,iBAAiB;AAAA,IACnB,IAAI,OAAO;AAAA,MAAS;AAAA,IACpB,MAAM;AAAA,EACR;AAAA,EAEA,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,EAAO;AAAA;AAOjC,IAAM,oBAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,iDAAiD;AAAA,EAE7E,QAAQ,0BAA0B,MAAM,QAAQ;AAAA,EAChD,MAAM,SAAS,MAAM;AAAA,EACrB,MAAM,WAAW,OAAO,aAAa,OAAO;AAAA,EAC5C,MAAM,UAAU,OAAO,cAAc;AAAA,EAErC,gBAAgB,GAAG,2BAA2B;AAAA,EAE9C,MAAM,aAAa,MAAM,sBAAsB,EAAE,UAAU,QAAQ,CAAC;AAAA,EAGpE,MAAM,mBAAmB,YAAY,MAAM;AAAA,IACzC,MAAM,QAAS,WAAmB;AAAA,IAClC,MAAM,aAAc,WAAmB;AAAA,IACvC,IAAI,SAAS,QAAQ,KAAK,eAAe,WAAW;AAAA,MAClD,MAAM,MAAM,KAAK,IAAI,IAAI,KAAK,MAAO,aAAa,QAAS,GAAG,CAAC;AAAA,MAC/D,gBAAgB,KAAK,qBAAqB,EAAE,MAAM,UAAU,UAAU,MAAM,IAAI,CAAC;AAAA,IACnF;AAAA,KACC,GAAG;AAAA,EAEN,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,YAAY,MAAM,WAAW,SAAS;AAAA,YACtC;AAAA,IACA,cAAc,gBAAgB;AAAA;AAAA,EAIhC,cAAc,IAAI,aAAa,KAAK,GAAG,SAAS;AAAA,EAEhD,gBAAgB,KAAK,oBAAoB,EAAE,MAAM,UAAU,UAAU,EAAE,CAAC;AAAA,EAExE,OAAO,EAAE,OAAO,MAAM,MAAO;AAAA;AAOxB,IAAM,kBAIT,OAAO,OAAO,OAAO,iBAAiB,YAAY;AAAA,EACpD,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,+CAA+C;AAAA,EAE3E,MAAM,YAAY,mBAAmB,KAAK;AAAA,EAG1C,MAAM,MAAM,aAAa,IAAI,SAAS;AAAA,EACtC,IAAI,KAAK;AAAA,IACP,MAAM,IAAI,QAAQ;AAAA,IAClB,aAAa,OAAO,SAAS;AAAA,IAC7B,gBAAgB,IAAI,uBAAuB;AAAA,EAC7C;AAAA,EAGA,MAAM,SAAS,kBAAkB,IAAI,SAAS;AAAA,EAC9C,IAAI,QAAQ;AAAA,IACV,MAAM,OAAO,QAAQ;AAAA,IACrB,kBAAkB,OAAO,SAAS;AAAA,IAClC,gBAAgB,IAAI,4BAA4B;AAAA,EAClD;AAAA,EAGA,MAAM,cAAc,OAAO,IAAI,SAAS;AAAA,EACxC,IAAI,aAAa;AAAA,IACf,MAAM,YAAY,QAAQ;AAAA,IAC1B,OAAO,OAAO,SAAS;AAAA,IACvB,gBAAgB,KAAK,4BAA4B;AAAA,EACnD,EAAO;AAAA,IACL,gBAAgB,KAAK,sBAAsB;AAAA;AAAA,EAG7C,OAAO,EAAE,OAAO,MAAM,MAAO;AAAA;AAOxB,IAAM,0BAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,kDAAkD;AAAA,EAE9E,QAAQ,qBAAqB,MAAM,QAAQ;AAAA,EAE3C,gBAAgB,GAAG,eAAe;AAAA,EAClC,MAAM,UAAU,MAAM,uBAAuB,KAAK;AAAA,EAElD,gBAAgB,IAAI,iBAAiB;AAAA,EACrC,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,MAAM,UAAU,IAAI,iBAAiB,EAAE,iBAAiB,SAAS,CAAC;AAAA,EAClE,IAAI;AAAA,IACF,MAAM,OAAO,MAAM,QAAQ,OAAO,MAAM,QAAQ;AAAA,MAC9C;AAAA,SACI,MAAM,gBAAgB,aAAa,EAAE,aAAa,MAAM,YAAY;AAAA,SACpE,MAAM,cAAc,aAAa,EAAE,WAAW,MAAM,UAAU;AAAA,SAC9D,MAAM,SAAS,aAAa,EAAE,MAAM,MAAM,KAAK;AAAA,IACrD,CAAC;AAAA,IACD,gBAAgB,KAAK,0BAA0B;AAAA,IAC/C,OAAO,EAAE,KAAK;AAAA,YACd;AAAA,IACA,SAAS,QAAQ;AAAA;AAAA;AAQd,IAAM,iCAIT,gBAAgB,CAAC,OAAO,OAAO,QAA8D;AAAA,EAC/F,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,kDAAkD;AAAA,EAE9E,QAAQ,qBAAqB,MAAM,QAAQ;AAAA,EAE3C,MAAM,UAAU,MAAM,uBAAuB,KAAK;AAAA,EAClD,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,MAAM,UAAU,IAAI,iBAAiB,EAAE,iBAAiB,SAAS,CAAC;AAAA,EAClE,IAAI;AAAA,IACF,OAAO,kBAA4C,CAAC,gBAAgB;AAAA,MAClE,OAAO,QAAQ,OAAO,MAAM,QAAQ;AAAA,QAClC;AAAA,QACA;AAAA,WACI,MAAM,gBAAgB,aAAa,EAAE,aAAa,MAAM,YAAY;AAAA,WACpE,MAAM,cAAc,aAAa,EAAE,WAAW,MAAM,UAAU;AAAA,WAC9D,MAAM,SAAS,aAAa,EAAE,MAAM,MAAM,KAAK;AAAA,MACrD,CAAC;AAAA,OACA,MAAM;AAAA,YACT;AAAA,IACA,SAAS,QAAQ;AAAA;AAAA;AAQd,IAAM,yBAIT,OAAO,OAAO,OAAO,iBAAiB,YAAY;AAAA,EACpD,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,iDAAiD;AAAA,EAE7E,gBAAgB,GAAG,yBAAyB;AAAA,EAC5C,MAAM,UAAU,MAAM,4BAA4B,KAAK;AAAA,EAEvD,MAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,OAAO,CAAC,MAAM,IAAI;AAAA,EAClE,gBAAgB,IAAI,sBAAsB;AAAA,EAE1C,MAAM,aAAa,MAAM,QAAQ,IAC/B,MAAM,IAAI,CAAC,SAAS,QAAQ,gBAAgB,IAAI,EAAE,KAAK,CAAC,MAAM,IAAI,aAAa,EAAE,MAAM,CAAC,CAAC,CAC3F;AAAA,EAEA,gBAAgB,KAAK,qBAAqB;AAAA,EAE1C,IAAI,MAAM,QAAQ,MAAM,IAAI,GAAG;AAAA,IAC7B,OAAO,EAAE,QAAQ,WAAW;AAAA,EAC9B;AAAA,EACA,OAAO,EAAE,QAAQ,WAAW,GAAG;AAAA;AAO1B,IAAM,wBAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,gDAAgD;AAAA,EAE5E,QAAQ,qBAAqB,MAAM,QAAQ;AAAA,EAE3C,gBAAgB,GAAG,eAAe;AAAA,EAClC,MAAM,UAAU,MAAM,uBAAuB,KAAK;AAAA,EAElD,gBAAgB,IAAI,gBAAgB;AAAA,EACpC,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,MAAM,UAAU,IAAI,iBAAiB,EAAE,iBAAiB,UAAU,cAAc,MAAM,OAAO,CAAC;AAAA,EAC9F,IAAI;AAAA,IACF,MAAM,OAAO,MAAM,QAAQ,OAAO,MAAM,MAAM,EAAE,OAAO,CAAC;AAAA,IACxD,gBAAgB,KAAK,yBAAyB;AAAA,IAC9C,OAAO,EAAE,KAAK;AAAA,YACd;AAAA,IACA,SAAS,QAAQ;AAAA;AAAA;AAQd,IAAM,+BAIT,gBAAgB,CAAC,OAAO,OAAO,QAA4D;AAAA,EAC7F,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,gDAAgD;AAAA,EAE5E,QAAQ,qBAAqB,MAAM,QAAQ;AAAA,EAE3C,MAAM,UAAU,MAAM,uBAAuB,KAAK;AAAA,EAClD,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,MAAM,UAAU,IAAI,iBAAiB,EAAE,iBAAiB,UAAU,cAAc,MAAM,OAAO,CAAC;AAAA,EAC9F,IAAI;AAAA,IACF,OAAO,kBAA0C,CAAC,gBAAgB;AAAA,MAChE,OAAO,QAAQ,OAAO,MAAM,MAAM,EAAE,QAAQ,YAAY,CAAC;AAAA,OACxD,MAAM;AAAA,YACT;AAAA,IACA,SAAS,QAAQ;AAAA;AAAA;AAQd,IAAM,uBAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,+CAA+C;AAAA,EAE3E,QAAQ,qBAAqB,MAAM,QAAQ;AAAA,EAE3C,gBAAgB,GAAG,eAAe;AAAA,EAClC,MAAM,UAAU,MAAM,uBAAuB,KAAK;AAAA,EAElD,gBAAgB,IAAI,kBAAkB;AAAA,EACtC,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,MAAM,UAAU,IAAI,iBAAiB;AAAA,IACnC,iBAAiB;AAAA,IACjB,cAAc;AAAA,EAChB,CAAC;AAAA,EACD,IAAI;AAAA,IACF,MAAM,OAAO,MAAM,QAAQ,OAAO,MAAM,MAAM,EAAE,OAAO,CAAC;AAAA,IACxD,gBAAgB,KAAK,wBAAwB;AAAA,IAC7C,OAAO,EAAE,KAAK;AAAA,YACd;AAAA,IACA,SAAS,QAAQ;AAAA;AAAA;AAQd,IAAM,8BAIT,gBAAgB,CAAC,OAAO,OAAO,QAA2D;AAAA,EAC5F,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,+CAA+C;AAAA,EAE3E,QAAQ,qBAAqB,MAAM,QAAQ;AAAA,EAE3C,MAAM,UAAU,MAAM,uBAAuB,KAAK;AAAA,EAClD,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,MAAM,UAAU,IAAI,iBAAiB;AAAA,IACnC,iBAAiB;AAAA,IACjB,cAAc;AAAA,EAChB,CAAC;AAAA,EACD,IAAI;AAAA,IACF,OAAO,kBAAyC,CAAC,gBAAgB;AAAA,MAC/D,OAAO,QAAQ,OAAO,MAAM,MAAM,EAAE,QAAQ,YAAY,CAAC;AAAA,OACxD,MAAM;AAAA,YACT;AAAA,IACA,SAAS,QAAQ;AAAA;AAAA;AAQrB,eAAsB,wBAAwB,GAAkB;AAAA,EAC9D,MAAM,aAAa,OAAO,QAAmD;AAAA,IAC3E,WAAW,YAAY,IAAI,OAAO,GAAG;AAAA,MACnC,MAAM,SAAS,QAAQ,EAAE,MAAM,MAAM,EAAE;AAAA,IACzC;AAAA,IACA,IAAI,MAAM;AAAA;AAAA,EAGZ,MAAM,WAAW,YAAyD;AAAA,EAC1E,MAAM,WAAW,iBAA8D;AAAA,EAC/E,MAAM,WAAW,MAAmD;AAAA,EAEpE,IAAI,eAAe;AAAA,IACjB,MAAO,cAAsB,UAAU,EAAE,MAAM,MAAM,EAAE;AAAA,IACvD,gBAAgB;AAAA,EAClB;AAAA,EAEA,cAAc,MAAM;AAAA;AAGf,IAAM,uBAIT,OAAO,OAAO,OAAO,YAAY,WAAW;AAAA,EAC9C,MAAM,cAAc,MAAM,eAAe,KAAM;AAAA,EAE/C,MAAM,SAAS,YAAY,UAAU,MAAM,IAAI;AAAA,EAC/C,OAAO,EAAE,OAAO,OAAO,OAAO;AAAA;AAGzB,IAAM,gCAIT,OAAO,OAAO,SAAS,UAAU;AAAA,EACnC,OAAO,qBAAqB,OAAO,OAAO,MAAM,IAAI,IAAI,gBAAgB,EAAE,MAAM;AAAA;AAYlF,SAAS,sBAAsB,CAC7B,OACA,eACA;AAAA,EACA,QAAQ,8BAA8B;AAAA,EACtC,MAAM,YAAiC,CAAC;AAAA,EACxC,WAAW,QAAQ,OAAO;AAAA,IACxB,MAAM,WAAW,KAAK;AAAA,IACtB,UAAU,YAAY,0BAA0B;AAAA,MAC9C,aAAa,KAAK;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,OAAO,CAAC,QAAa;AAAA,QACnB,cAAc,KAAK,EAAE,MAAM,UAAU,OAAQ,UAAU,CAAC,EAA8B,CAAC;AAAA,QACvF,OAAO;AAAA;AAAA,IAEX,CAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA;AAGF,IAAM,uBAIT,OAAO,OAAO,OAAO,iBAAiB,WAAW;AAAA,EACnD,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,+CAA+C;AAAA,EAE3E,MAAM,QAAQ;AAAA,EAEd,gBAAgB,GAAG,eAAe;AAAA,EAClC,MAAM,UAAU,MAAM,uBAAuB,KAAK;AAAA,EAElD,MAAM,gBAAyE,CAAC;AAAA,EAChF,MAAM,YACJ,MAAM,eAAe,SAAS,YAAY,uBAAuB,MAAM,OAAO,aAAa;AAAA,EAE7F,gBAAgB,IAAI,sBAAsB;AAAA,EAC1C,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,QAAQ,qBAAqB;AAAA,EAC7B,MAAM,UAAU,IAAI,iBAAiB;AAAA,IACnC,iBAAiB;AAAA,OACb,MAAM,gBAAgB,EAAE,cAAc,MAAM,aAAa;AAAA,EAC/D,CAAC;AAAA,EAED,IAAI;AAAA,IACF,MAAM,OAAO,MAAM,QAAQ,OAAO,MAAM,QAAQ;AAAA,MAC9C;AAAA,SACI,aAAa,EAAE,UAAU;AAAA,SACzB,MAAM,gBAAgB,aAAa,EAAE,aAAa,MAAM,YAAY;AAAA,SACpE,MAAM,cAAc,aAAa,EAAE,WAAW,MAAM,UAAU;AAAA,IACpE,CAAC;AAAA,IAED,MAAM,YAAqC,CAAC;AAAA,IAC5C,cAAc,QAAQ,CAAC,MAAM,UAAU;AAAA,MACrC,MAAM,KAAK,QAAQ;AAAA,MACnB,UAAU,MAAM,EAAE,IAAI,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM;AAAA,KAC1D;AAAA,IAED,gBAAgB,KAAK,uBAAuB;AAAA,IAC5C,OAAO,EAAE,MAAM,WAAW,qBAAqB,WAAW,MAAM,KAAK,EAAE;AAAA,YACvE;AAAA,IACA,SAAS,QAAQ;AAAA;AAAA;AAQd,IAAM,8BAIT,gBAAgB,CAAC,OAAO,OAAO,QAA2D;AAAA,EAC5F,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,+CAA+C;AAAA,EAE3E,MAAM,QAAQ;AAAA,EAEd,MAAM,UAAU,MAAM,uBAAuB,KAAK;AAAA,EAElD,MAAM,gBAAyE,CAAC;AAAA,EAChF,MAAM,YACJ,MAAM,eAAe,SAAS,YAAY,uBAAuB,MAAM,OAAO,aAAa;AAAA,EAE7F,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,QAAQ,qBAAqB;AAAA,EAC7B,MAAM,UAAU,IAAI,iBAAiB;AAAA,IACnC,iBAAiB;AAAA,OACb,MAAM,gBAAgB,EAAE,cAAc,MAAM,aAAa;AAAA,EAC/D,CAAC;AAAA,EAED,MAAM,QAAkB,CAAC;AAAA,EACzB,IAAI,aAAa;AAAA,EACjB,IAAI;AAAA,EACJ,IAAI,cAAmC;AAAA,EAEvC,MAAM,eAAe,MAAM;AAAA,IACzB,cAAc;AAAA,IACd,cAAc;AAAA;AAAA,EAGhB,IAAI,kBAAkB;AAAA,EACtB,MAAM,gBAAgB,QACnB,OAAO,MAAM,QAAQ;AAAA,IACpB;AAAA,OACI,aAAa,EAAE,UAAU;AAAA,IAC7B,aAAa,CAAC,UAAkB;AAAA,MAC9B,MAAM,KAAK,KAAK;AAAA,MAChB,aAAa;AAAA;AAAA,OAEX,MAAM,gBAAgB,aAAa,EAAE,aAAa,MAAM,YAAY;AAAA,OACpE,MAAM,cAAc,aAAa,EAAE,WAAW,MAAM,UAAU;AAAA,EACpE,CAAC,EACA,KAAK,MAAM;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,GACd,EACA,MAAM,CAAC,QAAiB;AAAA,IACvB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,aAAa;AAAA,GACd;AAAA,EAEH,IAAI;AAAA,IACF,OAAO,MAAM;AAAA,MACX,OAAO,MAAM,SAAS,GAAG;AAAA,QACvB,MAAM,QAAQ,MAAM,MAAM;AAAA,QAC1B,mBAAmB;AAAA,QACnB,MAAM,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,MAAM;AAAA,MAC7D;AAAA,MACA,IAAI;AAAA,QAAY;AAAA,MAChB,MAAM,IAAI,QAAc,CAAC,MAAM;AAAA,QAC7B,cAAc;AAAA,OACf;AAAA,IACH;AAAA,IAEA,OAAO,MAAM,SAAS,GAAG;AAAA,MACvB,MAAM,QAAQ,MAAM,MAAM;AAAA,MAC1B,mBAAmB;AAAA,MACnB,MAAM,EAAE,MAAM,cAAc,MAAM,QAAQ,WAAW,MAAM;AAAA,IAC7D;AAAA,YACA;AAAA,IACA,MAAM,cAAc,MAAM,MAAM,EAAE;AAAA,IAClC,SAAS,QAAQ;AAAA;AAAA,EAGnB,IAAI,iBAAiB;AAAA,IACnB,IAAI,CAAC,OAAO;AAAA,MAAS,MAAM;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,YAAqC,CAAC;AAAA,EAC5C,cAAc,QAAQ,CAAC,MAAM,UAAU;AAAA,IACrC,MAAM,KAAK,QAAQ;AAAA,IACnB,UAAU,MAAM,EAAE,IAAI,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM;AAAA,GAC1D;AAAA,EACD,MAAM,iBAAiB,qBAAqB,WAAW,MAAM,KAAK;AAAA,EAElE,IAAI,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAAA,IAC1C,MAAM,EAAE,MAAM,gBAAgB,MAAM,aAAa,aAAa,KAAK,eAAe,EAAE;AAAA,EACtF;AAAA,EAEA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,EAAE,MAAM,iBAAiB,WAAW,eAAe;AAAA,EAC3D;AAAA;AAOK,IAAM,qBAIT,OAAO,OAAO,UAAU;AAAA,EAC1B,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,6CAA6C;AAAA,EAEzE,MAAM,YAAY,mBAAmB,KAAK;AAAA,EAC1C,MAAM,YAAY,OAAO,IAAI,SAAS;AAAA,EAEtC,IAAI,YAAY;AAAA,EAChB,IAAI,aAA4C;AAAA,EAGhD,IAAI;AAAA,IACF,MAAM,KAAK,MAAa;AAAA,IACxB,MAAM,OAAO,MAAM,GAAG,KAAK,SAAS;AAAA,IACpC,YAAY;AAAA,IACZ,aAAa,EAAE,OAAO,KAAK,KAAK;AAAA,IAChC,MAAM;AAAA,IAGN,IAAI,cAAc,IAAI,aAAa,KAAK,CAAC,GAAG;AAAA,MAC1C,YAAY;AAAA,IACd;AAAA;AAAA,EAGF,OAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAOK,IAAM,iBAAiF;AAAA,EAC5F,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AACnB;AAEO,IAAM,wBAGT;AAAA,EACF,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AACnB;AAEO,IAAM,0BAGT;AAAA,EACF,iBAAiB;AACnB;;AC5wBA;AAQO,SAAS,+BAA+B,GAAG;AAAA,EAChD,MAAM,eAAe,sBAAsB,IAAI,aAAa;AAAA,EAC5D,IAAI,iBACF,gBACA,uBACA,uBACF,EAAE,uBAAuB,YAAY;AAAA,EACrC,aAAa,UAAU;AAAA,EACvB,UAAU,EAAE,KAAK,mCAAmC;AAAA;",
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "3B2BE18FF6F105A164756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ollama_JobRunFns.browser.d.ts","sourceRoot":"","sources":["../../../src/provider-ollama/common/Ollama_JobRunFns.browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,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;AAKtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA4B9D,eAAO,MAAM,qBAAqB,EAAE,eAAe,CACjD,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"Ollama_JobRunFns.browser.d.ts","sourceRoot":"","sources":["../../../src/provider-ollama/common/Ollama_JobRunFns.browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,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;AAKtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA4B9D,eAAO,MAAM,qBAAqB,EAAE,eAAe,CACjD,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,CAiClB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAAe,CAChD,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,CAqBlB,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,CAC/C,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,CA6BlB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CA6BlB,CAAC;AAMF,eAAO,MAAM,4BAA4B,EAAE,kBAAkB,CAC3D,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,CA+BlB,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,kBAAkB,CACzD,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,CA2BlB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,kBAAkB,CACxD,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CA2BlB,CAAC;AAiBF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CA4DlB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,kBAAkB,CACxD,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAqElB,CAAC;AAMF,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAC5C,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,CAqClB,CAAC;AAMF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAOrF,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,MAAM,EACN,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAMhD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ollama_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/provider-ollama/common/Ollama_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,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;AAKtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA4B9D,eAAO,MAAM,qBAAqB,EAAE,eAAe,CACjD,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"Ollama_JobRunFns.d.ts","sourceRoot":"","sources":["../../../src/provider-ollama/common/Ollama_JobRunFns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,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;AAKtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA4B9D,eAAO,MAAM,qBAAqB,EAAE,eAAe,CACjD,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,CAiClB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAAe,CAChD,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,CAqBlB,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,CAC/C,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,CA6BlB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CA6BlB,CAAC;AAMF,eAAO,MAAM,4BAA4B,EAAE,kBAAkB,CAC3D,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,CA+BlB,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,kBAAkB,CACzD,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,CA2BlB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,kBAAkB,CACxD,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CA2BlB,CAAC;AAiBF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAC9C,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CA4DlB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,kBAAkB,CACxD,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,CAqElB,CAAC;AAMF,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAC5C,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,CAqClB,CAAC;AAMF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAOrF,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,MAAM,EACN,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAMhD,CAAC"}
|
|
@@ -7,7 +7,7 @@ var OLLAMA = "OLLAMA";
|
|
|
7
7
|
var OLLAMA_DEFAULT_BASE_URL = "http://localhost:11434";
|
|
8
8
|
// src/provider-ollama/common/Ollama_JobRunFns.browser.ts
|
|
9
9
|
import { buildToolDescription, filterValidToolCalls } from "@workglow/ai";
|
|
10
|
-
import { parsePartialJson } from "@workglow/util";
|
|
10
|
+
import { getLogger, parsePartialJson } from "@workglow/util";
|
|
11
11
|
var _sdk;
|
|
12
12
|
async function loadOllamaSDK() {
|
|
13
13
|
if (!_sdk) {
|
|
@@ -32,6 +32,16 @@ function getModelName(model) {
|
|
|
32
32
|
return name;
|
|
33
33
|
}
|
|
34
34
|
var Ollama_TextGeneration = async (input, model, update_progress, signal) => {
|
|
35
|
+
if (Array.isArray(input.prompt)) {
|
|
36
|
+
getLogger().warn("Ollama_TextGeneration: array input received; processing sequentially (no native batch support)");
|
|
37
|
+
const prompts = input.prompt;
|
|
38
|
+
const results = [];
|
|
39
|
+
for (const item of prompts) {
|
|
40
|
+
const r = await Ollama_TextGeneration({ ...input, prompt: item }, model, update_progress, signal);
|
|
41
|
+
results.push(r.text);
|
|
42
|
+
}
|
|
43
|
+
return { text: results };
|
|
44
|
+
}
|
|
35
45
|
update_progress(0, "Starting Ollama text generation");
|
|
36
46
|
const client = await getClient(model);
|
|
37
47
|
const modelName = getModelName(model);
|
|
@@ -67,6 +77,16 @@ var Ollama_TextEmbedding = async (input, model, update_progress, signal) => {
|
|
|
67
77
|
return { vector: new Float32Array(response.embeddings[0]) };
|
|
68
78
|
};
|
|
69
79
|
var Ollama_TextRewriter = async (input, model, update_progress, signal) => {
|
|
80
|
+
if (Array.isArray(input.text)) {
|
|
81
|
+
getLogger().warn("Ollama_TextRewriter: array input received; processing sequentially (no native batch support)");
|
|
82
|
+
const texts = input.text;
|
|
83
|
+
const results = [];
|
|
84
|
+
for (const item of texts) {
|
|
85
|
+
const r = await Ollama_TextRewriter({ ...input, text: item }, model, update_progress, signal);
|
|
86
|
+
results.push(r.text);
|
|
87
|
+
}
|
|
88
|
+
return { text: results };
|
|
89
|
+
}
|
|
70
90
|
update_progress(0, "Starting Ollama text rewriting");
|
|
71
91
|
const client = await getClient(model);
|
|
72
92
|
const modelName = getModelName(model);
|
|
@@ -81,6 +101,16 @@ var Ollama_TextRewriter = async (input, model, update_progress, signal) => {
|
|
|
81
101
|
return { text: response.message.content };
|
|
82
102
|
};
|
|
83
103
|
var Ollama_TextSummary = async (input, model, update_progress, signal) => {
|
|
104
|
+
if (Array.isArray(input.text)) {
|
|
105
|
+
getLogger().warn("Ollama_TextSummary: array input received; processing sequentially (no native batch support)");
|
|
106
|
+
const texts = input.text;
|
|
107
|
+
const results = [];
|
|
108
|
+
for (const item of texts) {
|
|
109
|
+
const r = await Ollama_TextSummary({ ...input, text: item }, model, update_progress, signal);
|
|
110
|
+
results.push(r.text);
|
|
111
|
+
}
|
|
112
|
+
return { text: results };
|
|
113
|
+
}
|
|
84
114
|
update_progress(0, "Starting Ollama text summarization");
|
|
85
115
|
const client = await getClient(model);
|
|
86
116
|
const modelName = getModelName(model);
|
|
@@ -184,6 +214,18 @@ function mapOllamaTools(tools) {
|
|
|
184
214
|
}));
|
|
185
215
|
}
|
|
186
216
|
var Ollama_ToolCalling = async (input, model, update_progress, signal) => {
|
|
217
|
+
if (Array.isArray(input.prompt)) {
|
|
218
|
+
getLogger().warn("Ollama_ToolCalling: array input received; processing sequentially (no native batch support)");
|
|
219
|
+
const prompts = input.prompt;
|
|
220
|
+
const texts = [];
|
|
221
|
+
const toolCallsList = [];
|
|
222
|
+
for (const item of prompts) {
|
|
223
|
+
const r = await Ollama_ToolCalling({ ...input, prompt: item }, model, update_progress, signal);
|
|
224
|
+
texts.push(r.text);
|
|
225
|
+
toolCallsList.push(r.toolCalls);
|
|
226
|
+
}
|
|
227
|
+
return { text: texts, toolCalls: toolCallsList };
|
|
228
|
+
}
|
|
187
229
|
update_progress(0, "Starting Ollama tool calling");
|
|
188
230
|
const client = await getClient(model);
|
|
189
231
|
const modelName = getModelName(model);
|
|
@@ -428,4 +470,4 @@ export {
|
|
|
428
470
|
OLLAMA
|
|
429
471
|
};
|
|
430
472
|
|
|
431
|
-
//# debugId=
|
|
473
|
+
//# debugId=1886BE237F345DED64756E2164756E21
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"sources": ["../src/provider-ollama/common/Ollama_Constants.ts", "../src/provider-ollama/common/Ollama_JobRunFns.browser.ts", "../src/provider-ollama/common/Ollama_ModelSchema.ts", "../src/provider-ollama/Ollama_Worker.browser.ts", "../src/provider-ollama/OllamaProvider.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const OLLAMA = \"OLLAMA\";\nexport const OLLAMA_DEFAULT_BASE_URL = \"http://localhost:11434\";\n",
|
|
6
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\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 { parsePartialJson } from \"@workglow/util\";\nimport { OLLAMA_DEFAULT_BASE_URL } from \"./Ollama_Constants\";\nimport type { OllamaModelConfig } from \"./Ollama_ModelSchema\";\n\nlet _sdk: typeof import(\"ollama/browser\") | undefined;\nasync function loadOllamaSDK() {\n if (!_sdk) {\n try {\n _sdk = await import(\"ollama/browser\");\n } catch {\n throw new Error(\"ollama is required for Ollama tasks. Install it with: bun add ollama\");\n }\n }\n return _sdk.Ollama;\n}\n\nasync function getClient(model: OllamaModelConfig | undefined) {\n const Ollama = await loadOllamaSDK();\n const host = model?.provider_config?.base_url || OLLAMA_DEFAULT_BASE_URL;\n return new Ollama({ host });\n}\n\nfunction getModelName(model: OllamaModelConfig | 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\nexport const Ollama_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text generation\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n options: {\n temperature: input.temperature,\n top_p: input.topP,\n num_predict: input.maxTokens,\n frequency_penalty: input.frequencyPenalty,\n presence_penalty: input.presencePenalty,\n },\n });\n\n update_progress(100, \"Completed Ollama text generation\");\n return { text: response.message.content };\n};\n\nexport const Ollama_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text embedding\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const texts = Array.isArray(input.text) ? input.text : [input.text];\n\n const response = await client.embed({\n model: modelName,\n input: texts,\n });\n\n update_progress(100, \"Completed Ollama text embedding\");\n\n if (Array.isArray(input.text)) {\n return {\n vector: response.embeddings.map((e) => new Float32Array(e)),\n };\n }\n return { vector: new Float32Array(response.embeddings[0]) };\n};\n\nexport const Ollama_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text rewriting\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt },\n { role: \"user\", content: input.text },\n ],\n });\n\n update_progress(100, \"Completed Ollama text rewriting\");\n return { text: response.message.content };\n};\n\nexport const Ollama_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text summarization\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text },\n ],\n });\n\n update_progress(100, \"Completed Ollama text summarization\");\n return { text: response.message.content };\n};\n\n// ========================================================================\n// Streaming implementations (append mode)\n// ========================================================================\n\nexport const Ollama_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt }],\n options: {\n temperature: input.temperature,\n top_p: input.topP,\n num_predict: input.maxTokens,\n frequency_penalty: input.frequencyPenalty,\n presence_penalty: input.presencePenalty,\n },\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\nexport const Ollama_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt },\n { role: \"user\", content: input.text },\n ],\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\nexport const Ollama_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text },\n ],\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\n// ========================================================================\n// Tool calling implementations\n// ========================================================================\n\nfunction mapOllamaTools(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\nexport const Ollama_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama tool calling\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const messages: Array<{ role: string; 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 tools = input.toolChoice === \"none\" ? undefined : mapOllamaTools(input.tools);\n\n const response = await client.chat({\n model: modelName,\n messages,\n tools,\n options: {\n temperature: input.temperature,\n num_predict: input.maxTokens,\n },\n });\n\n const text = response.message.content ?? \"\";\n const toolCalls: Record<string, unknown> = {};\n (response.message.tool_calls ?? []).forEach((tc: any, index: number) => {\n let parsedInput: Record<string, unknown> = {};\n const fnArgs = tc.function.arguments;\n if (typeof fnArgs === \"string\") {\n try {\n parsedInput = JSON.parse(fnArgs);\n } catch {\n const partial = parsePartialJson(fnArgs);\n parsedInput = (partial as Record<string, unknown>) ?? {};\n }\n } else if (fnArgs != null) {\n parsedInput = fnArgs as Record<string, unknown>;\n }\n const id = `call_${index}`;\n toolCalls[id] = { id, name: tc.function.name as string, input: parsedInput };\n });\n\n update_progress(100, \"Completed Ollama tool calling\");\n return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };\n};\n\nexport const Ollama_ToolCalling_Stream: AiProviderStreamFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ToolCallingTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const messages: Array<{ role: string; 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 tools = input.toolChoice === \"none\" ? undefined : mapOllamaTools(input.tools);\n\n const stream = await client.chat({\n model: modelName,\n messages,\n tools,\n options: {\n temperature: input.temperature,\n num_predict: input.maxTokens,\n },\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n let accumulatedText = \"\";\n const toolCalls: Record<string, unknown> = {};\n let callIndex = 0;\n\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n accumulatedText += delta;\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n\n const chunkToolCalls = (chunk.message as any).tool_calls;\n if (Array.isArray(chunkToolCalls) && chunkToolCalls.length > 0) {\n for (const tc of chunkToolCalls) {\n let parsedInput: Record<string, unknown> = {};\n const fnArgs = tc.function.arguments;\n if (typeof fnArgs === \"string\") {\n try {\n parsedInput = JSON.parse(fnArgs);\n } catch {\n const partial = parsePartialJson(fnArgs);\n parsedInput = (partial as Record<string, unknown>) ?? {};\n }\n } else if (fnArgs != null) {\n parsedInput = fnArgs as Record<string, unknown>;\n }\n const id = `call_${callIndex++}`;\n toolCalls[id] = { id, name: tc.function.name as string, input: parsedInput };\n }\n yield { type: \"object-delta\", port: \"toolCalls\", objectDelta: { ...toolCalls } };\n }\n }\n\n const validToolCalls = filterValidToolCalls(toolCalls, input.tools);\n yield {\n type: \"finish\",\n data: { text: accumulatedText, toolCalls: validToolCalls } as ToolCallingTaskOutput,\n };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\n// ========================================================================\n// Model info\n// ========================================================================\n\nexport const Ollama_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n OllamaModelConfig\n> = async (input, model) => {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n let is_cached = false;\n let is_loaded = false;\n let file_sizes: Record<string, number> | null = null;\n\n try {\n const showResponse = await client.show({ model: modelName });\n is_cached = true;\n const size = (showResponse as any).size as number | undefined;\n if (size != null) {\n file_sizes = { model: size };\n }\n } catch {\n // Model not available on server\n }\n\n try {\n const psResponse = await client.ps();\n is_loaded = psResponse.models.some((m: any) => m.name === modelName);\n } catch {\n // ps() not available or failed\n }\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\nexport const OLLAMA_TASKS: Record<string, AiProviderRunFn<any, any, OllamaModelConfig>> = {\n ModelInfoTask: Ollama_ModelInfo,\n TextGenerationTask: Ollama_TextGeneration,\n TextEmbeddingTask: Ollama_TextEmbedding,\n TextRewriterTask: Ollama_TextRewriter,\n TextSummaryTask: Ollama_TextSummary,\n ToolCallingTask: Ollama_ToolCalling,\n};\n\nexport const OLLAMA_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, OllamaModelConfig>\n> = {\n TextGenerationTask: Ollama_TextGeneration_Stream,\n TextRewriterTask: Ollama_TextRewriter_Stream,\n TextSummaryTask: Ollama_TextSummary_Stream,\n ToolCallingTask: Ollama_ToolCalling_Stream,\n};\n",
|
|
6
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\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 { OLLAMA_DEFAULT_BASE_URL } from \"./Ollama_Constants\";\nimport type { OllamaModelConfig } from \"./Ollama_ModelSchema\";\n\nlet _sdk: typeof import(\"ollama/browser\") | undefined;\nasync function loadOllamaSDK() {\n if (!_sdk) {\n try {\n _sdk = await import(\"ollama/browser\");\n } catch {\n throw new Error(\"ollama is required for Ollama tasks. Install it with: bun add ollama\");\n }\n }\n return _sdk.Ollama;\n}\n\nasync function getClient(model: OllamaModelConfig | undefined) {\n const Ollama = await loadOllamaSDK();\n const host = model?.provider_config?.base_url || OLLAMA_DEFAULT_BASE_URL;\n return new Ollama({ host });\n}\n\nfunction getModelName(model: OllamaModelConfig | 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\nexport const Ollama_TextGeneration: AiProviderRunFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.prompt)) {\n getLogger().warn(\n \"Ollama_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 Ollama_TextGeneration({ ...input, prompt: item }, model, update_progress, signal);\n results.push(r.text as string);\n }\n return { text: results };\n }\n\n update_progress(0, \"Starting Ollama text generation\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt as string }],\n options: {\n temperature: input.temperature,\n top_p: input.topP,\n num_predict: input.maxTokens,\n frequency_penalty: input.frequencyPenalty,\n presence_penalty: input.presencePenalty,\n },\n });\n\n update_progress(100, \"Completed Ollama text generation\");\n return { text: response.message.content };\n};\n\nexport const Ollama_TextEmbedding: AiProviderRunFn<\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n update_progress(0, \"Starting Ollama text embedding\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const texts = Array.isArray(input.text) ? input.text : [input.text];\n\n const response = await client.embed({\n model: modelName,\n input: texts,\n });\n\n update_progress(100, \"Completed Ollama text embedding\");\n\n if (Array.isArray(input.text)) {\n return {\n vector: response.embeddings.map((e) => new Float32Array(e)),\n };\n }\n return { vector: new Float32Array(response.embeddings[0]) };\n};\n\nexport const Ollama_TextRewriter: AiProviderRunFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.text)) {\n getLogger().warn(\n \"Ollama_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 Ollama_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 Ollama text rewriting\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt as string },\n { role: \"user\", content: input.text as string },\n ],\n });\n\n update_progress(100, \"Completed Ollama text rewriting\");\n return { text: response.message.content };\n};\n\nexport const Ollama_TextSummary: AiProviderRunFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.text)) {\n getLogger().warn(\n \"Ollama_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 Ollama_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 Ollama text summarization\");\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const response = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text as string },\n ],\n });\n\n update_progress(100, \"Completed Ollama text summarization\");\n return { text: response.message.content };\n};\n\n// ========================================================================\n// Streaming implementations (append mode)\n// ========================================================================\n\nexport const Ollama_TextGeneration_Stream: AiProviderStreamFn<\n TextGenerationTaskInput,\n TextGenerationTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextGenerationTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [{ role: \"user\", content: input.prompt as string }],\n options: {\n temperature: input.temperature,\n top_p: input.topP,\n num_predict: input.maxTokens,\n frequency_penalty: input.frequencyPenalty,\n presence_penalty: input.presencePenalty,\n },\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextGenerationTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\nexport const Ollama_TextRewriter_Stream: AiProviderStreamFn<\n TextRewriterTaskInput,\n TextRewriterTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextRewriterTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: input.prompt as string },\n { role: \"user\", content: input.text as string },\n ],\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextRewriterTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\nexport const Ollama_TextSummary_Stream: AiProviderStreamFn<\n TextSummaryTaskInput,\n TextSummaryTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<TextSummaryTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n const stream = await client.chat({\n model: modelName,\n messages: [\n { role: \"system\", content: \"Summarize the following text concisely.\" },\n { role: \"user\", content: input.text as string },\n ],\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n }\n yield { type: \"finish\", data: {} as TextSummaryTaskOutput };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\n// ========================================================================\n// Tool calling implementations\n// ========================================================================\n\nfunction mapOllamaTools(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\nexport const Ollama_ToolCalling: AiProviderRunFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n OllamaModelConfig\n> = async (input, model, update_progress, signal) => {\n if (Array.isArray(input.prompt)) {\n getLogger().warn(\n \"Ollama_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 Ollama_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 Ollama tool calling\");\n const client = await getClient(model);\n const modelName = getModelName(model);\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 = input.toolChoice === \"none\" ? undefined : mapOllamaTools(input.tools);\n\n const response = await client.chat({\n model: modelName,\n messages,\n tools,\n options: {\n temperature: input.temperature,\n num_predict: input.maxTokens,\n },\n });\n\n const text = response.message.content ?? \"\";\n const toolCalls: Record<string, unknown> = {};\n (response.message.tool_calls ?? []).forEach((tc: any, index: number) => {\n let parsedInput: Record<string, unknown> = {};\n const fnArgs = tc.function.arguments;\n if (typeof fnArgs === \"string\") {\n try {\n parsedInput = JSON.parse(fnArgs);\n } catch {\n const partial = parsePartialJson(fnArgs);\n parsedInput = (partial as Record<string, unknown>) ?? {};\n }\n } else if (fnArgs != null) {\n parsedInput = fnArgs as Record<string, unknown>;\n }\n const id = `call_${index}`;\n toolCalls[id] = { id, name: tc.function.name as string, input: parsedInput };\n });\n\n update_progress(100, \"Completed Ollama tool calling\");\n return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };\n};\n\nexport const Ollama_ToolCalling_Stream: AiProviderStreamFn<\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n OllamaModelConfig\n> = async function* (input, model, signal): AsyncIterable<StreamEvent<ToolCallingTaskOutput>> {\n const client = await getClient(model);\n const modelName = getModelName(model);\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 = input.toolChoice === \"none\" ? undefined : mapOllamaTools(input.tools);\n\n const stream = await client.chat({\n model: modelName,\n messages,\n tools,\n options: {\n temperature: input.temperature,\n num_predict: input.maxTokens,\n },\n stream: true,\n });\n\n const onAbort = () => stream.abort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n let accumulatedText = \"\";\n const toolCalls: Record<string, unknown> = {};\n let callIndex = 0;\n\n try {\n for await (const chunk of stream) {\n const delta = chunk.message.content;\n if (delta) {\n accumulatedText += delta;\n yield { type: \"text-delta\", port: \"text\", textDelta: delta };\n }\n\n const chunkToolCalls = (chunk.message as any).tool_calls;\n if (Array.isArray(chunkToolCalls) && chunkToolCalls.length > 0) {\n for (const tc of chunkToolCalls) {\n let parsedInput: Record<string, unknown> = {};\n const fnArgs = tc.function.arguments;\n if (typeof fnArgs === \"string\") {\n try {\n parsedInput = JSON.parse(fnArgs);\n } catch {\n const partial = parsePartialJson(fnArgs);\n parsedInput = (partial as Record<string, unknown>) ?? {};\n }\n } else if (fnArgs != null) {\n parsedInput = fnArgs as Record<string, unknown>;\n }\n const id = `call_${callIndex++}`;\n toolCalls[id] = { id, name: tc.function.name as string, input: parsedInput };\n }\n yield { type: \"object-delta\", port: \"toolCalls\", objectDelta: { ...toolCalls } };\n }\n }\n\n const validToolCalls = filterValidToolCalls(toolCalls, input.tools);\n yield {\n type: \"finish\",\n data: { text: accumulatedText, toolCalls: validToolCalls } as ToolCallingTaskOutput,\n };\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n};\n\n// ========================================================================\n// Model info\n// ========================================================================\n\nexport const Ollama_ModelInfo: AiProviderRunFn<\n ModelInfoTaskInput,\n ModelInfoTaskOutput,\n OllamaModelConfig\n> = async (input, model) => {\n const client = await getClient(model);\n const modelName = getModelName(model);\n\n let is_cached = false;\n let is_loaded = false;\n let file_sizes: Record<string, number> | null = null;\n\n try {\n const showResponse = await client.show({ model: modelName });\n is_cached = true;\n const size = (showResponse as any).size as number | undefined;\n if (size != null) {\n file_sizes = { model: size };\n }\n } catch {\n // Model not available on server\n }\n\n try {\n const psResponse = await client.ps();\n is_loaded = psResponse.models.some((m: any) => m.name === modelName);\n } catch {\n // ps() not available or failed\n }\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\nexport const OLLAMA_TASKS: Record<string, AiProviderRunFn<any, any, OllamaModelConfig>> = {\n ModelInfoTask: Ollama_ModelInfo,\n TextGenerationTask: Ollama_TextGeneration,\n TextEmbeddingTask: Ollama_TextEmbedding,\n TextRewriterTask: Ollama_TextRewriter,\n TextSummaryTask: Ollama_TextSummary,\n ToolCallingTask: Ollama_ToolCalling,\n};\n\nexport const OLLAMA_STREAM_TASKS: Record<\n string,\n AiProviderStreamFn<any, any, OllamaModelConfig>\n> = {\n TextGenerationTask: Ollama_TextGeneration_Stream,\n TextRewriterTask: Ollama_TextRewriter_Stream,\n TextSummaryTask: Ollama_TextSummary_Stream,\n ToolCallingTask: Ollama_ToolCalling_Stream,\n};\n",
|
|
7
7
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ModelConfigSchema, ModelRecordSchema } from \"@workglow/ai\";\nimport { DataPortSchemaObject, FromSchema } from \"@workglow/util\";\nimport { OLLAMA, OLLAMA_DEFAULT_BASE_URL } from \"./Ollama_Constants\";\n\nexport const OllamaModelSchema = {\n type: \"object\",\n properties: {\n provider: {\n const: OLLAMA,\n description: \"Discriminator: Ollama local LLM server.\",\n },\n provider_config: {\n type: \"object\",\n description: \"Ollama-specific configuration.\",\n properties: {\n model_name: {\n type: \"string\",\n description: \"The Ollama model identifier (e.g., 'llama3.2', 'nomic-embed-text').\",\n },\n base_url: {\n type: \"string\",\n description: \"Base URL for the Ollama server.\",\n default: OLLAMA_DEFAULT_BASE_URL,\n },\n },\n required: [\"model_name\"],\n additionalProperties: false,\n },\n },\n required: [\"provider\", \"provider_config\"],\n additionalProperties: true,\n} as const satisfies DataPortSchemaObject;\n\nexport const OllamaModelRecordSchema = {\n type: \"object\",\n properties: {\n ...ModelRecordSchema.properties,\n ...OllamaModelSchema.properties,\n },\n required: [...ModelRecordSchema.required, ...OllamaModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type OllamaModelRecord = FromSchema<typeof OllamaModelRecordSchema>;\n\nexport const OllamaModelConfigSchema = {\n type: \"object\",\n properties: {\n ...ModelConfigSchema.properties,\n ...OllamaModelSchema.properties,\n },\n required: [...ModelConfigSchema.required, ...OllamaModelSchema.required],\n additionalProperties: false,\n} as const satisfies DataPortSchemaObject;\n\nexport type OllamaModelConfig = FromSchema<typeof OllamaModelConfigSchema>;\n",
|
|
8
8
|
"/**\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 { OLLAMA_STREAM_TASKS, OLLAMA_TASKS } from \"./common/Ollama_JobRunFns.browser\";\nimport { OllamaProvider } from \"./OllamaProvider\";\n\nexport function OLLAMA_WORKER_JOBRUN_REGISTER() {\n const workerServer = globalServiceRegistry.get(WORKER_SERVER);\n new OllamaProvider(OLLAMA_TASKS, OLLAMA_STREAM_TASKS).registerOnWorkerServer(workerServer);\n workerServer.sendReady();\n console.log(\"OLLAMA_WORKER_JOBRUN registered\");\n}\n",
|
|
9
9
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n AiProvider,\n type AiProviderReactiveRunFn,\n type AiProviderRunFn,\n type AiProviderStreamFn,\n} from \"@workglow/ai\";\nimport { OLLAMA } from \"./common/Ollama_Constants\";\nimport type { OllamaModelConfig } from \"./common/Ollama_ModelSchema\";\n\n/**\n * AI provider for Ollama local LLM server.\n *\n * Supports text generation, text embedding, text rewriting, and text summarization\n * via the Ollama API using the `ollama` SDK.\n *\n * Ollama runs locally and does not require an API key -- only a `base_url`\n * (defaults to `http://localhost:11434`).\n *\n * Task run functions are injected via the constructor so that the `ollama` SDK\n * is only imported where actually needed (inline mode, worker server), not on\n * the main thread in worker mode.\n *\n * @example\n * ```typescript\n * // Worker mode (main thread) -- lightweight, no SDK import:\n * await new OllamaProvider().register({\n * mode: \"worker\",\n * worker: new Worker(new URL(\"./worker_ollama.ts\", import.meta.url), { type: \"module\" }),\n * });\n *\n * // Inline mode -- caller provides the tasks:\n * import { OLLAMA_TASKS } from \"@workglow/ai-provider/ollama\";\n * await new OllamaProvider(OLLAMA_TASKS).register({ mode: \"inline\" });\n * ```\n */\nexport class OllamaProvider extends AiProvider<OllamaModelConfig> {\n readonly name = OLLAMA;\n readonly isLocal = true;\n readonly supportsBrowser = true;\n\n readonly taskTypes = [\n \"ModelInfoTask\",\n \"TextGenerationTask\",\n \"TextEmbeddingTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"ToolCallingTask\",\n ] as const;\n\n constructor(\n tasks?: Record<string, AiProviderRunFn<any, any, OllamaModelConfig>>,\n streamTasks?: Record<string, AiProviderStreamFn<any, any, OllamaModelConfig>>,\n reactiveTasks?: Record<string, AiProviderReactiveRunFn<any, any, OllamaModelConfig>>\n ) {\n super(tasks, streamTasks, reactiveTasks);\n }\n}\n"
|
|
10
10
|
],
|
|
11
|
-
"mappings": "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",
|
|
12
|
-
"debugId": "
|
|
11
|
+
"mappings": "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",
|
|
12
|
+
"debugId": "1886BE237F345DED64756E2164756E21",
|
|
13
13
|
"names": []
|
|
14
14
|
}
|