@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,436 @@
|
|
|
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 { RunAnywhere } from '../RunAnywhere';
|
|
20
|
+
import { WASMBridge } from '../../Foundation/WASMBridge';
|
|
21
|
+
import { Offsets } from '../../Foundation/StructOffsets';
|
|
22
|
+
import { SDKError, SDKErrorCode } from '../../Foundation/ErrorTypes';
|
|
23
|
+
import { SDKLogger } from '../../Foundation/SDKLogger';
|
|
24
|
+
import { EventBus } from '../../Foundation/EventBus';
|
|
25
|
+
import { SDKEventType, LLMFramework } from '../../types/enums';
|
|
26
|
+
const logger = new SDKLogger('TextGeneration');
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Text Generation Extension
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
class TextGenerationImpl {
|
|
31
|
+
extensionName = 'TextGeneration';
|
|
32
|
+
_llmComponentHandle = 0;
|
|
33
|
+
/** Ensure the SDK is initialized and return the bridge. */
|
|
34
|
+
requireBridge() {
|
|
35
|
+
if (!RunAnywhere.isInitialized) {
|
|
36
|
+
throw SDKError.notInitialized();
|
|
37
|
+
}
|
|
38
|
+
return WASMBridge.shared;
|
|
39
|
+
}
|
|
40
|
+
/** Ensure the LLM component is created. */
|
|
41
|
+
async ensureLLMComponent() {
|
|
42
|
+
if (this._llmComponentHandle !== 0) {
|
|
43
|
+
return this._llmComponentHandle;
|
|
44
|
+
}
|
|
45
|
+
const bridge = this.requireBridge();
|
|
46
|
+
const m = bridge.module;
|
|
47
|
+
// Allocate pointer for output handle
|
|
48
|
+
const handlePtr = m._malloc(4);
|
|
49
|
+
// {async: true} for JSPI -- component creation may init WebGPU context
|
|
50
|
+
const result = await bridge.callFunction('rac_llm_component_create', 'number', ['number'], [handlePtr], { async: true });
|
|
51
|
+
if (result !== 0) {
|
|
52
|
+
m._free(handlePtr);
|
|
53
|
+
bridge.checkResult(result, 'rac_llm_component_create');
|
|
54
|
+
}
|
|
55
|
+
this._llmComponentHandle = m.getValue(handlePtr, 'i32');
|
|
56
|
+
m._free(handlePtr);
|
|
57
|
+
logger.debug('LLM component created');
|
|
58
|
+
return this._llmComponentHandle;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Load an LLM model for text generation.
|
|
62
|
+
*
|
|
63
|
+
* @param modelPath - Path to the model file (in Emscripten FS)
|
|
64
|
+
* @param modelId - Model identifier
|
|
65
|
+
* @param modelName - Human-readable model name
|
|
66
|
+
*/
|
|
67
|
+
async loadModel(modelPath, modelId, modelName) {
|
|
68
|
+
const bridge = this.requireBridge();
|
|
69
|
+
const handle = await this.ensureLLMComponent();
|
|
70
|
+
logger.info(`Loading LLM model: ${modelId} from ${modelPath}`);
|
|
71
|
+
EventBus.shared.emit('model.loadStarted', SDKEventType.Model, { modelId });
|
|
72
|
+
const pathPtr = bridge.allocString(modelPath);
|
|
73
|
+
const idPtr = bridge.allocString(modelId);
|
|
74
|
+
const namePtr = bridge.allocString(modelName ?? modelId);
|
|
75
|
+
try {
|
|
76
|
+
// {async: true} allows JSPI to suspend during WebGPU device/buffer
|
|
77
|
+
// initialization that happens inside load_model.
|
|
78
|
+
const result = await bridge.callFunction('rac_llm_component_load_model', 'number', ['number', 'number', 'number', 'number'], [handle, pathPtr, idPtr, namePtr], { async: true });
|
|
79
|
+
bridge.checkResult(result, 'rac_llm_component_load_model');
|
|
80
|
+
logger.info(`LLM model loaded: ${modelId}`);
|
|
81
|
+
EventBus.shared.emit('model.loadCompleted', SDKEventType.Model, { modelId });
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
EventBus.shared.emit('model.loadFailed', SDKEventType.Model, {
|
|
85
|
+
modelId,
|
|
86
|
+
error: error instanceof Error ? error.message : String(error),
|
|
87
|
+
});
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
bridge.free(pathPtr);
|
|
92
|
+
bridge.free(idPtr);
|
|
93
|
+
bridge.free(namePtr);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Unload the currently loaded LLM model.
|
|
98
|
+
*/
|
|
99
|
+
async unloadModel() {
|
|
100
|
+
if (this._llmComponentHandle === 0)
|
|
101
|
+
return;
|
|
102
|
+
const bridge = this.requireBridge();
|
|
103
|
+
const result = await bridge.callFunction('rac_llm_component_unload', 'number', ['number'], [this._llmComponentHandle], { async: true });
|
|
104
|
+
bridge.checkResult(result, 'rac_llm_component_unload');
|
|
105
|
+
logger.info('LLM model unloaded');
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check if an LLM model is currently loaded.
|
|
109
|
+
*/
|
|
110
|
+
get isModelLoaded() {
|
|
111
|
+
if (this._llmComponentHandle === 0)
|
|
112
|
+
return false;
|
|
113
|
+
try {
|
|
114
|
+
const m = WASMBridge.shared.module;
|
|
115
|
+
return m._rac_llm_component_is_loaded(this._llmComponentHandle) === 1;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Generate text from a prompt (non-streaming).
|
|
123
|
+
*
|
|
124
|
+
* Uses `ccall` with `{async: true}` so that Emscripten's JSPI / Asyncify
|
|
125
|
+
* can suspend the WASM stack for async WebGPU buffer operations. Without
|
|
126
|
+
* this the blocking C function traps with `RuntimeError: unreachable` on
|
|
127
|
+
* WebGPU builds because the browser event-loop cannot pump GPU command
|
|
128
|
+
* buffers while the main thread is blocked in a synchronous ccall.
|
|
129
|
+
*
|
|
130
|
+
* @param prompt - Input text prompt
|
|
131
|
+
* @param options - Generation options (temperature, maxTokens, etc.)
|
|
132
|
+
* @returns Generation result with text and metrics
|
|
133
|
+
*/
|
|
134
|
+
async generate(prompt, options = {}) {
|
|
135
|
+
const bridge = this.requireBridge();
|
|
136
|
+
const m = bridge.module;
|
|
137
|
+
const handle = await this.ensureLLMComponent();
|
|
138
|
+
if (!this.isModelLoaded) {
|
|
139
|
+
throw new SDKError(SDKErrorCode.ModelNotLoaded, 'No LLM model loaded. Call loadModel() first.');
|
|
140
|
+
}
|
|
141
|
+
logger.debug(`Generating from prompt (${prompt.length} chars)`);
|
|
142
|
+
const startTime = performance.now();
|
|
143
|
+
EventBus.shared.emit('generation.started', SDKEventType.Generation, {
|
|
144
|
+
prompt: prompt.substring(0, 100),
|
|
145
|
+
});
|
|
146
|
+
// Allocate prompt string
|
|
147
|
+
const promptPtr = bridge.allocString(prompt);
|
|
148
|
+
// Create default options struct
|
|
149
|
+
const optionsPtr = m._rac_wasm_create_llm_options_default();
|
|
150
|
+
if (optionsPtr === 0) {
|
|
151
|
+
bridge.free(promptPtr);
|
|
152
|
+
throw new SDKError(SDKErrorCode.WASMMemoryError, 'Failed to allocate LLM options');
|
|
153
|
+
}
|
|
154
|
+
// Override options if provided (offsets from compiler via StructOffsets)
|
|
155
|
+
if (options.maxTokens !== undefined) {
|
|
156
|
+
m.setValue(optionsPtr + Offsets.llmOptions.maxTokens, options.maxTokens, 'i32');
|
|
157
|
+
}
|
|
158
|
+
if (options.temperature !== undefined) {
|
|
159
|
+
m.setValue(optionsPtr + Offsets.llmOptions.temperature, options.temperature, 'float');
|
|
160
|
+
}
|
|
161
|
+
if (options.topP !== undefined) {
|
|
162
|
+
m.setValue(optionsPtr + Offsets.llmOptions.topP, options.topP, 'float');
|
|
163
|
+
}
|
|
164
|
+
// Allocate and zero-initialise the result struct so any C++ code that
|
|
165
|
+
// reads a field before writing (e.g. checking `text != NULL`) does not
|
|
166
|
+
// encounter garbage memory.
|
|
167
|
+
const resultSize = m._rac_wasm_sizeof_llm_result();
|
|
168
|
+
const resultPtr = m._malloc(resultSize);
|
|
169
|
+
for (let i = 0; i < resultSize; i++)
|
|
170
|
+
m.setValue(resultPtr + i, 0, 'i8');
|
|
171
|
+
try {
|
|
172
|
+
// Call with {async: true} so Emscripten's JSPI / Asyncify can yield
|
|
173
|
+
// to the browser event-loop during WebGPU buffer map operations.
|
|
174
|
+
// On CPU-only builds this is harmless (the result is simply wrapped
|
|
175
|
+
// in an already-resolved Promise).
|
|
176
|
+
let result;
|
|
177
|
+
try {
|
|
178
|
+
logger.debug('Calling rac_llm_component_generate via ccall({async:true})');
|
|
179
|
+
const callResult = bridge.callFunction('rac_llm_component_generate', 'number', ['number', 'number', 'number', 'number'], [handle, promptPtr, optionsPtr, resultPtr], { async: true });
|
|
180
|
+
logger.debug(`ccall returned type=${typeof callResult}, isPromise=${callResult instanceof Promise}`);
|
|
181
|
+
result = await callResult;
|
|
182
|
+
logger.debug(`Generation returned result=${result}`);
|
|
183
|
+
}
|
|
184
|
+
catch (wasmErr) {
|
|
185
|
+
// Log the full error details including stack trace
|
|
186
|
+
if (wasmErr instanceof Error) {
|
|
187
|
+
logger.error(`WASM generation error: ${wasmErr.message}\nStack: ${wasmErr.stack}`);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
logger.error(`WASM generation error (raw): type=${typeof wasmErr}, value=${String(wasmErr)}`);
|
|
191
|
+
}
|
|
192
|
+
const detail = typeof wasmErr === 'number'
|
|
193
|
+
? `WASM C++ exception (ptr=${wasmErr}). The model's chat template may be unsupported.`
|
|
194
|
+
: wasmErr instanceof Error ? wasmErr.message : String(wasmErr);
|
|
195
|
+
throw new SDKError(SDKErrorCode.GenerationFailed, `LLM generation crashed: ${detail}`);
|
|
196
|
+
}
|
|
197
|
+
bridge.checkResult(result, 'rac_llm_component_generate');
|
|
198
|
+
// Read result struct (offsets from compiler via StructOffsets)
|
|
199
|
+
const textPtr = m.getValue(resultPtr + Offsets.llmResult.text, '*');
|
|
200
|
+
const text = bridge.readString(textPtr);
|
|
201
|
+
const inputTokens = m.getValue(resultPtr + Offsets.llmResult.promptTokens, 'i32');
|
|
202
|
+
const outputTokens = m.getValue(resultPtr + Offsets.llmResult.completionTokens, 'i32');
|
|
203
|
+
const latencyMs = performance.now() - startTime;
|
|
204
|
+
const tokensPerSecond = outputTokens > 0 ? (outputTokens / (latencyMs / 1000)) : 0;
|
|
205
|
+
const genResult = {
|
|
206
|
+
text,
|
|
207
|
+
inputTokens,
|
|
208
|
+
tokensUsed: outputTokens,
|
|
209
|
+
modelUsed: bridge.readString(m._rac_llm_component_get_model_id(handle)),
|
|
210
|
+
latencyMs,
|
|
211
|
+
framework: LLMFramework.LlamaCpp,
|
|
212
|
+
hardwareUsed: bridge.accelerationMode,
|
|
213
|
+
tokensPerSecond,
|
|
214
|
+
thinkingTokens: 0,
|
|
215
|
+
responseTokens: outputTokens,
|
|
216
|
+
};
|
|
217
|
+
EventBus.shared.emit('generation.completed', SDKEventType.Generation, {
|
|
218
|
+
tokensUsed: outputTokens,
|
|
219
|
+
latencyMs,
|
|
220
|
+
});
|
|
221
|
+
// Free the text string allocated inside the result by the C++ side
|
|
222
|
+
m._rac_llm_result_free(resultPtr);
|
|
223
|
+
return genResult;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
EventBus.shared.emit('generation.failed', SDKEventType.Generation, {
|
|
227
|
+
error: error instanceof Error ? error.message : String(error),
|
|
228
|
+
});
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
bridge.free(promptPtr);
|
|
233
|
+
m._free(optionsPtr);
|
|
234
|
+
// Free the result struct itself (separate from _rac_llm_result_free
|
|
235
|
+
// which only frees the inner `text` string).
|
|
236
|
+
m._free(resultPtr);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Generate text with streaming (returns AsyncIterable of tokens).
|
|
241
|
+
*
|
|
242
|
+
* Async because the underlying C call uses `{async: true}` so Emscripten's
|
|
243
|
+
* JSPI can suspend the WASM stack during WebGPU buffer operations. On
|
|
244
|
+
* CPU-only builds the result is simply an already-resolved Promise.
|
|
245
|
+
*
|
|
246
|
+
* @param prompt - Input text prompt
|
|
247
|
+
* @param options - Generation options
|
|
248
|
+
* @returns Streaming result with async token stream and final result promise
|
|
249
|
+
*/
|
|
250
|
+
async generateStream(prompt, options = {}) {
|
|
251
|
+
const bridge = this.requireBridge();
|
|
252
|
+
const m = bridge.module;
|
|
253
|
+
const handle = await this.ensureLLMComponent();
|
|
254
|
+
if (!this.isModelLoaded) {
|
|
255
|
+
throw new SDKError(SDKErrorCode.ModelNotLoaded, 'No LLM model loaded. Call loadModel() first.');
|
|
256
|
+
}
|
|
257
|
+
// Token queue for async iteration
|
|
258
|
+
const tokenQueue = [];
|
|
259
|
+
let resolveNext = null;
|
|
260
|
+
let isDone = false;
|
|
261
|
+
let streamError = null;
|
|
262
|
+
// Result promise
|
|
263
|
+
let resolveResult = null;
|
|
264
|
+
let rejectResult = null;
|
|
265
|
+
const resultPromise = new Promise((resolve, reject) => {
|
|
266
|
+
resolveResult = resolve;
|
|
267
|
+
rejectResult = reject;
|
|
268
|
+
});
|
|
269
|
+
const startTime = performance.now();
|
|
270
|
+
let tokenCount = 0;
|
|
271
|
+
let fullText = '';
|
|
272
|
+
let timeToFirstToken;
|
|
273
|
+
// Register token callback
|
|
274
|
+
const tokenCbPtr = m.addFunction((tokenPtr, _userData) => {
|
|
275
|
+
const token = m.UTF8ToString(tokenPtr);
|
|
276
|
+
tokenCount++;
|
|
277
|
+
fullText += token;
|
|
278
|
+
if (timeToFirstToken === undefined) {
|
|
279
|
+
timeToFirstToken = performance.now() - startTime;
|
|
280
|
+
}
|
|
281
|
+
if (resolveNext) {
|
|
282
|
+
const resolve = resolveNext;
|
|
283
|
+
resolveNext = null;
|
|
284
|
+
resolve({ value: token, done: false });
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
tokenQueue.push(token);
|
|
288
|
+
}
|
|
289
|
+
return 1; // RAC_TRUE = continue
|
|
290
|
+
}, 'iii');
|
|
291
|
+
// Register complete callback
|
|
292
|
+
const completeCbPtr = m.addFunction((_resultPtr, _userData) => {
|
|
293
|
+
isDone = true;
|
|
294
|
+
if (resolveNext) {
|
|
295
|
+
const resolve = resolveNext;
|
|
296
|
+
resolveNext = null;
|
|
297
|
+
resolve({ value: undefined, done: true });
|
|
298
|
+
}
|
|
299
|
+
const latencyMs = performance.now() - startTime;
|
|
300
|
+
const tokensPerSecond = tokenCount > 0 ? (tokenCount / (latencyMs / 1000)) : 0;
|
|
301
|
+
resolveResult?.({
|
|
302
|
+
text: fullText,
|
|
303
|
+
inputTokens: 0,
|
|
304
|
+
tokensUsed: tokenCount,
|
|
305
|
+
modelUsed: '',
|
|
306
|
+
latencyMs,
|
|
307
|
+
framework: LLMFramework.LlamaCpp,
|
|
308
|
+
hardwareUsed: bridge.accelerationMode,
|
|
309
|
+
tokensPerSecond,
|
|
310
|
+
timeToFirstTokenMs: timeToFirstToken,
|
|
311
|
+
thinkingTokens: 0,
|
|
312
|
+
responseTokens: tokenCount,
|
|
313
|
+
});
|
|
314
|
+
// Cleanup callback pointers
|
|
315
|
+
m.removeFunction(tokenCbPtr);
|
|
316
|
+
m.removeFunction(completeCbPtr);
|
|
317
|
+
m.removeFunction(errorCbPtr);
|
|
318
|
+
}, 'vii');
|
|
319
|
+
// Register error callback
|
|
320
|
+
const errorCbPtr = m.addFunction((errorCode, errorMsgPtr, _userData) => {
|
|
321
|
+
isDone = true;
|
|
322
|
+
const errorMsg = m.UTF8ToString(errorMsgPtr);
|
|
323
|
+
streamError = SDKError.fromRACResult(errorCode, errorMsg);
|
|
324
|
+
if (resolveNext) {
|
|
325
|
+
const resolve = resolveNext;
|
|
326
|
+
resolveNext = null;
|
|
327
|
+
resolve({ value: undefined, done: true });
|
|
328
|
+
}
|
|
329
|
+
rejectResult?.(streamError);
|
|
330
|
+
m.removeFunction(tokenCbPtr);
|
|
331
|
+
m.removeFunction(completeCbPtr);
|
|
332
|
+
m.removeFunction(errorCbPtr);
|
|
333
|
+
}, 'viii');
|
|
334
|
+
// Start streaming generation
|
|
335
|
+
const promptPtr = bridge.allocString(prompt);
|
|
336
|
+
const optionsPtr = m._rac_wasm_create_llm_options_default();
|
|
337
|
+
if (options.maxTokens !== undefined) {
|
|
338
|
+
m.setValue(optionsPtr + Offsets.llmOptions.maxTokens, options.maxTokens, 'i32');
|
|
339
|
+
}
|
|
340
|
+
if (options.temperature !== undefined) {
|
|
341
|
+
m.setValue(optionsPtr + Offsets.llmOptions.temperature, options.temperature, 'float');
|
|
342
|
+
}
|
|
343
|
+
let startResult;
|
|
344
|
+
try {
|
|
345
|
+
logger.debug('Calling rac_llm_component_generate_stream via ccall({async:true})');
|
|
346
|
+
const callResult = bridge.callFunction('rac_llm_component_generate_stream', 'number', ['number', 'number', 'number', 'number', 'number', 'number', 'number'], [handle, promptPtr, optionsPtr, tokenCbPtr, completeCbPtr, errorCbPtr, 0], { async: true });
|
|
347
|
+
logger.debug(`ccall returned type=${typeof callResult}, isPromise=${callResult instanceof Promise}`);
|
|
348
|
+
startResult = await callResult;
|
|
349
|
+
logger.debug(`Stream generation returned result=${startResult}`);
|
|
350
|
+
}
|
|
351
|
+
catch (wasmErr) {
|
|
352
|
+
bridge.free(promptPtr);
|
|
353
|
+
m._free(optionsPtr);
|
|
354
|
+
m.removeFunction(tokenCbPtr);
|
|
355
|
+
m.removeFunction(completeCbPtr);
|
|
356
|
+
m.removeFunction(errorCbPtr);
|
|
357
|
+
if (wasmErr instanceof Error) {
|
|
358
|
+
logger.error(`WASM stream generation error: ${wasmErr.message}\nStack: ${wasmErr.stack}`);
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
logger.error(`WASM stream generation error (raw): type=${typeof wasmErr}, value=${String(wasmErr)}`);
|
|
362
|
+
}
|
|
363
|
+
const detail = typeof wasmErr === 'number'
|
|
364
|
+
? `WASM C++ exception (ptr=${wasmErr}). The model's chat template may be unsupported.`
|
|
365
|
+
: wasmErr instanceof Error ? wasmErr.message : String(wasmErr);
|
|
366
|
+
throw new SDKError(SDKErrorCode.GenerationFailed, `LLM streaming generation crashed: ${detail}`);
|
|
367
|
+
}
|
|
368
|
+
bridge.free(promptPtr);
|
|
369
|
+
m._free(optionsPtr);
|
|
370
|
+
if (startResult !== 0) {
|
|
371
|
+
m.removeFunction(tokenCbPtr);
|
|
372
|
+
m.removeFunction(completeCbPtr);
|
|
373
|
+
m.removeFunction(errorCbPtr);
|
|
374
|
+
throw SDKError.fromRACResult(startResult, 'Failed to start streaming generation');
|
|
375
|
+
}
|
|
376
|
+
// Create async iterable
|
|
377
|
+
const stream = {
|
|
378
|
+
[Symbol.asyncIterator]() {
|
|
379
|
+
return {
|
|
380
|
+
next() {
|
|
381
|
+
if (streamError) {
|
|
382
|
+
return Promise.reject(streamError);
|
|
383
|
+
}
|
|
384
|
+
if (tokenQueue.length > 0) {
|
|
385
|
+
return Promise.resolve({ value: tokenQueue.shift(), done: false });
|
|
386
|
+
}
|
|
387
|
+
if (isDone) {
|
|
388
|
+
return Promise.resolve({ value: undefined, done: true });
|
|
389
|
+
}
|
|
390
|
+
return new Promise((resolve) => {
|
|
391
|
+
resolveNext = resolve;
|
|
392
|
+
});
|
|
393
|
+
},
|
|
394
|
+
};
|
|
395
|
+
},
|
|
396
|
+
};
|
|
397
|
+
return {
|
|
398
|
+
stream,
|
|
399
|
+
result: resultPromise,
|
|
400
|
+
cancel: () => {
|
|
401
|
+
m._rac_llm_component_cancel(handle);
|
|
402
|
+
},
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Cancel any in-progress generation.
|
|
407
|
+
*/
|
|
408
|
+
cancel() {
|
|
409
|
+
if (this._llmComponentHandle === 0)
|
|
410
|
+
return;
|
|
411
|
+
try {
|
|
412
|
+
const m = WASMBridge.shared.module;
|
|
413
|
+
m._rac_llm_component_cancel(this._llmComponentHandle);
|
|
414
|
+
}
|
|
415
|
+
catch {
|
|
416
|
+
// Ignore cancel errors
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Clean up the LLM component (frees memory).
|
|
421
|
+
*/
|
|
422
|
+
cleanup() {
|
|
423
|
+
if (this._llmComponentHandle !== 0) {
|
|
424
|
+
try {
|
|
425
|
+
const m = WASMBridge.shared.module;
|
|
426
|
+
m._rac_llm_component_destroy(this._llmComponentHandle);
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
// Ignore cleanup errors
|
|
430
|
+
}
|
|
431
|
+
this._llmComponentHandle = 0;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
export const TextGeneration = new TextGenerationImpl();
|
|
436
|
+
//# sourceMappingURL=RunAnywhere+TextGeneration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunAnywhere+TextGeneration.js","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+TextGeneration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AACzD,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,YAAY,EAAwB,MAAM,mBAAmB,CAAC;AAGrF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAE/C,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,MAAM,kBAAkB;IACb,aAAa,GAAG,gBAAgB,CAAC;IAClC,mBAAmB,GAAG,CAAC,CAAC;IAEhC,2DAA2D;IACnD,aAAa;QACnB,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;YAC/B,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,UAAU,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,2CAA2C;IACnC,KAAK,CAAC,kBAAkB;QAC9B,IAAI,IAAI,CAAC,mBAAmB,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,mBAAmB,CAAC;QAClC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAExB,qCAAqC;QACrC,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,uEAAuE;QACvE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CACtC,0BAA0B,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CACrE,CAAC;QAEZ,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACnB,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAEnB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,OAAe,EAAE,SAAkB;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE/C,MAAM,CAAC,IAAI,CAAC,sBAAsB,OAAO,SAAS,SAAS,EAAE,CAAC,CAAC;QAE/D,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAE3E,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,mEAAmE;YACnE,iDAAiD;YACjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CACtC,8BAA8B,EAC9B,QAAQ,EACR,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EACxC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,EACjC,EAAE,KAAK,EAAE,IAAI,EAAE,CACN,CAAC;YACZ,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;YAE3D,MAAM,CAAC,IAAI,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;YAC5C,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,KAAK,EAAE;gBAC3D,OAAO;gBACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,mBAAmB,KAAK,CAAC;YAAE,OAAO;QAE3C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAEpC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CACtC,0BAA0B,EAC1B,QAAQ,EACR,CAAC,QAAQ,CAAC,EACV,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAC1B,EAAE,KAAK,EAAE,IAAI,EAAE,CACN,CAAC;QACZ,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;QAEvD,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAI,aAAa;QACf,IAAI,IAAI,CAAC,mBAAmB,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;YACnC,OAAO,CAAC,CAAC,4BAA4B,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,UAAgC,EAAE;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE/C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,QAAQ,CAAC,YAAY,CAAC,cAAc,EAAE,8CAA8C,CAAC,CAAC;QAClG,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,2BAA2B,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,UAAU,EAAE;YAClE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;SACjC,CAAC,CAAC;QAEH,yBAAyB;QACzB,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE7C,gCAAgC;QAChC,MAAM,UAAU,GAAG,CAAC,CAAC,oCAAoC,EAAE,CAAC;QAC5D,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,MAAM,IAAI,QAAQ,CAAC,YAAY,CAAC,eAAe,EAAE,gCAAgC,CAAC,CAAC;QACrF,CAAC;QAED,yEAAyE;QACzE,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,CAAC,CAAC,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACtC,CAAC,CAAC,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,CAAC,CAAC,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1E,CAAC;QAED,sEAAsE;QACtE,uEAAuE;QACvE,4BAA4B;QAC5B,MAAM,UAAU,GAAG,CAAC,CAAC,2BAA2B,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE;YAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAExE,IAAI,CAAC;YACH,oEAAoE;YACpE,iEAAiE;YACjE,oEAAoE;YACpE,mCAAmC;YACnC,IAAI,MAAc,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;gBAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CACpC,4BAA4B,EAC5B,QAAQ,EACR,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EACxC,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,EAC1C,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,UAAU,eAAe,UAAU,YAAY,OAAO,EAAE,CAAC,CAAC;gBACrG,MAAM,GAAG,MAAM,UAAoB,CAAC;gBACpC,MAAM,CAAC,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,OAAgB,EAAE,CAAC;gBAC1B,mDAAmD;gBACnD,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;oBAC7B,MAAM,CAAC,KAAK,CAAC,0BAA0B,OAAO,CAAC,OAAO,YAAY,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;gBACrF,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,qCAAqC,OAAO,OAAO,WAAW,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAChG,CAAC;gBACD,MAAM,MAAM,GAAG,OAAO,OAAO,KAAK,QAAQ;oBACxC,CAAC,CAAC,2BAA2B,OAAO,kDAAkD;oBACtF,CAAC,CAAC,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACjE,MAAM,IAAI,QAAQ,CAChB,YAAY,CAAC,gBAAgB,EAC7B,2BAA2B,MAAM,EAAE,CACpC,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;YAEzD,+DAA+D;YAC/D,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YAClF,MAAM,YAAY,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAEvF,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAChD,MAAM,eAAe,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEnF,MAAM,SAAS,GAAwB;gBACrC,IAAI;gBACJ,WAAW;gBACX,UAAU,EAAE,YAAY;gBACxB,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,+BAA+B,CAAC,MAAM,CAAC,CAAC;gBACvE,SAAS;gBACT,SAAS,EAAE,YAAY,CAAC,QAAQ;gBAChC,YAAY,EAAE,MAAM,CAAC,gBAAwC;gBAC7D,eAAe;gBACf,cAAc,EAAE,CAAC;gBACjB,cAAc,EAAE,YAAY;aAC7B,CAAC;YAEF,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,YAAY,CAAC,UAAU,EAAE;gBACpE,UAAU,EAAE,YAAY;gBACxB,SAAS;aACV,CAAC,CAAC;YAEH,mEAAmE;YACnE,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAElC,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,YAAY,CAAC,UAAU,EAAE;gBACjE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpB,oEAAoE;YACpE,6CAA6C;YAC7C,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,UAAgC,EAAE;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE/C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,QAAQ,CAAC,YAAY,CAAC,cAAc,EAAE,8CAA8C,CAAC,CAAC;QAClG,CAAC;QAED,kCAAkC;QAClC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,WAAW,GAAqD,IAAI,CAAC;QACzE,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,WAAW,GAAiB,IAAI,CAAC;QAErC,iBAAiB;QACjB,IAAI,aAAa,GAAmD,IAAI,CAAC;QACzE,IAAI,YAAY,GAAoC,IAAI,CAAC;QAEzD,MAAM,aAAa,GAAG,IAAI,OAAO,CAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzE,aAAa,GAAG,OAAO,CAAC;YACxB,YAAY,GAAG,MAAM,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,gBAAoC,CAAC;QAEzC,0BAA0B;QAC1B,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,QAAgB,EAAE,SAAiB,EAAU,EAAE;YAC/E,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvC,UAAU,EAAE,CAAC;YACb,QAAQ,IAAI,KAAK,CAAC;YAElB,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACnC,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACnD,CAAC;YAED,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,WAAW,CAAC;gBAC5B,WAAW,GAAG,IAAI,CAAC;gBACnB,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;YAED,OAAO,CAAC,CAAC,CAAC,sBAAsB;QAClC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,6BAA6B;QAC7B,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,UAAkB,EAAE,SAAiB,EAAQ,EAAE;YAClF,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,WAAW,CAAC;gBAC5B,WAAW,GAAG,IAAI,CAAC;gBACnB,OAAO,CAAC,EAAE,KAAK,EAAE,SAA8B,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAChD,MAAM,eAAe,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/E,aAAa,EAAE,CAAC;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,CAAC;gBACd,UAAU,EAAE,UAAU;gBACtB,SAAS,EAAE,EAAE;gBACb,SAAS;gBACT,SAAS,EAAE,YAAY,CAAC,QAAQ;gBAChC,YAAY,EAAE,MAAM,CAAC,gBAAwC;gBAC7D,eAAe;gBACf,kBAAkB,EAAE,gBAAgB;gBACpC,cAAc,EAAE,CAAC;gBACjB,cAAc,EAAE,UAAU;aAC3B,CAAC,CAAC;YAEH,4BAA4B;YAC5B,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7B,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAChC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,0BAA0B;QAC1B,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,SAAiB,EAAE,WAAmB,EAAE,SAAiB,EAAQ,EAAE;YACnG,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAC7C,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAE1D,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,WAAW,CAAC;gBAC5B,WAAW,GAAG,IAAI,CAAC;gBACnB,OAAO,CAAC,EAAE,KAAK,EAAE,SAA8B,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,YAAY,EAAE,CAAC,WAAW,CAAC,CAAC;YAE5B,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7B,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAChC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC,EAAE,MAAM,CAAC,CAAC;QAEX,6BAA6B;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,CAAC,CAAC,oCAAoC,EAAE,CAAC;QAE5D,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,CAAC,CAAC,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACtC,CAAC,CAAC,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxF,CAAC;QAED,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;YAClF,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CACpC,mCAAmC,EACnC,QAAQ,EACR,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EACtE,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC,EACzE,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,UAAU,eAAe,UAAU,YAAY,OAAO,EAAE,CAAC,CAAC;YACrG,WAAW,GAAG,MAAM,UAAoB,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,qCAAqC,WAAW,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,OAAgB,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpB,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7B,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAChC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7B,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;gBAC7B,MAAM,CAAC,KAAK,CAAC,iCAAiC,OAAO,CAAC,OAAO,YAAY,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5F,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,4CAA4C,OAAO,OAAO,WAAW,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvG,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,OAAO,KAAK,QAAQ;gBACxC,CAAC,CAAC,2BAA2B,OAAO,kDAAkD;gBACtF,CAAC,CAAC,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjE,MAAM,IAAI,QAAQ,CAChB,YAAY,CAAC,gBAAgB,EAC7B,qCAAqC,MAAM,EAAE,CAC9C,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAEpB,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7B,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAChC,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7B,MAAM,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,sCAAsC,CAAC,CAAC;QACpF,CAAC;QAED,wBAAwB;QACxB,MAAM,MAAM,GAA0B;YACpC,CAAC,MAAM,CAAC,aAAa,CAAC;gBACpB,OAAO;oBACL,IAAI;wBACF,IAAI,WAAW,EAAE,CAAC;4BAChB,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;wBACrC,CAAC;wBACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC1B,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;wBACtE,CAAC;wBACD,IAAI,MAAM,EAAE,CAAC;4BACX,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAA8B,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;wBAChF,CAAC;wBACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;4BAC7B,WAAW,GAAG,OAAO,CAAC;wBACxB,CAAC,CAAC,CAAC;oBACL,CAAC;iBACF,CAAC;YACJ,CAAC;SACF,CAAC;QAEF,OAAO;YACL,MAAM;YACN,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,GAAG,EAAE;gBACX,CAAC,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,IAAI,CAAC,mBAAmB,KAAK,CAAC;YAAE,OAAO;QAC3C,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;YACnC,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,mBAAmB,KAAK,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;gBACnC,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YACD,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - Tool Calling Extension
|
|
3
|
+
*
|
|
4
|
+
* Adds tool calling (function calling) capabilities to LLM generation.
|
|
5
|
+
* The LLM can request external actions (API calls, calculations, etc.)
|
|
6
|
+
* and the SDK orchestrates the generate -> parse -> execute -> loop cycle.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* - C++ (rac_tool_calling.h): ALL parsing, prompt formatting, JSON handling
|
|
10
|
+
* - This file: Tool registry, executor storage, orchestration
|
|
11
|
+
*
|
|
12
|
+
* Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/LLM/
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* import { ToolCalling } from '@runanywhere/web';
|
|
16
|
+
*
|
|
17
|
+
* ToolCalling.registerTool(
|
|
18
|
+
* { name: 'get_weather', description: 'Gets weather', parameters: [...] },
|
|
19
|
+
* async (args) => ({ temperature: '72F', condition: 'Sunny' })
|
|
20
|
+
* );
|
|
21
|
+
*
|
|
22
|
+
* const result = await ToolCalling.generateWithTools('What is the weather?');
|
|
23
|
+
* console.log(result.text);
|
|
24
|
+
*/
|
|
25
|
+
import { type ToolValue, type ToolDefinition, type ToolCall, type ToolResult, type ToolCallingOptions, type ToolCallingResult, type ToolExecutor } from './ToolCallingTypes';
|
|
26
|
+
export { ToolCallFormat, type ToolValue, type ToolParameterType, type ToolParameter, type ToolDefinition, type ToolCall, type ToolResult, type ToolCallingOptions, type ToolCallingResult, type ToolExecutor, } from './ToolCallingTypes';
|
|
27
|
+
/** Create a ToolValue from a plain JS value. */
|
|
28
|
+
export declare function toToolValue(val: unknown): ToolValue;
|
|
29
|
+
/** Convert a ToolValue to a plain JS value. */
|
|
30
|
+
export declare function fromToolValue(tv: ToolValue): unknown;
|
|
31
|
+
/** Get a string argument from tool call args. */
|
|
32
|
+
export declare function getStringArg(args: Record<string, ToolValue>, key: string): string | undefined;
|
|
33
|
+
/** Get a number argument from tool call args. */
|
|
34
|
+
export declare function getNumberArg(args: Record<string, ToolValue>, key: string): number | undefined;
|
|
35
|
+
declare class ToolCallingImpl {
|
|
36
|
+
readonly extensionName = "ToolCalling";
|
|
37
|
+
private toolRegistry;
|
|
38
|
+
/**
|
|
39
|
+
* Register a tool that the LLM can use.
|
|
40
|
+
*
|
|
41
|
+
* @param definition - Tool definition (name, description, parameters)
|
|
42
|
+
* @param executor - Async function that executes the tool
|
|
43
|
+
*/
|
|
44
|
+
registerTool(definition: ToolDefinition, executor: ToolExecutor): void;
|
|
45
|
+
/**
|
|
46
|
+
* Unregister a tool by name.
|
|
47
|
+
*/
|
|
48
|
+
unregisterTool(name: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Get all registered tool definitions.
|
|
51
|
+
*/
|
|
52
|
+
getRegisteredTools(): ToolDefinition[];
|
|
53
|
+
/**
|
|
54
|
+
* Clear all registered tools.
|
|
55
|
+
*/
|
|
56
|
+
clearTools(): void;
|
|
57
|
+
/**
|
|
58
|
+
* Execute a tool call by looking up the registered executor.
|
|
59
|
+
*/
|
|
60
|
+
executeTool(toolCall: ToolCall): Promise<ToolResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Generate a response with tool calling support.
|
|
63
|
+
*
|
|
64
|
+
* Orchestrates: generate -> parse -> execute -> loop
|
|
65
|
+
*
|
|
66
|
+
* @param prompt - The user's prompt
|
|
67
|
+
* @param options - Tool calling options
|
|
68
|
+
* @returns Result with final text, all tool calls, and their results
|
|
69
|
+
*/
|
|
70
|
+
generateWithTools(prompt: string, options?: ToolCallingOptions): Promise<ToolCallingResult>;
|
|
71
|
+
/**
|
|
72
|
+
* Clean up the tool calling extension (clears all registered tools).
|
|
73
|
+
*/
|
|
74
|
+
cleanup(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Continue generation after manual tool execution.
|
|
77
|
+
* Use when autoExecute is false.
|
|
78
|
+
*/
|
|
79
|
+
continueWithToolResult(previousPrompt: string, toolCall: ToolCall, toolResult: ToolResult, options?: ToolCallingOptions): Promise<ToolCallingResult>;
|
|
80
|
+
}
|
|
81
|
+
export declare const ToolCalling: ToolCallingImpl;
|
|
82
|
+
//# sourceMappingURL=RunAnywhere+ToolCalling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunAnywhere+ToolCalling.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+ToolCalling.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,cAAc,EACd,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC;AAoC5B,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAcnD;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAepD;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG7F;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG7F;AA4VD,cAAM,eAAe;IACnB,QAAQ,CAAC,aAAa,iBAAiB;IACvC,OAAO,CAAC,YAAY,CAAqC;IAEzD;;;;;OAKG;IACH,YAAY,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAKtE;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKlC;;OAEG;IACH,kBAAkB,IAAI,cAAc,EAAE;IAItC;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IA6B1D;;;;;;;;OAQG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC;IAsG7B;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;;OAGG;IACG,sBAAsB,CAC1B,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,iBAAiB,CAAC;CAY9B;AAED,eAAO,MAAM,WAAW,iBAAwB,CAAC"}
|