@workglow/ai-provider 0.1.2 → 0.2.0
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/common/ToolCallParsers.d.ts +253 -0
- package/dist/common/ToolCallParsers.d.ts.map +1 -0
- package/dist/provider-anthropic/AnthropicProvider.d.ts +3 -2
- package/dist/provider-anthropic/AnthropicProvider.d.ts.map +1 -1
- package/dist/provider-anthropic/AnthropicQueuedProvider.d.ts +3 -2
- package/dist/provider-anthropic/AnthropicQueuedProvider.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_Client.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_JobRunFns.d.ts.map +1 -1
- package/dist/provider-anthropic/common/Anthropic_ToolCalling.d.ts +10 -0
- package/dist/provider-anthropic/common/Anthropic_ToolCalling.d.ts.map +1 -0
- package/dist/provider-anthropic/index.js +3 -4
- package/dist/provider-anthropic/index.js.map +3 -3
- package/dist/provider-anthropic/runtime.js +225 -8
- package/dist/provider-anthropic/runtime.js.map +9 -8
- package/dist/provider-chrome/WebBrowserProvider.d.ts +2 -1
- package/dist/provider-chrome/WebBrowserProvider.d.ts.map +1 -1
- package/dist/provider-chrome/WebBrowserQueuedProvider.d.ts +2 -1
- package/dist/provider-chrome/WebBrowserQueuedProvider.d.ts.map +1 -1
- package/dist/provider-chrome/index.js +2 -4
- package/dist/provider-chrome/index.js.map +3 -3
- package/dist/provider-chrome/runtime.js +3 -7
- package/dist/provider-chrome/runtime.js.map +4 -4
- package/dist/provider-gemini/GoogleGeminiProvider.d.ts +3 -2
- package/dist/provider-gemini/GoogleGeminiProvider.d.ts.map +1 -1
- package/dist/provider-gemini/GoogleGeminiQueuedProvider.d.ts +3 -2
- package/dist/provider-gemini/GoogleGeminiQueuedProvider.d.ts.map +1 -1
- package/dist/provider-gemini/common/Gemini_JobRunFns.d.ts.map +1 -1
- package/dist/provider-gemini/common/Gemini_ToolCalling.d.ts +10 -0
- package/dist/provider-gemini/common/Gemini_ToolCalling.d.ts.map +1 -0
- package/dist/provider-gemini/index.js +3 -4
- package/dist/provider-gemini/index.js.map +3 -3
- package/dist/provider-gemini/runtime.js +188 -8
- package/dist/provider-gemini/runtime.js.map +7 -6
- package/dist/provider-hf-inference/HfInferenceProvider.d.ts +3 -2
- package/dist/provider-hf-inference/HfInferenceProvider.d.ts.map +1 -1
- package/dist/provider-hf-inference/HfInferenceQueuedProvider.d.ts +3 -2
- package/dist/provider-hf-inference/HfInferenceQueuedProvider.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_JobRunFns.d.ts.map +1 -1
- package/dist/provider-hf-inference/common/HFI_ToolCalling.d.ts +10 -0
- package/dist/provider-hf-inference/common/HFI_ToolCalling.d.ts.map +1 -0
- package/dist/provider-hf-inference/index.js +3 -4
- package/dist/provider-hf-inference/index.js.map +3 -3
- package/dist/provider-hf-inference/runtime.js +157 -8
- package/dist/provider-hf-inference/runtime.js.map +7 -6
- package/dist/provider-hf-transformers/HuggingFaceTransformersProvider.d.ts +3 -2
- package/dist/provider-hf-transformers/HuggingFaceTransformersProvider.d.ts.map +1 -1
- package/dist/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.d.ts +3 -3
- package/dist/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_JobRunFns.d.ts +52 -0
- package/dist/provider-hf-transformers/common/HFT_JobRunFns.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_Pipeline.d.ts +1 -1
- package/dist/provider-hf-transformers/common/HFT_Pipeline.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_StructuredGeneration.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextClassification.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextQuestionAnswer.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextSummary.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_TextTranslation.d.ts.map +1 -1
- package/dist/provider-hf-transformers/common/HFT_ToolCalling.d.ts +10 -0
- package/dist/provider-hf-transformers/common/HFT_ToolCalling.d.ts.map +1 -0
- package/dist/provider-hf-transformers/common/HFT_ToolMarkup.d.ts +20 -0
- package/dist/provider-hf-transformers/common/HFT_ToolMarkup.d.ts.map +1 -0
- package/dist/provider-hf-transformers/common/HFT_ToolParser.d.ts +67 -0
- package/dist/provider-hf-transformers/common/HFT_ToolParser.d.ts.map +1 -0
- package/dist/provider-hf-transformers/index.d.ts +1 -0
- package/dist/provider-hf-transformers/index.d.ts.map +1 -1
- package/dist/provider-hf-transformers/index.js +71 -7
- package/dist/provider-hf-transformers/index.js.map +7 -6
- package/dist/provider-hf-transformers/runtime.d.ts +1 -0
- package/dist/provider-hf-transformers/runtime.d.ts.map +1 -1
- package/dist/provider-hf-transformers/runtime.js +1244 -13
- package/dist/provider-hf-transformers/runtime.js.map +18 -15
- package/dist/provider-llamacpp/LlamaCppProvider.d.ts +3 -2
- package/dist/provider-llamacpp/LlamaCppProvider.d.ts.map +1 -1
- package/dist/provider-llamacpp/LlamaCppQueuedProvider.d.ts +3 -2
- package/dist/provider-llamacpp/LlamaCppQueuedProvider.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_JobRunFns.d.ts.map +1 -1
- package/dist/provider-llamacpp/common/LlamaCpp_ToolCalling.d.ts +10 -0
- package/dist/provider-llamacpp/common/LlamaCpp_ToolCalling.d.ts.map +1 -0
- package/dist/provider-llamacpp/common/LlamaCpp_ToolParser.d.ts +35 -0
- package/dist/provider-llamacpp/common/LlamaCpp_ToolParser.d.ts.map +1 -0
- package/dist/provider-llamacpp/index.js +3 -4
- package/dist/provider-llamacpp/index.js.map +3 -3
- package/dist/provider-llamacpp/runtime.js +1394 -9
- package/dist/provider-llamacpp/runtime.js.map +11 -8
- package/dist/provider-ollama/OllamaProvider.d.ts +3 -2
- package/dist/provider-ollama/OllamaProvider.d.ts.map +1 -1
- package/dist/provider-ollama/OllamaQueuedProvider.d.ts +3 -2
- package/dist/provider-ollama/OllamaQueuedProvider.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts +47 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts +46 -0
- package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts.map +1 -1
- package/dist/provider-ollama/common/Ollama_ToolCalling.d.ts +16 -0
- package/dist/provider-ollama/common/Ollama_ToolCalling.d.ts.map +1 -0
- package/dist/provider-ollama/index.browser.js +3 -4
- package/dist/provider-ollama/index.browser.js.map +3 -3
- package/dist/provider-ollama/index.js +3 -4
- package/dist/provider-ollama/index.js.map +3 -3
- package/dist/provider-ollama/runtime.browser.js +130 -8
- package/dist/provider-ollama/runtime.browser.js.map +8 -7
- package/dist/provider-ollama/runtime.js +125 -8
- package/dist/provider-ollama/runtime.js.map +8 -7
- package/dist/provider-openai/OpenAiProvider.d.ts +3 -2
- package/dist/provider-openai/OpenAiProvider.d.ts.map +1 -1
- package/dist/provider-openai/OpenAiQueuedProvider.d.ts +3 -2
- package/dist/provider-openai/OpenAiQueuedProvider.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_Client.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_JobRunFns.browser.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_JobRunFns.d.ts.map +1 -1
- package/dist/provider-openai/common/OpenAI_ToolCalling.d.ts +10 -0
- package/dist/provider-openai/common/OpenAI_ToolCalling.d.ts.map +1 -0
- package/dist/provider-openai/index.browser.js +3 -4
- package/dist/provider-openai/index.browser.js.map +3 -3
- package/dist/provider-openai/index.js +3 -4
- package/dist/provider-openai/index.js.map +3 -3
- package/dist/provider-openai/runtime.browser.js +138 -8
- package/dist/provider-openai/runtime.browser.js.map +8 -7
- package/dist/provider-openai/runtime.js +138 -8
- package/dist/provider-openai/runtime.js.map +8 -7
- package/dist/provider-tf-mediapipe/TensorFlowMediaPipeProvider.d.ts +2 -1
- package/dist/provider-tf-mediapipe/TensorFlowMediaPipeProvider.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/TensorFlowMediaPipeQueuedProvider.d.ts +2 -1
- package/dist/provider-tf-mediapipe/TensorFlowMediaPipeQueuedProvider.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/common/TFMP_Download.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/common/TFMP_ImageClassification.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/common/TFMP_Runtime.d.ts +1 -1
- package/dist/provider-tf-mediapipe/common/TFMP_Runtime.d.ts.map +1 -1
- package/dist/provider-tf-mediapipe/index.js.map +2 -2
- package/dist/provider-tf-mediapipe/runtime.js +2 -4
- package/dist/provider-tf-mediapipe/runtime.js.map +13 -13
- package/dist/test.d.ts +7 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +913 -0
- package/dist/test.js.map +10 -0
- package/package.json +24 -17
|
@@ -1,28 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/provider-llamacpp/common/LlamaCpp_Runtime.ts", "../src/common/PipelineTaskMapping.ts", "../src/common/HfModelSearch.ts", "../src/provider-llamacpp/common/LlamaCpp_Constants.ts", "../src/provider-llamacpp/common/LlamaCpp_ModelSearch.ts", "../src/provider-llamacpp/common/LlamaCpp_CountTokens.ts", "../src/provider-llamacpp/common/LlamaCpp_Download.ts", "../src/provider-llamacpp/common/LlamaCpp_ModelInfo.ts", "../src/provider-llamacpp/common/LlamaCpp_StructuredGeneration.ts", "../src/provider-llamacpp/common/LlamaCpp_TextEmbedding.ts", "../src/provider-llamacpp/common/LlamaCpp_TextGeneration.ts", "../src/provider-llamacpp/common/LlamaCpp_TextRewriter.ts", "../src/provider-llamacpp/common/LlamaCpp_TextSummary.ts", "../src/provider-llamacpp/common/LlamaCpp_Unload.ts", "../src/provider-llamacpp/common/LlamaCpp_JobRunFns.ts", "../src/provider-llamacpp/LlamaCppQueuedProvider.ts", "../src/provider-llamacpp/registerLlamaCppInline.ts", "../src/provider-llamacpp/registerLlamaCppWorker.ts", "../src/provider-llamacpp/LlamaCppProvider.ts"],
|
|
3
|
+
"sources": ["../src/provider-llamacpp/common/LlamaCpp_Runtime.ts", "../src/common/PipelineTaskMapping.ts", "../src/common/HfModelSearch.ts", "../src/provider-llamacpp/common/LlamaCpp_Constants.ts", "../src/provider-llamacpp/common/LlamaCpp_ModelSearch.ts", "../src/provider-llamacpp/common/LlamaCpp_CountTokens.ts", "../src/provider-llamacpp/common/LlamaCpp_Download.ts", "../src/provider-llamacpp/common/LlamaCpp_ModelInfo.ts", "../src/provider-llamacpp/common/LlamaCpp_StructuredGeneration.ts", "../src/provider-llamacpp/common/LlamaCpp_TextEmbedding.ts", "../src/provider-llamacpp/common/LlamaCpp_TextGeneration.ts", "../src/provider-llamacpp/common/LlamaCpp_TextRewriter.ts", "../src/provider-llamacpp/common/LlamaCpp_TextSummary.ts", "../src/provider-llamacpp/common/LlamaCpp_ToolCalling.ts", "../src/common/ToolCallParsers.ts", "../src/provider-llamacpp/common/LlamaCpp_ToolParser.ts", "../src/provider-llamacpp/common/LlamaCpp_Unload.ts", "../src/provider-llamacpp/common/LlamaCpp_JobRunFns.ts", "../src/provider-llamacpp/LlamaCppQueuedProvider.ts", "../src/provider-llamacpp/registerLlamaCppInline.ts", "../src/provider-llamacpp/registerLlamaCppWorker.ts", "../src/provider-llamacpp/LlamaCppProvider.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 { StreamEvent } from \"@workglow/task-graph\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport type { Llama as LlamaInstance } from \"node-llama-cpp\";\nimport type { LlamaModel, LlamaContext, LlamaEmbeddingContext } from \"node-llama-cpp\";\n\nlet _sdk: typeof import(\"node-llama-cpp\") | undefined;\n\nexport async function loadSdk() {\n if (!_sdk) {\n try {\n _sdk = await import(\"node-llama-cpp\");\n } catch {\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\nexport function getLlamaCppSdk() {\n if (!_sdk) {\n throw new Error(\"LlamaCpp SDK not loaded; call loadSdk() first\");\n }\n return _sdk;\n}\n\nlet llamaInstance: LlamaInstance | undefined;\n/** @internal Used by unload task */\nexport const llamaCppModels = new Map<string, LlamaModel>();\n/** @internal Used by unload task */\nexport const llamaCppTextContexts = new Map<string, LlamaContext>();\n/** @internal Used by unload task */\nexport const llamaCppEmbeddingContexts = new Map<string, LlamaEmbeddingContext>();\n\n/** Maps model_url (or model_path when used as URI) to the actual downloaded filesystem path. */\nexport const resolvedPaths = new Map<string, string>();\n\nexport async function getLlamaInstance(): Promise<LlamaInstance> {\n if (!llamaInstance) {\n const { getLlama } = await loadSdk();\n llamaInstance = await getLlama();\n }\n return llamaInstance;\n}\n\nexport function getConfigKey(model: LlamaCppModelConfig): string {\n return model.provider_config.model_url ?? model.provider_config.model_path;\n}\n\nexport function 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\nexport async function getOrLoadModel(model: LlamaCppModelConfig): Promise<LlamaModel> {\n const modelPath = getActualModelPath(model);\n const cached = llamaCppModels.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 llamaCppModels.set(modelPath, loadedModel);\n return loadedModel;\n}\n\n/** Spread into `LlamaChatSession.prompt` options when `provider_config.seed` is set. */\nexport function llamaCppSeedPromptSpread(\n provider_config: LlamaCppModelConfig[\"provider_config\"]\n): { seed: number } | Record<string, never> {\n return provider_config.seed !== undefined ? { seed: provider_config.seed } : {};\n}\n\nfunction detectQwenChatWrapperVariation(model: LlamaCppModelConfig): \"3\" | \"3.5\" | undefined {\n const candidates = [\n model.model_id,\n model.title,\n model.description,\n model.provider_config.model_url,\n model.provider_config.model_path,\n ]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .map((value) => value.toLowerCase());\n\n if (\n candidates.some((value) =>\n /\\bqwen(?:[\\s._-]?|)3(?:[\\s._-]?|)5\\b|\\bqwen(?:[\\s._-]?|)3\\.5\\b/.test(value)\n )\n ) {\n return \"3.5\";\n }\n\n if (candidates.some((value) => /\\bqwen(?:[\\s._-]?|)3\\b/.test(value))) {\n return \"3\";\n }\n\n return undefined;\n}\n\n/** Spread into {@link LlamaChatSession} constructor when Qwen wrapper variation can be inferred. */\nexport function llamaCppChatSessionConstructorSpread(model: LlamaCppModelConfig) {\n const variation = detectQwenChatWrapperVariation(model);\n if (!variation) {\n return {};\n }\n const { QwenChatWrapper } = getLlamaCppSdk();\n return { chatWrapper: new QwenChatWrapper({ variation }) };\n}\n\nexport async function getOrCreateTextContext(model: LlamaCppModelConfig): Promise<LlamaContext> {\n const modelPath = getActualModelPath(model);\n const cached = llamaCppTextContexts.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 llamaCppTextContexts.set(modelPath, context);\n return context;\n}\n\nexport async function getOrCreateEmbeddingContext(\n model: LlamaCppModelConfig\n): Promise<LlamaEmbeddingContext> {\n const modelPath = getActualModelPath(model);\n const cached = llamaCppEmbeddingContexts.get(modelPath);\n if (cached) return cached;\n\n const loadedModel = await getOrLoadModel(model);\n\n const context = await loadedModel.createEmbeddingContext();\n\n llamaCppEmbeddingContexts.set(modelPath, context);\n return context;\n}\n\nexport async 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 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\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(llamaCppTextContexts as Map<string, { dispose(): Promise<void> }>);\n await disposeAll(llamaCppEmbeddingContexts as Map<string, { dispose(): Promise<void> }>);\n await disposeAll(llamaCppModels as Map<string, { dispose(): Promise<void> }>);\n\n if (llamaInstance) {\n await
|
|
5
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport type { Llama as LlamaInstance } from \"node-llama-cpp\";\nimport type { LlamaModel, LlamaContext, LlamaEmbeddingContext } from \"node-llama-cpp\";\n\nlet _sdk: typeof import(\"node-llama-cpp\") | undefined;\n\nexport async function loadSdk() {\n if (!_sdk) {\n try {\n _sdk = await import(\"node-llama-cpp\");\n } catch {\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\nexport function getLlamaCppSdk() {\n if (!_sdk) {\n throw new Error(\"LlamaCpp SDK not loaded; call loadSdk() first\");\n }\n return _sdk;\n}\n\nlet llamaInstance: LlamaInstance | undefined;\n/** @internal Used by unload task */\nexport const llamaCppModels = new Map<string, LlamaModel>();\n/** @internal Used by unload task */\nexport const llamaCppTextContexts = new Map<string, LlamaContext>();\n/** @internal Used by unload task */\nexport const llamaCppEmbeddingContexts = new Map<string, LlamaEmbeddingContext>();\n\n/** Maps model_url (or model_path when used as URI) to the actual downloaded filesystem path. */\nexport const resolvedPaths = new Map<string, string>();\n\nexport async function getLlamaInstance(): Promise<LlamaInstance> {\n if (!llamaInstance) {\n const { getLlama } = await loadSdk();\n llamaInstance = await getLlama();\n }\n return llamaInstance;\n}\n\nexport function getConfigKey(model: LlamaCppModelConfig): string {\n return model.provider_config.model_url ?? model.provider_config.model_path;\n}\n\nexport function 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\nexport async function getOrLoadModel(model: LlamaCppModelConfig): Promise<LlamaModel> {\n const modelPath = getActualModelPath(model);\n const cached = llamaCppModels.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 llamaCppModels.set(modelPath, loadedModel);\n return loadedModel;\n}\n\n/** Spread into `LlamaChatSession.prompt` options when `provider_config.seed` is set. */\nexport function llamaCppSeedPromptSpread(\n provider_config: LlamaCppModelConfig[\"provider_config\"]\n): { seed: number } | Record<string, never> {\n return provider_config.seed !== undefined ? { seed: provider_config.seed } : {};\n}\n\nfunction detectQwenChatWrapperVariation(model: LlamaCppModelConfig): \"3\" | \"3.5\" | undefined {\n const candidates = [\n model.model_id,\n model.title,\n model.description,\n model.provider_config.model_url,\n model.provider_config.model_path,\n ]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .map((value) => value.toLowerCase());\n\n if (\n candidates.some((value) =>\n /\\bqwen(?:[\\s._-]?|)3(?:[\\s._-]?|)5\\b|\\bqwen(?:[\\s._-]?|)3\\.5\\b/.test(value)\n )\n ) {\n return \"3.5\";\n }\n\n if (candidates.some((value) => /\\bqwen(?:[\\s._-]?|)3\\b/.test(value))) {\n return \"3\";\n }\n\n return undefined;\n}\n\n/** Spread into {@link LlamaChatSession} constructor when Qwen wrapper variation can be inferred. */\nexport function llamaCppChatSessionConstructorSpread(model: LlamaCppModelConfig) {\n const variation = detectQwenChatWrapperVariation(model);\n if (!variation) {\n return {};\n }\n const { QwenChatWrapper } = getLlamaCppSdk();\n return { chatWrapper: new QwenChatWrapper({ variation }) };\n}\n\nexport async function getOrCreateTextContext(model: LlamaCppModelConfig): Promise<LlamaContext> {\n const modelPath = getActualModelPath(model);\n const cached = llamaCppTextContexts.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 llamaCppTextContexts.set(modelPath, context);\n return context;\n}\n\nexport async function getOrCreateEmbeddingContext(\n model: LlamaCppModelConfig\n): Promise<LlamaEmbeddingContext> {\n const modelPath = getActualModelPath(model);\n const cached = llamaCppEmbeddingContexts.get(modelPath);\n if (cached) return cached;\n\n const loadedModel = await getOrLoadModel(model);\n\n const context = await loadedModel.createEmbeddingContext();\n\n llamaCppEmbeddingContexts.set(modelPath, context);\n return context;\n}\n\nexport async 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 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\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(llamaCppTextContexts as Map<string, { dispose(): Promise<void> }>);\n await disposeAll(llamaCppEmbeddingContexts as Map<string, { dispose(): Promise<void> }>);\n await disposeAll(llamaCppModels as Map<string, { dispose(): Promise<void> }>);\n\n if (llamaInstance) {\n await llamaInstance.dispose?.().catch(() => {});\n llamaInstance = undefined;\n }\n\n resolvedPaths.clear();\n}\n",
|
|
6
6
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Mapping from app task types to HuggingFace pipeline names.\n * Each task type maps to one or more pipelines (first is primary).\n */\nconst TASK_TO_PIPELINES: Record<string, string[]> = {\n TextEmbeddingTask: [\"feature-extraction\"],\n TextGenerationTask: [\"text-generation\"],\n TextSummaryTask: [\"sentence-similarity\", \"summarization\"],\n TextTranslationTask: [\"translation\"],\n TextClassificationTask: [\"text-classification\", \"zero-shot-classification\"],\n TextQuestionAnswerTask: [\"question-answering\"],\n TextFillMaskTask: [\"fill-mask\"],\n TextLanguageDetectionTask: [\"text-classification\"],\n TextNamedEntityRecognitionTask: [\"token-classification\"],\n TokenClassificationTask: [\"token-classification\"],\n ImageClassificationTask: [\"image-classification\", \"zero-shot-image-classification\"],\n ImageEmbeddingTask: [\"image-feature-extraction\"],\n ImageSegmentationTask: [\"image-segmentation\"],\n ImageToImageTask: [\"image-to-image\"],\n ImageToTextTask: [\"image-to-text\"],\n ObjectDetectionTask: [\"object-detection\", \"zero-shot-object-detection\"],\n DepthEstimationTask: [\"depth-estimation\"],\n AudioClassificationTask: [\"audio-classification\"],\n SpeechRecognitionTask: [\"automatic-speech-recognition\"],\n};\n\n/** Convert an app task type to its primary HuggingFace pipeline name. */\nexport function taskTypeToPipeline(taskType: string): string | undefined {\n return TASK_TO_PIPELINES[taskType]?.[0];\n}\n\n/** Convert an app task type to all matching HuggingFace pipeline names. */\nexport function taskTypeToPipelines(taskType: string): string[] {\n return TASK_TO_PIPELINES[taskType] ?? [];\n}\n\n/** Reverse lookup: given a HuggingFace pipeline name, return all matching app task types. */\nexport function pipelineToTaskTypes(pipeline: string): string[] {\n return Object.entries(TASK_TO_PIPELINES)\n .filter(([, pipelines]) => pipelines.includes(pipeline))\n .map(([task]) => task);\n}\n",
|
|
7
7
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ModelSearchResultItem } from \"@workglow/ai\";\nimport { pipelineToTaskTypes } from \"./PipelineTaskMapping\";\n\nexport interface HfModelEntry {\n id: string;\n modelId: string;\n pipeline_tag?: string;\n library_name?: string;\n likes: number;\n downloads: number;\n tags?: string[];\n siblings?: Array<{ rfilename: string }>;\n}\n\nconst HF_API_BASE = \"https://huggingface.co/api\";\n\nexport function formatDownloads(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;\n return String(n);\n}\n\n/**\n * Map an HF model entry to a provider-specific config object.\n */\nexport function mapHfProviderConfig(\n entry: HfModelEntry,\n provider: string\n): Record<string, unknown> {\n switch (provider) {\n case \"HF_TRANSFORMERS_ONNX\":\n return {\n model_path: entry.id,\n ...(entry.pipeline_tag ? { pipeline: entry.pipeline_tag } : {}),\n };\n case \"LOCAL_LLAMACPP\":\n return { model_path: entry.id };\n default:\n return { model_name: entry.id };\n }\n}\n\n/**\n * Map an HF model entry to a ModelSearchResultItem.\n */\nexport function mapHfModelResult(entry: HfModelEntry, provider: string): ModelSearchResultItem {\n const badges = [entry.pipeline_tag, entry.library_name].filter(Boolean).join(\" | \");\n return {\n id: entry.id,\n label: `${entry.id}${badges ? ` ${badges}` : \"\"}`,\n description: `${formatDownloads(entry.downloads)} downloads`,\n record: {\n model_id: entry.id,\n provider,\n title: entry.id.split(\"/\").pop() ?? entry.id,\n description: [entry.pipeline_tag, `${formatDownloads(entry.downloads)} downloads`]\n .filter(Boolean)\n .join(\" \\u2014 \"),\n tasks: entry.pipeline_tag ? pipelineToTaskTypes(entry.pipeline_tag) : [],\n provider_config: mapHfProviderConfig(entry, provider),\n metadata: {},\n },\n raw: entry,\n };\n}\n\n/**\n * Search HuggingFace models API. Returns all results (limit=500, no pagination).\n * An empty `query` lists top models by sort order (no text filter).\n */\nexport async function searchHfModels(\n query: string,\n extraParams?: Record<string, string>,\n expandFields?: string[],\n signal?: AbortSignal\n): Promise<HfModelEntry[]> {\n const params = new URLSearchParams({\n search: query,\n limit: \"500\",\n sort: \"downloads\",\n direction: \"-1\",\n ...extraParams,\n });\n params.append(\"expand[]\", \"pipeline_tag\");\n if (expandFields) {\n for (const field of expandFields) {\n params.append(\"expand[]\", field);\n }\n }\n const res = await fetch(`${HF_API_BASE}/models?${params}`, { signal });\n if (!res.ok) throw new Error(`HuggingFace API returned ${res.status}`);\n return res.json();\n}\n",
|
|
8
8
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const LOCAL_LLAMACPP = \"LOCAL_LLAMACPP\";\nexport const LLAMACPP_DEFAULT_MODELS_DIR = \"./models\";\n",
|
|
9
9
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFn, ModelSearchTaskInput, ModelSearchTaskOutput } from \"@workglow/ai\";\nimport { searchHfModels, mapHfModelResult } from \"../../common/HfModelSearch\";\nimport { LOCAL_LLAMACPP } from \"./LlamaCpp_Constants\";\n\nexport const LlamaCpp_ModelSearch: AiProviderRunFn<\n ModelSearchTaskInput,\n ModelSearchTaskOutput\n> = async (input, _model, _onProgress, signal) => {\n const entries = await searchHfModels(\n input.query?.trim() ?? \"\",\n { filter: \"gguf\" },\n undefined,\n signal\n );\n const results = entries.map((entry) => mapHfModelResult(entry, LOCAL_LLAMACPP));\n return { results };\n};\n",
|
|
10
10
|
"/**\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 CountTokensTaskInput,\n CountTokensTaskOutput,\n} from \"@workglow/ai\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport { getOrLoadModel } from \"./LlamaCpp_Runtime\";\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 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",
|
|
11
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n DownloadModelTaskRunInput,\n DownloadModelTaskRunOutput,\n} from \"@workglow/ai\";\nimport { LLAMACPP_DEFAULT_MODELS_DIR } from \"./LlamaCpp_Constants\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport { getConfigKey, loadSdk, resolvedPaths } from \"./LlamaCpp_Runtime\";\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 const progressInterval = setInterval(() => {\n const total =
|
|
11
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n DownloadModelTaskRunInput,\n DownloadModelTaskRunOutput,\n} from \"@workglow/ai\";\nimport { LLAMACPP_DEFAULT_MODELS_DIR } from \"./LlamaCpp_Constants\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport { getConfigKey, loadSdk, resolvedPaths } from \"./LlamaCpp_Runtime\";\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 const progressInterval = setInterval(() => {\n const total = downloader.totalSize;\n const downloaded = downloader.downloadedSize;\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 });\n }\n }, 500);\n\n let modelPath: string;\n try {\n modelPath = await downloader.download();\n } finally {\n clearInterval(progressInterval);\n }\n\n resolvedPaths.set(getConfigKey(model), modelPath);\n\n update_progress(100, \"Model downloaded\", { file: modelUri, progress: 100 });\n\n return { model: input.model! };\n};\n",
|
|
12
12
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRunFn, ModelInfoTaskInput, ModelInfoTaskOutput } from \"@workglow/ai\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport {\n getActualModelPath,\n getConfigKey,\n llamaCppModels,\n resolvedPaths,\n} from \"./LlamaCpp_Runtime\";\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 = llamaCppModels.has(modelPath);\n\n let is_cached = is_loaded;\n let file_sizes: Record<string, number> | null = null;\n\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 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",
|
|
13
13
|
"/**\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 StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport { parsePartialJson } from \"@workglow/util/worker\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport {\n getLlamaCppSdk,\n getLlamaInstance,\n getOrCreateTextContext,\n llamaCppChatSessionConstructorSpread,\n llamaCppSeedPromptSpread,\n loadSdk,\n} from \"./LlamaCpp_Runtime\";\n\nexport const LlamaCpp_StructuredGeneration: AiProviderRunFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n LlamaCppModelConfig\n> = async (input, model, update_progress, signal) => {\n if (!model) throw new Error(\"Model config is required for StructuredGenerationTask.\");\n\n await loadSdk();\n\n update_progress(0, \"Loading model\");\n const llama = await getLlamaInstance();\n const context = await getOrCreateTextContext(model);\n\n update_progress(10, \"Running structured generation\");\n const grammar = await llama.createGrammarForJsonSchema(input.outputSchema as any);\n const sequence = context.getSequence();\n const { LlamaChatSession } = getLlamaCppSdk();\n const session = new LlamaChatSession({\n contextSequence: sequence,\n ...llamaCppChatSessionConstructorSpread(model),\n });\n\n try {\n const text = await session.prompt(input.prompt as string, {\n signal,\n grammar,\n ...llamaCppSeedPromptSpread(model.provider_config),\n ...(input.temperature !== undefined && { temperature: input.temperature }),\n ...(input.maxTokens !== undefined && { maxTokens: input.maxTokens }),\n });\n\n let object: Record<string, unknown>;\n try {\n object = JSON.parse(text);\n } catch {\n object = {};\n }\n\n update_progress(100, \"Structured generation complete\");\n return { object };\n } finally {\n session.dispose({ disposeSequence: false });\n sequence.dispose();\n }\n};\n\nexport const LlamaCpp_StructuredGeneration_Stream: AiProviderStreamFn<\n StructuredGenerationTaskInput,\n StructuredGenerationTaskOutput,\n LlamaCppModelConfig\n> = async function* (\n input,\n model,\n signal\n): AsyncIterable<StreamEvent<StructuredGenerationTaskOutput>> {\n if (!model) throw new Error(\"Model config is required for StructuredGenerationTask.\");\n\n await loadSdk();\n\n const llama = await getLlamaInstance();\n const context = await getOrCreateTextContext(model);\n const grammar = await llama.createGrammarForJsonSchema(input.outputSchema as any);\n\n const sequence = context.getSequence();\n const { LlamaChatSession } = getLlamaCppSdk();\n const session = new LlamaChatSession({\n contextSequence: sequence,\n ...llamaCppChatSessionConstructorSpread(model),\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 grammar,\n ...llamaCppSeedPromptSpread(model.provider_config),\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 const partial = parsePartialJson(accumulatedText);\n if (partial !== undefined) {\n yield {\n type: \"object-delta\",\n port: \"object\",\n objectDelta: partial as Record<string, unknown>,\n };\n }\n }\n if (isComplete) break;\n await new Promise<void>((r) => {\n resolveWait = r;\n });\n }\n while (queue.length > 0) {\n const chunk = queue.shift()!;\n accumulatedText += chunk;\n }\n } finally {\n await promptPromise.catch(() => {});\n session.dispose({ disposeSequence: false });\n sequence.dispose();\n }\n\n if (completionError) {\n if (signal.aborted) return;\n throw completionError;\n }\n\n let finalObject: Record<string, unknown>;\n try {\n finalObject = JSON.parse(accumulatedText);\n } catch {\n finalObject = (parsePartialJson(accumulatedText) as Record<string, unknown>) ?? {};\n }\n\n yield { type: \"finish\", data: { object: finalObject } as StructuredGenerationTaskOutput };\n};\n",
|
|
14
14
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n TextEmbeddingTaskInput,\n TextEmbeddingTaskOutput,\n} from \"@workglow/ai\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport { getOrCreateEmbeddingContext } from \"./LlamaCpp_Runtime\";\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",
|
|
15
15
|
"/**\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 TextGenerationTaskInput,\n TextGenerationTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport {\n getOrCreateTextContext,\n llamaCppChatSessionConstructorSpread,\n llamaCppSeedPromptSpread,\n loadSdk,\n streamFromSession,\n} from \"./LlamaCpp_Runtime\";\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({\n contextSequence: sequence,\n ...llamaCppChatSessionConstructorSpread(model),\n });\n try {\n const text = await session.prompt(input.prompt, {\n signal,\n ...llamaCppSeedPromptSpread(model.provider_config),\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 session.dispose({ disposeSequence: false });\n sequence.dispose();\n }\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({\n contextSequence: sequence,\n ...llamaCppChatSessionConstructorSpread(model),\n });\n try {\n yield* streamFromSession<TextGenerationTaskOutput>((onTextChunk) => {\n return session.prompt(input.prompt, {\n signal,\n onTextChunk,\n ...llamaCppSeedPromptSpread(model.provider_config),\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 session.dispose({ disposeSequence: false });\n sequence.dispose();\n }\n};\n",
|
|
16
16
|
"/**\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 TextRewriterTaskInput,\n TextRewriterTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport {\n getOrCreateTextContext,\n llamaCppChatSessionConstructorSpread,\n llamaCppSeedPromptSpread,\n loadSdk,\n streamFromSession,\n} from \"./LlamaCpp_Runtime\";\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({\n contextSequence: sequence,\n ...llamaCppChatSessionConstructorSpread(model),\n systemPrompt: input.prompt,\n });\n try {\n const text = await session.prompt(input.text, {\n signal,\n ...llamaCppSeedPromptSpread(model.provider_config),\n });\n update_progress(100, \"Text rewriting complete\");\n return { text };\n } finally {\n session.dispose({ disposeSequence: false });\n sequence.dispose();\n }\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({\n contextSequence: sequence,\n ...llamaCppChatSessionConstructorSpread(model),\n systemPrompt: input.prompt,\n });\n try {\n yield* streamFromSession<TextRewriterTaskOutput>((onTextChunk) => {\n return session.prompt(input.text, {\n signal,\n onTextChunk,\n ...llamaCppSeedPromptSpread(model.provider_config),\n });\n }, signal);\n } finally {\n session.dispose({ disposeSequence: false });\n sequence.dispose();\n }\n};\n",
|
|
17
17
|
"/**\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 TextSummaryTaskInput,\n TextSummaryTaskOutput,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport {\n getOrCreateTextContext,\n llamaCppChatSessionConstructorSpread,\n llamaCppSeedPromptSpread,\n loadSdk,\n streamFromSession,\n} from \"./LlamaCpp_Runtime\";\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 ...llamaCppChatSessionConstructorSpread(model),\n systemPrompt: \"Summarize the following text concisely, preserving the key points.\",\n });\n try {\n const text = await session.prompt(input.text, {\n signal,\n ...llamaCppSeedPromptSpread(model.provider_config),\n });\n update_progress(100, \"Summarization complete\");\n return { text };\n } finally {\n session.dispose({ disposeSequence: false });\n sequence.dispose();\n }\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 ...llamaCppChatSessionConstructorSpread(model),\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, {\n signal,\n onTextChunk,\n ...llamaCppSeedPromptSpread(model.provider_config),\n });\n }, signal);\n } finally {\n session.dispose({ disposeSequence: false });\n sequence.dispose();\n }\n};\n",
|
|
18
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { filterValidToolCalls } from \"@workglow/ai/worker\";\nimport type {\n AiProviderRunFn,\n AiProviderStreamFn,\n ToolCallingTaskInput,\n ToolCallingTaskOutput,\n ToolCalls,\n ToolDefinition,\n} from \"@workglow/ai\";\nimport type { StreamEvent } from \"@workglow/task-graph\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport {\n buildRawCompletionPrompt,\n extractToolCallsFromText,\n supportsNativeFunctions,\n toolChoiceForcesToolCall,\n truncateAtTurnBoundary,\n} from \"./LlamaCpp_ToolParser\";\nimport {\n getLlamaCppSdk,\n getOrCreateTextContext,\n llamaCppChatSessionConstructorSpread,\n llamaCppSeedPromptSpread,\n loadSdk,\n} from \"./LlamaCpp_Runtime\";\nimport { getLogger } from \"@workglow/util/worker\";\n\n// ============================================================================\n// System prompt\n// ============================================================================\n\nfunction buildSystemPrompt(input: ToolCallingTaskInput): string | undefined {\n const base = input.systemPrompt;\n if (input.toolChoice === \"required\") {\n const instruction =\n \"You must call at least one tool from the provided tool list when answering.\";\n return base ? `${base}\\n\\n${instruction}` : instruction;\n }\n return base || undefined;\n}\n\n// ============================================================================\n// Message → ChatHistoryItem[] conversion\n// ============================================================================\n\nfunction extractTextFromContent(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return String(content ?? \"\");\n return content\n .filter((block: any) => block?.type === \"text\")\n .map((block: any) => String(block.text ?? \"\"))\n .join(\"\");\n}\n\n/**\n * Convert workglow messages to node-llama-cpp's `ChatHistoryItem[]`.\n *\n * Key difference from OpenAI/Anthropic format: tool results are NOT separate\n * history items. They get merged into the preceding `model` response's\n * `ChatModelFunctionCall.result` fields, matched by `tool_use_id`.\n */\nfunction convertMessagesToChatHistory(\n messages: ToolCallingTaskInput[\"messages\"],\n prompt: string | undefined,\n systemPrompt: string | undefined\n): any[] {\n const history: any[] = [];\n\n if (systemPrompt) {\n history.push({ type: \"system\", text: systemPrompt });\n }\n\n if (!messages || messages.length === 0) {\n const promptText = typeof prompt === \"string\" ? prompt : String(prompt ?? \"\");\n history.push({ type: \"user\", text: promptText });\n return history;\n }\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n const text = extractTextFromContent(msg.content);\n history.push({ type: \"user\", text });\n continue;\n }\n\n if (msg.role === \"assistant\" && Array.isArray(msg.content)) {\n const response: any[] = [];\n\n for (const block of msg.content as any[]) {\n if (block.type === \"text\" && block.text) {\n response.push(block.text);\n } else if (block.type === \"tool_use\") {\n // Create functionCall entry — result will be filled by subsequent tool message\n response.push({\n type: \"functionCall\",\n name: block.name,\n description: undefined,\n params: block.input ?? {},\n result: undefined,\n // Tag with id so we can match tool results below\n _toolUseId: block.id,\n });\n }\n }\n\n history.push({ type: \"model\", response });\n continue;\n }\n\n if (msg.role === \"tool\" && Array.isArray(msg.content)) {\n // Find the most recent \"model\" response to merge results into\n let lastModel: any | undefined;\n for (let i = history.length - 1; i >= 0; i--) {\n if (history[i].type === \"model\") {\n lastModel = history[i];\n break;\n }\n }\n if (!lastModel) continue;\n\n for (const block of msg.content as any[]) {\n const toolUseId = block.tool_use_id;\n if (!toolUseId) continue;\n\n // Find the matching functionCall in the model response\n const fnCall = lastModel.response.find(\n (item: any) =>\n typeof item === \"object\" &&\n item !== null &&\n item.type === \"functionCall\" &&\n item._toolUseId === toolUseId &&\n item.result === undefined\n );\n if (fnCall) {\n fnCall.result =\n typeof block.content === \"string\" ? block.content : JSON.stringify(block.content);\n }\n }\n continue;\n }\n }\n\n // Clean up the temporary _toolUseId tags from functionCall objects\n for (const item of history) {\n if (item.type === \"model\" && Array.isArray(item.response)) {\n for (const entry of item.response) {\n if (typeof entry === \"object\" && entry !== null && \"_toolUseId\" in entry) {\n delete entry._toolUseId;\n }\n }\n }\n }\n\n return history;\n}\n\n// ============================================================================\n// ChatModelFunctions builder (schema only, no handlers)\n// ============================================================================\n\nfunction buildChatModelFunctions(\n tools: ReadonlyArray<ToolDefinition>\n): Record<string, { description?: string; params?: any }> {\n const functions: Record<string, { description?: string; params?: any }> = {};\n for (const tool of tools) {\n functions[tool.name] = {\n ...(tool.description && { description: tool.description }),\n ...(tool.inputSchema && { params: tool.inputSchema }),\n };\n }\n return functions;\n}\n\n// ============================================================================\n// Prompt options\n// ============================================================================\n\n/**\n * Sampling options for {@link LlamaCompletion.generateCompletion} (FunctionGemma raw path).\n * Includes `responsePrefix` which is only supported on the raw completion path.\n */\nfunction llamaCppRawCompletionOptions(\n input: ToolCallingTaskInput,\n model: LlamaCppModelConfig\n): Record<string, unknown> {\n const opts: Record<string, unknown> = {\n ...llamaCppSeedPromptSpread(model.provider_config),\n };\n if (input.maxTokens !== undefined) {\n opts.maxTokens = input.maxTokens;\n }\n if (input.temperature !== undefined) {\n opts.temperature = input.temperature;\n } else if (toolChoiceForcesToolCall(input.toolChoice)) {\n opts.temperature = 0.2;\n }\n return opts;\n}\n\n/**\n * Sampling options for {@link LlamaChat.generateResponse}.\n * Does NOT include `responsePrefix` (not supported by LlamaChat).\n */\nfunction llamaCppChatGenerateOptions(\n input: ToolCallingTaskInput,\n model: LlamaCppModelConfig\n): Record<string, unknown> {\n const opts: Record<string, unknown> = {\n ...llamaCppSeedPromptSpread(model.provider_config),\n };\n if (input.maxTokens !== undefined) {\n opts.maxTokens = input.maxTokens;\n }\n if (input.temperature !== undefined) {\n opts.temperature = input.temperature;\n } else if (toolChoiceForcesToolCall(input.toolChoice)) {\n opts.temperature = 0.2;\n }\n return opts;\n}\n\n// ============================================================================\n// Extract tool calls from LlamaChat response\n// ============================================================================\n\nfunction extractNativeFunctionCalls(\n functionCalls: ReadonlyArray<{ functionName: string; params: any }> | undefined\n): ToolCalls {\n if (!functionCalls || functionCalls.length === 0) return [];\n return functionCalls.map((fc, index) => ({\n id: `call_${index}`,\n name: fc.functionName,\n input: (fc.params ?? {}) as Record<string, unknown>,\n }));\n}\n\n// ============================================================================\n// Non-streaming run function\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 update_progress(10, \"Running tool calling\");\n const sequence = context.getSequence();\n const { LlamaChat, LlamaCompletion } = getLlamaCppSdk();\n const systemPrompt = buildSystemPrompt(input);\n\n // ---- FunctionGemma raw completion path (unchanged) ----\n const rawPrompt = buildRawCompletionPrompt(input, model, systemPrompt);\n\n getLogger().debug(\"LlamaCpp_ToolCalling\", { rawPrompt, systemPrompt });\n\n if (rawPrompt !== undefined) {\n const completion = new LlamaCompletion({ contextSequence: sequence });\n try {\n const rawText = await completion.generateCompletion(rawPrompt, {\n signal,\n ...llamaCppRawCompletionOptions(input, model),\n });\n\n const text = truncateAtTurnBoundary(rawText);\n getLogger().debug(\"LlamaCpp_ToolCalling LlamaCompletion\", { rawText, text });\n const toolCalls = filterValidToolCalls(\n extractToolCallsFromText(text, input, model),\n input.tools\n );\n getLogger().debug(\"LlamaCpp_ToolCalling LlamaCompletion\", { toolCalls });\n update_progress(100, \"Tool calling complete\");\n return { text, toolCalls };\n } finally {\n completion.dispose({ disposeSequence: false });\n sequence.dispose();\n }\n }\n\n // ---- Native function calling path via LlamaChat ----\n const llamaChat = new LlamaChat({\n contextSequence: sequence,\n ...llamaCppChatSessionConstructorSpread(model),\n });\n\n const promptText =\n typeof input.prompt === \"string\" ? input.prompt : extractTextFromContent(input.prompt);\n const chatHistory = convertMessagesToChatHistory(input.messages, promptText, systemPrompt);\n const functions = supportsNativeFunctions(input, model)\n ? buildChatModelFunctions(input.tools)\n : undefined;\n\n getLogger().debug(\"LlamaCpp_ToolCalling LlamaChat\", { chatHistory, functions });\n\n try {\n const res = await llamaChat.generateResponse(chatHistory, {\n signal,\n ...llamaCppChatGenerateOptions(input, model),\n ...(functions && {\n functions,\n ...(toolChoiceForcesToolCall(input.toolChoice) && { documentFunctionParams: true }),\n }),\n });\n\n const text = res.response;\n const toolCalls = extractNativeFunctionCalls(res.functionCalls);\n\n // Fallback: parse tool calls from text if native parsing found nothing\n if (toolCalls.length === 0 && input.tools.length > 0 && input.toolChoice !== \"none\") {\n toolCalls.push(...extractToolCallsFromText(text, input, model));\n }\n\n update_progress(100, \"Tool calling complete\");\n return { text, toolCalls: filterValidToolCalls(toolCalls, input.tools) };\n } finally {\n llamaChat.dispose({ disposeSequence: false });\n sequence.dispose();\n }\n};\n\n// ============================================================================\n// Shared streaming helper\n// ============================================================================\n\n/**\n * Drives an async generation call that pushes text chunks via `onTextChunk`,\n * yielding `text-delta` events as they arrive. Returns accumulated text and\n * the generation result (if any) once complete.\n *\n * Both the raw-completion and LlamaChat streaming paths delegate here via\n * `yield*` to avoid duplicating the queue / notification / drain loop.\n */\nasync function* streamTextChunks<T>(\n startGeneration: (onTextChunk: (chunk: string) => void) => Promise<T>,\n signal: AbortSignal,\n cleanup: () => void\n): AsyncGenerator<StreamEvent<ToolCallingTaskOutput>, { text: string; result: T | undefined }> {\n const queue: string[] = [];\n let isComplete = false;\n let completionError: unknown;\n let resolveWait: (() => void) | null = null;\n let accumulatedText = \"\";\n let result: T | undefined;\n\n const notifyWaiter = () => {\n resolveWait?.();\n resolveWait = null;\n };\n\n const generationPromise = startGeneration((chunk: string) => {\n queue.push(chunk);\n notifyWaiter();\n })\n .then((res) => {\n result = res;\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 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 generationPromise.catch(() => {});\n cleanup();\n }\n\n if (completionError) {\n throw completionError;\n }\n\n if (signal.aborted) {\n throw (signal as any).reason ?? new Error(\"The operation was aborted\");\n }\n return { text: accumulatedText, result };\n}\n\n// ============================================================================\n// Streaming run function\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 sequence = context.getSequence();\n const { LlamaChat, LlamaCompletion } = getLlamaCppSdk();\n const systemPrompt = buildSystemPrompt(input);\n\n // ---- FunctionGemma raw completion path ----\n const rawPrompt = buildRawCompletionPrompt(input, model, systemPrompt);\n\n if (rawPrompt !== undefined) {\n const completion = new LlamaCompletion({ contextSequence: sequence });\n\n const { text: rawText } = yield* streamTextChunks(\n (onTextChunk) =>\n completion.generateCompletion(rawPrompt, {\n signal,\n ...llamaCppRawCompletionOptions(input, model),\n onTextChunk,\n }),\n signal,\n () => {\n completion.dispose({ disposeSequence: false });\n sequence.dispose();\n }\n );\n\n const text = truncateAtTurnBoundary(rawText);\n const validToolCalls = filterValidToolCalls(\n extractToolCallsFromText(text, input, model),\n input.tools\n );\n\n if (validToolCalls.length > 0) {\n yield { type: \"object-delta\", port: \"toolCalls\", objectDelta: [...validToolCalls] };\n }\n\n yield {\n type: \"finish\",\n data: { text, toolCalls: validToolCalls } as ToolCallingTaskOutput,\n };\n return;\n }\n\n // ---- Native function calling path via LlamaChat ----\n const llamaChat = new LlamaChat({\n contextSequence: sequence,\n ...llamaCppChatSessionConstructorSpread(model),\n });\n\n const promptText =\n typeof input.prompt === \"string\" ? input.prompt : extractTextFromContent(input.prompt);\n const chatHistory = convertMessagesToChatHistory(input.messages, promptText, systemPrompt);\n const functions = supportsNativeFunctions(input, model)\n ? buildChatModelFunctions(input.tools)\n : undefined;\n\n const { text: accumulatedText, result: chatResponse } = yield* streamTextChunks(\n (onTextChunk) =>\n llamaChat.generateResponse(chatHistory, {\n signal,\n ...llamaCppChatGenerateOptions(input, model),\n ...(functions && {\n functions,\n ...(toolChoiceForcesToolCall(input.toolChoice) && { documentFunctionParams: true }),\n }),\n onTextChunk,\n }),\n signal,\n () => {\n llamaChat.dispose({ disposeSequence: false });\n sequence.dispose();\n }\n );\n\n const toolCalls = extractNativeFunctionCalls(chatResponse?.functionCalls);\n\n // Fallback: parse tool calls from text if native parsing found nothing\n if (toolCalls.length === 0 && input.tools.length > 0 && input.toolChoice !== \"none\") {\n toolCalls.push(...extractToolCallsFromText(accumulatedText, input, model));\n }\n const validToolCalls = filterValidToolCalls(toolCalls, input.tools);\n\n if (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",
|
|
19
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ToolCalls } from \"@workglow/ai\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ToolCall {\n readonly name: string;\n readonly arguments: Record<string, unknown>;\n readonly id: string | null;\n}\n\nexport interface ToolCallParserResult {\n readonly tool_calls: ReadonlyArray<ToolCall>;\n readonly content: string;\n readonly parser: string;\n}\n\nexport interface ParseToolCallsOptions {\n readonly tokenizer?: TokenizerLike | null;\n readonly model?: string | null;\n readonly parser?: string | null;\n}\n\n/**\n * Minimal tokenizer shape used for model-family detection.\n * Compatible with `PreTrainedTokenizer` from `@huggingface/transformers`.\n */\nexport interface TokenizerLike {\n readonly config?: {\n readonly name_or_path?: string;\n readonly _name_or_path?: string;\n readonly model_type?: string;\n };\n readonly name_or_path?: string;\n}\n\nexport type ParserFn = (text: string) => ToolCallParserResult | null;\n\n// ============================================================================\n// Text cleanup\n// ============================================================================\n\n/**\n * Strip thinking blocks (`<think>...</think>`) and HFT special tokens\n * (`<|im_end|>`, `<|end_of_turn|>`, etc.) from model output.\n * Used to clean up content text returned alongside tool calls.\n */\nexport function stripModelArtifacts(text: string): string {\n return text\n .replace(/<think>(?:[^<]|<(?!\\/think>))*<\\/think>/g, \"\")\n .replace(/<\\|[a-z_]+\\|>/g, \"\")\n .trim();\n}\n\n// ============================================================================\n// Shared helpers\n// ============================================================================\n\nexport function makeToolCall(\n name: string,\n args: Record<string, unknown>,\n id: string | null = null\n): ToolCall {\n return { name, arguments: args, id };\n}\n\nexport function tryParseJson(text: string): unknown | undefined {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Scan `source` for balanced blocks delimited by `openChar`/`closeChar`\n * (e.g. `{`/`}` or `[`/`]`). Correctly handles JSON string literals so\n * that braces inside strings are not counted.\n *\n * This is a ReDoS-safe alternative to regex patterns like `\\{[\\s\\S]*?\\}`.\n */\nfunction findBalancedBlocks(\n source: string,\n openChar: string,\n closeChar: string,\n startFrom: number = 0\n): Array<{ text: string; start: number; end: number }> {\n const results: Array<{ text: string; start: number; end: number }> = [];\n const length = source.length;\n let i = startFrom;\n while (i < length) {\n if (source[i] !== openChar) {\n i++;\n continue;\n }\n let depth = 1;\n let j = i + 1;\n let inString = false;\n let escape = false;\n while (j < length && depth > 0) {\n const ch = source[j];\n if (inString) {\n if (escape) {\n escape = false;\n } else if (ch === \"\\\\\") {\n escape = true;\n } else if (ch === '\"') {\n inString = false;\n }\n } else {\n if (ch === '\"') {\n inString = true;\n } else if (ch === openChar) {\n depth++;\n } else if (ch === closeChar) {\n depth--;\n }\n }\n j++;\n }\n if (depth === 0) {\n results.push({ text: source.slice(i, j), start: i, end: j });\n i = j;\n } else {\n break;\n }\n }\n return results;\n}\n\nexport function parseJsonToolCallArray(\n jsonStr: string,\n nameKey: string = \"name\",\n argsKeys: ReadonlyArray<string> = [\"arguments\", \"parameters\"]\n): ReadonlyArray<ToolCall> | undefined {\n const parsed = tryParseJson(jsonStr.trim());\n if (!parsed) return undefined;\n\n const arr = Array.isArray(parsed) ? parsed : [parsed];\n const calls = arr\n .filter(\n (c): c is Record<string, unknown> =>\n !!c && typeof c === \"object\" && !!(c as Record<string, unknown>)[nameKey]\n )\n .map((c) => {\n const args = argsKeys.reduce<Record<string, unknown> | undefined>(\n (found, key) => found ?? (c[key] as Record<string, unknown> | undefined),\n undefined\n );\n return makeToolCall(c[nameKey] as string, args ?? {}, (c.id as string | null) ?? null);\n });\n\n return calls.length > 0 ? calls : undefined;\n}\n\n/**\n * Parse key=value argument syntax used by Gorilla, NexusRaven, and Gemma.\n * Handles quoted strings (`\"val\"`, `'val'`) and bare values.\n */\nexport function parseKeyValueArgs(argsStr: string): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n if (!argsStr) return args;\n\n const argRegex = /(?<!\\w)(\\w+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s,]+))/g;\n let match: RegExpExecArray | null;\n while ((match = argRegex.exec(argsStr)) !== null) {\n const key = match[1];\n const value = match[2] ?? match[3] ?? match[4];\n args[key] = coerceArgValue(value);\n }\n return args;\n}\n\nexport function coerceArgValue(value: string): unknown {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value !== \"\" && !isNaN(Number(value))) return Number(value);\n return value;\n}\n\n/**\n * Richer value coercion for FunctionGemma-style arguments.\n * Superset of {@link coerceArgValue}: also handles JSON-quoted strings,\n * objects, and arrays.\n */\nexport function parseFunctionGemmaArgumentValue(rawValue: string): unknown {\n const trimmed = rawValue.trim();\n if (trimmed.length === 0) return \"\";\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\") return null;\n\n const numeric = Number(trimmed);\n if (!Number.isNaN(numeric) && /^-?\\d+(?:\\.\\d+)?$/.test(trimmed)) {\n return numeric;\n }\n\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n ) {\n try {\n return JSON.parse(trimmed);\n } catch {\n // Fall through to raw string.\n }\n }\n\n return trimmed;\n}\n\n/**\n * Parse a loose `{key: value, ...}` object that may not be valid JSON.\n * Used as a FunctionGemma fallback when models emit partial syntax.\n */\nexport function parseFunctionGemmaLooseObject(text: string): Record<string, unknown> | undefined {\n const trimmed = text.trim();\n if (!trimmed.startsWith(\"{\") || !trimmed.endsWith(\"}\")) {\n return undefined;\n }\n\n const inner = trimmed.slice(1, -1).trim();\n if (inner.length === 0) {\n return {};\n }\n\n const result: Record<string, unknown> = {};\n const pairs = inner.matchAll(/([A-Za-z0-9_]+)\\s*:\\s*('[^']*'|\"[^\"]*\"|[^,}]+)/g);\n\n for (const [_, rawKey, rawValue] of pairs) {\n const key = rawKey.trim();\n const valueText = rawValue.trim().replace(/^'([^']*)'$/, '\"$1\"');\n result[key] = parseFunctionGemmaArgumentValue(valueText);\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n// ============================================================================\n// Individual parsers for each model family\n// ============================================================================\n\n/**\n * Llama 3.1/3.2/3.3 (Meta)\n *\n * Formats:\n * - `<|python_tag|>{\"name\": \"func\", \"parameters\": {\"arg\": \"val\"}}`\n * - `<function=func>{\"arg\": \"val\"}</function>` (3.2 lightweight 1B/3B)\n * - `{\"name\": \"func\", \"parameters\": {...}}` (bare JSON)\n */\nexport const parseLlama: ParserFn = (text) => {\n const calls: ToolCall[] = [];\n let content = text;\n\n // Try <|python_tag|> format first\n const pythonTagMatch = text.match(\n /<\\|python_tag\\|>((?:[^<]|<(?!\\|eot_id\\|>|\\|eom_id\\|>))*)(?:<\\|eot_id\\|>|<\\|eom_id\\|>|$)/\n );\n if (pythonTagMatch) {\n content = text.slice(0, text.indexOf(\"<|python_tag|>\")).trim();\n const jsonSection = pythonTagMatch[1].trim();\n for (const line of jsonSection.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const parsed = tryParseJson(trimmed) as Record<string, unknown> | undefined;\n if (parsed?.name) {\n calls.push(\n makeToolCall(\n parsed.name as string,\n (parsed.parameters ?? parsed.arguments ?? {}) as Record<string, unknown>,\n (parsed.id as string | null) ?? null\n )\n );\n }\n }\n }\n\n // Try <function=name>{args}</function> format (Llama 3.2 lightweight 1B/3B)\n if (calls.length === 0) {\n const funcTagRegex = /<function=(\\w+)>((?:[^<]|<(?!\\/function>))*)<\\/function>/g;\n let funcMatch: RegExpExecArray | null;\n while ((funcMatch = funcTagRegex.exec(text)) !== null) {\n const args = tryParseJson(funcMatch[2].trim()) as Record<string, unknown> | undefined;\n if (args) {\n calls.push(makeToolCall(funcMatch[1], args));\n }\n }\n if (calls.length > 0) {\n content = text.replace(/<function=\\w+>(?:[^<]|<(?!\\/function>))*<\\/function>/g, \"\").trim();\n }\n }\n\n // Check for {\"name\":...} pattern at end of output (no python_tag)\n // Uses balanced-brace scanning instead of regex to avoid ReDoS\n if (calls.length === 0) {\n const blocks = findBalancedBlocks(text, \"{\", \"}\");\n for (const block of blocks) {\n const parsed = tryParseJson(block.text) as Record<string, unknown> | undefined;\n if (parsed?.name && (parsed.parameters !== undefined || parsed.arguments !== undefined)) {\n calls.push(\n makeToolCall(\n parsed.name as string,\n (parsed.parameters ?? parsed.arguments ?? {}) as Record<string, unknown>,\n (parsed.id as string | null) ?? null\n )\n );\n }\n }\n if (calls.length > 0) {\n content = text.slice(0, text.indexOf(calls[0].name) - '{\"name\": \"'.length).trim();\n }\n }\n\n return calls.length > 0 ? { tool_calls: calls, content, parser: \"llama\" } : null;\n};\n\n/**\n * Mistral / Mixtral (Mistral AI)\n *\n * Format: `[TOOL_CALLS] [{\"name\": \"func\", \"arguments\": {...}, \"id\": \"9charID\"}]`\n */\nexport const parseMistral: ParserFn = (text) => {\n const marker = \"[TOOL_CALLS]\";\n const idx = text.indexOf(marker);\n if (idx === -1) return null;\n\n const content = text.slice(0, idx).trim();\n const jsonStr = text.slice(idx + marker.length).trim();\n const calls = parseJsonToolCallArray(jsonStr);\n\n return calls ? { tool_calls: calls, content, parser: \"mistral\" } : null;\n};\n\n/**\n * Hermes (NousResearch) — also used by Qwen 2.5, Qwen 3, SOLAR, and others\n *\n * Format: `<tool_call>\\n{\"name\": \"func\", \"arguments\": {...}}\\n</tool_call>`\n */\nexport const parseHermes: ParserFn = (text) => {\n const regex = /<tool_call>((?:[^<]|<(?!\\/tool_call>))*)<\\/tool_call>/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n const parsed = tryParseJson(match[1].trim()) as Record<string, unknown> | undefined;\n if (parsed) {\n calls.push(\n makeToolCall(\n (parsed.name ?? \"\") as string,\n (parsed.arguments ?? parsed.parameters ?? {}) as Record<string, unknown>,\n (parsed.id as string | null) ?? null\n )\n );\n }\n }\n\n if (calls.length === 0) return null;\n\n const content = text.replace(/<tool_call>(?:[^<]|<(?!\\/tool_call>))*<\\/tool_call>/g, \"\").trim();\n return { tool_calls: calls, content, parser: \"hermes\" };\n};\n\n/**\n * Cohere Command-R / Command-R+\n *\n * Formats:\n * - `Action: ```json\\n[{\"tool_name\": \"func\", \"parameters\": {...}}]\\n````\n * - `Action: [{\"tool_name\": ..., \"parameters\": ...}]`\n */\nexport const parseCohere: ParserFn = (text) => {\n const blockMatch = text.match(/Action:\\s*```(?:json)?\\n?((?:[^`]|`(?!``))*)\\n?```/);\n // Use balanced-bracket scanning for inline format to avoid ReDoS\n let inlineJsonStr: string | undefined;\n if (!blockMatch) {\n const actionIdx = text.indexOf(\"Action:\");\n if (actionIdx !== -1) {\n const afterAction = text.slice(actionIdx + \"Action:\".length).trimStart();\n if (afterAction.startsWith(\"[\")) {\n const blocks = findBalancedBlocks(afterAction, \"[\", \"]\");\n if (blocks.length > 0) {\n inlineJsonStr = blocks[0].text;\n }\n }\n }\n }\n\n const jsonStr = blockMatch?.[1] ?? inlineJsonStr;\n if (!jsonStr) return null;\n\n const calls = parseJsonToolCallArray(jsonStr, \"tool_name\", [\"parameters\", \"arguments\"]);\n if (!calls) {\n // Retry with \"name\" key\n const fallbackCalls = parseJsonToolCallArray(jsonStr);\n if (!fallbackCalls) return null;\n\n const actionIdx = text.indexOf(\"Action:\");\n const content = text.slice(0, actionIdx).trim();\n return { tool_calls: fallbackCalls, content, parser: \"cohere\" };\n }\n\n const actionIdx = text.indexOf(\"Action:\");\n const content = text.slice(0, actionIdx).trim();\n return { tool_calls: calls, content, parser: \"cohere\" };\n};\n\n/**\n * DeepSeek V2/V3/V3.1\n *\n * V2 format: `<|tool▁call▁begin|>function_name\\n```json\\n{...}\\n```<|tool▁call▁end|>`\n * V3.1 format: `<|tool▁calls▁begin|><|tool▁call▁begin|>name<|tool▁sep|>{args}<|tool▁call▁end|><|tool▁calls▁end|>`\n */\nexport const parseDeepSeek: ParserFn = (text) => {\n const calls: ToolCall[] = [];\n\n // Helper to match both fullwidth | and ASCII | bar variants, and ▁ or space\n const bar = \"(?:||\\\\|)\";\n const sep = \"[\\\\s\\u2581]\";\n\n // Try V3.1 format first: name<|tool▁sep|>{args}\n const v31Regex = new RegExp(\n `<${bar}tool${sep}call${sep}begin${bar}>\\\\s*(\\\\w+)\\\\s*<${bar}tool${sep}sep${bar}>\\\\s*([^<]*(?:<(?!${bar}tool${sep}call${sep}end${bar}>)[^<]*)*)\\\\s*<${bar}tool${sep}call${sep}end${bar}>`,\n \"g\"\n );\n let match: RegExpExecArray | null;\n while ((match = v31Regex.exec(text)) !== null) {\n const args = tryParseJson(match[2].trim()) as Record<string, unknown> | undefined;\n if (args) {\n calls.push(makeToolCall(match[1], args));\n }\n }\n\n // Try V2 format: name\\n```json\\n{args}\\n```\n if (calls.length === 0) {\n const v2Regex = new RegExp(\n `<${bar}tool${sep}call${sep}begin${bar}>\\\\s*(\\\\w+)\\\\s*\\\\n\\`\\`\\`(?:json)?\\\\n([^\\`]*(?:\\`(?!\\`\\`)[^\\`]*)*)\\\\n\\`\\`\\`\\\\s*<${bar}tool${sep}call${sep}end${bar}>`,\n \"g\"\n );\n while ((match = v2Regex.exec(text)) !== null) {\n const args = tryParseJson(match[2].trim()) as Record<string, unknown> | undefined;\n if (args) {\n calls.push(makeToolCall(match[1], args));\n }\n }\n }\n\n if (calls.length === 0) return null;\n\n const content = text\n .replace(new RegExp(`<${bar}tool${sep}calls?${sep}(?:begin|end)${bar}>`, \"g\"), \"\")\n .replace(\n new RegExp(\n `<${bar}tool${sep}call${sep}(?:begin|end)${bar}>[^<]*(?:<(?!${bar}tool${sep}call${sep}end${bar}>)[^<]*)*<${bar}tool${sep}call${sep}end${bar}>`,\n \"g\"\n ),\n \"\"\n )\n .replace(new RegExp(`<${bar}tool${sep}sep${bar}>`, \"g\"), \"\")\n .trim();\n return { tool_calls: calls, content, parser: \"deepseek\" };\n};\n\n/**\n * Phi-4 / Phi-4-mini (Microsoft)\n *\n * Format: `<|tool_calls|>[{\"name\": \"func\", \"arguments\": {...}}]<|/tool_calls|>`\n */\nexport const parsePhi: ParserFn = (text) => {\n const match = text.match(/<\\|tool_calls\\|>((?:[^<]|<(?!\\|\\/tool_calls\\|>))*)<\\|\\/tool_calls\\|>/);\n if (!match) return null;\n\n const calls = parseJsonToolCallArray(match[1]);\n if (!calls) return null;\n\n const content = text.slice(0, text.indexOf(\"<|tool_calls|>\")).trim();\n return { tool_calls: calls, content, parser: \"phi\" };\n};\n\n/**\n * Phi-3 functools format (legacy)\n *\n * Format: `functools[{\"name\": \"func\", \"arguments\": {...}}]`\n */\nexport const parsePhiFunctools: ParserFn = (text) => {\n const idx = text.indexOf(\"functools\");\n if (idx === -1) return null;\n\n // Scan forward past optional whitespace to find the opening [\n let start = idx + \"functools\".length;\n while (start < text.length && /\\s/.test(text[start])) start++;\n if (start >= text.length || text[start] !== \"[\") return null;\n\n const blocks = findBalancedBlocks(text, \"[\", \"]\", start);\n if (blocks.length === 0) return null;\n\n const calls = parseJsonToolCallArray(blocks[0].text);\n if (!calls) return null;\n\n const content = text.slice(0, idx).trim();\n return { tool_calls: calls, content, parser: \"phi_functools\" };\n};\n\n/**\n * InternLM 2 / 2.5 (Shanghai AI Lab)\n *\n * Format: `<|action_start|><|plugin|>\\n{\"name\": \"func\", \"parameters\": {...}}<|action_end|>`\n */\nexport const parseInternLM: ParserFn = (text) => {\n const regex =\n /<\\|action_start\\|>\\s*<\\|plugin\\|>((?:[^<]|<(?!\\|action_end\\|>))*)<\\|action_end\\|>/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n const parsed = tryParseJson(match[1].trim()) as Record<string, unknown> | undefined;\n if (parsed) {\n calls.push(\n makeToolCall(\n (parsed.name ?? \"\") as string,\n (parsed.parameters ?? parsed.arguments ?? {}) as Record<string, unknown>,\n (parsed.id as string | null) ?? null\n )\n );\n }\n }\n\n if (calls.length === 0) return null;\n\n const content = text\n .replace(/<\\|action_start\\|>\\s*<\\|plugin\\|>(?:[^<]|<(?!\\|action_end\\|>))*<\\|action_end\\|>/g, \"\")\n .trim();\n return { tool_calls: calls, content, parser: \"internlm\" };\n};\n\n/**\n * ChatGLM / GLM-4 (Zhipu AI)\n *\n * Format: function name followed by newline and JSON arguments.\n * `func_name\\n{\"arg\": \"val\"}`\n */\nexport const parseChatGLM: ParserFn = (text) => {\n const match = text.match(/^(\\w+)\\n(\\{[\\s\\S]*\\})\\s*$/m);\n if (!match) return null;\n\n const args = tryParseJson(match[2].trim()) as Record<string, unknown> | undefined;\n if (!args) return null;\n\n return {\n tool_calls: [makeToolCall(match[1], args)],\n content: \"\",\n parser: \"chatglm\",\n };\n};\n\n/**\n * Functionary (MeetKai)\n *\n * Format: `>>>func_name\\n{\"arg\": \"val\"}`\n * Uses `all` as a special function name for regular text.\n */\nexport const parseFunctionary: ParserFn = (text) => {\n const regex = />>>\\s*(\\w+)\\s*\\n((?:(?!>>>)[\\s\\S])*)/g;\n const calls: ToolCall[] = [];\n let content = \"\";\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n const funcName = match[1].trim();\n const body = match[2].trim();\n\n if (funcName === \"all\") {\n content += body;\n continue;\n }\n\n const args = tryParseJson(body) as Record<string, unknown> | undefined;\n calls.push(makeToolCall(funcName, args ?? { content: body }));\n }\n\n if (calls.length === 0) return null;\n return { tool_calls: calls, content: content.trim(), parser: \"functionary\" };\n};\n\n/**\n * Gorilla (Berkeley)\n *\n * Format: `<<function>>func_name(arg1=\"val1\", arg2=val2)`\n */\nexport const parseGorilla: ParserFn = (text) => {\n const regex = /<<function>>\\s{0,20}(\\w+)\\(([^)]*)\\)/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n calls.push(makeToolCall(match[1], parseKeyValueArgs(match[2].trim())));\n }\n\n if (calls.length === 0) return null;\n\n const content = text.replace(/<<function>>\\s{0,20}\\w+\\([^)]*\\)/g, \"\").trim();\n return { tool_calls: calls, content, parser: \"gorilla\" };\n};\n\n/**\n * NexusRaven (Nexusflow)\n *\n * Format: `Call: func_name(arg1=\"val1\", arg2=val2)\\nThought: reasoning...`\n */\nexport const parseNexusRaven: ParserFn = (text) => {\n const regex = /Call:\\s{0,20}(\\w+)\\(([^)]*)\\)/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n calls.push(makeToolCall(match[1], parseKeyValueArgs(match[2].trim())));\n }\n\n if (calls.length === 0) return null;\n\n const thoughtMatch = text.match(/Thought:\\s*((?:(?!Call:)[\\s\\S])*)/);\n const content =\n thoughtMatch?.[1]?.trim() ?? text.replace(/Call:\\s{0,20}\\w+\\([^)]*\\)/g, \"\").trim();\n return { tool_calls: calls, content, parser: \"nexusraven\" };\n};\n\n/**\n * xLAM (Salesforce)\n *\n * Format: Raw JSON array of tool calls: `[{\"name\": \"func\", \"arguments\": {...}}]`\n * May be wrapped in ```json code blocks.\n */\nexport const parseXLAM: ParserFn = (text) => {\n // Try code block format first using ReDoS-safe backtick matching\n const codeBlockMatch = text.match(/```(?:json)?\\n?((?:[^`]|`(?!``))*)\\n?```/);\n let jsonStr: string | undefined;\n let isCodeBlock = false;\n\n if (codeBlockMatch) {\n const inner = codeBlockMatch[1].trim();\n if (inner.startsWith(\"[\")) {\n jsonStr = inner;\n isCodeBlock = true;\n }\n }\n\n if (!jsonStr) {\n const trimmed = text.trim();\n if (!trimmed.startsWith(\"[\")) return null;\n jsonStr = trimmed;\n }\n\n const calls = parseJsonToolCallArray(jsonStr);\n if (!calls) return null;\n\n const content = isCodeBlock ? text.slice(0, text.indexOf(\"```\")).trim() : \"\";\n return { tool_calls: calls, content, parser: \"xlam\" };\n};\n\n/**\n * FireFunction (Fireworks AI)\n *\n * Format: `{\"tool_calls\": [{\"function\": {\"name\": \"...\", \"arguments\": \"...\"}}]}`\n */\nexport const parseFireFunction: ParserFn = (text) => {\n // Use balanced-bracket scanning to avoid ReDoS\n const toolCallsIdx = text.indexOf('\"tool_calls\"');\n if (toolCallsIdx === -1) return null;\n\n // Find the opening [ after \"tool_calls\":\n let bracketStart = text.indexOf(\"[\", toolCallsIdx);\n if (bracketStart === -1) return null;\n\n const blocks = findBalancedBlocks(text, \"[\", \"]\", bracketStart);\n if (blocks.length === 0) return null;\n\n const parsed = tryParseJson(blocks[0].text) as Array<Record<string, unknown>> | undefined;\n if (!parsed || !Array.isArray(parsed)) return null;\n\n const calls: ToolCall[] = [];\n for (const c of parsed) {\n const fn = c.function as Record<string, unknown> | undefined;\n if (!fn?.name) continue;\n\n let args = fn.arguments ?? {};\n if (typeof args === \"string\") {\n args = tryParseJson(args) ?? {};\n }\n calls.push(\n makeToolCall(\n fn.name as string,\n args as Record<string, unknown>,\n (c.id as string | null) ?? null\n )\n );\n }\n\n return calls.length > 0 ? { tool_calls: calls, content: \"\", parser: \"firefunction\" } : null;\n};\n\n/**\n * Granite (IBM)\n *\n * Format: `<|tool_call|>{\"name\": \"func\", \"arguments\": {...}}<|/tool_call|>` or `<|end_of_text|>`\n */\nexport const parseGranite: ParserFn = (text) => {\n const regex =\n /<\\|tool_call\\|>((?:[^<]|<(?!\\|\\/tool_call\\|>|\\|end_of_text\\|>))*?)(?:<\\|\\/tool_call\\|>|<\\|end_of_text\\|>|$)/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n const parsed = tryParseJson(match[1].trim()) as Record<string, unknown> | undefined;\n if (parsed) {\n calls.push(\n makeToolCall(\n (parsed.name ?? \"\") as string,\n (parsed.arguments ?? parsed.parameters ?? {}) as Record<string, unknown>,\n (parsed.id as string | null) ?? null\n )\n );\n }\n }\n\n if (calls.length === 0) return null;\n\n const content = text\n .replace(\n /<\\|tool_call\\|>(?:[^<]|<(?!\\|\\/tool_call\\|>|\\|end_of_text\\|>))*(?:<\\|\\/tool_call\\|>|$)/g,\n \"\"\n )\n .trim();\n return { tool_calls: calls, content, parser: \"granite\" };\n};\n\n/**\n * Gemma 2/3 (Google) — prompt-based, no dedicated tokens\n *\n * Formats:\n * - ```tool_code\\nfunc(arg=val)\\n```\n * - `{\"name\": \"func\", \"parameters\": {...}}`\n */\nexport const parseGemma: ParserFn = (text) => {\n // Manual extraction to avoid ReDoS with backtick-matching regexes\n const openMarker = \"```tool_code\";\n const openIdx = text.indexOf(openMarker);\n if (openIdx === -1) return null;\n const lineStart = text.indexOf(\"\\n\", openIdx + openMarker.length);\n if (lineStart === -1) return null;\n // Find closing ``` on its own line after the content\n let closeIdx = -1;\n let searchFrom = lineStart + 1;\n while (searchFrom < text.length) {\n const candidate = text.indexOf(\"```\", searchFrom);\n if (candidate === -1) break;\n // Ensure the ``` is preceded by a newline (possibly with whitespace)\n const lineBegin = text.lastIndexOf(\"\\n\", candidate - 1);\n if (lineBegin >= lineStart && text.slice(lineBegin + 1, candidate).trim() === \"\") {\n closeIdx = candidate;\n break;\n }\n searchFrom = candidate + 3;\n }\n if (closeIdx === -1) return null;\n\n const rawCode = text.slice(lineStart + 1, closeIdx).replace(/\\n[ \\t]*$/, \"\");\n const code = rawCode.trim();\n const funcMatch = code.match(/^(\\w+)\\(([\\s\\S]*)\\)$/);\n if (!funcMatch) return null;\n\n // Remove the entire fenced block from content\n const blockEnd = closeIdx + 3;\n const content = (text.slice(0, openIdx) + text.slice(blockEnd)).trim();\n return {\n tool_calls: [makeToolCall(funcMatch[1], parseKeyValueArgs(funcMatch[2].trim()))],\n content,\n parser: \"gemma\",\n };\n};\n\n/**\n * Parse FunctionGemma-style arguments from the captured string between braces.\n * Handles both `<escape>` delimited and plain `key:value` formats, with a\n * JSON fallback for more complex values.\n */\nfunction parseFunctionGemmaArgs(argsStr: string): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n if (!argsStr.trim()) return args;\n\n // Try <escape>-delimited format first: key:<escape>value<escape>\n const escapeRegex =\n /(?<![A-Za-z0-9_])([A-Za-z0-9_]+)\\s*:\\s*<escape>((?:[^<]|<(?!escape>))*)<escape>/g;\n let escapeMatch: RegExpExecArray | null;\n while ((escapeMatch = escapeRegex.exec(argsStr)) !== null) {\n args[escapeMatch[1]] = coerceArgValue(escapeMatch[2]);\n }\n if (Object.keys(args).length > 0) return args;\n\n // Try plain key:value format (no escape tags): key:value separated by commas\n // Also handles cases where the model generates only a single <escape> tag\n const plainRegex =\n /(?<![A-Za-z0-9_])(?=([A-Za-z0-9_]+))\\1\\s*:\\s*(?:'([^']*)'|\"([^\"]*)\"|([^,}]+))/g;\n let plainMatch: RegExpExecArray | null;\n while ((plainMatch = plainRegex.exec(argsStr)) !== null) {\n const key = plainMatch[1].trim();\n const value = (plainMatch[2] ?? plainMatch[3] ?? plainMatch[4] ?? \"\")\n .replace(/<escape>/g, \"\")\n .trim();\n args[key] = parseFunctionGemmaArgumentValue(value);\n }\n if (Object.keys(args).length > 0) return args;\n\n // Fallback: try JSON.parse on {argsStr}\n const jsonResult = tryParseJson(`{${argsStr}}`) as Record<string, unknown> | undefined;\n if (jsonResult && typeof jsonResult === \"object\") return jsonResult;\n\n return args;\n}\n\n/**\n * FunctionGemma (Google, specialized 270M model)\n *\n * Format: `<start_function_call>call:func_name{key:<escape>value<escape>}<end_function_call>`\n * Also handles variants without `<end_function_call>` (e.g., `<end_of_turn>`).\n */\nexport const parseFunctionGemma: ParserFn = (text) => {\n // Match with explicit end tag. Allow:\n // - Optional <start_function_call> wrapper\n // - `call:name{args}` or just `:name{args}` (model may omit `call` prefix)\n // - Optional whitespace/newlines between name and `{`\n const regex =\n /(?:<start_function_call>\\s*)?call:(?=([\\w.]+))\\1\\s*\\{([^}]*)\\}(?:\\s*<end_function_call>)?/g;\n const calls: ToolCall[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(text)) !== null) {\n calls.push(makeToolCall(match[1].trim(), parseFunctionGemmaArgs(match[2])));\n }\n\n // Fallback: handle missing `call` prefix (`:name{args}` at start of text)\n if (calls.length === 0) {\n const fallbackRegex = /^:([A-Za-z_]\\w*)\\s*\\{([^}]*)\\}$/;\n const fallbackMatch = text.trim().match(fallbackRegex);\n if (fallbackMatch) {\n calls.push(makeToolCall(fallbackMatch[1].trim(), parseFunctionGemmaArgs(fallbackMatch[2])));\n }\n }\n\n if (calls.length === 0) return null;\n\n const content = text\n .replace(\n /(?:<start_function_call>\\s*)?(?:call)?:(?=([\\w.]+))\\1\\s*\\{[^}]*\\}(?:\\s*<end_function_call>)?/g,\n \"\"\n )\n .trim();\n return { tool_calls: calls, content, parser: \"functiongemma\" };\n};\n\n/**\n * Parse Liquid/LFM-style Pythonic function call arguments.\n * Handles both `key=val, key2=val2` and `params=JSON` patterns.\n * When a single `params` argument contains a JSON object, spreads it.\n */\nfunction parseLiquidArgs(argsStr: string): Record<string, unknown> {\n const trimmed = argsStr.trim();\n\n // Try params=JSON pattern: params={\"key\": \"val\", ...} or params={'key': 'val', ...}\n const paramsMatch = trimmed.match(/^params\\s*=\\s*(\\{[\\s\\S]*\\})$/);\n if (paramsMatch) {\n const jsonStr = paramsMatch[1].replace(/'/g, '\"');\n const parsed = tryParseJson(jsonStr) as Record<string, unknown> | undefined;\n if (parsed && typeof parsed === \"object\") {\n return parsed;\n }\n }\n\n // Try bare JSON object: { key: \"val\", ... } (JS-style, keys may be unquoted)\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n // Add quotes around unquoted keys for JSON.parse\n const jsonified = trimmed.replace(/([{,]\\s*)(\\w+)\\s*:/g, '$1\"$2\":');\n const parsed = tryParseJson(jsonified) as Record<string, unknown> | undefined;\n if (parsed && typeof parsed === \"object\") {\n return parsed;\n }\n }\n\n // Fall back to key=value parsing\n return parseKeyValueArgs(argsStr);\n}\n\n/**\n * Extract Pythonic function calls from text: `func_name(args)` or `[func(args)]`.\n * Handles balanced parentheses so JSON in args doesn't break matching.\n */\nfunction extractPythonicCalls(text: string): ToolCall[] {\n const calls: ToolCall[] = [];\n const startRegex = /(?<!\\w)(\\w+)\\(/g;\n let startMatch: RegExpExecArray | null;\n while ((startMatch = startRegex.exec(text)) !== null) {\n const funcName = startMatch[1];\n const argsStart = startMatch.index + startMatch[0].length;\n // Balance parentheses to find the closing )\n let depth = 1;\n let i = argsStart;\n while (i < text.length && depth > 0) {\n if (text[i] === \"(\") depth++;\n else if (text[i] === \")\") depth--;\n i++;\n }\n if (depth === 0) {\n const argsStr = text.slice(argsStart, i - 1);\n calls.push(makeToolCall(funcName, parseLiquidArgs(argsStr)));\n // Advance regex scanning position past this complete call to avoid matching inside args\n startRegex.lastIndex = i;\n }\n }\n return calls;\n}\n\n/**\n * LiquidAI LFM / LFM2 / LFM2.5\n *\n * Formats:\n * - `<|tool_call_start|>[func_name(key=\"value\", key2=123)]<|tool_call_end|>`\n * - `[func_name(params={\"key\": \"val\"})]` (bracket-only, no special tokens)\n * Parallel calls: `<|tool_call_start|>[func1(a=\"b\"), func2(c=\"d\")]<|tool_call_end|>`\n * Uses Pythonic function call syntax.\n */\nexport const parseLiquid: ParserFn = (text) => {\n // Try special token format first\n const specialMatch = text.match(\n /<\\|tool_call_start\\|>((?:[^<]|<(?!\\|tool_call_end\\|>))*)<\\|tool_call_end\\|>/\n );\n if (specialMatch) {\n const inner = specialMatch[1].trim();\n const unwrapped = inner.startsWith(\"[\") && inner.endsWith(\"]\") ? inner.slice(1, -1) : inner;\n const calls = extractPythonicCalls(unwrapped);\n if (calls.length > 0) {\n const content = stripModelArtifacts(\n text.replace(\n /<\\|tool_call_start\\|>(?:[^<]|<(?!\\|tool_call_end\\|>))*<\\|tool_call_end\\|>/g,\n \"\"\n )\n );\n return { tool_calls: calls, content, parser: \"liquid\" };\n }\n }\n\n // Try bracket-only format: [func(args)] without special tokens\n // Use manual balanced-paren extraction to avoid ReDoS\n const bracketCalls: ToolCall[] = [];\n const bracketSpans: Array<[number, number]> = [];\n {\n const bracketOpenRegex = /\\[(?=\\w+\\()/g;\n let bm: RegExpExecArray | null;\n while ((bm = bracketOpenRegex.exec(text)) !== null) {\n const innerStart = bm.index + 1;\n // Find balanced closing ] by tracking parens\n let depth = 0;\n let i = innerStart;\n let foundClose = false;\n while (i < text.length) {\n const ch = text[i];\n if (ch === \"(\") depth++;\n else if (ch === \")\") {\n depth--;\n if (depth === 0 && i + 1 < text.length && text[i + 1] === \"]\") {\n const inner = text.slice(innerStart, i + 1);\n const calls = extractPythonicCalls(inner);\n bracketCalls.push(...calls);\n bracketSpans.push([bm.index, i + 2]);\n bracketOpenRegex.lastIndex = i + 2;\n foundClose = true;\n break;\n }\n }\n i++;\n }\n if (!foundClose) break;\n }\n }\n\n if (bracketCalls.length > 0) {\n let content = text;\n for (let k = bracketSpans.length - 1; k >= 0; k--) {\n content = content.slice(0, bracketSpans[k][0]) + content.slice(bracketSpans[k][1]);\n }\n return { tool_calls: bracketCalls, content: stripModelArtifacts(content), parser: \"liquid\" };\n }\n\n // Try ||Call: format (LFM2 text-based variant): ||Call: func_name(args)\n const callPrefixRegex = /\\|?\\|?Call:\\s*/g;\n let callPrefixMatch: RegExpExecArray | null;\n const callCalls: ToolCall[] = [];\n while ((callPrefixMatch = callPrefixRegex.exec(text)) !== null) {\n const afterPrefix = text.slice(callPrefixMatch.index + callPrefixMatch[0].length);\n const calls = extractPythonicCalls(afterPrefix);\n if (calls.length > 0) {\n callCalls.push(calls[0]);\n }\n }\n\n if (callCalls.length > 0) {\n const content = stripModelArtifacts(text.replace(/\\|?\\|?Call:\\s{0,20}\\w+\\([^)]*\\)/g, \"\"));\n return { tool_calls: callCalls, content, parser: \"liquid\" };\n }\n\n return null;\n};\n\n/**\n * Jamba (AI21)\n *\n * Format: `<tool_calls>[{\"name\": \"func\", \"arguments\": {...}}]</tool_calls>`\n * Also supports OpenAI-compatible format via FireFunction fallback.\n */\nexport const parseJamba: ParserFn = (text) => {\n const tagMatch = text.match(/<tool_calls>((?:[^<]|<(?!\\/tool_calls>))*)<\\/tool_calls>/);\n if (tagMatch) {\n const parsed = tryParseJson(tagMatch[1].trim());\n if (parsed) {\n const arr = Array.isArray(parsed) ? parsed : [parsed];\n const calls: ToolCall[] = [];\n for (const c of arr as Array<Record<string, unknown>>) {\n if (!c.name) continue;\n let args = c.arguments ?? c.parameters ?? {};\n if (typeof args === \"string\") {\n args = tryParseJson(args) ?? {};\n }\n calls.push(\n makeToolCall(\n c.name as string,\n args as Record<string, unknown>,\n (c.id as string | null) ?? null\n )\n );\n }\n if (calls.length > 0) {\n const content = text.slice(0, text.indexOf(\"<tool_calls>\")).trim();\n return { tool_calls: calls, content, parser: \"jamba\" };\n }\n }\n }\n\n return parseFireFunction(text);\n};\n\n/**\n * Qwen 3.5 XML format\n *\n * Format:\n * ```\n * <tool_call>\n * <function=function_name>\n * <parameter=param_name>value</parameter>\n * ...\n * </function>\n * </tool_call>\n * ```\n *\n * The special `params` parameter may contain a JSON object to be spread\n * into the arguments.\n */\nexport const parseQwen35Xml: ParserFn = (text) => {\n const toolCallMatches = text.matchAll(/<tool_call>((?:[^<]|<(?!\\/tool_call>))*)<\\/tool_call>/g);\n const calls: ToolCall[] = [];\n for (const [_, toolCallBody] of toolCallMatches) {\n const functionMatch = toolCallBody\n .trim()\n .match(/<function=([^>\\n<]+)>((?:[^<]|<(?!\\/function>))*)<\\/function>/);\n if (!functionMatch) {\n continue;\n }\n const [, rawName, functionBody] = functionMatch;\n const parsedInput: Record<string, unknown> = {};\n const parameterMatches = functionBody.matchAll(\n /<parameter=([^>\\n<]+)>((?:[^<]|<(?!\\/parameter>))*)<\\/parameter>/g\n );\n for (const [__, rawParamName, rawValue] of parameterMatches) {\n const paramName = rawParamName.trim();\n const valueText = rawValue.trim();\n if (paramName === \"params\") {\n try {\n const parsedValue = JSON.parse(valueText);\n if (parsedValue && typeof parsedValue === \"object\" && !Array.isArray(parsedValue)) {\n Object.assign(parsedInput, parsedValue);\n continue;\n }\n } catch {\n // Fall back to keeping the raw string.\n }\n }\n parsedInput[paramName] = valueText;\n }\n calls.push(makeToolCall(rawName.trim(), parsedInput));\n }\n\n if (calls.length === 0) return null;\n\n const content = text.replace(/<tool_call>(?:[^<]|<(?!\\/tool_call>))*<\\/tool_call>/g, \"\").trim();\n return { tool_calls: calls, content, parser: \"qwen35xml\" };\n};\n\n// ============================================================================\n// Model family detection\n// ============================================================================\n\nconst MODEL_PARSERS: Record<string, ReadonlyArray<ParserFn>> = {\n llama: [parseLlama, parseHermes],\n mistral: [parseMistral, parseHermes],\n mixtral: [parseMistral, parseHermes],\n qwen: [parseHermes, parseLlama],\n qwen2: [parseHermes, parseLlama],\n qwen3: [parseHermes, parseQwen35Xml, parseLlama],\n qwen35: [parseQwen35Xml, parseHermes, parseLlama],\n cohere: [parseCohere, parseHermes],\n command: [parseCohere, parseHermes],\n deepseek: [parseDeepSeek, parseHermes],\n hermes: [parseHermes],\n phi: [parsePhi, parsePhiFunctools, parseHermes],\n internlm: [parseInternLM, parseHermes],\n chatglm: [parseChatGLM],\n glm: [parseChatGLM],\n functiongemma: [parseFunctionGemma, parseGemma, parseHermes],\n gemma: [parseFunctionGemma, parseGemma, parseHermes],\n functionary: [parseFunctionary],\n gorilla: [parseGorilla],\n nexusraven: [parseNexusRaven],\n xlam: [parseXLAM],\n firefunction: [parseFireFunction, parsePhiFunctools],\n granite: [parseGranite, parseHermes],\n solar: [parseHermes],\n jamba: [parseJamba, parseHermes],\n liquid: [parseLiquid, parseHermes],\n lfm: [parseLiquid, parseHermes],\n yi: [parseHermes, parseLlama],\n falcon: [parseHermes, parseLlama],\n};\n\n/**\n * Default parser chain used when the model family cannot be determined.\n * Ordered by specificity (most distinctive markers first).\n */\nconst DEFAULT_PARSER_CHAIN: ReadonlyArray<ParserFn> = [\n parsePhi,\n parseMistral,\n parseDeepSeek,\n parseInternLM,\n parseGranite,\n parseFunctionGemma,\n parseQwen35Xml,\n parseHermes,\n parseCohere,\n parseFunctionary,\n parseGorilla,\n parseNexusRaven,\n parseFireFunction,\n parsePhiFunctools,\n parseLiquid,\n parseLlama,\n parseGemma,\n parseXLAM,\n];\n\n/**\n * Detect the model family from a tokenizer instance or model name string.\n */\nfunction detectModelFamily(tokenizerOrName: TokenizerLike | string | null): string | null {\n let name = \"\";\n\n if (typeof tokenizerOrName === \"string\") {\n name = tokenizerOrName.toLowerCase();\n } else if (tokenizerOrName) {\n const config = tokenizerOrName.config ?? {};\n name = (\n config.name_or_path ??\n config._name_or_path ??\n config.model_type ??\n tokenizerOrName.name_or_path ??\n \"\"\n ).toLowerCase();\n }\n\n if (!name) return null;\n\n for (const family of Object.keys(MODEL_PARSERS)) {\n if (name.includes(family)) {\n return family;\n }\n }\n\n return null;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Parse tool calls from LLM output text.\n *\n * Automatically detects the model family from the tokenizer and applies the\n * appropriate parser(s). Falls back to trying all known formats if the model\n * family cannot be determined.\n */\nexport function parseToolCalls(\n text: string,\n { tokenizer = null, model = null, parser = null }: ParseToolCallsOptions = {}\n): ToolCallParserResult {\n if (!text || typeof text !== \"string\") {\n return { tool_calls: [], content: text ?? \"\", parser: \"none\" };\n }\n\n let parsersToTry: ReadonlyArray<ParserFn>;\n\n if (parser) {\n const key = parser.toLowerCase();\n const found = MODEL_PARSERS[key];\n if (!found) {\n throw new Error(\n `Unknown parser \"${parser}\". Available parsers: ${Object.keys(MODEL_PARSERS).join(\", \")}`\n );\n }\n parsersToTry = found;\n } else {\n const family = detectModelFamily(tokenizer ?? model ?? null);\n parsersToTry = family ? MODEL_PARSERS[family]! : DEFAULT_PARSER_CHAIN;\n }\n\n for (const parserFn of parsersToTry) {\n const result = parserFn(text);\n if (result) return result;\n }\n\n return { tool_calls: [], content: text, parser: \"none\" };\n}\n\n/**\n * Check if text likely contains tool calls without fully parsing them.\n * Faster than `parseToolCalls` when you only need presence detection.\n */\nexport function hasToolCalls(text: string): boolean {\n if (!text) return false;\n return (\n text.includes(\"<tool_call>\") ||\n text.includes(\"[TOOL_CALLS]\") ||\n text.includes(\"<|python_tag|>\") ||\n text.includes(\"<function=\") ||\n text.includes(\"<|tool_calls|>\") ||\n text.includes(\"<tool_calls>\") ||\n text.includes(\"<|action_start|>\") ||\n text.includes(\"<<function>>\") ||\n text.includes(\">>>\") ||\n text.includes(\"Call:\") ||\n text.includes(\"Action:\") ||\n text.includes(\"functools\") ||\n text.includes(\"<start_function_call>\") ||\n text.includes(\"<|tool_call|>\") ||\n text.includes(\"<|tool_call_start|>\") ||\n /tool[\\s\\u2581]call[\\s\\u2581]begin/.test(text)\n );\n}\n\n/**\n * Get the list of available parser names.\n */\nexport function getAvailableParsers(): ReadonlyArray<string> {\n return Object.keys(MODEL_PARSERS);\n}\n\n/**\n * Get a model-family-specific generation prefix that guides the model to\n * produce tool calls. Appended to the prompt before generation and prepended\n * to the decoded output before parsing.\n *\n * @param family - The detected model family (from `getAvailableParsers` / `detectModelFamily`).\n * @param forcedToolName - When a specific tool is forced, include its name in the prefix.\n * @returns The prefix string, or `undefined` if no prefix is needed.\n */\nexport function getGenerationPrefix(\n family: string | null,\n forcedToolName: string | undefined\n): string | undefined {\n if (!family) return undefined;\n\n switch (family) {\n case \"functiongemma\":\n return forcedToolName\n ? `<start_function_call>call:${forcedToolName}{`\n : \"<start_function_call>call:\";\n default:\n return undefined;\n }\n}\n\n// ============================================================================\n// High-level parsing returning workglow ToolCalls type\n// ============================================================================\n\n/**\n * Parse tool calls from model-generated text, returning the workglow `ToolCalls`\n * type directly (with `input` field instead of `arguments`).\n *\n * Tries, in order:\n * 1. FunctionGemma `call:func{...}` syntax\n * 2. `<tool_call>JSON</tool_call>` tags (Qwen/Hermes)\n * 3. Bare JSON objects with `name` + `arguments`/`parameters` keys\n * 4. `{\"function\": {\"name\": ..., \"arguments\": ...}}` format\n *\n * Returns both the cleaned text (with tool-call markup removed) and the parsed\n * ToolCall array.\n */\nexport function parseToolCallsFromText(responseText: string): {\n text: string;\n toolCalls: ToolCalls;\n} {\n // Try FunctionGemma first\n const functionGemmaResult = parseFunctionGemma(responseText);\n if (functionGemmaResult && functionGemmaResult.tool_calls.length > 0) {\n return {\n text: functionGemmaResult.content,\n toolCalls: functionGemmaResult.tool_calls.map((call, index) => ({\n id: call.id ?? `call_${index}`,\n name: call.name,\n input: call.arguments,\n })),\n };\n }\n\n // FunctionGemma loose-object fallback (no tool name context available)\n const looseObject = parseFunctionGemmaLooseObject(responseText);\n if (looseObject) {\n return {\n text: \"\",\n toolCalls: [{ id: \"call_0\", name: \"\", input: looseObject }],\n };\n }\n\n // Try Hermes/Qwen tag-based format\n const hermesResult = parseHermes(responseText);\n if (hermesResult && hermesResult.tool_calls.length > 0) {\n return {\n text: hermesResult.content,\n toolCalls: hermesResult.tool_calls.map((call, index) => ({\n id: call.id ?? `call_${index}`,\n name: call.name,\n input: call.arguments,\n })),\n };\n }\n\n // Fallback: brace-balanced scanner for bare JSON objects\n const toolCalls: ToolCalls = [];\n let callIndex = 0;\n\n const jsonCandidates = findBalancedBlocks(responseText, \"{\", \"}\");\n\n const matchedRanges: Array<{ start: number; end: number }> = [];\n for (const candidate of jsonCandidates) {\n try {\n const parsed = JSON.parse(candidate.text);\n if (parsed.name && (parsed.arguments !== undefined || parsed.parameters !== undefined)) {\n const id = `call_${callIndex++}`;\n toolCalls.push({\n id,\n name: parsed.name as string,\n input: (parsed.arguments ?? parsed.parameters ?? {}) as Record<string, unknown>,\n });\n matchedRanges.push({ start: candidate.start, end: candidate.end });\n } else if (parsed.function?.name) {\n let functionArgs: unknown = parsed.function.arguments ?? {};\n if (typeof functionArgs === \"string\") {\n try {\n functionArgs = JSON.parse(functionArgs);\n } catch {\n functionArgs = {};\n }\n }\n const id = `call_${callIndex++}`;\n toolCalls.push({\n id,\n name: parsed.function.name as string,\n input: (functionArgs ?? {}) as Record<string, unknown>,\n });\n matchedRanges.push({ start: candidate.start, end: candidate.end });\n }\n } catch {\n // Not valid JSON, skip\n }\n }\n\n let cleanedText = responseText;\n if (toolCalls.length > 0) {\n let result = \"\";\n let lastIndex = 0;\n for (const range of matchedRanges) {\n result += responseText.slice(lastIndex, range.start);\n lastIndex = range.end;\n }\n result += responseText.slice(lastIndex);\n cleanedText = result.trim();\n }\n\n return { text: cleanedText, toolCalls };\n}\n",
|
|
20
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ToolCallingTaskInput, ToolCalls, ToolDefinition } from \"@workglow/ai\";\nimport {\n parseFunctionGemma,\n parseFunctionGemmaLooseObject,\n parseHermes,\n parseLlama,\n parseLiquid,\n parseQwen35Xml,\n} from \"../../common/ToolCallParsers\";\nimport type { ToolCallParserResult } from \"../../common/ToolCallParsers\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\n\n// ============================================================================\n// Model text candidates\n// ============================================================================\n\nexport function getModelTextCandidates(model: LlamaCppModelConfig): string[] {\n return [\n model.model_id,\n model.title,\n model.description,\n model.provider_config.model_url,\n model.provider_config.model_path,\n ]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .map((value) => value.toLowerCase());\n}\n\n// ============================================================================\n// Tool choice utilities\n// ============================================================================\n\nexport function toolChoiceForcesToolCall(toolChoice: ToolCallingTaskInput[\"toolChoice\"]): boolean {\n return (\n toolChoice === \"required\" ||\n (toolChoice !== undefined && toolChoice !== \"auto\" && toolChoice !== \"none\")\n );\n}\n\nfunction forcedToolChoiceName(toolChoice: ToolCallingTaskInput[\"toolChoice\"]): string | undefined {\n if (\n typeof toolChoice !== \"string\" ||\n toolChoice === \"auto\" ||\n toolChoice === \"none\" ||\n toolChoice === \"required\"\n ) {\n return undefined;\n }\n return toolChoice;\n}\n\nexport function forcedToolSelection(input: ToolCallingTaskInput): string | undefined {\n const explicitToolName = forcedToolChoiceName(input.toolChoice);\n if (explicitToolName !== undefined) {\n return explicitToolName;\n }\n if (input.toolChoice === \"required\" && input.tools.length === 1) {\n return input.tools[0]?.name;\n }\n return undefined;\n}\n\nexport function resolveParsedToolName(name: string, input: ToolCallingTaskInput): string {\n if (input.tools.some((tool) => tool.name === name)) {\n return name;\n }\n return forcedToolSelection(input) ?? name;\n}\n\n// ============================================================================\n// FunctionGemma detection & prompt building\n// ============================================================================\n\nfunction detectFunctionGemmaModel(model: LlamaCppModelConfig): boolean {\n return getModelTextCandidates(model).some((value) => value.includes(\"functiongemma\"));\n}\n\nfunction functionGemmaDeclarationSchema(schema: Record<string, unknown> | undefined): string {\n if (!schema) {\n return \"{type: OBJECT}\";\n }\n\n const type = typeof schema.type === \"string\" ? schema.type.toUpperCase() : \"OBJECT\";\n const description =\n typeof schema.description === \"string\" ? `description: ${schema.description} ,` : \"\";\n\n if (type === \"OBJECT\") {\n const properties =\n schema.properties && typeof schema.properties === \"object\"\n ? Object.entries(schema.properties as Record<string, unknown>)\n .map(([key, value]) => {\n const property = (value ?? {}) as Record<string, unknown>;\n const propertyType =\n typeof property.type === \"string\" ? property.type.toUpperCase() : \"STRING\";\n const propertyDescription =\n typeof property.description === \"string\"\n ? `description: ${property.description} ,`\n : \"\";\n return `${key}:{${propertyDescription}type: ${propertyType}}`;\n })\n .join(\",\")\n : \"\";\n const required = Array.isArray(schema.required) ? schema.required.join(\",\") : \"\";\n return `{${description}parameters:{properties:{${properties}},required:[${required}],type: OBJECT}}`;\n }\n\n return `{${description}type: ${type}}`;\n}\n\nfunction buildFunctionGemmaDeclarations(tools: ReadonlyArray<ToolDefinition>): string {\n return tools\n .map((tool) => {\n const description = tool.description?.trim() ?? \"\";\n return (\n `declaration:${tool.name}\\n` +\n `{description: ${description} ,parameters:` +\n `${functionGemmaDeclarationSchema(tool.inputSchema as Record<string, unknown>).slice(1, -1)}}`\n );\n })\n .join(\"\\n\");\n}\n\nfunction buildFunctionGemmaDeveloperPrompt(\n baseSystemPrompt: string | undefined,\n required: boolean\n): string {\n const lines = [\n baseSystemPrompt,\n \"You are a model that can do function calling with the following functions\",\n required ? \"You must call at least one function from the provided list.\" : undefined,\n \"If you call a function, output only the function call and nothing else.\",\n \"If tool results are already available and no further function call is needed, answer the user normally.\",\n ].filter((value): value is string => typeof value === \"string\" && value.trim().length > 0);\n\n return lines.join(\"\\n\");\n}\n\nfunction extractMessageText(content: unknown): string {\n if (typeof content === \"string\") {\n return content;\n }\n if (!Array.isArray(content)) {\n return String(content ?? \"\");\n }\n return content\n .filter(\n (block) => block && typeof block === \"object\" && (block as { type?: unknown }).type === \"text\"\n )\n .map((block) => String((block as { text?: unknown }).text ?? \"\"))\n .join(\"\");\n}\n\nfunction serializeFunctionGemmaValue(value: unknown): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n if (\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null ||\n Array.isArray(value) ||\n typeof value === \"object\"\n ) {\n return JSON.stringify(value);\n }\n return JSON.stringify(String(value));\n}\n\nfunction serializeFunctionGemmaToolCall(name: string, input: Record<string, unknown>): string {\n const args = Object.entries(input)\n .map(([key, value]) => `${key}:${serializeFunctionGemmaValue(value)}`)\n .join(\",\");\n return `call:${name}{${args}}`;\n}\n\nfunction buildFunctionGemmaConversationPrompt(input: ToolCallingTaskInput): string {\n if (!input.messages || input.messages.length === 0) {\n return String(input.prompt);\n }\n\n const turns: string[] = [];\n const toolNamesById = new Map<string, string>();\n\n for (const message of input.messages) {\n if (message.role === \"user\") {\n turns.push(\"user\", extractMessageText(message.content));\n continue;\n }\n\n if (message.role === \"assistant\" && Array.isArray(message.content)) {\n const toolUses = message.content.filter(\n (\n block\n ): block is {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n } => block.type === \"tool_use\"\n );\n const serializedCalls = toolUses.map((block) => {\n toolNamesById.set(block.id, block.name);\n return serializeFunctionGemmaToolCall(block.name, block.input);\n });\n const text = message.content\n .filter((block): block is { type: \"text\"; text: string } => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\")\n .trim();\n const serializedCallText = serializedCalls.join(\"\\n\").trim();\n\n if (\n text &&\n text !== serializedCallText &&\n !serializedCalls.some((call) => text.includes(call))\n ) {\n turns.push(\"model\", text);\n }\n if (serializedCalls.length > 0) {\n turns.push(\"model\", serializedCalls.join(\"\\n\"));\n }\n continue;\n }\n\n if (message.role === \"tool\" && Array.isArray(message.content)) {\n for (const block of message.content) {\n const toolName = toolNamesById.get(block.tool_use_id) ?? \"tool\";\n const resultText = extractMessageText(block.content);\n turns.push(\n \"user\",\n `The function ${toolName} already returned this result: ${resultText}\\n` +\n `Do not call ${toolName} again just to repeat the same lookup.\\n` +\n `If this result answers the user's request, reply with the final answer.\\n` +\n `Only call another function if a different function is still needed to complete the request.`\n );\n }\n }\n }\n\n return turns.join(\"\\n\");\n}\n\nfunction buildFunctionGemmaRawPrompt(\n input: ToolCallingTaskInput,\n systemPrompt: string | undefined\n): string {\n const hasMessages = input.messages && input.messages.length > 0;\n const userPrompt = buildFunctionGemmaConversationPrompt(input);\n\n const parts = [\n \"developer\",\n buildFunctionGemmaDeveloperPrompt(systemPrompt, input.toolChoice === \"required\"),\n buildFunctionGemmaDeclarations(input.tools),\n ];\n\n if (hasMessages) {\n // buildFunctionGemmaConversationPrompt already includes role markers\n parts.push(userPrompt);\n } else {\n parts.push(\"user\", userPrompt);\n }\n\n parts.push(\"model\");\n return parts.join(\"\\n\");\n}\n\n/**\n * If the model requires a raw completion prompt (bypassing LlamaChatSession),\n * returns the prompt string. Otherwise returns `undefined` and the caller\n * should use the normal LlamaChatSession path.\n */\nexport function buildRawCompletionPrompt(\n input: ToolCallingTaskInput,\n model: LlamaCppModelConfig,\n systemPrompt: string | undefined\n): string | undefined {\n if (detectFunctionGemmaModel(model) && input.toolChoice !== \"none\") {\n return buildFunctionGemmaRawPrompt(input, systemPrompt);\n }\n return undefined;\n}\n\n/**\n * Whether the model supports LlamaChatSession's native function calling API.\n * Models that require a raw completion prompt (e.g. FunctionGemma) do not.\n */\nexport function supportsNativeFunctions(\n input: ToolCallingTaskInput,\n model: LlamaCppModelConfig\n): boolean {\n return input.toolChoice !== \"none\" && !detectFunctionGemmaModel(model);\n}\n\n/**\n * Whether the text likely contains tool call markup worth parsing.\n */\nexport function hasToolCallMarkers(text: string): boolean {\n return (\n text.includes(\"<tool_call>\") ||\n text.includes(\"<start_function_call>\") ||\n text.includes(\"<|tool_call_start|>\") ||\n /\\[\\w+\\(/.test(text)\n );\n}\n\n/**\n * Truncate raw completion output at turn boundary markers.\n * FunctionGemma and similar raw-prompt models may generate past their turn,\n * echoing conversation structure (`\\nuser\\n...`, `\\ndeveloper\\n...`).\n */\nexport function truncateAtTurnBoundary(text: string): string {\n const markers = [\"\\nuser\\n\", \"\\ndeveloper\\n\"];\n let truncateAt = text.length;\n for (const marker of markers) {\n const idx = text.indexOf(marker);\n if (idx !== -1 && idx < truncateAt) {\n truncateAt = idx;\n }\n }\n return text.slice(0, truncateAt).trim();\n}\n\n// ============================================================================\n// Qwen detection\n// ============================================================================\n\nexport function detectQwenToolCallingVariation(\n model: LlamaCppModelConfig\n): \"3\" | \"3.5\" | undefined {\n const candidates = getModelTextCandidates(model);\n\n if (\n candidates.some((value) =>\n /\\bqwen(?:[\\s._-]?|)3(?:[\\s._-]?|)5\\b|\\bqwen(?:[\\s._-]?|)3\\.5\\b/.test(value)\n )\n ) {\n return \"3.5\";\n }\n\n if (candidates.some((value) => /\\bqwen(?:[\\s._-]?|)3\\b/.test(value))) {\n return \"3\";\n }\n\n return undefined;\n}\n\n// ============================================================================\n// Tool call extraction using shared parsers\n// ============================================================================\n\nfunction adaptParserResult(result: ToolCallParserResult, input: ToolCallingTaskInput): ToolCalls {\n return result.tool_calls.map((call, index) => ({\n id: call.id ?? `call_${index}`,\n name: resolveParsedToolName(call.name, input),\n input: call.arguments,\n }));\n}\n\nexport function extractToolCallsFromText(\n text: string,\n input: ToolCallingTaskInput,\n model: LlamaCppModelConfig\n): ToolCalls {\n // FunctionGemma models: try dedicated parser first\n if (detectFunctionGemmaModel(model)) {\n const functionGemmaResult = parseFunctionGemma(text);\n if (functionGemmaResult && functionGemmaResult.tool_calls.length > 0) {\n return adaptParserResult(functionGemmaResult, input);\n }\n\n // FunctionGemma loose-object fallback (requires forced tool name)\n const forcedToolName = forcedToolSelection(input);\n const looseObject = forcedToolName ? parseFunctionGemmaLooseObject(text) : undefined;\n if (forcedToolName && looseObject) {\n return [{ id: \"call_0\", name: forcedToolName, input: looseObject }];\n }\n }\n\n // Try Liquid/LFM format: <|tool_call_start|>[func(args)]<|tool_call_end|> or [func(args)]\n const liquidResult = parseLiquid(text);\n if (liquidResult && liquidResult.tool_calls.length > 0) {\n return adaptParserResult(liquidResult, input);\n }\n\n // Try Hermes/JSON format: <tool_call>{\"name\":...}</tool_call>\n const hermesResult = parseHermes(text);\n if (hermesResult && hermesResult.tool_calls.length > 0) {\n return adaptParserResult(hermesResult, input);\n }\n\n // Try Qwen 3.5 XML format: <tool_call><function=name><parameter=...></tool_call>\n const qwen35Result = parseQwen35Xml(text);\n if (qwen35Result && qwen35Result.tool_calls.length > 0) {\n return adaptParserResult(qwen35Result, input);\n }\n\n // Try Llama/bare JSON format: {\"name\": \"func\", \"parameters\"|\"arguments\": {...}}\n const llamaResult = parseLlama(text);\n if (llamaResult && llamaResult.tool_calls.length > 0) {\n return adaptParserResult(llamaResult, input);\n }\n\n return [];\n}\n",
|
|
18
21
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n AiProviderRunFn,\n UnloadModelTaskRunInput,\n UnloadModelTaskRunOutput,\n} from \"@workglow/ai\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport {\n getActualModelPath,\n llamaCppEmbeddingContexts,\n llamaCppModels,\n llamaCppTextContexts,\n} from \"./LlamaCpp_Runtime\";\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 const ctx = llamaCppTextContexts.get(modelPath);\n if (ctx) {\n await ctx.dispose();\n llamaCppTextContexts.delete(modelPath);\n update_progress(33, \"Text context disposed\");\n }\n\n const embCtx = llamaCppEmbeddingContexts.get(modelPath);\n if (embCtx) {\n await embCtx.dispose();\n llamaCppEmbeddingContexts.delete(modelPath);\n update_progress(66, \"Embedding context disposed\");\n }\n\n const cachedModel = llamaCppModels.get(modelPath);\n if (cachedModel) {\n await cachedModel.dispose();\n llamaCppModels.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",
|
|
19
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderReactiveRunFn, AiProviderRunFn, AiProviderStreamFn } from \"@workglow/ai\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport { LlamaCpp_ModelSearch } from \"./LlamaCpp_ModelSearch\";\n\nexport {\n disposeLlamaCppResources,\n loadSdk,\n getLlamaCppSdk,\n getLlamaInstance,\n getOrCreateTextContext,\n getOrCreateEmbeddingContext,\n getOrLoadModel,\n getActualModelPath,\n getConfigKey,\n resolvedPaths,\n streamFromSession,\n} from \"./LlamaCpp_Runtime\";\n\nimport { LlamaCpp_CountTokens, LlamaCpp_CountTokens_Reactive } from \"./LlamaCpp_CountTokens\";\nimport { LlamaCpp_Download } from \"./LlamaCpp_Download\";\nimport { LlamaCpp_ModelInfo } from \"./LlamaCpp_ModelInfo\";\nimport {\n LlamaCpp_StructuredGeneration,\n LlamaCpp_StructuredGeneration_Stream,\n} from \"./LlamaCpp_StructuredGeneration\";\nimport { LlamaCpp_TextEmbedding } from \"./LlamaCpp_TextEmbedding\";\nimport { LlamaCpp_TextGeneration, LlamaCpp_TextGeneration_Stream } from \"./LlamaCpp_TextGeneration\";\nimport { LlamaCpp_TextRewriter, LlamaCpp_TextRewriter_Stream } from \"./LlamaCpp_TextRewriter\";\nimport { LlamaCpp_TextSummary, LlamaCpp_TextSummary_Stream } from \"./LlamaCpp_TextSummary\";\nimport { LlamaCpp_Unload } from \"./LlamaCpp_Unload\";\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 StructuredGenerationTask: LlamaCpp_StructuredGeneration,\n ModelSearchTask: LlamaCpp_ModelSearch,\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 StructuredGenerationTask: LlamaCpp_StructuredGeneration_Stream,\n};\n\nexport const LLAMACPP_REACTIVE_TASKS: Record<\n string,\n AiProviderReactiveRunFn<any, any, LlamaCppModelConfig>\n> = {\n CountTokensTask: LlamaCpp_CountTokens_Reactive,\n};\n",
|
|
20
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\
|
|
22
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderReactiveRunFn, AiProviderRunFn, AiProviderStreamFn } from \"@workglow/ai\";\nimport type { LlamaCppModelConfig } from \"./LlamaCpp_ModelSchema\";\nimport { LlamaCpp_ModelSearch } from \"./LlamaCpp_ModelSearch\";\n\nexport {\n disposeLlamaCppResources,\n loadSdk,\n getLlamaCppSdk,\n getLlamaInstance,\n getOrCreateTextContext,\n getOrCreateEmbeddingContext,\n getOrLoadModel,\n getActualModelPath,\n getConfigKey,\n resolvedPaths,\n streamFromSession,\n} from \"./LlamaCpp_Runtime\";\n\nimport { LlamaCpp_CountTokens, LlamaCpp_CountTokens_Reactive } from \"./LlamaCpp_CountTokens\";\nimport { LlamaCpp_Download } from \"./LlamaCpp_Download\";\nimport { LlamaCpp_ModelInfo } from \"./LlamaCpp_ModelInfo\";\nimport {\n LlamaCpp_StructuredGeneration,\n LlamaCpp_StructuredGeneration_Stream,\n} from \"./LlamaCpp_StructuredGeneration\";\nimport { LlamaCpp_TextEmbedding } from \"./LlamaCpp_TextEmbedding\";\nimport { LlamaCpp_TextGeneration, LlamaCpp_TextGeneration_Stream } from \"./LlamaCpp_TextGeneration\";\nimport { LlamaCpp_TextRewriter, LlamaCpp_TextRewriter_Stream } from \"./LlamaCpp_TextRewriter\";\nimport { LlamaCpp_TextSummary, LlamaCpp_TextSummary_Stream } from \"./LlamaCpp_TextSummary\";\nimport { LlamaCpp_ToolCalling, LlamaCpp_ToolCalling_Stream } from \"./LlamaCpp_ToolCalling\";\nimport { LlamaCpp_Unload } from \"./LlamaCpp_Unload\";\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 StructuredGenerationTask: LlamaCpp_StructuredGeneration,\n ModelSearchTask: LlamaCpp_ModelSearch,\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 StructuredGenerationTask: LlamaCpp_StructuredGeneration_Stream,\n};\n\nexport const LLAMACPP_REACTIVE_TASKS: Record<\n string,\n AiProviderReactiveRunFn<any, any, LlamaCppModelConfig>\n> = {\n CountTokensTask: LlamaCpp_CountTokens_Reactive,\n};\n",
|
|
23
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { QueuedAiProvider } from \"@workglow/ai\";\nimport type { AiProviderReactiveRunFn, AiProviderRunFn, AiProviderStreamFn } from \"@workglow/ai\";\nimport { LOCAL_LLAMACPP } from \"./common/LlamaCpp_Constants\";\nimport type { LlamaCppModelConfig } from \"./common/LlamaCpp_ModelSchema\";\n\n/** Main-thread registration (inline or worker-backed); creates the default job queue. */\nexport class LlamaCppQueuedProvider extends QueuedAiProvider<LlamaCppModelConfig> {\n readonly name = LOCAL_LLAMACPP;\n readonly displayName = \"Local llama.cpp\";\n readonly isLocal = true;\n readonly supportsBrowser = false;\n\n readonly taskTypes = [\n \"DownloadModelTask\",\n \"UnloadModelTask\",\n \"ModelInfoTask\",\n \"CountTokensTask\",\n \"TextGenerationTask\",\n \"TextEmbeddingTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"ToolCallingTask\",\n \"ModelSearchTask\",\n ] as const;\n\n constructor(\n tasks?: Record<string, AiProviderRunFn<any, any, LlamaCppModelConfig>>,\n streamTasks?: Record<string, AiProviderStreamFn<any, any, LlamaCppModelConfig>>,\n reactiveTasks?: Record<string, AiProviderReactiveRunFn<any, any, LlamaCppModelConfig>>\n ) {\n super(tasks, streamTasks, reactiveTasks);\n }\n}\n",
|
|
21
24
|
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { AiProviderRegisterOptions } from \"@workglow/ai\";\nimport {\n LLAMACPP_REACTIVE_TASKS,\n LLAMACPP_STREAM_TASKS,\n LLAMACPP_TASKS,\n} from \"./common/LlamaCpp_JobRunFns\";\nimport { LlamaCppQueuedProvider } from \"./LlamaCppQueuedProvider\";\n\nexport async function registerLlamaCppInline(options?: AiProviderRegisterOptions): Promise<void> {\n await new LlamaCppQueuedProvider(\n LLAMACPP_TASKS,\n LLAMACPP_STREAM_TASKS,\n LLAMACPP_REACTIVE_TASKS\n ).register(options ?? {});\n}\n",
|
|
22
25
|
"/**\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/worker\";\nimport {\n LLAMACPP_REACTIVE_TASKS,\n LLAMACPP_STREAM_TASKS,\n LLAMACPP_TASKS,\n} from \"./common/LlamaCpp_JobRunFns\";\nimport { LlamaCppProvider } from \"./LlamaCppProvider\";\n\nexport async function registerLlamaCppWorker(): Promise<void> {\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 job run functions registered\");\n}\n",
|
|
23
|
-
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n
|
|
26
|
+
"/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AiProvider } from \"@workglow/ai/worker\";\nimport type {\n AiProviderReactiveRunFn,\n AiProviderRunFn,\n AiProviderStreamFn,\n} from \"@workglow/ai/worker\";\nimport { LOCAL_LLAMACPP } from \"./common/LlamaCpp_Constants\";\nimport type { LlamaCppModelConfig } from \"./common/LlamaCpp_ModelSchema\";\n\n/**\n * AI provider for running GGUF models locally via node-llama-cpp.\n *\n * Supports model downloading, unloading, text generation, text embedding,\n * text rewriting, and text summarization using llama.cpp under the hood.\n *\n * This provider is server-side only (Node.js/Bun) — it requires native binaries\n * and cannot run in the browser.\n *\n * Models are cached in memory after the first load. Use UnloadModelTask to\n * release memory when a model is no longer needed.\n */\nexport class LlamaCppProvider extends AiProvider<LlamaCppModelConfig> {\n readonly name = LOCAL_LLAMACPP;\n readonly displayName = \"Local llama.cpp\";\n readonly isLocal = true;\n readonly supportsBrowser = false;\n\n readonly taskTypes = [\n \"DownloadModelTask\",\n \"UnloadModelTask\",\n \"ModelInfoTask\",\n \"CountTokensTask\",\n \"TextGenerationTask\",\n \"TextEmbeddingTask\",\n \"TextRewriterTask\",\n \"TextSummaryTask\",\n \"ToolCallingTask\",\n \"ModelSearchTask\",\n ] as const;\n\n constructor(\n tasks?: Record<string, AiProviderRunFn<any, any, LlamaCppModelConfig>>,\n streamTasks?: Record<string, AiProviderStreamFn<any, any, LlamaCppModelConfig>>,\n reactiveTasks?: Record<string, AiProviderReactiveRunFn<any, any, LlamaCppModelConfig>>\n ) {\n super(tasks, streamTasks, reactiveTasks);\n }\n}\n"
|
|
24
27
|
],
|
|
25
|
-
"mappings": "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",
|
|
26
|
-
"debugId": "
|
|
28
|
+
"mappings": "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",
|
|
29
|
+
"debugId": "86AE88EC6A1801D664756E2164756E21",
|
|
27
30
|
"names": []
|
|
28
31
|
}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { AiProvider
|
|
6
|
+
import { AiProvider } from "@workglow/ai/worker";
|
|
7
|
+
import type { AiProviderReactiveRunFn, AiProviderRunFn, AiProviderStreamFn } from "@workglow/ai/worker";
|
|
7
8
|
import type { OllamaModelConfig } from "./common/Ollama_ModelSchema";
|
|
8
9
|
/**
|
|
9
10
|
* AI provider for Ollama local LLM server.
|
|
@@ -23,7 +24,7 @@ export declare class OllamaProvider extends AiProvider<OllamaModelConfig> {
|
|
|
23
24
|
readonly displayName = "Ollama";
|
|
24
25
|
readonly isLocal = true;
|
|
25
26
|
readonly supportsBrowser = true;
|
|
26
|
-
readonly taskTypes: readonly ["ModelInfoTask", "TextGenerationTask", "TextEmbeddingTask", "TextRewriterTask", "TextSummaryTask", "ModelSearchTask"];
|
|
27
|
+
readonly taskTypes: readonly ["ModelInfoTask", "TextGenerationTask", "TextEmbeddingTask", "TextRewriterTask", "TextSummaryTask", "ToolCallingTask", "ModelSearchTask"];
|
|
27
28
|
constructor(tasks?: Record<string, AiProviderRunFn<any, any, OllamaModelConfig>>, streamTasks?: Record<string, AiProviderStreamFn<any, any, OllamaModelConfig>>, reactiveTasks?: Record<string, AiProviderReactiveRunFn<any, any, OllamaModelConfig>>);
|
|
28
29
|
}
|
|
29
30
|
//# sourceMappingURL=OllamaProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OllamaProvider.d.ts","sourceRoot":"","sources":["../../src/provider-ollama/OllamaProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"OllamaProvider.d.ts","sourceRoot":"","sources":["../../src/provider-ollama/OllamaProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EACV,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAe,SAAQ,UAAU,CAAC,iBAAiB,CAAC;IAC/D,QAAQ,CAAC,IAAI,YAAU;IACvB,QAAQ,CAAC,WAAW,YAAY;IAChC,QAAQ,CAAC,OAAO,QAAQ;IACxB,QAAQ,CAAC,eAAe,QAAQ;IAEhC,QAAQ,CAAC,SAAS,YAChB,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACR;IAEX,YACE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EACpE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAC7E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAGrF;CACF"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* Copyright 2025 Steven Roussey <sroussey@gmail.com>
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { AiProvider
|
|
6
|
+
import { AiProvider } from "@workglow/ai";
|
|
7
|
+
import type { AiProviderReactiveRunFn, AiProviderRunFn, AiProviderStreamFn } from "@workglow/ai";
|
|
7
8
|
import type { OllamaModelConfig } from "./common/Ollama_ModelSchema";
|
|
8
9
|
/** Main-thread registration (inline or worker-backed). No queue — uses direct execution. */
|
|
9
10
|
export declare class OllamaQueuedProvider extends AiProvider<OllamaModelConfig> {
|
|
@@ -11,7 +12,7 @@ export declare class OllamaQueuedProvider extends AiProvider<OllamaModelConfig>
|
|
|
11
12
|
readonly displayName = "Ollama";
|
|
12
13
|
readonly isLocal = true;
|
|
13
14
|
readonly supportsBrowser = true;
|
|
14
|
-
readonly taskTypes: readonly ["ModelInfoTask", "TextGenerationTask", "TextEmbeddingTask", "TextRewriterTask", "TextSummaryTask", "ModelSearchTask"];
|
|
15
|
+
readonly taskTypes: readonly ["ModelInfoTask", "TextGenerationTask", "TextEmbeddingTask", "TextRewriterTask", "TextSummaryTask", "ToolCallingTask", "ModelSearchTask"];
|
|
15
16
|
constructor(tasks?: Record<string, AiProviderRunFn<any, any, OllamaModelConfig>>, streamTasks?: Record<string, AiProviderStreamFn<any, any, OllamaModelConfig>>, reactiveTasks?: Record<string, AiProviderReactiveRunFn<any, any, OllamaModelConfig>>);
|
|
16
17
|
}
|
|
17
18
|
//# sourceMappingURL=OllamaQueuedProvider.d.ts.map
|