@runanywhere/web 0.1.0-beta.1

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 (205) hide show
  1. package/README.md +795 -0
  2. package/dist/Foundation/ErrorTypes.d.ts +61 -0
  3. package/dist/Foundation/ErrorTypes.d.ts.map +1 -0
  4. package/dist/Foundation/ErrorTypes.js +90 -0
  5. package/dist/Foundation/ErrorTypes.js.map +1 -0
  6. package/dist/Foundation/EventBus.d.ts +171 -0
  7. package/dist/Foundation/EventBus.d.ts.map +1 -0
  8. package/dist/Foundation/EventBus.js +113 -0
  9. package/dist/Foundation/EventBus.js.map +1 -0
  10. package/dist/Foundation/PlatformAdapter.d.ts +101 -0
  11. package/dist/Foundation/PlatformAdapter.d.ts.map +1 -0
  12. package/dist/Foundation/PlatformAdapter.js +417 -0
  13. package/dist/Foundation/PlatformAdapter.js.map +1 -0
  14. package/dist/Foundation/SDKLogger.d.ts +33 -0
  15. package/dist/Foundation/SDKLogger.d.ts.map +1 -0
  16. package/dist/Foundation/SDKLogger.js +82 -0
  17. package/dist/Foundation/SDKLogger.js.map +1 -0
  18. package/dist/Foundation/SherpaONNXBridge.d.ts +134 -0
  19. package/dist/Foundation/SherpaONNXBridge.d.ts.map +1 -0
  20. package/dist/Foundation/SherpaONNXBridge.js +332 -0
  21. package/dist/Foundation/SherpaONNXBridge.js.map +1 -0
  22. package/dist/Foundation/StructOffsets.d.ts +147 -0
  23. package/dist/Foundation/StructOffsets.d.ts.map +1 -0
  24. package/dist/Foundation/StructOffsets.js +161 -0
  25. package/dist/Foundation/StructOffsets.js.map +1 -0
  26. package/dist/Foundation/WASMBridge.d.ts +241 -0
  27. package/dist/Foundation/WASMBridge.d.ts.map +1 -0
  28. package/dist/Foundation/WASMBridge.js +393 -0
  29. package/dist/Foundation/WASMBridge.js.map +1 -0
  30. package/dist/Infrastructure/ArchiveUtility.d.ts +25 -0
  31. package/dist/Infrastructure/ArchiveUtility.d.ts.map +1 -0
  32. package/dist/Infrastructure/ArchiveUtility.js +139 -0
  33. package/dist/Infrastructure/ArchiveUtility.js.map +1 -0
  34. package/dist/Infrastructure/AudioCapture.d.ts +87 -0
  35. package/dist/Infrastructure/AudioCapture.d.ts.map +1 -0
  36. package/dist/Infrastructure/AudioCapture.js +231 -0
  37. package/dist/Infrastructure/AudioCapture.js.map +1 -0
  38. package/dist/Infrastructure/AudioPlayback.d.ts +53 -0
  39. package/dist/Infrastructure/AudioPlayback.d.ts.map +1 -0
  40. package/dist/Infrastructure/AudioPlayback.js +117 -0
  41. package/dist/Infrastructure/AudioPlayback.js.map +1 -0
  42. package/dist/Infrastructure/DeviceCapabilities.d.ts +39 -0
  43. package/dist/Infrastructure/DeviceCapabilities.d.ts.map +1 -0
  44. package/dist/Infrastructure/DeviceCapabilities.js +111 -0
  45. package/dist/Infrastructure/DeviceCapabilities.js.map +1 -0
  46. package/dist/Infrastructure/ExtensionRegistry.d.ts +30 -0
  47. package/dist/Infrastructure/ExtensionRegistry.d.ts.map +1 -0
  48. package/dist/Infrastructure/ExtensionRegistry.js +41 -0
  49. package/dist/Infrastructure/ExtensionRegistry.js.map +1 -0
  50. package/dist/Infrastructure/ModelDownloader.d.ts +98 -0
  51. package/dist/Infrastructure/ModelDownloader.d.ts.map +1 -0
  52. package/dist/Infrastructure/ModelDownloader.js +431 -0
  53. package/dist/Infrastructure/ModelDownloader.js.map +1 -0
  54. package/dist/Infrastructure/ModelLoaderTypes.d.ts +34 -0
  55. package/dist/Infrastructure/ModelLoaderTypes.d.ts.map +1 -0
  56. package/dist/Infrastructure/ModelLoaderTypes.js +12 -0
  57. package/dist/Infrastructure/ModelLoaderTypes.js.map +1 -0
  58. package/dist/Infrastructure/ModelManager.d.ts +219 -0
  59. package/dist/Infrastructure/ModelManager.d.ts.map +1 -0
  60. package/dist/Infrastructure/ModelManager.js +885 -0
  61. package/dist/Infrastructure/ModelManager.js.map +1 -0
  62. package/dist/Infrastructure/ModelRegistry.d.ts +131 -0
  63. package/dist/Infrastructure/ModelRegistry.d.ts.map +1 -0
  64. package/dist/Infrastructure/ModelRegistry.js +122 -0
  65. package/dist/Infrastructure/ModelRegistry.js.map +1 -0
  66. package/dist/Infrastructure/OPFSStorage.d.ts +143 -0
  67. package/dist/Infrastructure/OPFSStorage.d.ts.map +1 -0
  68. package/dist/Infrastructure/OPFSStorage.js +330 -0
  69. package/dist/Infrastructure/OPFSStorage.js.map +1 -0
  70. package/dist/Infrastructure/VLMWorkerBridge.d.ts +211 -0
  71. package/dist/Infrastructure/VLMWorkerBridge.d.ts.map +1 -0
  72. package/dist/Infrastructure/VLMWorkerBridge.js +264 -0
  73. package/dist/Infrastructure/VLMWorkerBridge.js.map +1 -0
  74. package/dist/Infrastructure/VLMWorkerRuntime.d.ts +38 -0
  75. package/dist/Infrastructure/VLMWorkerRuntime.d.ts.map +1 -0
  76. package/dist/Infrastructure/VLMWorkerRuntime.js +503 -0
  77. package/dist/Infrastructure/VLMWorkerRuntime.js.map +1 -0
  78. package/dist/Infrastructure/VideoCapture.d.ts +118 -0
  79. package/dist/Infrastructure/VideoCapture.d.ts.map +1 -0
  80. package/dist/Infrastructure/VideoCapture.js +207 -0
  81. package/dist/Infrastructure/VideoCapture.js.map +1 -0
  82. package/dist/Public/Extensions/DiffusionTypes.d.ts +64 -0
  83. package/dist/Public/Extensions/DiffusionTypes.d.ts.map +1 -0
  84. package/dist/Public/Extensions/DiffusionTypes.js +28 -0
  85. package/dist/Public/Extensions/DiffusionTypes.js.map +1 -0
  86. package/dist/Public/Extensions/EmbeddingsTypes.d.ts +33 -0
  87. package/dist/Public/Extensions/EmbeddingsTypes.d.ts.map +1 -0
  88. package/dist/Public/Extensions/EmbeddingsTypes.js +13 -0
  89. package/dist/Public/Extensions/EmbeddingsTypes.js.map +1 -0
  90. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts +44 -0
  91. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts.map +1 -0
  92. package/dist/Public/Extensions/RunAnywhere+Diffusion.js +189 -0
  93. package/dist/Public/Extensions/RunAnywhere+Diffusion.js.map +1 -0
  94. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts +56 -0
  95. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts.map +1 -0
  96. package/dist/Public/Extensions/RunAnywhere+Embeddings.js +240 -0
  97. package/dist/Public/Extensions/RunAnywhere+Embeddings.js.map +1 -0
  98. package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts +53 -0
  99. package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts.map +1 -0
  100. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js +153 -0
  101. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js.map +1 -0
  102. package/dist/Public/Extensions/RunAnywhere+STT.d.ts +95 -0
  103. package/dist/Public/Extensions/RunAnywhere+STT.d.ts.map +1 -0
  104. package/dist/Public/Extensions/RunAnywhere+STT.js +417 -0
  105. package/dist/Public/Extensions/RunAnywhere+STT.js.map +1 -0
  106. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts +69 -0
  107. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts.map +1 -0
  108. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js +196 -0
  109. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js.map +1 -0
  110. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts +55 -0
  111. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts.map +1 -0
  112. package/dist/Public/Extensions/RunAnywhere+TTS.js +253 -0
  113. package/dist/Public/Extensions/RunAnywhere+TTS.js.map +1 -0
  114. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts +80 -0
  115. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts.map +1 -0
  116. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js +436 -0
  117. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js.map +1 -0
  118. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts +82 -0
  119. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts.map +1 -0
  120. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js +576 -0
  121. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js.map +1 -0
  122. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts +70 -0
  123. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts.map +1 -0
  124. package/dist/Public/Extensions/RunAnywhere+VAD.js +231 -0
  125. package/dist/Public/Extensions/RunAnywhere+VAD.js.map +1 -0
  126. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts +58 -0
  127. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts.map +1 -0
  128. package/dist/Public/Extensions/RunAnywhere+VLM.js +262 -0
  129. package/dist/Public/Extensions/RunAnywhere+VLM.js.map +1 -0
  130. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts +49 -0
  131. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts.map +1 -0
  132. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js +222 -0
  133. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js.map +1 -0
  134. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts +63 -0
  135. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts.map +1 -0
  136. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js +168 -0
  137. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js.map +1 -0
  138. package/dist/Public/Extensions/STTTypes.d.ts +53 -0
  139. package/dist/Public/Extensions/STTTypes.d.ts.map +1 -0
  140. package/dist/Public/Extensions/STTTypes.js +16 -0
  141. package/dist/Public/Extensions/STTTypes.js.map +1 -0
  142. package/dist/Public/Extensions/TTSTypes.d.ts +31 -0
  143. package/dist/Public/Extensions/TTSTypes.d.ts.map +1 -0
  144. package/dist/Public/Extensions/TTSTypes.js +3 -0
  145. package/dist/Public/Extensions/TTSTypes.js.map +1 -0
  146. package/dist/Public/Extensions/ToolCallingTypes.d.ts +78 -0
  147. package/dist/Public/Extensions/ToolCallingTypes.d.ts.map +1 -0
  148. package/dist/Public/Extensions/ToolCallingTypes.js +8 -0
  149. package/dist/Public/Extensions/ToolCallingTypes.js.map +1 -0
  150. package/dist/Public/Extensions/VADTypes.d.ts +30 -0
  151. package/dist/Public/Extensions/VADTypes.d.ts.map +1 -0
  152. package/dist/Public/Extensions/VADTypes.js +8 -0
  153. package/dist/Public/Extensions/VADTypes.js.map +1 -0
  154. package/dist/Public/Extensions/VLMTypes.d.ts +56 -0
  155. package/dist/Public/Extensions/VLMTypes.d.ts.map +1 -0
  156. package/dist/Public/Extensions/VLMTypes.js +24 -0
  157. package/dist/Public/Extensions/VLMTypes.js.map +1 -0
  158. package/dist/Public/Extensions/VoiceAgentTypes.d.ts +42 -0
  159. package/dist/Public/Extensions/VoiceAgentTypes.d.ts.map +1 -0
  160. package/dist/Public/Extensions/VoiceAgentTypes.js +12 -0
  161. package/dist/Public/Extensions/VoiceAgentTypes.js.map +1 -0
  162. package/dist/Public/Extensions/VoicePipelineTypes.d.ts +69 -0
  163. package/dist/Public/Extensions/VoicePipelineTypes.d.ts.map +1 -0
  164. package/dist/Public/Extensions/VoicePipelineTypes.js +9 -0
  165. package/dist/Public/Extensions/VoicePipelineTypes.js.map +1 -0
  166. package/dist/Public/RunAnywhere.d.ts +121 -0
  167. package/dist/Public/RunAnywhere.d.ts.map +1 -0
  168. package/dist/Public/RunAnywhere.js +332 -0
  169. package/dist/Public/RunAnywhere.js.map +1 -0
  170. package/dist/index.d.ts +67 -0
  171. package/dist/index.d.ts.map +1 -0
  172. package/dist/index.js +53 -0
  173. package/dist/index.js.map +1 -0
  174. package/dist/types/LLMTypes.d.ts +48 -0
  175. package/dist/types/LLMTypes.d.ts.map +1 -0
  176. package/dist/types/LLMTypes.js +8 -0
  177. package/dist/types/LLMTypes.js.map +1 -0
  178. package/dist/types/enums.d.ts +144 -0
  179. package/dist/types/enums.d.ts.map +1 -0
  180. package/dist/types/enums.js +159 -0
  181. package/dist/types/enums.js.map +1 -0
  182. package/dist/types/index.d.ts +9 -0
  183. package/dist/types/index.d.ts.map +1 -0
  184. package/dist/types/index.js +8 -0
  185. package/dist/types/index.js.map +1 -0
  186. package/dist/types/models.d.ts +154 -0
  187. package/dist/types/models.d.ts.map +1 -0
  188. package/dist/types/models.js +8 -0
  189. package/dist/types/models.js.map +1 -0
  190. package/dist/workers/vlm-worker.d.ts +9 -0
  191. package/dist/workers/vlm-worker.d.ts.map +1 -0
  192. package/dist/workers/vlm-worker.js +10 -0
  193. package/dist/workers/vlm-worker.js.map +1 -0
  194. package/package.json +62 -0
  195. package/wasm/racommons-webgpu.js +156 -0
  196. package/wasm/racommons-webgpu.wasm +0 -0
  197. package/wasm/racommons.js +126 -0
  198. package/wasm/racommons.wasm +0 -0
  199. package/wasm/sherpa/sherpa-onnx-asr.js +1538 -0
  200. package/wasm/sherpa/sherpa-onnx-glue-original.js +19 -0
  201. package/wasm/sherpa/sherpa-onnx-glue.js +17 -0
  202. package/wasm/sherpa/sherpa-onnx-tts.js +657 -0
  203. package/wasm/sherpa/sherpa-onnx-vad.js +337 -0
  204. package/wasm/sherpa/sherpa-onnx-wave.js +88 -0
  205. package/wasm/sherpa/sherpa-onnx.wasm +0 -0
