@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,196 @@
1
+ /**
2
+ * RunAnywhere Web SDK - Structured Output Extension
3
+ *
4
+ * Adds JSON-structured output capabilities for LLM generation.
5
+ * Uses the RACommons rac_structured_output_* C API for schema-guided
6
+ * generation and JSON extraction/validation.
7
+ *
8
+ * Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/StructuredOutput/
9
+ *
10
+ * Usage:
11
+ * import { StructuredOutput, TextGeneration } from '@runanywhere/web';
12
+ *
13
+ * const schema = JSON.stringify({ type: 'object', properties: { name: { type: 'string' } } });
14
+ * const prompt = await StructuredOutput.preparePrompt('List 3 colors', schema);
15
+ * const result = await TextGeneration.generate(prompt);
16
+ * const validated = StructuredOutput.validate(result.text, schema);
17
+ * console.log(validated.extractedJson); // parsed JSON
18
+ */
19
+ import { RunAnywhere } from '../RunAnywhere';
20
+ import { WASMBridge } from '../../Foundation/WASMBridge';
21
+ import { Offsets } from '../../Foundation/StructOffsets';
22
+ import { SDKError } from '../../Foundation/ErrorTypes';
23
+ import { SDKLogger } from '../../Foundation/SDKLogger';
24
+ const logger = new SDKLogger('StructuredOutput');
25
+ function requireBridge() {
26
+ if (!RunAnywhere.isInitialized)
27
+ throw SDKError.notInitialized();
28
+ return WASMBridge.shared;
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // Structured Output Extension
32
+ // ---------------------------------------------------------------------------
33
+ export const StructuredOutput = {
34
+ /**
35
+ * Extract JSON from a text response (finds first complete JSON object/array).
36
+ *
37
+ * @param text - Raw LLM output text
38
+ * @returns Extracted JSON string, or null if none found
39
+ */
40
+ extractJson(text) {
41
+ const bridge = requireBridge();
42
+ const m = bridge.module;
43
+ const textPtr = bridge.allocString(text);
44
+ const outJsonPtr = m._malloc(4); // char** out_json
45
+ const outLenPtr = m._malloc(4); // size_t* out_length
46
+ try {
47
+ const result = m.ccall('rac_structured_output_extract_json', 'number', ['number', 'number', 'number'], [textPtr, outJsonPtr, outLenPtr]);
48
+ if (result !== 0)
49
+ return null;
50
+ const jsonPtr = m.getValue(outJsonPtr, '*');
51
+ if (!jsonPtr)
52
+ return null;
53
+ const json = bridge.readString(jsonPtr);
54
+ m._free(jsonPtr); // rac_strdup'd, so we free it
55
+ return json;
56
+ }
57
+ finally {
58
+ bridge.free(textPtr);
59
+ m._free(outJsonPtr);
60
+ m._free(outLenPtr);
61
+ }
62
+ },
63
+ /**
64
+ * Prepare a prompt with schema instructions for structured output.
65
+ *
66
+ * @param originalPrompt - The user's original prompt
67
+ * @param config - Schema configuration
68
+ * @returns Enhanced prompt with schema instructions
69
+ */
70
+ preparePrompt(originalPrompt, config) {
71
+ const bridge = requireBridge();
72
+ const m = bridge.module;
73
+ const promptPtr = bridge.allocString(originalPrompt);
74
+ // Build rac_structured_output_config_t: { json_schema, include_schema_in_prompt }
75
+ const configSize = m._rac_wasm_sizeof_structured_output_config();
76
+ const configPtr = m._malloc(configSize);
77
+ const soConf = Offsets.structuredOutputConfig;
78
+ const schemaPtr = bridge.allocString(config.jsonSchema);
79
+ m.setValue(configPtr + soConf.jsonSchema, schemaPtr, '*');
80
+ m.setValue(configPtr + soConf.includeSchemaInPrompt, (config.includeSchemaInPrompt !== false) ? 1 : 0, 'i32');
81
+ const outPromptPtr = m._malloc(4);
82
+ try {
83
+ const result = m.ccall('rac_structured_output_prepare_prompt', 'number', ['number', 'number', 'number'], [promptPtr, configPtr, outPromptPtr]);
84
+ if (result !== 0) {
85
+ logger.warning('Failed to prepare structured prompt, returning original');
86
+ return originalPrompt;
87
+ }
88
+ const preparedPtr = m.getValue(outPromptPtr, '*');
89
+ if (!preparedPtr)
90
+ return originalPrompt;
91
+ const prepared = bridge.readString(preparedPtr);
92
+ m._free(preparedPtr);
93
+ return prepared;
94
+ }
95
+ finally {
96
+ bridge.free(promptPtr);
97
+ bridge.free(schemaPtr);
98
+ m._free(configPtr);
99
+ m._free(outPromptPtr);
100
+ }
101
+ },
102
+ /**
103
+ * Get a system prompt that instructs the LLM to produce JSON matching a schema.
104
+ *
105
+ * @param jsonSchema - JSON Schema string
106
+ * @returns System prompt string
107
+ */
108
+ getSystemPrompt(jsonSchema) {
109
+ const bridge = requireBridge();
110
+ const m = bridge.module;
111
+ const schemaPtr = bridge.allocString(jsonSchema);
112
+ const outPtr = m._malloc(4);
113
+ try {
114
+ const result = m.ccall('rac_structured_output_get_system_prompt', 'number', ['number', 'number'], [schemaPtr, outPtr]);
115
+ if (result !== 0)
116
+ return '';
117
+ const ptr = m.getValue(outPtr, '*');
118
+ if (!ptr)
119
+ return '';
120
+ const prompt = bridge.readString(ptr);
121
+ m._free(ptr);
122
+ return prompt;
123
+ }
124
+ finally {
125
+ bridge.free(schemaPtr);
126
+ m._free(outPtr);
127
+ }
128
+ },
129
+ /**
130
+ * Validate LLM output against a JSON schema.
131
+ *
132
+ * @param text - Raw LLM output
133
+ * @param config - Schema configuration
134
+ * @returns Validation result with extracted JSON if valid
135
+ */
136
+ validate(text, config) {
137
+ const bridge = requireBridge();
138
+ const m = bridge.module;
139
+ const textPtr = bridge.allocString(text);
140
+ const configSize = m._rac_wasm_sizeof_structured_output_config();
141
+ const configPtr = m._malloc(configSize);
142
+ const soConf2 = Offsets.structuredOutputConfig;
143
+ const schemaPtr = bridge.allocString(config.jsonSchema);
144
+ m.setValue(configPtr + soConf2.jsonSchema, schemaPtr, '*');
145
+ m.setValue(configPtr + soConf2.includeSchemaInPrompt, (config.includeSchemaInPrompt !== false) ? 1 : 0, 'i32');
146
+ // rac_structured_output_validation_t (size from sizeof helper)
147
+ const valSize = 12; // 3 fields × 4 bytes on wasm32 — all i32/ptr
148
+ const valPtr = m._malloc(valSize);
149
+ try {
150
+ const result = m.ccall('rac_structured_output_validate', 'number', ['number', 'number', 'number'], [textPtr, configPtr, valPtr]);
151
+ if (result !== 0) {
152
+ return { isValid: false, errorMessage: 'Validation call failed' };
153
+ }
154
+ const soVal = Offsets.structuredOutputValidation;
155
+ const isValid = m.getValue(valPtr + soVal.isValid, 'i32') === 1;
156
+ const errorMsgPtr = m.getValue(valPtr + soVal.errorMessage, '*');
157
+ const extractedPtr = m.getValue(valPtr + soVal.extractedJson, '*');
158
+ const validation = {
159
+ isValid,
160
+ errorMessage: errorMsgPtr ? bridge.readString(errorMsgPtr) : undefined,
161
+ extractedJson: extractedPtr ? bridge.readString(extractedPtr) : undefined,
162
+ };
163
+ // Free C validation struct
164
+ m.ccall('rac_structured_output_validation_free', null, ['number'], [valPtr]);
165
+ return validation;
166
+ }
167
+ finally {
168
+ bridge.free(textPtr);
169
+ bridge.free(schemaPtr);
170
+ m._free(configPtr);
171
+ }
172
+ },
173
+ /**
174
+ * Check if text contains a complete JSON object or array.
175
+ *
176
+ * @param text - Text to check
177
+ * @returns True if a complete JSON block was found
178
+ */
179
+ hasCompleteJson(text) {
180
+ const bridge = requireBridge();
181
+ const m = bridge.module;
182
+ const textPtr = bridge.allocString(text);
183
+ const startPtr = m._malloc(4);
184
+ const endPtr = m._malloc(4);
185
+ try {
186
+ const found = m.ccall('rac_structured_output_find_complete_json', 'number', ['number', 'number', 'number'], [textPtr, startPtr, endPtr]);
187
+ return found === 1;
188
+ }
189
+ finally {
190
+ bridge.free(textPtr);
191
+ m._free(startPtr);
192
+ m._free(endPtr);
193
+ }
194
+ },
195
+ };
196
+ //# sourceMappingURL=RunAnywhere+StructuredOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunAnywhere+StructuredOutput.js","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+StructuredOutput.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * RunAnywhere Web SDK - Text-to-Speech Extension
3
+ *
4
+ * Adds TTS (speech synthesis) capabilities via sherpa-onnx WASM.
5
+ * Uses Piper/VITS ONNX models for offline, on-device speech synthesis.
6
+ *
7
+ * Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/TTS/
8
+ *
9
+ * Usage:
10
+ * import { TTS } from '@runanywhere/web';
11
+ *
12
+ * await TTS.loadVoice({
13
+ * voiceId: 'piper-en-amy',
14
+ * modelPath: '/models/tts/model.onnx',
15
+ * tokensPath: '/models/tts/tokens.txt',
16
+ * dataDir: '/models/tts/espeak-ng-data',
17
+ * });
18
+ *
19
+ * const result = await TTS.synthesize('Hello world');
20
+ * // result.audioData is Float32Array of PCM samples
21
+ */
22
+ import type { TTSVoiceConfig, TTSSynthesisResult, TTSSynthesizeOptions } from './TTSTypes';
23
+ export type { TTSVoiceConfig, TTSSynthesisResult, TTSSynthesizeOptions } from './TTSTypes';
24
+ declare class TTSImpl {
25
+ readonly extensionName = "TTS";
26
+ private _ttsHandle;
27
+ private _currentVoiceId;
28
+ /**
29
+ * Load a TTS voice model via sherpa-onnx.
30
+ * Model files must already be written to sherpa-onnx virtual FS.
31
+ */
32
+ loadVoice(config: TTSVoiceConfig): Promise<void>;
33
+ /** Unload the TTS voice. */
34
+ unloadVoice(): Promise<void>;
35
+ /** Check if a TTS voice is loaded. */
36
+ get isVoiceLoaded(): boolean;
37
+ /** Get current voice ID. */
38
+ get voiceId(): string;
39
+ /** Get the sample rate of the loaded TTS model. */
40
+ get sampleRate(): number;
41
+ /** Get the number of speakers in the loaded model. */
42
+ get numSpeakers(): number;
43
+ /**
44
+ * Synthesize speech from text.
45
+ *
46
+ * @param text - Text to synthesize
47
+ * @param options - Synthesis options (speaker ID, speed)
48
+ * @returns Synthesis result with PCM audio data
49
+ */
50
+ synthesize(text: string, options?: TTSSynthesizeOptions): Promise<TTSSynthesisResult>;
51
+ /** Clean up the TTS resources. */
52
+ cleanup(): void;
53
+ }
54
+ export declare const TTS: TTSImpl;
55
+ //# sourceMappingURL=RunAnywhere+TTS.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunAnywhere+TTS.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+TTS.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE3F,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAoB3F,cAAM,OAAO;IACX,QAAQ,CAAC,aAAa,SAAS;IAC/B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,eAAe,CAAM;IAE7B;;;OAGG;IACG,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA6EtD,4BAA4B;IACtB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC,sCAAsC;IACtC,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,4BAA4B;IAC5B,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,mDAAmD;IACnD,IAAI,UAAU,IAAI,MAAM,CAGvB;IAED,sDAAsD;IACtD,IAAI,WAAW,IAAI,MAAM,CAGxB;IAED;;;;;;OAMG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsG/F,kCAAkC;IAClC,OAAO,IAAI,IAAI;CAShB;AAED,eAAO,MAAM,GAAG,SAAgB,CAAC"}
@@ -0,0 +1,253 @@
1
+ /**
2
+ * RunAnywhere Web SDK - Text-to-Speech Extension
3
+ *
4
+ * Adds TTS (speech synthesis) capabilities via sherpa-onnx WASM.
5
+ * Uses Piper/VITS ONNX models for offline, on-device speech synthesis.
6
+ *
7
+ * Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/TTS/
8
+ *
9
+ * Usage:
10
+ * import { TTS } from '@runanywhere/web';
11
+ *
12
+ * await TTS.loadVoice({
13
+ * voiceId: 'piper-en-amy',
14
+ * modelPath: '/models/tts/model.onnx',
15
+ * tokensPath: '/models/tts/tokens.txt',
16
+ * dataDir: '/models/tts/espeak-ng-data',
17
+ * });
18
+ *
19
+ * const result = await TTS.synthesize('Hello world');
20
+ * // result.audioData is Float32Array of PCM samples
21
+ */
22
+ import { RunAnywhere } from '../RunAnywhere';
23
+ import { SherpaONNXBridge } from '../../Foundation/SherpaONNXBridge';
24
+ import { SDKError, SDKErrorCode } from '../../Foundation/ErrorTypes';
25
+ import { SDKLogger } from '../../Foundation/SDKLogger';
26
+ import { EventBus } from '../../Foundation/EventBus';
27
+ import { SDKEventType } from '../../types/enums';
28
+ // @ts-ignore – sherpa-onnx-tts.js has no .d.ts
29
+ import { initSherpaOnnxOfflineTtsConfig, freeConfig } from '../../../wasm/sherpa/sherpa-onnx-tts.js';
30
+ const logger = new SDKLogger('TTS');
31
+ // ---------------------------------------------------------------------------
32
+ // Internal Helpers
33
+ // ---------------------------------------------------------------------------
34
+ function requireSherpa() {
35
+ if (!RunAnywhere.isInitialized)
36
+ throw SDKError.notInitialized();
37
+ return SherpaONNXBridge.shared;
38
+ }
39
+ // ---------------------------------------------------------------------------
40
+ // TTS Extension
41
+ // ---------------------------------------------------------------------------
42
+ class TTSImpl {
43
+ extensionName = 'TTS';
44
+ _ttsHandle = 0;
45
+ _currentVoiceId = '';
46
+ /**
47
+ * Load a TTS voice model via sherpa-onnx.
48
+ * Model files must already be written to sherpa-onnx virtual FS.
49
+ */
50
+ async loadVoice(config) {
51
+ const sherpa = requireSherpa();
52
+ await sherpa.ensureLoaded();
53
+ const m = sherpa.module;
54
+ // Clean up previous voice
55
+ this.cleanup();
56
+ logger.info(`Loading TTS voice: ${config.voiceId}`);
57
+ EventBus.shared.emit('model.loadStarted', SDKEventType.Model, {
58
+ modelId: config.voiceId, component: 'tts',
59
+ });
60
+ const startMs = performance.now();
61
+ // Build the proper C struct config for sherpa-onnx offline TTS
62
+ // Uses the initSherpaOnnxOfflineTtsConfig helper from sherpa-onnx-tts.js
63
+ // which packs the config into WASM memory as the C API expects.
64
+ const configObj = {
65
+ offlineTtsModelConfig: {
66
+ offlineTtsVitsModelConfig: {
67
+ model: config.modelPath,
68
+ lexicon: config.lexicon ?? '',
69
+ tokens: config.tokensPath,
70
+ dataDir: config.dataDir ?? '',
71
+ noiseScale: 0.667,
72
+ noiseScaleW: 0.8,
73
+ lengthScale: 1.0,
74
+ },
75
+ numThreads: config.numThreads ?? 1,
76
+ debug: 0,
77
+ provider: 'cpu',
78
+ },
79
+ ruleFsts: '',
80
+ ruleFars: '',
81
+ maxNumSentences: 1,
82
+ silenceScale: 0.2,
83
+ };
84
+ logger.debug(`Building TTS config struct... (_CopyHeap available: ${typeof m._CopyHeap})`);
85
+ let configStruct;
86
+ try {
87
+ configStruct = initSherpaOnnxOfflineTtsConfig(configObj, m);
88
+ }
89
+ catch (initErr) {
90
+ const msg = initErr instanceof Error ? initErr.message : JSON.stringify(initErr);
91
+ logger.error(`Failed to build TTS config struct: ${msg}`);
92
+ throw new SDKError(SDKErrorCode.ModelLoadFailed, `Failed to build TTS config: ${msg}`);
93
+ }
94
+ try {
95
+ logger.debug(`Calling _SherpaOnnxCreateOfflineTts with ptr=${configStruct.ptr}`);
96
+ this._ttsHandle = m._SherpaOnnxCreateOfflineTts(configStruct.ptr);
97
+ if (this._ttsHandle === 0) {
98
+ throw new SDKError(SDKErrorCode.ModelLoadFailed, `Failed to create TTS engine for voice: ${config.voiceId}`);
99
+ }
100
+ this._currentVoiceId = config.voiceId;
101
+ const loadTimeMs = Math.round(performance.now() - startMs);
102
+ logger.info(`TTS voice loaded: ${config.voiceId} in ${loadTimeMs}ms`);
103
+ EventBus.shared.emit('model.loadCompleted', SDKEventType.Model, {
104
+ modelId: config.voiceId, component: 'tts', loadTimeMs,
105
+ });
106
+ }
107
+ catch (error) {
108
+ this.cleanup();
109
+ if (error instanceof Error)
110
+ throw error;
111
+ const msg = typeof error === 'object' ? JSON.stringify(error) : String(error);
112
+ throw new SDKError(SDKErrorCode.ModelLoadFailed, `TTS creation failed: ${msg}`);
113
+ }
114
+ finally {
115
+ freeConfig(configStruct, m);
116
+ }
117
+ }
118
+ /** Unload the TTS voice. */
119
+ async unloadVoice() {
120
+ this.cleanup();
121
+ logger.info('TTS voice unloaded');
122
+ }
123
+ /** Check if a TTS voice is loaded. */
124
+ get isVoiceLoaded() {
125
+ return this._ttsHandle !== 0;
126
+ }
127
+ /** Get current voice ID. */
128
+ get voiceId() {
129
+ return this._currentVoiceId;
130
+ }
131
+ /** Get the sample rate of the loaded TTS model. */
132
+ get sampleRate() {
133
+ if (this._ttsHandle === 0)
134
+ return 0;
135
+ return SherpaONNXBridge.shared.module._SherpaOnnxOfflineTtsSampleRate(this._ttsHandle);
136
+ }
137
+ /** Get the number of speakers in the loaded model. */
138
+ get numSpeakers() {
139
+ if (this._ttsHandle === 0)
140
+ return 0;
141
+ return SherpaONNXBridge.shared.module._SherpaOnnxOfflineTtsNumSpeakers(this._ttsHandle);
142
+ }
143
+ /**
144
+ * Synthesize speech from text.
145
+ *
146
+ * @param text - Text to synthesize
147
+ * @param options - Synthesis options (speaker ID, speed)
148
+ * @returns Synthesis result with PCM audio data
149
+ */
150
+ async synthesize(text, options = {}) {
151
+ const sherpa = requireSherpa();
152
+ const m = sherpa.module;
153
+ if (this._ttsHandle === 0) {
154
+ throw new SDKError(SDKErrorCode.ModelNotLoaded, 'No TTS voice loaded. Call loadVoice() first.');
155
+ }
156
+ const startMs = performance.now();
157
+ const sid = options.speakerId ?? 0;
158
+ const speed = options.speed ?? 1.0;
159
+ logger.debug(`Synthesizing: "${text.substring(0, 80)}..." (sid=${sid}, speed=${speed})`);
160
+ const textPtr = sherpa.allocString(text);
161
+ try {
162
+ // SherpaOnnxOfflineTtsGenerate returns a pointer to generated audio struct:
163
+ // struct { const float* samples; int32_t n; int32_t sample_rate; }
164
+ logger.debug(`Calling _SherpaOnnxOfflineTtsGenerate (handle=${this._ttsHandle})`);
165
+ let audioPtr;
166
+ try {
167
+ audioPtr = m._SherpaOnnxOfflineTtsGenerate(this._ttsHandle, textPtr, sid, speed);
168
+ }
169
+ catch (wasmErr) {
170
+ // C++ exceptions thrown from WASM appear as numeric exception pointers
171
+ let errMsg;
172
+ if (typeof wasmErr === 'number') {
173
+ // Try to extract C++ exception message from WASM memory
174
+ let cppMsg = '';
175
+ try {
176
+ // Emscripten exception layout: the exception pointer points to the thrown object.
177
+ // For std::exception, the what() string is typically at a known offset.
178
+ // Try reading as UTF8 string from various offsets
179
+ const offsets = [0, 4, 8, 12, 16];
180
+ for (const off of offsets) {
181
+ const strPtr = m.HEAP32[(wasmErr + off) / 4];
182
+ if (strPtr > 0 && strPtr < m.HEAPU8.length) {
183
+ const str = m.UTF8ToString(strPtr);
184
+ if (str && str.length > 2 && str.length < 1000 && /^[\x20-\x7e]/.test(str)) {
185
+ cppMsg = str;
186
+ break;
187
+ }
188
+ }
189
+ }
190
+ }
191
+ catch { /* ignore */ }
192
+ errMsg = cppMsg
193
+ ? `WASM C++ exception: ${cppMsg}`
194
+ : `WASM C++ exception (ptr=${wasmErr}). Possible cause: model incompatibility or insufficient memory.`;
195
+ }
196
+ else {
197
+ errMsg = String(wasmErr);
198
+ }
199
+ logger.error(`TTS WASM error: ${errMsg}`);
200
+ throw new SDKError(SDKErrorCode.GenerationFailed, `TTS synthesis WASM error: ${errMsg}`);
201
+ }
202
+ logger.debug(`_SherpaOnnxOfflineTtsGenerate returned: ${audioPtr}`);
203
+ if (!audioPtr || audioPtr === 0) {
204
+ throw new SDKError(SDKErrorCode.GenerationFailed, 'TTS synthesis failed (null audio pointer)');
205
+ }
206
+ // Read the generated audio struct using HEAP32 (matches sherpa-onnx-tts.js pattern)
207
+ const numSamples = m.HEAP32[audioPtr / 4 + 1];
208
+ const sampleRate = m.HEAP32[audioPtr / 4 + 2];
209
+ const samplesFloatIdx = m.HEAP32[audioPtr / 4] / 4; // float pointer / 4 = float array index
210
+ logger.debug(`TTS audio: numSamples=${numSamples}, sampleRate=${sampleRate}, samplesIdx=${samplesFloatIdx}`);
211
+ // Copy audio data from WASM heap
212
+ const audioData = new Float32Array(numSamples);
213
+ if (samplesFloatIdx && numSamples > 0) {
214
+ for (let i = 0; i < numSamples; i++) {
215
+ audioData[i] = m.HEAPF32[samplesFloatIdx + i];
216
+ }
217
+ }
218
+ // Destroy the audio struct
219
+ m._SherpaOnnxDestroyOfflineTtsGeneratedAudio(audioPtr);
220
+ const processingTimeMs = Math.round(performance.now() - startMs);
221
+ const durationMs = Math.round((numSamples / sampleRate) * 1000);
222
+ const result = {
223
+ audioData,
224
+ sampleRate,
225
+ durationMs,
226
+ processingTimeMs,
227
+ };
228
+ EventBus.shared.emit('tts.synthesized', SDKEventType.Voice, {
229
+ durationMs,
230
+ sampleRate,
231
+ textLength: text.length,
232
+ });
233
+ logger.debug(`TTS generated ${durationMs}ms audio in ${processingTimeMs}ms`);
234
+ return result;
235
+ }
236
+ finally {
237
+ sherpa.free(textPtr);
238
+ }
239
+ }
240
+ /** Clean up the TTS resources. */
241
+ cleanup() {
242
+ if (this._ttsHandle !== 0) {
243
+ try {
244
+ SherpaONNXBridge.shared.module._SherpaOnnxDestroyOfflineTts(this._ttsHandle);
245
+ }
246
+ catch { /* ignore */ }
247
+ this._ttsHandle = 0;
248
+ }
249
+ this._currentVoiceId = '';
250
+ }
251
+ }
252
+ export const TTS = new TTSImpl();
253
+ //# sourceMappingURL=RunAnywhere+TTS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunAnywhere+TTS.js","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+TTS.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * RunAnywhere Web SDK - Text Generation Extension
3
+ *
4
+ * Adds LLM text generation capabilities to RunAnywhere.
5
+ * Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/LLM/
6
+ *
7
+ * Usage:
8
+ * import { RunAnywhere } from '@runanywhere/web';
9
+ *
10
+ * await RunAnywhere.loadModel('tinyllama-1.1b-q4');
11
+ * const result = await RunAnywhere.generate('Hello!', { maxTokens: 100 });
12
+ * console.log(result.text);
13
+ *
14
+ * // Streaming
15
+ * for await (const token of RunAnywhere.generateStream('Tell me a story')) {
16
+ * process.stdout.write(token);
17
+ * }
18
+ */
19
+ import type { LLMGenerationOptions, LLMGenerationResult, LLMStreamingResult } from '../../types/LLMTypes';
20
+ declare class TextGenerationImpl {
21
+ readonly extensionName = "TextGeneration";
22
+ private _llmComponentHandle;
23
+ /** Ensure the SDK is initialized and return the bridge. */
24
+ private requireBridge;
25
+ /** Ensure the LLM component is created. */
26
+ private ensureLLMComponent;
27
+ /**
28
+ * Load an LLM model for text generation.
29
+ *
30
+ * @param modelPath - Path to the model file (in Emscripten FS)
31
+ * @param modelId - Model identifier
32
+ * @param modelName - Human-readable model name
33
+ */
34
+ loadModel(modelPath: string, modelId: string, modelName?: string): Promise<void>;
35
+ /**
36
+ * Unload the currently loaded LLM model.
37
+ */
38
+ unloadModel(): Promise<void>;
39
+ /**
40
+ * Check if an LLM model is currently loaded.
41
+ */
42
+ get isModelLoaded(): boolean;
43
+ /**
44
+ * Generate text from a prompt (non-streaming).
45
+ *
46
+ * Uses `ccall` with `{async: true}` so that Emscripten's JSPI / Asyncify
47
+ * can suspend the WASM stack for async WebGPU buffer operations. Without
48
+ * this the blocking C function traps with `RuntimeError: unreachable` on
49
+ * WebGPU builds because the browser event-loop cannot pump GPU command
50
+ * buffers while the main thread is blocked in a synchronous ccall.
51
+ *
52
+ * @param prompt - Input text prompt
53
+ * @param options - Generation options (temperature, maxTokens, etc.)
54
+ * @returns Generation result with text and metrics
55
+ */
56
+ generate(prompt: string, options?: LLMGenerationOptions): Promise<LLMGenerationResult>;
57
+ /**
58
+ * Generate text with streaming (returns AsyncIterable of tokens).
59
+ *
60
+ * Async because the underlying C call uses `{async: true}` so Emscripten's
61
+ * JSPI can suspend the WASM stack during WebGPU buffer operations. On
62
+ * CPU-only builds the result is simply an already-resolved Promise.
63
+ *
64
+ * @param prompt - Input text prompt
65
+ * @param options - Generation options
66
+ * @returns Streaming result with async token stream and final result promise
67
+ */
68
+ generateStream(prompt: string, options?: LLMGenerationOptions): Promise<LLMStreamingResult>;
69
+ /**
70
+ * Cancel any in-progress generation.
71
+ */
72
+ cancel(): void;
73
+ /**
74
+ * Clean up the LLM component (frees memory).
75
+ */
76
+ cleanup(): void;
77
+ }
78
+ export declare const TextGeneration: TextGenerationImpl;
79
+ export {};
80
+ //# sourceMappingURL=RunAnywhere+TextGeneration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunAnywhere+TextGeneration.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+TextGeneration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AASH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAQ1G,cAAM,kBAAkB;IACtB,QAAQ,CAAC,aAAa,oBAAoB;IAC1C,OAAO,CAAC,mBAAmB,CAAK;IAEhC,2DAA2D;IAC3D,OAAO,CAAC,aAAa;IAOrB,2CAA2C;YAC7B,kBAAkB;IA2BhC;;;;;;OAMG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCtF;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBlC;;OAEG;IACH,IAAI,aAAa,IAAI,OAAO,CAQ3B;IAED;;;;;;;;;;;;OAYG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA4HhG;;;;;;;;;;OAUG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0LrG;;OAEG;IACH,MAAM,IAAI,IAAI;IAUd;;OAEG;IACH,OAAO,IAAI,IAAI;CAWhB;AAED,eAAO,MAAM,cAAc,oBAA2B,CAAC"}