@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.
Files changed (135) hide show
  1. package/dist/common/ToolCallParsers.d.ts +253 -0
  2. package/dist/common/ToolCallParsers.d.ts.map +1 -0
  3. package/dist/provider-anthropic/AnthropicProvider.d.ts +3 -2
  4. package/dist/provider-anthropic/AnthropicProvider.d.ts.map +1 -1
  5. package/dist/provider-anthropic/AnthropicQueuedProvider.d.ts +3 -2
  6. package/dist/provider-anthropic/AnthropicQueuedProvider.d.ts.map +1 -1
  7. package/dist/provider-anthropic/common/Anthropic_Client.d.ts.map +1 -1
  8. package/dist/provider-anthropic/common/Anthropic_JobRunFns.d.ts.map +1 -1
  9. package/dist/provider-anthropic/common/Anthropic_ToolCalling.d.ts +10 -0
  10. package/dist/provider-anthropic/common/Anthropic_ToolCalling.d.ts.map +1 -0
  11. package/dist/provider-anthropic/index.js +3 -4
  12. package/dist/provider-anthropic/index.js.map +3 -3
  13. package/dist/provider-anthropic/runtime.js +225 -8
  14. package/dist/provider-anthropic/runtime.js.map +9 -8
  15. package/dist/provider-chrome/WebBrowserProvider.d.ts +2 -1
  16. package/dist/provider-chrome/WebBrowserProvider.d.ts.map +1 -1
  17. package/dist/provider-chrome/WebBrowserQueuedProvider.d.ts +2 -1
  18. package/dist/provider-chrome/WebBrowserQueuedProvider.d.ts.map +1 -1
  19. package/dist/provider-chrome/index.js +2 -4
  20. package/dist/provider-chrome/index.js.map +3 -3
  21. package/dist/provider-chrome/runtime.js +3 -7
  22. package/dist/provider-chrome/runtime.js.map +4 -4
  23. package/dist/provider-gemini/GoogleGeminiProvider.d.ts +3 -2
  24. package/dist/provider-gemini/GoogleGeminiProvider.d.ts.map +1 -1
  25. package/dist/provider-gemini/GoogleGeminiQueuedProvider.d.ts +3 -2
  26. package/dist/provider-gemini/GoogleGeminiQueuedProvider.d.ts.map +1 -1
  27. package/dist/provider-gemini/common/Gemini_JobRunFns.d.ts.map +1 -1
  28. package/dist/provider-gemini/common/Gemini_ToolCalling.d.ts +10 -0
  29. package/dist/provider-gemini/common/Gemini_ToolCalling.d.ts.map +1 -0
  30. package/dist/provider-gemini/index.js +3 -4
  31. package/dist/provider-gemini/index.js.map +3 -3
  32. package/dist/provider-gemini/runtime.js +188 -8
  33. package/dist/provider-gemini/runtime.js.map +7 -6
  34. package/dist/provider-hf-inference/HfInferenceProvider.d.ts +3 -2
  35. package/dist/provider-hf-inference/HfInferenceProvider.d.ts.map +1 -1
  36. package/dist/provider-hf-inference/HfInferenceQueuedProvider.d.ts +3 -2
  37. package/dist/provider-hf-inference/HfInferenceQueuedProvider.d.ts.map +1 -1
  38. package/dist/provider-hf-inference/common/HFI_JobRunFns.d.ts.map +1 -1
  39. package/dist/provider-hf-inference/common/HFI_ToolCalling.d.ts +10 -0
  40. package/dist/provider-hf-inference/common/HFI_ToolCalling.d.ts.map +1 -0
  41. package/dist/provider-hf-inference/index.js +3 -4
  42. package/dist/provider-hf-inference/index.js.map +3 -3
  43. package/dist/provider-hf-inference/runtime.js +157 -8
  44. package/dist/provider-hf-inference/runtime.js.map +7 -6
  45. package/dist/provider-hf-transformers/HuggingFaceTransformersProvider.d.ts +3 -2
  46. package/dist/provider-hf-transformers/HuggingFaceTransformersProvider.d.ts.map +1 -1
  47. package/dist/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.d.ts +3 -3
  48. package/dist/provider-hf-transformers/HuggingFaceTransformersQueuedProvider.d.ts.map +1 -1
  49. package/dist/provider-hf-transformers/common/HFT_JobRunFns.d.ts +52 -0
  50. package/dist/provider-hf-transformers/common/HFT_JobRunFns.d.ts.map +1 -1
  51. package/dist/provider-hf-transformers/common/HFT_Pipeline.d.ts +1 -1
  52. package/dist/provider-hf-transformers/common/HFT_Pipeline.d.ts.map +1 -1
  53. package/dist/provider-hf-transformers/common/HFT_StructuredGeneration.d.ts.map +1 -1
  54. package/dist/provider-hf-transformers/common/HFT_TextClassification.d.ts.map +1 -1
  55. package/dist/provider-hf-transformers/common/HFT_TextQuestionAnswer.d.ts.map +1 -1
  56. package/dist/provider-hf-transformers/common/HFT_TextSummary.d.ts.map +1 -1
  57. package/dist/provider-hf-transformers/common/HFT_TextTranslation.d.ts.map +1 -1
  58. package/dist/provider-hf-transformers/common/HFT_ToolCalling.d.ts +10 -0
  59. package/dist/provider-hf-transformers/common/HFT_ToolCalling.d.ts.map +1 -0
  60. package/dist/provider-hf-transformers/common/HFT_ToolMarkup.d.ts +20 -0
  61. package/dist/provider-hf-transformers/common/HFT_ToolMarkup.d.ts.map +1 -0
  62. package/dist/provider-hf-transformers/common/HFT_ToolParser.d.ts +67 -0
  63. package/dist/provider-hf-transformers/common/HFT_ToolParser.d.ts.map +1 -0
  64. package/dist/provider-hf-transformers/index.d.ts +1 -0
  65. package/dist/provider-hf-transformers/index.d.ts.map +1 -1
  66. package/dist/provider-hf-transformers/index.js +71 -7
  67. package/dist/provider-hf-transformers/index.js.map +7 -6
  68. package/dist/provider-hf-transformers/runtime.d.ts +1 -0
  69. package/dist/provider-hf-transformers/runtime.d.ts.map +1 -1
  70. package/dist/provider-hf-transformers/runtime.js +1244 -13
  71. package/dist/provider-hf-transformers/runtime.js.map +18 -15
  72. package/dist/provider-llamacpp/LlamaCppProvider.d.ts +3 -2
  73. package/dist/provider-llamacpp/LlamaCppProvider.d.ts.map +1 -1
  74. package/dist/provider-llamacpp/LlamaCppQueuedProvider.d.ts +3 -2
  75. package/dist/provider-llamacpp/LlamaCppQueuedProvider.d.ts.map +1 -1
  76. package/dist/provider-llamacpp/common/LlamaCpp_JobRunFns.d.ts.map +1 -1
  77. package/dist/provider-llamacpp/common/LlamaCpp_ToolCalling.d.ts +10 -0
  78. package/dist/provider-llamacpp/common/LlamaCpp_ToolCalling.d.ts.map +1 -0
  79. package/dist/provider-llamacpp/common/LlamaCpp_ToolParser.d.ts +35 -0
  80. package/dist/provider-llamacpp/common/LlamaCpp_ToolParser.d.ts.map +1 -0
  81. package/dist/provider-llamacpp/index.js +3 -4
  82. package/dist/provider-llamacpp/index.js.map +3 -3
  83. package/dist/provider-llamacpp/runtime.js +1394 -9
  84. package/dist/provider-llamacpp/runtime.js.map +11 -8
  85. package/dist/provider-ollama/OllamaProvider.d.ts +3 -2
  86. package/dist/provider-ollama/OllamaProvider.d.ts.map +1 -1
  87. package/dist/provider-ollama/OllamaQueuedProvider.d.ts +3 -2
  88. package/dist/provider-ollama/OllamaQueuedProvider.d.ts.map +1 -1
  89. package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts +47 -1
  90. package/dist/provider-ollama/common/Ollama_JobRunFns.browser.d.ts.map +1 -1
  91. package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts +46 -0
  92. package/dist/provider-ollama/common/Ollama_JobRunFns.d.ts.map +1 -1
  93. package/dist/provider-ollama/common/Ollama_ToolCalling.d.ts +16 -0
  94. package/dist/provider-ollama/common/Ollama_ToolCalling.d.ts.map +1 -0
  95. package/dist/provider-ollama/index.browser.js +3 -4
  96. package/dist/provider-ollama/index.browser.js.map +3 -3
  97. package/dist/provider-ollama/index.js +3 -4
  98. package/dist/provider-ollama/index.js.map +3 -3
  99. package/dist/provider-ollama/runtime.browser.js +130 -8
  100. package/dist/provider-ollama/runtime.browser.js.map +8 -7
  101. package/dist/provider-ollama/runtime.js +125 -8
  102. package/dist/provider-ollama/runtime.js.map +8 -7
  103. package/dist/provider-openai/OpenAiProvider.d.ts +3 -2
  104. package/dist/provider-openai/OpenAiProvider.d.ts.map +1 -1
  105. package/dist/provider-openai/OpenAiQueuedProvider.d.ts +3 -2
  106. package/dist/provider-openai/OpenAiQueuedProvider.d.ts.map +1 -1
  107. package/dist/provider-openai/common/OpenAI_Client.d.ts.map +1 -1
  108. package/dist/provider-openai/common/OpenAI_JobRunFns.browser.d.ts.map +1 -1
  109. package/dist/provider-openai/common/OpenAI_JobRunFns.d.ts.map +1 -1
  110. package/dist/provider-openai/common/OpenAI_ToolCalling.d.ts +10 -0
  111. package/dist/provider-openai/common/OpenAI_ToolCalling.d.ts.map +1 -0
  112. package/dist/provider-openai/index.browser.js +3 -4
  113. package/dist/provider-openai/index.browser.js.map +3 -3
  114. package/dist/provider-openai/index.js +3 -4
  115. package/dist/provider-openai/index.js.map +3 -3
  116. package/dist/provider-openai/runtime.browser.js +138 -8
  117. package/dist/provider-openai/runtime.browser.js.map +8 -7
  118. package/dist/provider-openai/runtime.js +138 -8
  119. package/dist/provider-openai/runtime.js.map +8 -7
  120. package/dist/provider-tf-mediapipe/TensorFlowMediaPipeProvider.d.ts +2 -1
  121. package/dist/provider-tf-mediapipe/TensorFlowMediaPipeProvider.d.ts.map +1 -1
  122. package/dist/provider-tf-mediapipe/TensorFlowMediaPipeQueuedProvider.d.ts +2 -1
  123. package/dist/provider-tf-mediapipe/TensorFlowMediaPipeQueuedProvider.d.ts.map +1 -1
  124. package/dist/provider-tf-mediapipe/common/TFMP_Download.d.ts.map +1 -1
  125. package/dist/provider-tf-mediapipe/common/TFMP_ImageClassification.d.ts.map +1 -1
  126. package/dist/provider-tf-mediapipe/common/TFMP_Runtime.d.ts +1 -1
  127. package/dist/provider-tf-mediapipe/common/TFMP_Runtime.d.ts.map +1 -1
  128. package/dist/provider-tf-mediapipe/index.js.map +2 -2
  129. package/dist/provider-tf-mediapipe/runtime.js +2 -4
  130. package/dist/provider-tf-mediapipe/runtime.js.map +13 -13
  131. package/dist/test.d.ts +7 -0
  132. package/dist/test.d.ts.map +1 -0
  133. package/dist/test.js +913 -0
  134. package/dist/test.js.map +10 -0
  135. package/package.json +24 -17
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/common/ToolCallParsers.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * @license\n * Copyright 2025 Steven Roussey <sroussey@gmail.com>\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { 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"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "846853B19CC40B4B64756E2164756E21",
9
+ "names": []
10
+ }
package/package.json CHANGED
@@ -2,25 +2,32 @@
2
2
  "name": "@workglow/ai-provider",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.1.2",
