@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.
- package/README.md +795 -0
- package/dist/Foundation/ErrorTypes.d.ts +61 -0
- package/dist/Foundation/ErrorTypes.d.ts.map +1 -0
- package/dist/Foundation/ErrorTypes.js +90 -0
- package/dist/Foundation/ErrorTypes.js.map +1 -0
- package/dist/Foundation/EventBus.d.ts +171 -0
- package/dist/Foundation/EventBus.d.ts.map +1 -0
- package/dist/Foundation/EventBus.js +113 -0
- package/dist/Foundation/EventBus.js.map +1 -0
- package/dist/Foundation/PlatformAdapter.d.ts +101 -0
- package/dist/Foundation/PlatformAdapter.d.ts.map +1 -0
- package/dist/Foundation/PlatformAdapter.js +417 -0
- package/dist/Foundation/PlatformAdapter.js.map +1 -0
- package/dist/Foundation/SDKLogger.d.ts +33 -0
- package/dist/Foundation/SDKLogger.d.ts.map +1 -0
- package/dist/Foundation/SDKLogger.js +82 -0
- package/dist/Foundation/SDKLogger.js.map +1 -0
- package/dist/Foundation/SherpaONNXBridge.d.ts +134 -0
- package/dist/Foundation/SherpaONNXBridge.d.ts.map +1 -0
- package/dist/Foundation/SherpaONNXBridge.js +332 -0
- package/dist/Foundation/SherpaONNXBridge.js.map +1 -0
- package/dist/Foundation/StructOffsets.d.ts +147 -0
- package/dist/Foundation/StructOffsets.d.ts.map +1 -0
- package/dist/Foundation/StructOffsets.js +161 -0
- package/dist/Foundation/StructOffsets.js.map +1 -0
- package/dist/Foundation/WASMBridge.d.ts +241 -0
- package/dist/Foundation/WASMBridge.d.ts.map +1 -0
- package/dist/Foundation/WASMBridge.js +393 -0
- package/dist/Foundation/WASMBridge.js.map +1 -0
- package/dist/Infrastructure/ArchiveUtility.d.ts +25 -0
- package/dist/Infrastructure/ArchiveUtility.d.ts.map +1 -0
- package/dist/Infrastructure/ArchiveUtility.js +139 -0
- package/dist/Infrastructure/ArchiveUtility.js.map +1 -0
- package/dist/Infrastructure/AudioCapture.d.ts +87 -0
- package/dist/Infrastructure/AudioCapture.d.ts.map +1 -0
- package/dist/Infrastructure/AudioCapture.js +231 -0
- package/dist/Infrastructure/AudioCapture.js.map +1 -0
- package/dist/Infrastructure/AudioPlayback.d.ts +53 -0
- package/dist/Infrastructure/AudioPlayback.d.ts.map +1 -0
- package/dist/Infrastructure/AudioPlayback.js +117 -0
- package/dist/Infrastructure/AudioPlayback.js.map +1 -0
- package/dist/Infrastructure/DeviceCapabilities.d.ts +39 -0
- package/dist/Infrastructure/DeviceCapabilities.d.ts.map +1 -0
- package/dist/Infrastructure/DeviceCapabilities.js +111 -0
- package/dist/Infrastructure/DeviceCapabilities.js.map +1 -0
- package/dist/Infrastructure/ExtensionRegistry.d.ts +30 -0
- package/dist/Infrastructure/ExtensionRegistry.d.ts.map +1 -0
- package/dist/Infrastructure/ExtensionRegistry.js +41 -0
- package/dist/Infrastructure/ExtensionRegistry.js.map +1 -0
- package/dist/Infrastructure/ModelDownloader.d.ts +98 -0
- package/dist/Infrastructure/ModelDownloader.d.ts.map +1 -0
- package/dist/Infrastructure/ModelDownloader.js +431 -0
- package/dist/Infrastructure/ModelDownloader.js.map +1 -0
- package/dist/Infrastructure/ModelLoaderTypes.d.ts +34 -0
- package/dist/Infrastructure/ModelLoaderTypes.d.ts.map +1 -0
- package/dist/Infrastructure/ModelLoaderTypes.js +12 -0
- package/dist/Infrastructure/ModelLoaderTypes.js.map +1 -0
- package/dist/Infrastructure/ModelManager.d.ts +219 -0
- package/dist/Infrastructure/ModelManager.d.ts.map +1 -0
- package/dist/Infrastructure/ModelManager.js +885 -0
- package/dist/Infrastructure/ModelManager.js.map +1 -0
- package/dist/Infrastructure/ModelRegistry.d.ts +131 -0
- package/dist/Infrastructure/ModelRegistry.d.ts.map +1 -0
- package/dist/Infrastructure/ModelRegistry.js +122 -0
- package/dist/Infrastructure/ModelRegistry.js.map +1 -0
- package/dist/Infrastructure/OPFSStorage.d.ts +143 -0
- package/dist/Infrastructure/OPFSStorage.d.ts.map +1 -0
- package/dist/Infrastructure/OPFSStorage.js +330 -0
- package/dist/Infrastructure/OPFSStorage.js.map +1 -0
- package/dist/Infrastructure/VLMWorkerBridge.d.ts +211 -0
- package/dist/Infrastructure/VLMWorkerBridge.d.ts.map +1 -0
- package/dist/Infrastructure/VLMWorkerBridge.js +264 -0
- package/dist/Infrastructure/VLMWorkerBridge.js.map +1 -0
- package/dist/Infrastructure/VLMWorkerRuntime.d.ts +38 -0
- package/dist/Infrastructure/VLMWorkerRuntime.d.ts.map +1 -0
- package/dist/Infrastructure/VLMWorkerRuntime.js +503 -0
- package/dist/Infrastructure/VLMWorkerRuntime.js.map +1 -0
- package/dist/Infrastructure/VideoCapture.d.ts +118 -0
- package/dist/Infrastructure/VideoCapture.d.ts.map +1 -0
- package/dist/Infrastructure/VideoCapture.js +207 -0
- package/dist/Infrastructure/VideoCapture.js.map +1 -0
- package/dist/Public/Extensions/DiffusionTypes.d.ts +64 -0
- package/dist/Public/Extensions/DiffusionTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/DiffusionTypes.js +28 -0
- package/dist/Public/Extensions/DiffusionTypes.js.map +1 -0
- package/dist/Public/Extensions/EmbeddingsTypes.d.ts +33 -0
- package/dist/Public/Extensions/EmbeddingsTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/EmbeddingsTypes.js +13 -0
- package/dist/Public/Extensions/EmbeddingsTypes.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts +44 -0
- package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+Diffusion.js +189 -0
- package/dist/Public/Extensions/RunAnywhere+Diffusion.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts +56 -0
- package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+Embeddings.js +240 -0
- package/dist/Public/Extensions/RunAnywhere+Embeddings.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts +53 -0
- package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+ModelManagement.js +153 -0
- package/dist/Public/Extensions/RunAnywhere+ModelManagement.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+STT.d.ts +95 -0
- package/dist/Public/Extensions/RunAnywhere+STT.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+STT.js +417 -0
- package/dist/Public/Extensions/RunAnywhere+STT.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts +69 -0
- package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js +196 -0
- package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+TTS.d.ts +55 -0
- package/dist/Public/Extensions/RunAnywhere+TTS.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+TTS.js +253 -0
- package/dist/Public/Extensions/RunAnywhere+TTS.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts +80 -0
- package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+TextGeneration.js +436 -0
- package/dist/Public/Extensions/RunAnywhere+TextGeneration.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts +82 -0
- package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+ToolCalling.js +576 -0
- package/dist/Public/Extensions/RunAnywhere+ToolCalling.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VAD.d.ts +70 -0
- package/dist/Public/Extensions/RunAnywhere+VAD.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VAD.js +231 -0
- package/dist/Public/Extensions/RunAnywhere+VAD.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VLM.d.ts +58 -0
- package/dist/Public/Extensions/RunAnywhere+VLM.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VLM.js +262 -0
- package/dist/Public/Extensions/RunAnywhere+VLM.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts +49 -0
- package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js +222 -0
- package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts +63 -0
- package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js +168 -0
- package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js.map +1 -0
- package/dist/Public/Extensions/STTTypes.d.ts +53 -0
- package/dist/Public/Extensions/STTTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/STTTypes.js +16 -0
- package/dist/Public/Extensions/STTTypes.js.map +1 -0
- package/dist/Public/Extensions/TTSTypes.d.ts +31 -0
- package/dist/Public/Extensions/TTSTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/TTSTypes.js +3 -0
- package/dist/Public/Extensions/TTSTypes.js.map +1 -0
- package/dist/Public/Extensions/ToolCallingTypes.d.ts +78 -0
- package/dist/Public/Extensions/ToolCallingTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/ToolCallingTypes.js +8 -0
- package/dist/Public/Extensions/ToolCallingTypes.js.map +1 -0
- package/dist/Public/Extensions/VADTypes.d.ts +30 -0
- package/dist/Public/Extensions/VADTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/VADTypes.js +8 -0
- package/dist/Public/Extensions/VADTypes.js.map +1 -0
- package/dist/Public/Extensions/VLMTypes.d.ts +56 -0
- package/dist/Public/Extensions/VLMTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/VLMTypes.js +24 -0
- package/dist/Public/Extensions/VLMTypes.js.map +1 -0
- package/dist/Public/Extensions/VoiceAgentTypes.d.ts +42 -0
- package/dist/Public/Extensions/VoiceAgentTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/VoiceAgentTypes.js +12 -0
- package/dist/Public/Extensions/VoiceAgentTypes.js.map +1 -0
- package/dist/Public/Extensions/VoicePipelineTypes.d.ts +69 -0
- package/dist/Public/Extensions/VoicePipelineTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/VoicePipelineTypes.js +9 -0
- package/dist/Public/Extensions/VoicePipelineTypes.js.map +1 -0
- package/dist/Public/RunAnywhere.d.ts +121 -0
- package/dist/Public/RunAnywhere.d.ts.map +1 -0
- package/dist/Public/RunAnywhere.js +332 -0
- package/dist/Public/RunAnywhere.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/types/LLMTypes.d.ts +48 -0
- package/dist/types/LLMTypes.d.ts.map +1 -0
- package/dist/types/LLMTypes.js +8 -0
- package/dist/types/LLMTypes.js.map +1 -0
- package/dist/types/enums.d.ts +144 -0
- package/dist/types/enums.d.ts.map +1 -0
- package/dist/types/enums.js +159 -0
- package/dist/types/enums.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/models.d.ts +154 -0
- package/dist/types/models.d.ts.map +1 -0
- package/dist/types/models.js +8 -0
- package/dist/types/models.js.map +1 -0
- package/dist/workers/vlm-worker.d.ts +9 -0
- package/dist/workers/vlm-worker.d.ts.map +1 -0
- package/dist/workers/vlm-worker.js +10 -0
- package/dist/workers/vlm-worker.js.map +1 -0
- package/package.json +62 -0
- package/wasm/racommons-webgpu.js +156 -0
- package/wasm/racommons-webgpu.wasm +0 -0
- package/wasm/racommons.js +126 -0
- package/wasm/racommons.wasm +0 -0
- package/wasm/sherpa/sherpa-onnx-asr.js +1538 -0
- package/wasm/sherpa/sherpa-onnx-glue-original.js +19 -0
- package/wasm/sherpa/sherpa-onnx-glue.js +17 -0
- package/wasm/sherpa/sherpa-onnx-tts.js +657 -0
- package/wasm/sherpa/sherpa-onnx-vad.js +337 -0
- package/wasm/sherpa/sherpa-onnx-wave.js +88 -0
- 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"}
|