@@ -0,0 +1,576 @@
1
+ /**
2
+ * RunAnywhere Web SDK - Tool Calling Extension
3
+ *
4
+ * Adds tool calling (function calling) capabilities to LLM generation.
5
+ * The LLM can request external actions (API calls, calculations, etc.)
6
+ * and the SDK orchestrates the generate -> parse -> execute -> loop cycle.
7
+ *
8
+ * Architecture:
9
+ * - C++ (rac_tool_calling.h): ALL parsing, prompt formatting, JSON handling
10
+ * - This file: Tool registry, executor storage, orchestration
11
+ *
12
+ * Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/LLM/
13
+ *
14
+ * Usage:
15
+ * import { ToolCalling } from '@runanywhere/web';
16
+ *
17
+ * ToolCalling.registerTool(
18
+ * { name: 'get_weather', description: 'Gets weather', parameters: [...] },
19
+ * async (args) => ({ temperature: '72F', condition: 'Sunny' })
20
+ * );
21
+ *
22
+ * const result = await ToolCalling.generateWithTools('What is the weather?');
23
+ * console.log(result.text);
24
+ */
25
+ import { RunAnywhere } from '../RunAnywhere';
26
+ import { WASMBridge } from '../../Foundation/WASMBridge';
27
+ import { SDKError, SDKErrorCode } from '../../Foundation/ErrorTypes';
28
+ import { SDKLogger } from '../../Foundation/SDKLogger';
29
+ import { TextGeneration } from './RunAnywhere+TextGeneration';
30
+ import { ToolCallFormat, } from './ToolCallingTypes';
31
+ export { ToolCallFormat, } from './ToolCallingTypes';
32
+ const logger = new SDKLogger('ToolCalling');
33
+ /**
34
+ * Generate text and return the complete result.
35
+ *
36
+ * Uses the streaming path (`generateStream`) and drains the token stream
37
+ * to collect the full response text. On WebGPU + JSPI builds the
38
+ * non-streaming `generate()` C function triggers "trying to suspend
39
+ * JS frames" because the Emscripten JSPI `Suspending` wrapper cannot
40
+ * unwind through mixed WASM/JS frames in the non-streaming code path.
41
+ * The streaming path works because its token callbacks return to JS
42
+ * cleanly between each suspension point.
43
+ */
44
+ async function collectGeneration(prompt, opts) {
45
+ const { stream } = await TextGeneration.generateStream(prompt, opts);
46
+ let text = '';
47
+ for await (const token of stream) {
48
+ text += token;
49
+ }
50
+ return { text };
51
+ }
52
+ function requireBridge() {
53
+ if (!RunAnywhere.isInitialized)
54
+ throw SDKError.notInitialized();
55
+ return WASMBridge.shared;
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // ToolValue helpers
59
+ // ---------------------------------------------------------------------------
60
+ /** Create a ToolValue from a plain JS value. */
61
+ export function toToolValue(val) {
62
+ if (val === null || val === undefined)
63
+ return { type: 'null' };
64
+ if (typeof val === 'string')
65
+ return { type: 'string', value: val };
66
+ if (typeof val === 'number')
67
+ return { type: 'number', value: val };
68
+ if (typeof val === 'boolean')
69
+ return { type: 'boolean', value: val };
70
+ if (Array.isArray(val))
71
+ return { type: 'array', value: val.map(toToolValue) };
72
+ if (typeof val === 'object') {
73
+ const obj = {};
74
+ for (const [k, v] of Object.entries(val)) {
75
+ obj[k] = toToolValue(v);
76
+ }
77
+ return { type: 'object', value: obj };
78
+ }
79
+ return { type: 'null' };
80
+ }
81
+ /** Convert a ToolValue to a plain JS value. */
82
+ export function fromToolValue(tv) {
83
+ switch (tv.type) {
84
+ case 'string': return tv.value;
85
+ case 'number': return tv.value;
86
+ case 'boolean': return tv.value;
87
+ case 'array': return tv.value.map(fromToolValue);
88
+ case 'object': {
89
+ const obj = {};
90
+ for (const [k, v] of Object.entries(tv.value)) {
91
+ obj[k] = fromToolValue(v);
92
+ }
93
+ return obj;
94
+ }
95
+ case 'null': return null;
96
+ }
97
+ }
98
+ /** Get a string argument from tool call args. */
99
+ export function getStringArg(args, key) {
100
+ const v = args[key];
101
+ return v?.type === 'string' ? v.value : undefined;
102
+ }
103
+ /** Get a number argument from tool call args. */
104
+ export function getNumberArg(args, key) {
105
+ const v = args[key];
106
+ return v?.type === 'number' ? v.value : undefined;
107
+ }
108
+ // ---------------------------------------------------------------------------
109
+ // Internal: C++ Bridge helpers
110
+ // ---------------------------------------------------------------------------
111
+ /**
112
+ * Check if C++ tool calling functions are available in the WASM module.
113
+ *
114
+ * On WebGPU builds, all WASM imports are wrapped with WebAssembly.Suspending.
115
+ * Synchronous ccall to C++ tool-calling functions (which are NOT
116
+ * WebAssembly.promising-wrapped) will throw "trying to suspend without
117
+ * WebAssembly.promising" if any import inside the C++ code returns a Promise.
118
+ * To avoid this, we always use the TypeScript fallback on WebGPU builds.
119
+ */
120
+ function hasNativeToolCalling() {
121
+ try {
122
+ const bridge = requireBridge();
123
+ // WebGPU builds have JSPI Suspending on ALL imports, so synchronous
124
+ // ccall to native tool helpers triggers SuspendError. Use TS fallback.
125
+ if (bridge.accelerationMode === 'webgpu')
126
+ return false;
127
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
128
+ return typeof bridge.module['_rac_tool_call_parse'] === 'function';
129
+ }
130
+ catch {
131
+ return false;
132
+ }
133
+ }
134
+ /**
135
+ * Parse LLM output for tool calls.
136
+ * Uses C++ when available, falls back to TypeScript regex parsing.
137
+ */
138
+ function parseToolCall(llmOutput) {
139
+ if (hasNativeToolCalling()) {
140
+ return parseToolCallNative(llmOutput);
141
+ }
142
+ return parseToolCallTS(llmOutput);
143
+ }
144
+ /**
145
+ * Parse via C++ rac_tool_call_parse.
146
+ */
147
+ function parseToolCallNative(llmOutput) {
148
+ const bridge = requireBridge();
149
+ const m = bridge.module;
150
+ // Allocate result struct (rac_tool_call_t)
151
+ // Fields: has_tool_call (i32), tool_name (ptr), arguments_json (ptr),
152
+ // clean_text (ptr), call_id (i64), format (i32)
153
+ const resultSize = 40; // generous
154
+ const resultPtr = m._malloc(resultSize);
155
+ for (let i = 0; i < resultSize; i++)
156
+ m.setValue(resultPtr + i, 0, 'i8');
157
+ const inputPtr = bridge.allocString(llmOutput);
158
+ try {
159
+ const rc = m.ccall('rac_tool_call_parse', 'number', ['number', 'number'], [inputPtr, resultPtr]);
160
+ const hasToolCall = m.getValue(resultPtr, 'i32');
161
+ const toolNamePtr = m.getValue(resultPtr + 4, '*');
162
+ const argsJsonPtr = m.getValue(resultPtr + 8, '*');
163
+ const cleanTextPtr = m.getValue(resultPtr + 12, '*');
164
+ const callId = m.getValue(resultPtr + 16, 'i32');
165
+ const cleanText = cleanTextPtr ? bridge.readString(cleanTextPtr) : llmOutput;
166
+ if (rc !== 0 || hasToolCall !== 1 || !toolNamePtr) {
167
+ // Free the result struct
168
+ m.ccall('rac_tool_call_free', null, ['number'], [resultPtr]);
169
+ return { text: cleanText, toolCall: null };
170
+ }
171
+ const toolName = bridge.readString(toolNamePtr);
172
+ const argsJson = argsJsonPtr ? bridge.readString(argsJsonPtr) : '{}';
173
+ const args = parseJsonToToolValues(argsJson);
174
+ // Free the result struct
175
+ m.ccall('rac_tool_call_free', null, ['number'], [resultPtr]);
176
+ return {
177
+ text: cleanText,
178
+ toolCall: {
179
+ toolName,
180
+ arguments: args,
181
+ callId: `call_${callId}`,
182
+ },
183
+ };
184
+ }
185
+ finally {
186
+ bridge.free(inputPtr);
187
+ m._free(resultPtr);
188
+ }
189
+ }
190
+ /**
191
+ * TypeScript fallback parser for when WASM doesn't have tool_calling compiled.
192
+ * Handles both default and LFM2 formats.
193
+ */
194
+ function parseToolCallTS(llmOutput) {
195
+ // Try default format: <tool_call>{"tool":"name","arguments":{...}}</tool_call>
196
+ const defaultMatch = llmOutput.match(/<tool_call>([\s\S]*?)(?:<\/tool_call>|$)/);
197
+ if (defaultMatch) {
198
+ const jsonStr = defaultMatch[1].trim();
199
+ const cleanText = llmOutput.replace(/<tool_call>[\s\S]*?(?:<\/tool_call>|$)/, '').trim();
200
+ try {
201
+ const parsed = JSON.parse(jsonStr);
202
+ const toolName = parsed.tool || parsed.name || parsed.function || '';
203
+ const rawArgs = parsed.arguments || parsed.args || parsed.parameters || {};
204
+ return {
205
+ text: cleanText,
206
+ toolCall: {
207
+ toolName,
208
+ arguments: jsonToToolValues(rawArgs),
209
+ callId: `call_${Date.now()}`,
210
+ },
211
+ };
212
+ }
213
+ catch {
214
+ // Try to fix common LLM JSON issues (unquoted keys)
215
+ try {
216
+ const fixed = jsonStr.replace(/([{,]\s*)(\w+)\s*:/g, '$1"$2":');
217
+ const parsed = JSON.parse(fixed);
218
+ const toolName = parsed.tool || parsed.name || parsed.function || '';
219
+ const rawArgs = parsed.arguments || parsed.args || parsed.parameters || {};
220
+ return {
221
+ text: cleanText,
222
+ toolCall: {
223
+ toolName,
224
+ arguments: jsonToToolValues(rawArgs),
225
+ callId: `call_${Date.now()}`,
226
+ },
227
+ };
228
+ }
229
+ catch {
230
+ return { text: llmOutput, toolCall: null };
231
+ }
232
+ }
233
+ }
234
+ // Try LFM2 format: <|tool_call_start|>[func_name(arg="val")]<|tool_call_end|>
235
+ const lfm2Match = llmOutput.match(/<\|tool_call_start\|>\s*\[(\w+)\((.*?)\)\]\s*<\|tool_call_end\|>/);
236
+ if (lfm2Match) {
237
+ const funcName = lfm2Match[1];
238
+ const argsStr = lfm2Match[2];
239
+ const cleanText = llmOutput.replace(/<\|tool_call_start\|>[\s\S]*?<\|tool_call_end\|>/, '').trim();
240
+ // Parse LFM2 arguments: arg1="val1", arg2="val2"
241
+ const args = {};
242
+ const argPattern = /(\w+)="([^"]*)"/g;
243
+ let argMatch;
244
+ while ((argMatch = argPattern.exec(argsStr)) !== null) {
245
+ args[argMatch[1]] = { type: 'string', value: argMatch[2] };
246
+ }
247
+ return {
248
+ text: cleanText,
249
+ toolCall: {
250
+ toolName: funcName,
251
+ arguments: args,
252
+ callId: `call_${Date.now()}`,
253
+ },
254
+ };
255
+ }
256
+ return { text: llmOutput, toolCall: null };
257
+ }
258
+ /**
259
+ * Format tool definitions into system prompt.
260
+ * Uses C++ when available, falls back to TypeScript.
261
+ */
262
+ function formatToolsForPrompt(tools, format = ToolCallFormat.Default) {
263
+ if (tools.length === 0)
264
+ return '';
265
+ const toolsJson = serializeToolDefinitions(tools);
266
+ if (hasNativeToolCalling()) {
267
+ const bridge = requireBridge();
268
+ const m = bridge.module;
269
+ const jsonPtr = bridge.allocString(toolsJson);
270
+ const fmtPtr = bridge.allocString(format);
271
+ const outPtrPtr = m._malloc(4);
272
+ m.setValue(outPtrPtr, 0, '*');
273
+ try {
274
+ const rc = m.ccall('rac_tool_call_format_prompt_json_with_format_name', 'number', ['number', 'number', 'number'], [jsonPtr, fmtPtr, outPtrPtr]);
275
+ if (rc === 0) {
276
+ const outPtr = m.getValue(outPtrPtr, '*');
277
+ if (outPtr) {
278
+ const result = bridge.readString(outPtr);
279
+ m.ccall('rac_free', null, ['number'], [outPtr]);
280
+ return result;
281
+ }
282
+ }
283
+ }
284
+ finally {
285
+ bridge.free(jsonPtr);
286
+ bridge.free(fmtPtr);
287
+ m._free(outPtrPtr);
288
+ }
289
+ }
290
+ // Fallback: build prompt in TypeScript
291
+ return formatToolsForPromptTS(tools, format);
292
+ }
293
+ /**
294
+ * Build follow-up prompt after tool execution.
295
+ * Uses C++ when available, falls back to TypeScript.
296
+ */
297
+ function buildFollowUpPrompt(originalPrompt, toolsPrompt, toolName, toolResultJson, keepToolsAvailable) {
298
+ if (hasNativeToolCalling()) {
299
+ const bridge = requireBridge();
300
+ const m = bridge.module;
301
+ const promptPtr = bridge.allocString(originalPrompt);
302
+ const toolsPromptPtr = toolsPrompt ? bridge.allocString(toolsPrompt) : 0;
303
+ const namePtr = bridge.allocString(toolName);
304
+ const resultPtr = bridge.allocString(toolResultJson);
305
+ const outPtrPtr = m._malloc(4);
306
+ m.setValue(outPtrPtr, 0, '*');
307
+ try {
308
+ const rc = m.ccall('rac_tool_call_build_followup_prompt', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], [promptPtr, toolsPromptPtr, namePtr, resultPtr, keepToolsAvailable ? 1 : 0, outPtrPtr]);
309
+ if (rc === 0) {
310
+ const outPtr = m.getValue(outPtrPtr, '*');
311
+ if (outPtr) {
312
+ const result = bridge.readString(outPtr);
313
+ m.ccall('rac_free', null, ['number'], [outPtr]);
314
+ return result;
315
+ }
316
+ }
317
+ }
318
+ finally {
319
+ bridge.free(promptPtr);
320
+ if (toolsPromptPtr)
321
+ bridge.free(toolsPromptPtr);
322
+ bridge.free(namePtr);
323
+ bridge.free(resultPtr);
324
+ m._free(outPtrPtr);
325
+ }
326
+ }
327
+ // Fallback: build in TypeScript
328
+ return buildFollowUpPromptTS(originalPrompt, toolName, toolResultJson, keepToolsAvailable);
329
+ }
330
+ // ---------------------------------------------------------------------------
331
+ // TypeScript fallback helpers
332
+ // ---------------------------------------------------------------------------
333
+ function formatToolsForPromptTS(tools, format) {
334
+ const toolDescriptions = tools.map((t) => {
335
+ const params = t.parameters.map((p) => {
336
+ const req = p.required !== false ? ' (required)' : ' (optional)';
337
+ return ` - ${p.name} (${p.type}${req}): ${p.description}`;
338
+ }).join('\n');
339
+ return ` ${t.name}: ${t.description}\n Parameters:\n${params}`;
340
+ }).join('\n\n');
341
+ if (format === ToolCallFormat.LFM2) {
342
+ return `You have access to the following tools:\n\n${toolDescriptions}\n\nTo use a tool, respond with:\n<|tool_call_start|>[tool_name(arg1="value1", arg2="value2")]<|tool_call_end|>\n\nIf no tool is needed, respond normally.`;
343
+ }
344
+ return `You have access to the following tools:\n\n${toolDescriptions}\n\nTo use a tool, respond with:\n<tool_call>{"tool": "tool_name", "arguments": {"arg1": "value1"}}</tool_call>\n\nIf no tool is needed, respond normally.`;
345
+ }
346
+ function buildFollowUpPromptTS(originalPrompt, toolName, toolResultJson, keepToolsAvailable) {
347
+ if (keepToolsAvailable) {
348
+ return `User: ${originalPrompt}\n\nYou previously used the ${toolName} tool and received:\n${toolResultJson}\n\nBased on this tool result, either use another tool if needed, or provide a helpful response.`;
349
+ }
350
+ return `The user asked: "${originalPrompt}"\n\nYou used the ${toolName} tool and received this data:\n${toolResultJson}\n\nNow provide a helpful, natural response to the user based on this information.`;
351
+ }
352
+ // ---------------------------------------------------------------------------
353
+ // JSON <-> ToolValue conversion
354
+ // ---------------------------------------------------------------------------
355
+ function parseJsonToToolValues(json) {
356
+ try {
357
+ const parsed = JSON.parse(json);
358
+ return jsonToToolValues(parsed);
359
+ }
360
+ catch {
361
+ return {};
362
+ }
363
+ }
364
+ function jsonToToolValues(obj) {
365
+ const result = {};
366
+ for (const [key, val] of Object.entries(obj)) {
367
+ result[key] = toToolValue(val);
368
+ }
369
+ return result;
370
+ }
371
+ function toolValueToJson(val) {
372
+ return fromToolValue(val);
373
+ }
374
+ function toolResultToJsonString(result) {
375
+ const plain = {};
376
+ for (const [k, v] of Object.entries(result)) {
377
+ plain[k] = toolValueToJson(v);
378
+ }
379
+ return JSON.stringify(plain);
380
+ }
381
+ function serializeToolDefinitions(tools) {
382
+ return JSON.stringify(tools.map((t) => ({
383
+ name: t.name,
384
+ description: t.description,
385
+ parameters: t.parameters.map((p) => ({
386
+ name: p.name,
387
+ type: p.type,
388
+ description: p.description,
389
+ required: p.required ?? true,
390
+ ...(p.enumValues ? { enumValues: p.enumValues } : {}),
391
+ })),
392
+ })));
393
+ }
394
+ // ---------------------------------------------------------------------------
395
+ // Tool Calling Extension
396
+ // ---------------------------------------------------------------------------
397
+ class ToolCallingImpl {
398
+ extensionName = 'ToolCalling';
399
+ toolRegistry = new Map();
400
+ /**
401
+ * Register a tool that the LLM can use.
402
+ *
403
+ * @param definition - Tool definition (name, description, parameters)
404
+ * @param executor - Async function that executes the tool
405
+ */
406
+ registerTool(definition, executor) {
407
+ this.toolRegistry.set(definition.name, { definition, executor });
408
+ logger.info(`Tool registered: ${definition.name}`);
409
+ }
410
+ /**
411
+ * Unregister a tool by name.
412
+ */
413
+ unregisterTool(name) {
414
+ this.toolRegistry.delete(name);
415
+ logger.info(`Tool unregistered: ${name}`);
416
+ }
417
+ /**
418
+ * Get all registered tool definitions.
419
+ */
420
+ getRegisteredTools() {
421
+ return Array.from(this.toolRegistry.values()).map((t) => t.definition);
422
+ }
423
+ /**
424
+ * Clear all registered tools.
425
+ */
426
+ clearTools() {
427
+ this.toolRegistry.clear();
428
+ logger.info('All tools cleared');
429
+ }
430
+ /**
431
+ * Execute a tool call by looking up the registered executor.
432
+ */
433
+ async executeTool(toolCall) {
434
+ const registered = this.toolRegistry.get(toolCall.toolName);
435
+ if (!registered) {
436
+ return {
437
+ toolName: toolCall.toolName,
438
+ success: false,
439
+ error: `Unknown tool: ${toolCall.toolName}`,
440
+ callId: toolCall.callId,
441
+ };
442
+ }
443
+ try {
444
+ const result = await registered.executor(toolCall.arguments);
445
+ return {
446
+ toolName: toolCall.toolName,
447
+ success: true,
448
+ result,
449
+ callId: toolCall.callId,
450
+ };
451
+ }
452
+ catch (err) {
453
+ return {
454
+ toolName: toolCall.toolName,
455
+ success: false,
456
+ error: err instanceof Error ? err.message : String(err),
457
+ callId: toolCall.callId,
458
+ };
459
+ }
460
+ }
461
+ /**
462
+ * Generate a response with tool calling support.
463
+ *
464
+ * Orchestrates: generate -> parse -> execute -> loop
465
+ *
466
+ * @param prompt - The user's prompt
467
+ * @param options - Tool calling options
468
+ * @returns Result with final text, all tool calls, and their results
469
+ */
470
+ async generateWithTools(prompt, options = {}) {
471
+ if (!RunAnywhere.isInitialized) {
472
+ throw SDKError.notInitialized();
473
+ }
474
+ if (!TextGeneration.isModelLoaded) {
475
+ throw new SDKError(SDKErrorCode.ModelNotLoaded, 'No LLM model loaded. Call loadModel() first.');
476
+ }
477
+ const maxToolCalls = options.maxToolCalls ?? 5;
478
+ const autoExecute = options.autoExecute ?? true;
479
+ const format = options.format ?? ToolCallFormat.Default;
480
+ const registeredTools = this.getRegisteredTools();
481
+ const tools = options.tools ?? registeredTools;
482
+ // Build tool system prompt
483
+ logger.debug('[generateWithTools] Formatting tools for prompt...');
484
+ let toolsPrompt;
485
+ try {
486
+ toolsPrompt = formatToolsForPrompt(tools, format);
487
+ logger.debug(`[generateWithTools] Tools prompt formatted (${toolsPrompt.length} chars)`);
488
+ }
489
+ catch (fmtErr) {
490
+ logger.error(`[generateWithTools] formatToolsForPrompt failed: ${fmtErr instanceof Error ? fmtErr.message : String(fmtErr)}`);
491
+ throw fmtErr;
492
+ }
493
+ let systemPrompt;
494
+ if (options.replaceSystemPrompt && options.systemPrompt) {
495
+ systemPrompt = options.systemPrompt;
496
+ }
497
+ else if (options.systemPrompt) {
498
+ systemPrompt = `${options.systemPrompt}\n\n${toolsPrompt}`;
499
+ }
500
+ else {
501
+ systemPrompt = toolsPrompt;
502
+ }
503
+ let fullPrompt = systemPrompt ? `${systemPrompt}\n\nUser: ${prompt}` : prompt;
504
+ const allToolCalls = [];
505
+ const allToolResults = [];
506
+ let finalText = '';
507
+ for (let i = 0; i < maxToolCalls; i++) {
508
+ // Generate – non-streaming avoids JSPI callback issues with WebGPU
509
+ logger.debug(`[generateWithTools] Round ${i + 1}/${maxToolCalls}, calling collectGeneration...`);
510
+ let genResult;
511
+ try {
512
+ genResult = await collectGeneration(fullPrompt, {
513
+ maxTokens: options.maxTokens ?? 1024,
514
+ temperature: options.temperature ?? 0.3,
515
+ });
516
+ logger.debug(`[generateWithTools] Generation complete (${genResult.text.length} chars)`);
517
+ }
518
+ catch (genErr) {
519
+ logger.error(`[generateWithTools] collectGeneration failed: ${genErr instanceof Error ? `${genErr.message}\nStack: ${genErr.stack}` : String(genErr)}`);
520
+ throw genErr;
521
+ }
522
+ // Parse for tool calls
523
+ const { text, toolCall } = parseToolCall(genResult.text);
524
+ finalText = text;
525
+ if (!toolCall)
526
+ break;
527
+ allToolCalls.push(toolCall);
528
+ logger.info(`Tool call detected: ${toolCall.toolName}`);
529
+ if (!autoExecute) {
530
+ return {
531
+ text: finalText,
532
+ toolCalls: allToolCalls,
533
+ toolResults: [],
534
+ isComplete: false,
535
+ };
536
+ }
537
+ // Execute tool
538
+ const result = await this.executeTool(toolCall);
539
+ allToolResults.push(result);
540
+ const resultJson = result.success && result.result
541
+ ? toolResultToJsonString(result.result)
542
+ : JSON.stringify({ error: result.error ?? 'Unknown error' });
543
+ logger.info(`Tool ${toolCall.toolName} ${result.success ? 'succeeded' : 'failed'}`);
544
+ // Build follow-up prompt
545
+ fullPrompt = buildFollowUpPrompt(prompt, options.keepToolsAvailable ? toolsPrompt : null, toolCall.toolName, resultJson, options.keepToolsAvailable ?? false);
546
+ }
547
+ return {
548
+ text: finalText,
549
+ toolCalls: allToolCalls,
550
+ toolResults: allToolResults,
551
+ isComplete: true,
552
+ };
553
+ }
554
+ /**
555
+ * Clean up the tool calling extension (clears all registered tools).
556
+ */
557
+ cleanup() {
558
+ this.toolRegistry.clear();
559
+ }
560
+ /**
561
+ * Continue generation after manual tool execution.
562
+ * Use when autoExecute is false.
563
+ */
564
+ async continueWithToolResult(previousPrompt, toolCall, toolResult, options) {
565
+ const resultJson = toolResult.success && toolResult.result
566
+ ? toolResultToJsonString(toolResult.result)
567
+ : `Error: ${toolResult.error ?? 'Unknown error'}`;
568
+ const continuedPrompt = `${previousPrompt}\n\nTool Result for ${toolCall.toolName}: ${resultJson}\n\nBased on the tool result, please provide your response:`;
569
+ return this.generateWithTools(continuedPrompt, {
570
+ ...options,
571
+ maxToolCalls: (options?.maxToolCalls ?? 5) - 1,
572
+ });
573
+ }
574
+ }
575
+ export const ToolCalling = new ToolCallingImpl();
576
+ //# sourceMappingURL=RunAnywhere+ToolCalling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunAnywhere+ToolCalling.js","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+ToolCalling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * RunAnywhere Web SDK - Voice Activity Detection Extension
3
+ *
4
+ * Adds VAD capabilities via sherpa-onnx WASM using Silero VAD model.
5
+ * Detects speech segments in audio streams with high accuracy.
6
+ *
7
+ * Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/VAD/
8
+ *
9
+ * Usage:
10
+ * import { VAD } from '@runanywhere/web';
11
+ *
12
+ * await VAD.loadModel({
13
+ * modelPath: '/models/vad/silero_vad.onnx',
14
+ * threshold: 0.5,
15
+ * });
16
+ *
17
+ * const hasVoice = VAD.processSamples(audioFloat32Array);
18
+ * if (hasVoice) console.log('Speech detected!');
19
+ */
20
+ import type { SpeechActivityCallback, VADModelConfig, SpeechSegment } from './VADTypes';
21
+ export { SpeechActivity } from './VADTypes';
22
+ export type { SpeechActivityCallback, VADModelConfig, SpeechSegment } from './VADTypes';
23
+ declare class VADImpl {
24
+ readonly extensionName = "VAD";
25
+ private _vadHandle;
26
+ private _sampleRate;
27
+ private _jsActivityCallback;
28
+ private _lastSpeechState;
29
+ /**
30
+ * Load the Silero VAD model via sherpa-onnx.
31
+ * The model file must already be in the sherpa-onnx virtual FS.
32
+ */
33
+ loadModel(config: VADModelConfig): Promise<void>;
34
+ /** Whether VAD model is loaded. */
35
+ get isInitialized(): boolean;
36
+ /**
37
+ * Register a callback for speech activity events.
38
+ * Called when speech starts, ends, or is ongoing.
39
+ */
40
+ onSpeechActivity(callback: SpeechActivityCallback): () => void;
41
+ /**
42
+ * Process audio samples through VAD.
43
+ * Returns whether speech was detected in this frame.
44
+ *
45
+ * The Silero VAD expects 512-sample windows at 16kHz.
46
+ * This method handles arbitrary-length input by feeding in chunks.
47
+ *
48
+ * @param samples - Float32Array of PCM audio samples (mono, 16kHz)
49
+ * @returns Whether speech is currently detected
50
+ */
51
+ processSamples(samples: Float32Array): boolean;
52
+ /**
53
+ * Get the next available speech segment (if any).
54
+ * Returns null if no complete segments are available.
55
+ *
56
+ * After calling processSamples(), check for available segments
57
+ * using this method. Call repeatedly until it returns null.
58
+ */
59
+ popSpeechSegment(): SpeechSegment | null;
60
+ /** Whether speech is currently detected. */
61
+ get isSpeechActive(): boolean;
62
+ /** Reset VAD state. */
63
+ reset(): void;
64
+ /** Flush remaining audio through VAD. */
65
+ flush(): void;
66
+ /** Clean up the VAD resources. */
67
+ cleanup(): void;
68
+ }
69
+ export declare const VAD: VADImpl;
70
+ //# sourceMappingURL=RunAnywhere+VAD.d.ts.map