5
+ "version": "0.2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/workglow-dev/workglow.git",
9
+ "directory": "packages/ai-provider"
10
+ },
6
11
  "description": "AI provider integrations for Workglow, supporting OpenAI, Hugging Face Transformers, MediaPipe, and GGML models.",
7
12
  "scripts": {
8
13
  "watch": "concurrently -c 'auto' 'bun:watch-*'",
9
- "watch-js": "concurrently -c 'auto' -n 'code,browser' 'bun run watch-code' 'bun run watch-browser'",
10
- "watch-code": "bun build --watch --no-clear-screen --sourcemap=external --packages=external --root ./src --outdir ./dist ./src/provider-anthropic/index.ts ./src/provider-anthropic/runtime.ts ./src/provider-gemini/index.ts ./src/provider-gemini/runtime.ts ./src/provider-hf-transformers/index.ts ./src/provider-hf-transformers/runtime.ts ./src/provider-llamacpp/index.ts ./src/provider-llamacpp/runtime.ts ./src/provider-hf-inference/index.ts ./src/provider-hf-inference/runtime.ts ./src/provider-ollama/index.ts ./src/provider-ollama/runtime.ts ./src/provider-openai/index.ts ./src/provider-openai/runtime.ts ./src/provider-chrome/index.ts ./src/provider-chrome/runtime.ts",
14
+ "watch-code": "bun build --watch --no-clear-screen --sourcemap=external --packages=external --root ./src --outdir ./dist ./src/provider-anthropic/index.ts ./src/provider-anthropic/runtime.ts ./src/provider-gemini/index.ts ./src/provider-gemini/runtime.ts ./src/provider-hf-transformers/index.ts ./src/provider-hf-transformers/runtime.ts ./src/provider-llamacpp/index.ts ./src/provider-llamacpp/runtime.ts ./src/provider-hf-inference/index.ts ./src/provider-hf-inference/runtime.ts ./src/provider-ollama/index.ts ./src/provider-ollama/runtime.ts ./src/provider-openai/index.ts ./src/provider-openai/runtime.ts ./src/provider-chrome/index.ts ./src/provider-chrome/runtime.ts ./src/test.ts",
11
15
  "watch-browser": "bun build --watch --no-clear-screen --target=browser --sourcemap=external --packages=external --outdir ./dist ./src/provider-ollama/index.browser.ts ./src/provider-ollama/runtime.browser.ts ./src/provider-openai/index.browser.ts ./src/provider-openai/runtime.browser.ts ./src/provider-tf-mediapipe/index.ts ./src/provider-tf-mediapipe/runtime.ts ./src/provider-chrome/index.ts",
12
16
  "watch-types": "tsc --watch --preserveWatchOutput",
13
17
  "build-package": "concurrently -c 'auto' -n 'code,browser,types' 'bun run build-code' 'bun run build-browser' 'bun run build-types'",
14
18
  "build-js": "concurrently -c 'auto' -n 'code,browser' 'bun run build-code' 'bun run build-browser'",
15
19
  "build-clean": "rm -fr dist/* tsconfig.tsbuildinfo",
16
- "build-code": "bun build --sourcemap=external --packages=external --root ./src --outdir ./dist ./src/provider-anthropic/index.ts ./src/provider-anthropic/runtime.ts ./src/provider-gemini/index.ts ./src/provider-gemini/runtime.ts ./src/provider-hf-transformers/index.ts ./src/provider-hf-transformers/runtime.ts ./src/provider-llamacpp/index.ts ./src/provider-llamacpp/runtime.ts ./src/provider-hf-inference/index.ts ./src/provider-hf-inference/runtime.ts ./src/provider-ollama/index.ts ./src/provider-ollama/runtime.ts ./src/provider-openai/index.ts ./src/provider-openai/runtime.ts ./src/provider-chrome/index.ts ./src/provider-chrome/runtime.ts",
20
+ "build-code": "bun build --sourcemap=external --packages=external --root ./src --outdir ./dist ./src/provider-anthropic/index.ts ./src/provider-anthropic/runtime.ts ./src/provider-gemini/index.ts ./src/provider-gemini/runtime.ts ./src/provider-hf-transformers/index.ts ./src/provider-hf-transformers/runtime.ts ./src/provider-llamacpp/index.ts ./src/provider-llamacpp/runtime.ts ./src/provider-hf-inference/index.ts ./src/provider-hf-inference/runtime.ts ./src/provider-ollama/index.ts ./src/provider-ollama/runtime.ts ./src/provider-openai/index.ts ./src/provider-openai/runtime.ts ./src/provider-chrome/index.ts ./src/provider-chrome/runtime.ts ./src/test.ts",
17
21
  "build-browser": "bun build --target=browser --sourcemap=external --packages=external --outdir ./dist ./src/provider-ollama/index.browser.ts ./src/provider-ollama/runtime.browser.ts ./src/provider-openai/index.browser.ts ./src/provider-openai/runtime.browser.ts ./src/provider-tf-mediapipe/index.ts ./src/provider-tf-mediapipe/runtime.ts ./src/provider-chrome/index.ts",
18
22
  "build-types": "rm -f tsconfig.tsbuildinfo && tsgo",
19
23
  "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
20
24
  "test": "bun test"
21
25
  },
