@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,417 @@
1
+ /**
2
+ * RunAnywhere Web SDK - Speech-to-Text Extension
3
+ *
4
+ * Adds STT (speech recognition) capabilities via sherpa-onnx WASM.
5
+ * Supports both offline (Whisper) and online (streaming Zipformer) models.
6
+ *
7
+ * Uses the sherpa-onnx C struct packing helpers from sherpa-onnx-asr.js
8
+ * to properly allocate config structs in WASM memory (NOT JSON strings).
9
+ *
10
+ * Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/STT/
11
+ *
12
+ * Usage:
13
+ * import { STT } from '@runanywhere/web';
14
+ *
15
+ * // Load model files (downloaded separately)
16
+ * await STT.loadModel({
17
+ * modelId: 'whisper-tiny-en',
18
+ * type: 'whisper',
19
+ * modelFiles: {
20
+ * encoder: '/models/whisper-tiny-en/encoder.onnx',
21
+ * decoder: '/models/whisper-tiny-en/decoder.onnx',
22
+ * tokens: '/models/whisper-tiny-en/tokens.txt',
23
+ * },
24
+ * });
25
+ *
26
+ * const result = await STT.transcribe(audioFloat32Array);
27
+ * console.log(result.text);
28
+ */
29
+ import { RunAnywhere } from '../RunAnywhere';
30
+ import { SherpaONNXBridge } from '../../Foundation/SherpaONNXBridge';
31
+ import { SDKError, SDKErrorCode } from '../../Foundation/ErrorTypes';
32
+ import { SDKLogger } from '../../Foundation/SDKLogger';
33
+ import { EventBus } from '../../Foundation/EventBus';
34
+ import { SDKEventType } from '../../types/enums';
35
+ import { STTModelType } from './STTTypes';
36
+ // Import sherpa-onnx C struct packing helpers.
37
+ // These functions properly allocate and fill C structs in WASM memory
38
+ // for passing to the sherpa-onnx C API.
39
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
40
+ // @ts-ignore — JS helper file, no .d.ts available
41
+ import { initSherpaOnnxOfflineRecognizerConfig, initSherpaOnnxOnlineRecognizerConfig, freeConfig } from '../../../wasm/sherpa/sherpa-onnx-asr.js';
42
+ const logger = new SDKLogger('STT');
43
+ // ---------------------------------------------------------------------------
44
+ // STT Types (re-exported from STTTypes.ts)
45
+ // ---------------------------------------------------------------------------
46
+ export { STTModelType } from './STTTypes';
47
+ // ---------------------------------------------------------------------------
48
+ // Config Builders (stateless helpers)
49
+ // ---------------------------------------------------------------------------
50
+ function requireSherpa() {
51
+ if (!RunAnywhere.isInitialized)
52
+ throw SDKError.notInitialized();
53
+ return SherpaONNXBridge.shared;
54
+ }
55
+ /**
56
+ * Build a sherpa-onnx offline recognizer config object suitable for
57
+ * `initSherpaOnnxOfflineRecognizerConfig()` from sherpa-onnx-asr.js.
58
+ *
59
+ * This returns a plain JS config object that the helper function will
60
+ * pack into a C struct in WASM memory.
61
+ */
62
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
+ function buildOfflineRecognizerConfig(config) {
64
+ const sampleRate = config.sampleRate ?? 16000;
65
+ const files = config.modelFiles;
66
+ // Base config with all model types empty (required for struct layout)
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ const modelConfig = {
69
+ transducer: { encoder: '', decoder: '', joiner: '' },
70
+ paraformer: { model: '' },
71
+ nemoCtc: { model: '' },
72
+ whisper: { encoder: '', decoder: '', language: '', task: '', tailPaddings: -1 },
73
+ tdnn: { model: '' },
74
+ senseVoice: { model: '', language: '', useInverseTextNormalization: 0 },
75
+ moonshine: { preprocessor: '', encoder: '', uncachedDecoder: '', cachedDecoder: '' },
76
+ fireRedAsr: { encoder: '', decoder: '' },
77
+ dolphin: { model: '' },
78
+ zipformerCtc: { model: '' },
79
+ canary: { encoder: '', decoder: '', srcLang: '', tgtLang: '', usePnc: 1 },
80
+ wenetCtc: { model: '' },
81
+ omnilingual: { model: '' },
82
+ tokens: '',
83
+ numThreads: 1,
84
+ provider: 'cpu',
85
+ debug: 0,
86
+ modelType: '',
87
+ modelingUnit: '',
88
+ bpeVocab: '',
89
+ teleSpeechCtc: '',
90
+ };
91
+ if (config.type === STTModelType.Whisper) {
92
+ const f = files;
93
+ modelConfig.whisper = {
94
+ encoder: f.encoder,
95
+ decoder: f.decoder,
96
+ language: config.language ?? 'en',
97
+ task: 'transcribe',
98
+ tailPaddings: -1,
99
+ };
100
+ modelConfig.tokens = f.tokens;
101
+ }
102
+ else if (config.type === STTModelType.Paraformer) {
103
+ const f = files;
104
+ modelConfig.paraformer = { model: f.model };
105
+ modelConfig.tokens = f.tokens;
106
+ }
107
+ return {
108
+ featConfig: { sampleRate, featureDim: 80 },
109
+ modelConfig,
110
+ lmConfig: { model: '', scale: 1.0 },
111
+ decodingMethod: 'greedy_search',
112
+ maxActivePaths: 4,
113
+ hotwordsFile: '',
114
+ hotwordsScore: 1.5,
115
+ ruleFsts: '',
116
+ ruleFars: '',
117
+ blankPenalty: 0,
118
+ };
119
+ }
120
+ /**
121
+ * Build a sherpa-onnx online recognizer config object suitable for
122
+ * `initSherpaOnnxOnlineRecognizerConfig()` from sherpa-onnx-asr.js.
123
+ */
124
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
125
+ function buildOnlineRecognizerConfig(config) {
126
+ const sampleRate = config.sampleRate ?? 16000;
127
+ const files = config.modelFiles;
128
+ return {
129
+ featConfig: { sampleRate, featureDim: 80 },
130
+ modelConfig: {
131
+ transducer: {
132
+ encoder: files.encoder,
133
+ decoder: files.decoder,
134
+ joiner: files.joiner,
135
+ },
136
+ paraformer: { encoder: '', decoder: '' },
137
+ zipformer2Ctc: { model: '' },
138
+ nemoCtc: { model: '' },
139
+ toneCtc: { model: '' },
140
+ tokens: files.tokens,
141
+ numThreads: 1,
142
+ provider: 'cpu',
143
+ debug: 0,
144
+ modelType: '',
145
+ modelingUnit: '',
146
+ bpeVocab: '',
147
+ },
148
+ decodingMethod: 'greedy_search',
149
+ maxActivePaths: 4,
150
+ enableEndpoint: 1,
151
+ rule1MinTrailingSilence: 2.4,
152
+ rule2MinTrailingSilence: 1.2,
153
+ rule3MinUtteranceLength: 20,
154
+ hotwordsFile: '',
155
+ hotwordsScore: 1.5,
156
+ ctcFstDecoderConfig: { graph: '', maxActive: 3000 },
157
+ ruleFsts: '',
158
+ ruleFars: '',
159
+ };
160
+ }
161
+ // ---------------------------------------------------------------------------
162
+ // STT Extension
163
+ // ---------------------------------------------------------------------------
164
+ class STTImpl {
165
+ extensionName = 'STT';
166
+ _offlineRecognizerHandle = 0;
167
+ _onlineRecognizerHandle = 0;
168
+ _currentModelType = STTModelType.Whisper;
169
+ _currentModelId = '';
170
+ /** Returns the currently loaded STT model type. */
171
+ get currentModelType() {
172
+ return this._currentModelType;
173
+ }
174
+ /**
175
+ * Load an STT model via sherpa-onnx.
176
+ * Model files must already be written to sherpa-onnx virtual FS
177
+ * (use SherpaONNXBridge.shared.downloadAndWrite() or .writeFile()).
178
+ */
179
+ async loadModel(config) {
180
+ const sherpa = requireSherpa();
181
+ await sherpa.ensureLoaded();
182
+ const m = sherpa.module;
183
+ // Clean up previous model
184
+ this.cleanup();
185
+ logger.info(`Loading STT model: ${config.modelId} (${config.type})`);
186
+ EventBus.shared.emit('model.loadStarted', SDKEventType.Model, {
187
+ modelId: config.modelId, component: 'stt',
188
+ });
189
+ const startMs = performance.now();
190
+ try {
191
+ if (config.type === STTModelType.Zipformer) {
192
+ // Streaming model: use online recognizer
193
+ const configObj = buildOnlineRecognizerConfig(config);
194
+ const configStruct = initSherpaOnnxOnlineRecognizerConfig(configObj, m);
195
+ this._onlineRecognizerHandle = m._SherpaOnnxCreateOnlineRecognizer(configStruct.ptr);
196
+ freeConfig(configStruct, m);
197
+ if (this._onlineRecognizerHandle === 0) {
198
+ throw new SDKError(SDKErrorCode.ModelLoadFailed, `Failed to create online recognizer for ${config.modelId}`);
199
+ }
200
+ }
201
+ else {
202
+ // Non-streaming model (Whisper, Paraformer): use offline recognizer
203
+ const configObj = buildOfflineRecognizerConfig(config);
204
+ logger.debug(`Offline config: ${JSON.stringify(configObj.modelConfig.whisper)}`);
205
+ const configStruct = initSherpaOnnxOfflineRecognizerConfig(configObj, m);
206
+ this._offlineRecognizerHandle = m._SherpaOnnxCreateOfflineRecognizer(configStruct.ptr);
207
+ freeConfig(configStruct, m);
208
+ if (this._offlineRecognizerHandle === 0) {
209
+ throw new SDKError(SDKErrorCode.ModelLoadFailed, `Failed to create offline recognizer for ${config.modelId}`);
210
+ }
211
+ }
212
+ this._currentModelType = config.type;
213
+ this._currentModelId = config.modelId;
214
+ const loadTimeMs = Math.round(performance.now() - startMs);
215
+ logger.info(`STT model loaded: ${config.modelId} in ${loadTimeMs}ms`);
216
+ EventBus.shared.emit('model.loadCompleted', SDKEventType.Model, {
217
+ modelId: config.modelId, component: 'stt', loadTimeMs,
218
+ });
219
+ }
220
+ catch (error) {
221
+ this.cleanup();
222
+ throw error;
223
+ }
224
+ }
225
+ /** Unload the STT model. */
226
+ async unloadModel() {
227
+ this.cleanup();
228
+ logger.info('STT model unloaded');
229
+ }
230
+ /** Check if an STT model is loaded. */
231
+ get isModelLoaded() {
232
+ return this._offlineRecognizerHandle !== 0 || this._onlineRecognizerHandle !== 0;
233
+ }
234
+ /** Get the current model ID. */
235
+ get modelId() {
236
+ return this._currentModelId;
237
+ }
238
+ /**
239
+ * Transcribe audio data (offline / non-streaming).
240
+ *
241
+ * @param audioSamples - Float32Array of PCM audio samples (mono, 16kHz)
242
+ * @param options - Transcription options
243
+ * @returns Transcription result
244
+ */
245
+ async transcribe(audioSamples, options = {}) {
246
+ const sherpa = requireSherpa();
247
+ const m = sherpa.module;
248
+ if (this._offlineRecognizerHandle === 0) {
249
+ if (this._onlineRecognizerHandle !== 0) {
250
+ // Streaming model: process all at once via online recognizer
251
+ return this._transcribeViaOnline(audioSamples, options);
252
+ }
253
+ throw new SDKError(SDKErrorCode.ModelNotLoaded, 'No STT model loaded. Call loadModel() first.');
254
+ }
255
+ const startMs = performance.now();
256
+ const sampleRate = options.sampleRate ?? 16000;
257
+ logger.debug(`Transcribing ${audioSamples.length} samples (${(audioSamples.length / sampleRate).toFixed(1)}s)`);
258
+ // Create stream
259
+ const stream = m._SherpaOnnxCreateOfflineStream(this._offlineRecognizerHandle);
260
+ if (stream === 0) {
261
+ throw new SDKError(SDKErrorCode.GenerationFailed, 'Failed to create offline stream');
262
+ }
263
+ // Copy audio to WASM memory
264
+ const audioPtr = m._malloc(audioSamples.length * 4);
265
+ m.HEAPF32.set(audioSamples, audioPtr / 4);
266
+ try {
267
+ // Feed audio
268
+ m._SherpaOnnxAcceptWaveformOffline(stream, sampleRate, audioPtr, audioSamples.length);
269
+ // Decode
270
+ m._SherpaOnnxDecodeOfflineStream(this._offlineRecognizerHandle, stream);
271
+ // Get result as JSON
272
+ const jsonPtr = m._SherpaOnnxGetOfflineStreamResultAsJson(stream);
273
+ const jsonStr = sherpa.readString(jsonPtr);
274
+ m._SherpaOnnxDestroyOfflineStreamResultJson(jsonPtr);
275
+ const result = JSON.parse(jsonStr || '{}');
276
+ const processingTimeMs = Math.round(performance.now() - startMs);
277
+ const transcription = {
278
+ text: (result.text ?? '').trim(),
279
+ confidence: result.confidence ?? 0,
280
+ detectedLanguage: result.lang,
281
+ processingTimeMs,
282
+ };
283
+ EventBus.shared.emit('stt.transcribed', SDKEventType.Voice, {
284
+ text: transcription.text,
285
+ confidence: transcription.confidence,
286
+ });
287
+ return transcription;
288
+ }
289
+ finally {
290
+ m._free(audioPtr);
291
+ m._SherpaOnnxDestroyOfflineStream(stream);
292
+ }
293
+ }
294
+ /** Internal: Transcribe via online recognizer (for streaming models used non-streaming) */
295
+ async _transcribeViaOnline(audioSamples, options = {}) {
296
+ const m = SherpaONNXBridge.shared.module;
297
+ const startMs = performance.now();
298
+ const sampleRate = options.sampleRate ?? 16000;
299
+ const stream = m._SherpaOnnxCreateOnlineStream(this._onlineRecognizerHandle);
300
+ if (stream === 0) {
301
+ throw new SDKError(SDKErrorCode.GenerationFailed, 'Failed to create online stream');
302
+ }
303
+ const audioPtr = m._malloc(audioSamples.length * 4);
304
+ m.HEAPF32.set(audioSamples, audioPtr / 4);
305
+ try {
306
+ m._SherpaOnnxOnlineStreamAcceptWaveform(stream, sampleRate, audioPtr, audioSamples.length);
307
+ m._SherpaOnnxOnlineStreamInputFinished(stream);
308
+ while (m._SherpaOnnxIsOnlineStreamReady(this._onlineRecognizerHandle, stream)) {
309
+ m._SherpaOnnxDecodeOnlineStream(this._onlineRecognizerHandle, stream);
310
+ }
311
+ const jsonPtr = m._SherpaOnnxGetOnlineStreamResultAsJson(this._onlineRecognizerHandle, stream);
312
+ const jsonStr = SherpaONNXBridge.shared.readString(jsonPtr);
313
+ m._SherpaOnnxDestroyOnlineStreamResultJson(jsonPtr);
314
+ const result = JSON.parse(jsonStr || '{}');
315
+ const processingTimeMs = Math.round(performance.now() - startMs);
316
+ return {
317
+ text: (result.text ?? '').trim(),
318
+ confidence: result.confidence ?? 0,
319
+ processingTimeMs,
320
+ };
321
+ }
322
+ finally {
323
+ m._free(audioPtr);
324
+ m._SherpaOnnxDestroyOnlineStream(stream);
325
+ }
326
+ }
327
+ /**
328
+ * Create a streaming transcription session.
329
+ * Returns an object to feed audio chunks and get results.
330
+ */
331
+ createStreamingSession(options = {}) {
332
+ if (this._onlineRecognizerHandle === 0) {
333
+ throw new SDKError(SDKErrorCode.ModelNotLoaded, 'No streaming STT model loaded. Use a zipformer model.');
334
+ }
335
+ return new STTStreamingSessionImpl(this._onlineRecognizerHandle, options);
336
+ }
337
+ /** Clean up the STT resources. */
338
+ cleanup() {
339
+ const sherpa = SherpaONNXBridge.shared;
340
+ if (!sherpa.isLoaded)
341
+ return;
342
+ const m = sherpa.module;
343
+ if (this._offlineRecognizerHandle !== 0) {
344
+ try {
345
+ m._SherpaOnnxDestroyOfflineRecognizer(this._offlineRecognizerHandle);
346
+ }
347
+ catch { /* ignore */ }
348
+ this._offlineRecognizerHandle = 0;
349
+ }
350
+ if (this._onlineRecognizerHandle !== 0) {
351
+ try {
352
+ m._SherpaOnnxDestroyOnlineRecognizer(this._onlineRecognizerHandle);
353
+ }
354
+ catch { /* ignore */ }
355
+ this._onlineRecognizerHandle = 0;
356
+ }
357
+ this._currentModelId = '';
358
+ }
359
+ }
360
+ export const STT = new STTImpl();
361
+ /** Returns the currently loaded STT model type. */
362
+ export function getCurrentSTTModelType() {
363
+ return STT.currentModelType;
364
+ }
365
+ class STTStreamingSessionImpl {
366
+ _stream;
367
+ _recognizer;
368
+ _sampleRate;
369
+ constructor(recognizer, options) {
370
+ this._recognizer = recognizer;
371
+ this._sampleRate = options.sampleRate ?? 16000;
372
+ const m = SherpaONNXBridge.shared.module;
373
+ this._stream = m._SherpaOnnxCreateOnlineStream(recognizer);
374
+ if (this._stream === 0) {
375
+ throw new SDKError(SDKErrorCode.GenerationFailed, 'Failed to create streaming session');
376
+ }
377
+ }
378
+ acceptWaveform(samples, sampleRate) {
379
+ const m = SherpaONNXBridge.shared.module;
380
+ const audioPtr = m._malloc(samples.length * 4);
381
+ m.HEAPF32.set(samples, audioPtr / 4);
382
+ m._SherpaOnnxOnlineStreamAcceptWaveform(this._stream, sampleRate ?? this._sampleRate, audioPtr, samples.length);
383
+ m._free(audioPtr);
384
+ // Decode available frames
385
+ while (m._SherpaOnnxIsOnlineStreamReady(this._recognizer, this._stream)) {
386
+ m._SherpaOnnxDecodeOnlineStream(this._recognizer, this._stream);
387
+ }
388
+ }
389
+ inputFinished() {
390
+ SherpaONNXBridge.shared.module._SherpaOnnxOnlineStreamInputFinished(this._stream);
391
+ }
392
+ getResult() {
393
+ const m = SherpaONNXBridge.shared.module;
394
+ const jsonPtr = m._SherpaOnnxGetOnlineStreamResultAsJson(this._recognizer, this._stream);
395
+ const jsonStr = SherpaONNXBridge.shared.readString(jsonPtr);
396
+ m._SherpaOnnxDestroyOnlineStreamResultJson(jsonPtr);
397
+ const result = JSON.parse(jsonStr || '{}');
398
+ const isEndpoint = m._SherpaOnnxOnlineStreamIsEndpoint(this._recognizer, this._stream) !== 0;
399
+ return {
400
+ text: (result.text ?? '').trim(),
401
+ isEndpoint,
402
+ };
403
+ }
404
+ reset() {
405
+ SherpaONNXBridge.shared.module._SherpaOnnxOnlineStreamReset(this._recognizer, this._stream);
406
+ }
407
+ destroy() {
408
+ if (this._stream !== 0) {
409
+ try {
410
+ SherpaONNXBridge.shared.module._SherpaOnnxDestroyOnlineStream(this._stream);
411
+ }
412
+ catch { /* ignore */ }
413
+ this._stream = 0;
414
+ }
415
+ }
416
+ }
417
+ //# sourceMappingURL=RunAnywhere+STT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunAnywhere+STT.js","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+STT.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,+CAA+C;AAC/C,sEAAsE;AACtE,wCAAwC;AACxC,6DAA6D;AAC7D,kDAAkD;AAClD,OAAO,EAAE,qCAAqC,EAAE,oCAAoC,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAElJ,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;AAEpC,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAW1C,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,SAAS,aAAa;IACpB,IAAI,CAAC,WAAW,CAAC,aAAa;QAAE,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC;IAChE,OAAO,gBAAgB,CAAC,MAAM,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,8DAA8D;AAC9D,SAAS,4BAA4B,CAAC,MAAsB;IAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;IAEhC,sEAAsE;IACtE,8DAA8D;IAC9D,MAAM,WAAW,GAAwB;QACvC,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACpD,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACtB,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE;QAC/E,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACnB,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,2BAA2B,EAAE,CAAC,EAAE;QACvE,SAAS,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;QACpF,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACxC,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACtB,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3B,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;QACzE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAC1B,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,CAAC;QACb,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,EAAE;QACb,YAAY,EAAE,EAAE;QAChB,QAAQ,EAAE,EAAE;QACZ,aAAa,EAAE,EAAE;KAClB,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,KAAwB,CAAC;QACnC,WAAW,CAAC,OAAO,GAAG;YACpB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;YACjC,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,CAAC,CAAC;SACjB,CAAC;QACF,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,UAAU,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,KAA2B,CAAC;QACtC,WAAW,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC5C,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,OAAO;QACL,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE;QAC1C,WAAW;QACX,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;QACnC,cAAc,EAAE,eAAe;QAC/B,cAAc,EAAE,CAAC;QACjB,YAAY,EAAE,EAAE;QAChB,aAAa,EAAE,GAAG;QAClB,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,CAAC;KAChB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,8DAA8D;AAC9D,SAAS,2BAA2B,CAAC,MAAsB;IACzD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,UAA+B,CAAC;IAErD,OAAO;QACL,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE;QAC1C,WAAW,EAAE;YACX,UAAU,EAAE;gBACV,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB;YACD,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACxC,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC5B,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACtB,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,EAAE;YACb,YAAY,EAAE,EAAE;YAChB,QAAQ,EAAE,EAAE;SACb;QACD,cAAc,EAAE,eAAe;QAC/B,cAAc,EAAE,CAAC;QACjB,cAAc,EAAE,CAAC;QACjB,uBAAuB,EAAE,GAAG;QAC5B,uBAAuB,EAAE,GAAG;QAC5B,uBAAuB,EAAE,EAAE;QAC3B,YAAY,EAAE,EAAE;QAChB,aAAa,EAAE,GAAG;QAClB,mBAAmB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;QACnD,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,OAAO;IACF,aAAa,GAAG,KAAK,CAAC;IACvB,wBAAwB,GAAG,CAAC,CAAC;IAC7B,uBAAuB,GAAG,CAAC,CAAC;IAC5B,iBAAiB,GAAiB,YAAY,CAAC,OAAO,CAAC;IACvD,eAAe,GAAG,EAAE,CAAC;IAE7B,mDAAmD;IACnD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,MAAsB;QACpC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAExB,0BAA0B;QAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,MAAM,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QACrE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,YAAY,CAAC,KAAK,EAAE;YAC5D,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK;SAC1C,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAElC,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,SAAS,EAAE,CAAC;gBAC3C,yCAAyC;gBACzC,MAAM,SAAS,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;gBACtD,MAAM,YAAY,GAAG,oCAAoC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAExE,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC,iCAAiC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBACrF,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;gBAE5B,IAAI,IAAI,CAAC,uBAAuB,KAAK,CAAC,EAAE,CAAC;oBACvC,MAAM,IAAI,QAAQ,CAAC,YAAY,CAAC,eAAe,EAC7C,0CAA0C,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,oEAAoE;gBACpE,MAAM,SAAS,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACjF,MAAM,YAAY,GAAG,qCAAqC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAEzE,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC,kCAAkC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBACvF,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;gBAE5B,IAAI,IAAI,CAAC,wBAAwB,KAAK,CAAC,EAAE,CAAC;oBACxC,MAAM,IAAI,QAAQ,CAAC,YAAY,CAAC,eAAe,EAC7C,2CAA2C,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;YAED,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC;YACrC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC;YAEtC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,OAAO,OAAO,UAAU,IAAI,CAAC,CAAC;YACtE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,KAAK,EAAE;gBAC9D,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU;aACtD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAED,uCAAuC;IACvC,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,wBAAwB,KAAK,CAAC,IAAI,IAAI,CAAC,uBAAuB,KAAK,CAAC,CAAC;IACnF,CAAC;IAED,gCAAgC;IAChC,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CACd,YAA0B,EAC1B,UAAgC,EAAE;QAElC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAExB,IAAI,IAAI,CAAC,wBAAwB,KAAK,CAAC,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,uBAAuB,KAAK,CAAC,EAAE,CAAC;gBACvC,6DAA6D;gBAC7D,OAAO,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1D,CAAC;YACD,MAAM,IAAI,QAAQ,CAAC,YAAY,CAAC,cAAc,EAAE,8CAA8C,CAAC,CAAC;QAClG,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;QAE/C,MAAM,CAAC,KAAK,CAAC,gBAAgB,YAAY,CAAC,MAAM,aAAa,CAAC,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEhH,gBAAgB;QAChB,MAAM,MAAM,GAAG,CAAC,CAAC,8BAA8B,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC/E,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,QAAQ,CAAC,YAAY,CAAC,gBAAgB,EAAE,iCAAiC,CAAC,CAAC;QACvF,CAAC;QAED,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,aAAa;YACb,CAAC,CAAC,gCAAgC,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;YAEtF,SAAS;YACT,CAAC,CAAC,8BAA8B,CAAC,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;YAExE,qBAAqB;YACrB,MAAM,OAAO,GAAG,CAAC,CAAC,uCAAuC,CAAC,MAAM,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC,CAAC,yCAAyC,CAAC,OAAO,CAAC,CAAC;YAErD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;YAC3C,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;YAEjE,MAAM,aAAa,GAA2B;gBAC5C,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBAChC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;gBAClC,gBAAgB,EAAE,MAAM,CAAC,IAAI;gBAC7B,gBAAgB;aACjB,CAAC;YAEF,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,KAAK,EAAE;gBAC1D,IAAI,EAAE,aAAa,CAAC,IAAI;gBACxB,UAAU,EAAE,aAAa,CAAC,UAAU;aACrC,CAAC,CAAC;YAEH,OAAO,aAAa,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAClB,CAAC,CAAC,+BAA+B,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,2FAA2F;IAC3F,KAAK,CAAC,oBAAoB,CACxB,YAA0B,EAC1B,UAAgC,EAAE;QAElC,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;QACzC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;QAE/C,MAAM,MAAM,GAAG,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC7E,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,QAAQ,CAAC,YAAY,CAAC,gBAAgB,EAAE,gCAAgC,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,CAAC,CAAC,qCAAqC,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;YAC3F,CAAC,CAAC,oCAAoC,CAAC,MAAM,CAAC,CAAC;YAE/C,OAAO,CAAC,CAAC,8BAA8B,CAAC,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC9E,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;YACxE,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,CAAC,sCAAsC,CAAC,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;YAC/F,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC5D,CAAC,CAAC,wCAAwC,CAAC,OAAO,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;YAC3C,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;YAEjE,OAAO;gBACL,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBAChC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;gBAClC,gBAAgB;aACjB,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAClB,CAAC,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,sBAAsB,CAAC,UAAgC,EAAE;QACvD,IAAI,IAAI,CAAC,uBAAuB,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,QAAQ,CAChB,YAAY,CAAC,cAAc,EAC3B,uDAAuD,CACxD,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,uBAAuB,CAAC,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED,kCAAkC;IAClC,OAAO;QACL,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO;QAE7B,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAExB,IAAI,IAAI,CAAC,wBAAwB,KAAK,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC;gBAAC,CAAC,CAAC,mCAAmC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACpG,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,IAAI,CAAC,uBAAuB,KAAK,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC;gBAAC,CAAC,CAAC,kCAAkC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAClG,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;AAEjC,mDAAmD;AACnD,MAAM,UAAU,sBAAsB;IACpC,OAAO,GAAG,CAAC,gBAAgB,CAAC;AAC9B,CAAC;AAmBD,MAAM,uBAAuB;IACnB,OAAO,CAAS;IACP,WAAW,CAAS;IACpB,WAAW,CAAS;IAErC,YAAY,UAAkB,EAAE,OAA6B;QAC3D,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;QAC/C,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,6BAA6B,CAAC,UAAU,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,QAAQ,CAAC,YAAY,CAAC,gBAAgB,EAAE,oCAAoC,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED,cAAc,CAAC,OAAqB,EAAE,UAAmB;QACvD,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;QACzC,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,qCAAqC,CACrC,IAAI,CAAC,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CACvE,CAAC;QACF,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAElB,0BAA0B;QAC1B,OAAO,CAAC,CAAC,8BAA8B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxE,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,aAAa;QACX,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,oCAAoC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpF,CAAC;IAED,SAAS;QACP,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;QACzC,MAAM,OAAO,GAAG,CAAC,CAAC,sCAAsC,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzF,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC,CAAC,wCAAwC,CAAC,OAAO,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,CAAC,CAAC,iCAAiC,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE7F,OAAO;YACL,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAChC,UAAU;SACX,CAAC;IACJ,CAAC;IAED,KAAK;QACH,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,4BAA4B,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9E,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACxB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,69 @@
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
+ export interface StructuredOutputConfig {
20
+ /** JSON Schema string */
21
+ jsonSchema: string;
22
+ /** Whether to include the schema in the prompt (default: true) */
23
+ includeSchemaInPrompt?: boolean;
24
+ }
25
+ export interface StructuredOutputValidation {
26
+ isValid: boolean;
27
+ errorMessage?: string;
28
+ extractedJson?: string;
29
+ }
30
+ export declare const StructuredOutput: {
31
+ /**
32
+ * Extract JSON from a text response (finds first complete JSON object/array).
33
+ *
34
+ * @param text - Raw LLM output text
35
+ * @returns Extracted JSON string, or null if none found
36
+ */
37
+ extractJson(text: string): string | null;
38
+ /**
39
+ * Prepare a prompt with schema instructions for structured output.
40
+ *
41
+ * @param originalPrompt - The user's original prompt
42
+ * @param config - Schema configuration
43
+ * @returns Enhanced prompt with schema instructions
44
+ */
45
+ preparePrompt(originalPrompt: string, config: StructuredOutputConfig): string;
46
+ /**
47
+ * Get a system prompt that instructs the LLM to produce JSON matching a schema.
48
+ *
49
+ * @param jsonSchema - JSON Schema string
50
+ * @returns System prompt string
51
+ */
52
+ getSystemPrompt(jsonSchema: string): string;
53
+ /**
54
+ * Validate LLM output against a JSON schema.
55
+ *
56
+ * @param text - Raw LLM output
57
+ * @param config - Schema configuration
58
+ * @returns Validation result with extracted JSON if valid
59
+ */
60
+ validate(text: string, config: StructuredOutputConfig): StructuredOutputValidation;
61
+ /**
62
+ * Check if text contains a complete JSON object or array.
63
+ *
64
+ * @param text - Text to check
65
+ * @returns True if a complete JSON block was found
66
+ */
67
+ hasCompleteJson(text: string): boolean;
68
+ };
69
+ //# sourceMappingURL=RunAnywhere+StructuredOutput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunAnywhere+StructuredOutput.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+StructuredOutput.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAmBH,MAAM,WAAW,sBAAsB;IACrC,yBAAyB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD,eAAO,MAAM,gBAAgB;IAC3B;;;;;OAKG;sBACe,MAAM,GAAG,MAAM,GAAG,IAAI;IA8BxC;;;;;;OAMG;kCAC2B,MAAM,UAAU,sBAAsB,GAAG,MAAM;IA0C7E;;;;;OAKG;gCACyB,MAAM,GAAG,MAAM;IA4B3C;;;;;;OAMG;mBACY,MAAM,UAAU,sBAAsB,GAAG,0BAA0B;IAkDlF;;;;;OAKG;0BACmB,MAAM,GAAG,OAAO;CAqBvC,CAAC"}