22
26
  "exports": {
23
- "./src/*": "./src/*",
27
+ "./test": {
28
+ "types": "./dist/test.d.ts",
29
+ "import": "./dist/test.js"
30
+ },
24
31
  "./anthropic": {
25
32
  "types": "./dist/provider-anthropic/index.d.ts",
26
33
  "import": "./dist/provider-anthropic/index.js"
@@ -118,11 +125,11 @@
118
125
  "access": "public"
119
126
  },
120
127
  "peerDependencies": {
121
- "@workglow/ai": "0.1.2",
122
- "@workglow/job-queue": "0.1.2",
123
- "@workglow/storage": "0.1.2",
124
- "@workglow/task-graph": "0.1.2",
125
- "@workglow/util": "0.1.2",
128
+ "@workglow/ai": "0.2.0",
129
+ "@workglow/job-queue": "0.2.0",
130
+ "@workglow/storage": "0.2.0",
131
+ "@workglow/task-graph": "0.2.0",
132
+ "@workglow/util": "0.2.0",
126
133
  "@huggingface/transformers": "^4.0.1",
127
134
  "@mediapipe/tasks-text": "^0.10.34",
128
135
  "@mediapipe/tasks-vision": "^0.10.34",
@@ -131,7 +138,7 @@
131
138
  "openai": "^6.33.0",
132
139
  "tiktoken": "^1.0.22",
133
140
  "js-tiktoken": "^1.0.16",
134
- "@anthropic-ai/sdk": "^0.82.0",
141
+ "@anthropic-ai/sdk": "^0.86.1",
135
142
  "@google/generative-ai": "^0.24.1",
136
143
  "node-llama-cpp": "^3.18.1",
137
144
  "@huggingface/inference": "^4.13.15",
@@ -194,7 +201,7 @@
194
201
  }
195
202
  },
196
203
  "devDependencies": {
197
- "@anthropic-ai/sdk": "^0.82.0",
204
+ "@anthropic-ai/sdk": "^0.86.1",
198
205
  "@google/generative-ai": "^0.24.1",
199
206
  "@huggingface/inference": "^4.13.15",
200
207
  "@mediapipe/tasks-audio": "^0.10.34",
@@ -202,11 +209,11 @@
202
209
  "@mediapipe/tasks-text": "^0.10.34",
203
210
  "@mediapipe/tasks-vision": "^0.10.34",
204
211
  "@huggingface/transformers": "^4.0.1",
205
- "@workglow/ai": "0.1.2",
206
- "@workglow/job-queue": "0.1.2",
207
- "@workglow/storage": "0.1.2",
208
- "@workglow/task-graph": "0.1.2",
209
- "@workglow/util": "0.1.2",
212
+ "@workglow/ai": "0.2.0",
213
+ "@workglow/job-queue": "0.2.0",
214
+ "@workglow/storage": "0.2.0",
215
+ "@workglow/task-graph": "0.2.0",
216
+ "@workglow/util": "0.2.0",
210
217
  "node-llama-cpp": "^3.18.1",
211
218
  "ollama": "^0.6.3",
212
219
  "openai": "^6.33.0",