@runanywhere/web-llamacpp 0.1.0-beta.10
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 +75 -0
- package/dist/Extensions/DiffusionTypes.d.ts +64 -0
- package/dist/Extensions/DiffusionTypes.d.ts.map +1 -0
- package/dist/Extensions/DiffusionTypes.js +28 -0
- package/dist/Extensions/DiffusionTypes.js.map +1 -0
- package/dist/Extensions/EmbeddingsTypes.d.ts +33 -0
- package/dist/Extensions/EmbeddingsTypes.d.ts.map +1 -0
- package/dist/Extensions/EmbeddingsTypes.js +13 -0
- package/dist/Extensions/EmbeddingsTypes.js.map +1 -0
- package/dist/Extensions/RunAnywhere+Diffusion.d.ts +44 -0
- package/dist/Extensions/RunAnywhere+Diffusion.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+Diffusion.js +185 -0
- package/dist/Extensions/RunAnywhere+Diffusion.js.map +1 -0
- package/dist/Extensions/RunAnywhere+Embeddings.d.ts +56 -0
- package/dist/Extensions/RunAnywhere+Embeddings.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+Embeddings.js +236 -0
- package/dist/Extensions/RunAnywhere+Embeddings.js.map +1 -0
- package/dist/Extensions/RunAnywhere+StructuredOutput.d.ts +69 -0
- package/dist/Extensions/RunAnywhere+StructuredOutput.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+StructuredOutput.js +194 -0
- package/dist/Extensions/RunAnywhere+StructuredOutput.js.map +1 -0
- package/dist/Extensions/RunAnywhere+TextGeneration.d.ts +87 -0
- package/dist/Extensions/RunAnywhere+TextGeneration.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+TextGeneration.js +525 -0
- package/dist/Extensions/RunAnywhere+TextGeneration.js.map +1 -0
- package/dist/Extensions/RunAnywhere+ToolCalling.d.ts +82 -0
- package/dist/Extensions/RunAnywhere+ToolCalling.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+ToolCalling.js +574 -0
- package/dist/Extensions/RunAnywhere+ToolCalling.js.map +1 -0
- package/dist/Extensions/RunAnywhere+VLM.d.ts +57 -0
- package/dist/Extensions/RunAnywhere+VLM.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+VLM.js +258 -0
- package/dist/Extensions/RunAnywhere+VLM.js.map +1 -0
- package/dist/Extensions/ToolCallingTypes.d.ts +78 -0
- package/dist/Extensions/ToolCallingTypes.d.ts.map +1 -0
- package/dist/Extensions/ToolCallingTypes.js +8 -0
- package/dist/Extensions/ToolCallingTypes.js.map +1 -0
- package/dist/Extensions/VLMTypes.d.ts +16 -0
- package/dist/Extensions/VLMTypes.d.ts.map +1 -0
- package/dist/Extensions/VLMTypes.js +18 -0
- package/dist/Extensions/VLMTypes.js.map +1 -0
- package/dist/Foundation/AnalyticsEventsBridge.d.ts +38 -0
- package/dist/Foundation/AnalyticsEventsBridge.d.ts.map +1 -0
- package/dist/Foundation/AnalyticsEventsBridge.js +394 -0
- package/dist/Foundation/AnalyticsEventsBridge.js.map +1 -0
- package/dist/Foundation/LlamaCppBridge.d.ts +182 -0
- package/dist/Foundation/LlamaCppBridge.d.ts.map +1 -0
- package/dist/Foundation/LlamaCppBridge.js +483 -0
- package/dist/Foundation/LlamaCppBridge.js.map +1 -0
- package/dist/Foundation/LlamaCppOffsets.d.ts +32 -0
- package/dist/Foundation/LlamaCppOffsets.d.ts.map +1 -0
- package/dist/Foundation/LlamaCppOffsets.js +191 -0
- package/dist/Foundation/LlamaCppOffsets.js.map +1 -0
- package/dist/Foundation/PlatformAdapter.d.ts +109 -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/TelemetryService.d.ts +96 -0
- package/dist/Foundation/TelemetryService.d.ts.map +1 -0
- package/dist/Foundation/TelemetryService.js +345 -0
- package/dist/Foundation/TelemetryService.js.map +1 -0
- package/dist/Foundation/WASMAnalyticsEmitter.d.ts +29 -0
- package/dist/Foundation/WASMAnalyticsEmitter.d.ts.map +1 -0
- package/dist/Foundation/WASMAnalyticsEmitter.js +70 -0
- package/dist/Foundation/WASMAnalyticsEmitter.js.map +1 -0
- package/dist/Infrastructure/VLMWorkerBridge.d.ts +219 -0
- package/dist/Infrastructure/VLMWorkerBridge.d.ts.map +1 -0
- package/dist/Infrastructure/VLMWorkerBridge.js +288 -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 +620 -0
- package/dist/Infrastructure/VLMWorkerRuntime.js.map +1 -0
- package/dist/LlamaCPP.d.ts +49 -0
- package/dist/LlamaCPP.d.ts.map +1 -0
- package/dist/LlamaCPP.js +63 -0
- package/dist/LlamaCPP.js.map +1 -0
- package/dist/LlamaCppProvider.d.ts +32 -0
- package/dist/LlamaCppProvider.d.ts.map +1 -0
- package/dist/LlamaCppProvider.js +106 -0
- package/dist/LlamaCppProvider.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.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 +69 -0
- package/wasm/racommons-llamacpp-webgpu.js +159 -0
- package/wasm/racommons-llamacpp-webgpu.wasm +0 -0
- package/wasm/racommons-llamacpp.js +129 -0
- package/wasm/racommons-llamacpp.wasm +0 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - VLM Worker Bridge
|
|
3
|
+
*
|
|
4
|
+
* Main-thread proxy for the VLM Web Worker. All VLM inference runs off the
|
|
5
|
+
* main thread so the camera, UI animations, and event loop stay responsive.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { VLMWorkerBridge } from '@runanywhere/web';
|
|
10
|
+
*
|
|
11
|
+
* const vlm = VLMWorkerBridge.shared;
|
|
12
|
+
* await vlm.init();
|
|
13
|
+
* await vlm.loadModel({ ... });
|
|
14
|
+
* const result = await vlm.process(rgbPixels, width, height, prompt, { maxTokens: 100 });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* RPC commands sent from the main thread to the Worker.
|
|
19
|
+
*/
|
|
20
|
+
export type VLMWorkerCommand = {
|
|
21
|
+
type: 'init';
|
|
22
|
+
id: number;
|
|
23
|
+
payload: {
|
|
24
|
+
/** URL to the WASM glue JS (racommons.js or racommons-webgpu.js) */
|
|
25
|
+
wasmJsUrl: string;
|
|
26
|
+
/** Whether the loaded module is the WebGPU variant */
|
|
27
|
+
useWebGPU?: boolean;
|
|
28
|
+
};
|
|
29
|
+
} | {
|
|
30
|
+
type: 'load-model';
|
|
31
|
+
id: number;
|
|
32
|
+
payload: {
|
|
33
|
+
modelOpfsKey: string;
|
|
34
|
+
modelFilename: string;
|
|
35
|
+
mmprojOpfsKey: string;
|
|
36
|
+
mmprojFilename: string;
|
|
37
|
+
modelId: string;
|
|
38
|
+
modelName: string;
|
|
39
|
+
/** Optional: raw model data when OPFS doesn't have it (memory-cache fallback). */
|
|
40
|
+
modelData?: ArrayBuffer;
|
|
41
|
+
/** Optional: raw mmproj data when OPFS doesn't have it. */
|
|
42
|
+
mmprojData?: ArrayBuffer;
|
|
43
|
+
};
|
|
44
|
+
} | {
|
|
45
|
+
type: 'process';
|
|
46
|
+
id: number;
|
|
47
|
+
payload: {
|
|
48
|
+
rgbPixels: ArrayBuffer;
|
|
49
|
+
width: number;
|
|
50
|
+
height: number;
|
|
51
|
+
prompt: string;
|
|
52
|
+
maxTokens: number;
|
|
53
|
+
temperature: number;
|
|
54
|
+
topP: number;
|
|
55
|
+
systemPrompt?: string;
|
|
56
|
+
modelFamily?: number;
|
|
57
|
+
};
|
|
58
|
+
} | {
|
|
59
|
+
type: 'cancel';
|
|
60
|
+
id: number;
|
|
61
|
+
} | {
|
|
62
|
+
type: 'unload';
|
|
63
|
+
id: number;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Result of a VLM inference operation.
|
|
67
|
+
*/
|
|
68
|
+
export interface VLMWorkerResult {
|
|
69
|
+
text: string;
|
|
70
|
+
totalTokens: number;
|
|
71
|
+
promptTokens: number;
|
|
72
|
+
completionTokens: number;
|
|
73
|
+
imageTokens: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* RPC responses from the Worker to the main thread.
|
|
77
|
+
*/
|
|
78
|
+
export type VLMWorkerResponse = {
|
|
79
|
+
id: number;
|
|
80
|
+
type: 'result';
|
|
81
|
+
payload: any;
|
|
82
|
+
} | {
|
|
83
|
+
id: number;
|
|
84
|
+
type: 'error';
|
|
85
|
+
payload: {
|
|
86
|
+
message: string;
|
|
87
|
+
};
|
|
88
|
+
} | {
|
|
89
|
+
id: number;
|
|
90
|
+
type: 'progress';
|
|
91
|
+
payload: {
|
|
92
|
+
stage: string;
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Parameters for loading a VLM model in the Worker.
|
|
97
|
+
*/
|
|
98
|
+
export interface VLMLoadModelParams {
|
|
99
|
+
modelOpfsKey: string;
|
|
100
|
+
modelFilename: string;
|
|
101
|
+
mmprojOpfsKey: string;
|
|
102
|
+
mmprojFilename: string;
|
|
103
|
+
modelId: string;
|
|
104
|
+
modelName: string;
|
|
105
|
+
/** Optional: raw model data when OPFS doesn't have it (memory-cache fallback). */
|
|
106
|
+
modelData?: ArrayBuffer;
|
|
107
|
+
/** Optional: raw mmproj data when OPFS doesn't have it. */
|
|
108
|
+
mmprojData?: ArrayBuffer;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Options for VLM image processing via the Worker bridge.
|
|
112
|
+
*/
|
|
113
|
+
export interface VLMProcessOptions {
|
|
114
|
+
maxTokens?: number;
|
|
115
|
+
temperature?: number;
|
|
116
|
+
topP?: number;
|
|
117
|
+
/** System prompt prepended to the user prompt inside the Worker. */
|
|
118
|
+
systemPrompt?: string;
|
|
119
|
+
/** Model family enum value (maps to rac_vlm_model_family_t). 0 = auto-detect. */
|
|
120
|
+
modelFamily?: number;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Callback for VLM progress updates (model loading stages, etc.).
|
|
124
|
+
*/
|
|
125
|
+
export type ProgressListener = (stage: string) => void;
|
|
126
|
+
/**
|
|
127
|
+
* VLMWorkerBridge - Main-thread proxy for VLM Web Worker inference.
|
|
128
|
+
*
|
|
129
|
+
* Manages the lifecycle of a dedicated Web Worker that runs VLM inference
|
|
130
|
+
* in its own WASM instance. Provides:
|
|
131
|
+
* - RPC protocol with message ID tracking and promise correlation
|
|
132
|
+
* - Auto-recovery from WASM crashes (OOB, stack overflow, etc.)
|
|
133
|
+
* - Progress listeners for model loading stages
|
|
134
|
+
* - Transferable pixel data for zero-copy image transfer
|
|
135
|
+
*/
|
|
136
|
+
export declare class VLMWorkerBridge {
|
|
137
|
+
private static _instance;
|
|
138
|
+
static get shared(): VLMWorkerBridge;
|
|
139
|
+
private worker;
|
|
140
|
+
private nextId;
|
|
141
|
+
private pending;
|
|
142
|
+
private _isInitialized;
|
|
143
|
+
private _isModelLoaded;
|
|
144
|
+
private _progressListeners;
|
|
145
|
+
/** Saved for auto-recovery after WASM crash */
|
|
146
|
+
private _lastModelParams;
|
|
147
|
+
private _needsRecovery;
|
|
148
|
+
/**
|
|
149
|
+
* Optional: the app can provide a custom Worker URL or factory.
|
|
150
|
+
* If not set, the bridge uses the bundled SDK worker entry point.
|
|
151
|
+
*/
|
|
152
|
+
private _workerUrl;
|
|
153
|
+
get isInitialized(): boolean;
|
|
154
|
+
get isModelLoaded(): boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Set a custom Worker URL.
|
|
157
|
+
*
|
|
158
|
+
* By default the bridge creates a Worker using the SDK's bundled entry point
|
|
159
|
+
* (`workers/vlm-worker.js`). Apps that need to customise the Worker location
|
|
160
|
+
* (e.g. different deploy path, or a worker that wraps the runtime) can call
|
|
161
|
+
* this before `init()`.
|
|
162
|
+
*/
|
|
163
|
+
set workerUrl(url: URL | string);
|
|
164
|
+
/**
|
|
165
|
+
* Subscribe to progress updates from the Worker.
|
|
166
|
+
* Returns an unsubscribe function.
|
|
167
|
+
*/
|
|
168
|
+
onProgress(fn: ProgressListener): () => void;
|
|
169
|
+
private emitProgress;
|
|
170
|
+
/**
|
|
171
|
+
* Initialize the Worker and its WASM instance.
|
|
172
|
+
* Must be called once before loadModel/process.
|
|
173
|
+
*
|
|
174
|
+
* Reads the WASM URL and acceleration mode from LlamaCppBridge internally —
|
|
175
|
+
* the app does not need to pass these.
|
|
176
|
+
*
|
|
177
|
+
* @param wasmJsUrl - Optional explicit URL for the WASM glue JS.
|
|
178
|
+
* When omitted, the SDK's LlamaCppBridge.wasmUrl is used
|
|
179
|
+
* so the worker loads the exact same variant (WebGPU or CPU)
|
|
180
|
+
* that the main thread successfully loaded.
|
|
181
|
+
*/
|
|
182
|
+
init(wasmJsUrl?: string): Promise<void>;
|
|
183
|
+
/**
|
|
184
|
+
* Load a VLM model in the Worker's WASM instance.
|
|
185
|
+
*
|
|
186
|
+
* Normally the Worker reads model files directly from OPFS (zero-copy).
|
|
187
|
+
* When OPFS quota is exceeded and models are only in the main-thread memory
|
|
188
|
+
* cache, the data is transferred via postMessage (still zero-copy via
|
|
189
|
+
* Transferable ArrayBuffers).
|
|
190
|
+
*/
|
|
191
|
+
loadModel(params: VLMLoadModelParams): Promise<void>;
|
|
192
|
+
/**
|
|
193
|
+
* Process an image with the VLM.
|
|
194
|
+
* Returns a promise that resolves when inference is complete.
|
|
195
|
+
* The main thread stays responsive during processing.
|
|
196
|
+
*
|
|
197
|
+
* The pixel buffer is transferred (zero-copy) to the Worker.
|
|
198
|
+
*/
|
|
199
|
+
process(rgbPixels: Uint8Array, width: number, height: number, prompt: string, options?: VLMProcessOptions): Promise<VLMWorkerResult>;
|
|
200
|
+
/**
|
|
201
|
+
* Recover from a WASM crash by terminating the old Worker,
|
|
202
|
+
* creating a fresh one, and reloading the model.
|
|
203
|
+
*/
|
|
204
|
+
private recover;
|
|
205
|
+
/** Cancel in-progress VLM generation. */
|
|
206
|
+
cancel(): void;
|
|
207
|
+
/** Unload the VLM model. */
|
|
208
|
+
unloadModel(): Promise<void>;
|
|
209
|
+
/**
|
|
210
|
+
* Terminate the Worker entirely.
|
|
211
|
+
*
|
|
212
|
+
* Rejects any in-flight RPC promises so callers aren't left hanging,
|
|
213
|
+
* then terminates the underlying Web Worker.
|
|
214
|
+
*/
|
|
215
|
+
terminate(): void;
|
|
216
|
+
private send;
|
|
217
|
+
private handleMessage;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=VLMWorkerBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VLMWorkerBridge.d.ts","sourceRoot":"","sources":["../../src/Infrastructure/VLMWorkerBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - VLM Worker Bridge
|
|
3
|
+
*
|
|
4
|
+
* Main-thread proxy for the VLM Web Worker. All VLM inference runs off the
|
|
5
|
+
* main thread so the camera, UI animations, and event loop stay responsive.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { VLMWorkerBridge } from '@runanywhere/web';
|
|
10
|
+
*
|
|
11
|
+
* const vlm = VLMWorkerBridge.shared;
|
|
12
|
+
* await vlm.init();
|
|
13
|
+
* await vlm.loadModel({ ... });
|
|
14
|
+
* const result = await vlm.process(rgbPixels, width, height, prompt, { maxTokens: 100 });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
import { SDKLogger } from '@runanywhere/web';
|
|
18
|
+
import { LlamaCppBridge } from '../Foundation/LlamaCppBridge';
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Bridge
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
const logger = new SDKLogger('VLMWorkerBridge');
|
|
23
|
+
/**
|
|
24
|
+
* VLMWorkerBridge - Main-thread proxy for VLM Web Worker inference.
|
|
25
|
+
*
|
|
26
|
+
* Manages the lifecycle of a dedicated Web Worker that runs VLM inference
|
|
27
|
+
* in its own WASM instance. Provides:
|
|
28
|
+
* - RPC protocol with message ID tracking and promise correlation
|
|
29
|
+
* - Auto-recovery from WASM crashes (OOB, stack overflow, etc.)
|
|
30
|
+
* - Progress listeners for model loading stages
|
|
31
|
+
* - Transferable pixel data for zero-copy image transfer
|
|
32
|
+
*/
|
|
33
|
+
export class VLMWorkerBridge {
|
|
34
|
+
// ---- Singleton ----
|
|
35
|
+
static _instance = null;
|
|
36
|
+
static get shared() {
|
|
37
|
+
if (!VLMWorkerBridge._instance) {
|
|
38
|
+
VLMWorkerBridge._instance = new VLMWorkerBridge();
|
|
39
|
+
}
|
|
40
|
+
return VLMWorkerBridge._instance;
|
|
41
|
+
}
|
|
42
|
+
// ---- State ----
|
|
43
|
+
worker = null;
|
|
44
|
+
nextId = 0;
|
|
45
|
+
pending = new Map();
|
|
46
|
+
_isInitialized = false;
|
|
47
|
+
_isModelLoaded = false;
|
|
48
|
+
_progressListeners = [];
|
|
49
|
+
/** Saved for auto-recovery after WASM crash */
|
|
50
|
+
_lastModelParams = null;
|
|
51
|
+
_needsRecovery = false;
|
|
52
|
+
/**
|
|
53
|
+
* Optional: the app can provide a custom Worker URL or factory.
|
|
54
|
+
* If not set, the bridge uses the bundled SDK worker entry point.
|
|
55
|
+
*/
|
|
56
|
+
_workerUrl = null;
|
|
57
|
+
get isInitialized() { return this._isInitialized; }
|
|
58
|
+
get isModelLoaded() { return this._isModelLoaded; }
|
|
59
|
+
// ---- Configuration ----
|
|
60
|
+
/**
|
|
61
|
+
* Set a custom Worker URL.
|
|
62
|
+
*
|
|
63
|
+
* By default the bridge creates a Worker using the SDK's bundled entry point
|
|
64
|
+
* (`workers/vlm-worker.js`). Apps that need to customise the Worker location
|
|
65
|
+
* (e.g. different deploy path, or a worker that wraps the runtime) can call
|
|
66
|
+
* this before `init()`.
|
|
67
|
+
*/
|
|
68
|
+
set workerUrl(url) {
|
|
69
|
+
this._workerUrl = url;
|
|
70
|
+
}
|
|
71
|
+
// ---- Progress ----
|
|
72
|
+
/**
|
|
73
|
+
* Subscribe to progress updates from the Worker.
|
|
74
|
+
* Returns an unsubscribe function.
|
|
75
|
+
*/
|
|
76
|
+
onProgress(fn) {
|
|
77
|
+
this._progressListeners.push(fn);
|
|
78
|
+
return () => {
|
|
79
|
+
this._progressListeners = this._progressListeners.filter((l) => l !== fn);
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
emitProgress(stage) {
|
|
83
|
+
for (const fn of this._progressListeners)
|
|
84
|
+
fn(stage);
|
|
85
|
+
}
|
|
86
|
+
// ---- Lifecycle ----
|
|
87
|
+
/**
|
|
88
|
+
* Initialize the Worker and its WASM instance.
|
|
89
|
+
* Must be called once before loadModel/process.
|
|
90
|
+
*
|
|
91
|
+
* Reads the WASM URL and acceleration mode from LlamaCppBridge internally —
|
|
92
|
+
* the app does not need to pass these.
|
|
93
|
+
*
|
|
94
|
+
* @param wasmJsUrl - Optional explicit URL for the WASM glue JS.
|
|
95
|
+
* When omitted, the SDK's LlamaCppBridge.wasmUrl is used
|
|
96
|
+
* so the worker loads the exact same variant (WebGPU or CPU)
|
|
97
|
+
* that the main thread successfully loaded.
|
|
98
|
+
*/
|
|
99
|
+
async init(wasmJsUrl) {
|
|
100
|
+
if (this._isInitialized)
|
|
101
|
+
return;
|
|
102
|
+
// All acceleration logic lives in the SDK's LlamaCppBridge.
|
|
103
|
+
// We just read the decision it already made.
|
|
104
|
+
const bridge = LlamaCppBridge.shared;
|
|
105
|
+
const useWebGPU = bridge.accelerationMode === 'webgpu';
|
|
106
|
+
const resolvedUrl = wasmJsUrl ?? bridge.wasmUrl ?? '';
|
|
107
|
+
if (!resolvedUrl) {
|
|
108
|
+
throw new Error('[VLMWorkerBridge] SDK not initialized — no WASM URL available');
|
|
109
|
+
}
|
|
110
|
+
// Create the Worker
|
|
111
|
+
const workerUrl = this._workerUrl ?? new URL('../workers/vlm-worker.js', import.meta.url);
|
|
112
|
+
this.worker = new Worker(workerUrl, { type: 'module' });
|
|
113
|
+
this.worker.onmessage = this.handleMessage.bind(this);
|
|
114
|
+
this.worker.onerror = (e) => {
|
|
115
|
+
logger.error(`Worker error: ${e.message ?? e}`);
|
|
116
|
+
};
|
|
117
|
+
await this.send('init', { wasmJsUrl: resolvedUrl, useWebGPU });
|
|
118
|
+
this._isInitialized = true;
|
|
119
|
+
logger.info(`Worker initialized (${useWebGPU ? 'WebGPU' : 'CPU'})`);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Load a VLM model in the Worker's WASM instance.
|
|
123
|
+
*
|
|
124
|
+
* Normally the Worker reads model files directly from OPFS (zero-copy).
|
|
125
|
+
* When OPFS quota is exceeded and models are only in the main-thread memory
|
|
126
|
+
* cache, the data is transferred via postMessage (still zero-copy via
|
|
127
|
+
* Transferable ArrayBuffers).
|
|
128
|
+
*/
|
|
129
|
+
async loadModel(params) {
|
|
130
|
+
if (!this._isInitialized) {
|
|
131
|
+
await this.init();
|
|
132
|
+
}
|
|
133
|
+
// M-RoPE models (Qwen2-VL) produce NaN logits on WebGPU due to f16
|
|
134
|
+
// accumulation overflow in the rotary position encoding shader. If we
|
|
135
|
+
// detect one, restart the Worker with the CPU WASM binary so the entire
|
|
136
|
+
// inference runs on the CPU backend.
|
|
137
|
+
//
|
|
138
|
+
// PERFORMANCE: The CPU WASM binary is single-threaded (pthreads OFF), so
|
|
139
|
+
// Qwen2-VL runs at ~1 tok/s vs ~15-20 tok/s for WebGPU models (LFM2-VL).
|
|
140
|
+
// This is a correctness-over-speed trade-off.
|
|
141
|
+
// TODO: re-test on WebGPU periodically as llama.cpp's WebGPU backend
|
|
142
|
+
// matures — the Vulkan fp16 FA fix (b8168) may eventually be ported.
|
|
143
|
+
const bridge = LlamaCppBridge.shared;
|
|
144
|
+
const isQwenVL = /qwen/i.test(params.modelId) || /qwen/i.test(params.modelName);
|
|
145
|
+
if (isQwenVL && bridge.accelerationMode === 'webgpu') {
|
|
146
|
+
const currentUrl = bridge.wasmUrl ?? '';
|
|
147
|
+
const cpuUrl = currentUrl.replace(/-webgpu\.js$/, '.js');
|
|
148
|
+
if (cpuUrl !== currentUrl) {
|
|
149
|
+
logger.info('Qwen2-VL detected — restarting VLM Worker with CPU WASM (M-RoPE compat)');
|
|
150
|
+
this.terminate();
|
|
151
|
+
await this.init(cpuUrl);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Transfer data buffers when provided (zero-copy to Worker)
|
|
155
|
+
const transferables = [];
|
|
156
|
+
if (params.modelData)
|
|
157
|
+
transferables.push(params.modelData);
|
|
158
|
+
if (params.mmprojData)
|
|
159
|
+
transferables.push(params.mmprojData);
|
|
160
|
+
await this.send('load-model', params, transferables);
|
|
161
|
+
this._isModelLoaded = true;
|
|
162
|
+
this._lastModelParams = params;
|
|
163
|
+
this._needsRecovery = false;
|
|
164
|
+
logger.info(`Model loaded: ${params.modelId}`);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Process an image with the VLM.
|
|
168
|
+
* Returns a promise that resolves when inference is complete.
|
|
169
|
+
* The main thread stays responsive during processing.
|
|
170
|
+
*
|
|
171
|
+
* The pixel buffer is transferred (zero-copy) to the Worker.
|
|
172
|
+
*/
|
|
173
|
+
async process(rgbPixels, width, height, prompt, options = {}) {
|
|
174
|
+
// Auto-recover from previous WASM crash (OOB, etc.)
|
|
175
|
+
if (this._needsRecovery) {
|
|
176
|
+
await this.recover();
|
|
177
|
+
}
|
|
178
|
+
if (!this._isModelLoaded) {
|
|
179
|
+
throw new Error('No VLM model loaded in Worker. Call loadModel() first.');
|
|
180
|
+
}
|
|
181
|
+
// Transfer the pixel buffer (zero-copy to Worker)
|
|
182
|
+
const buffer = rgbPixels.buffer.slice(rgbPixels.byteOffset, rgbPixels.byteOffset + rgbPixels.byteLength);
|
|
183
|
+
try {
|
|
184
|
+
return await this.send('process', {
|
|
185
|
+
rgbPixels: buffer,
|
|
186
|
+
width,
|
|
187
|
+
height,
|
|
188
|
+
prompt,
|
|
189
|
+
maxTokens: options.maxTokens ?? 200,
|
|
190
|
+
temperature: options.temperature ?? 0.7,
|
|
191
|
+
topP: options.topP ?? 0.9,
|
|
192
|
+
systemPrompt: options.systemPrompt,
|
|
193
|
+
modelFamily: options.modelFamily,
|
|
194
|
+
}, [buffer]);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
198
|
+
// WASM runtime errors (OOB, stack overflow) leave the instance corrupted.
|
|
199
|
+
// Mark for recovery so the next call creates a fresh Worker.
|
|
200
|
+
if (msg.includes('memory access out of bounds') ||
|
|
201
|
+
msg.includes('unreachable') ||
|
|
202
|
+
msg.includes('RuntimeError')) {
|
|
203
|
+
logger.warning('WASM crash detected, will recover on next call');
|
|
204
|
+
this._needsRecovery = true;
|
|
205
|
+
}
|
|
206
|
+
throw err;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Recover from a WASM crash by terminating the old Worker,
|
|
211
|
+
* creating a fresh one, and reloading the model.
|
|
212
|
+
*/
|
|
213
|
+
async recover() {
|
|
214
|
+
if (!this._lastModelParams) {
|
|
215
|
+
throw new Error('Cannot recover: no model params saved');
|
|
216
|
+
}
|
|
217
|
+
logger.info('Recovering from WASM crash...');
|
|
218
|
+
const params = this._lastModelParams;
|
|
219
|
+
// Destroy old worker completely
|
|
220
|
+
this.terminate();
|
|
221
|
+
// Reinitialize fresh worker + reload model
|
|
222
|
+
await this.init();
|
|
223
|
+
await this.loadModel(params);
|
|
224
|
+
logger.info('Recovery complete');
|
|
225
|
+
}
|
|
226
|
+
/** Cancel in-progress VLM generation. */
|
|
227
|
+
cancel() {
|
|
228
|
+
if (this.worker) {
|
|
229
|
+
this.worker.postMessage({ type: 'cancel', id: -2 });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/** Unload the VLM model. */
|
|
233
|
+
async unloadModel() {
|
|
234
|
+
if (!this._isModelLoaded)
|
|
235
|
+
return;
|
|
236
|
+
await this.send('unload', {});
|
|
237
|
+
this._isModelLoaded = false;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Terminate the Worker entirely.
|
|
241
|
+
*
|
|
242
|
+
* Rejects any in-flight RPC promises so callers aren't left hanging,
|
|
243
|
+
* then terminates the underlying Web Worker.
|
|
244
|
+
*/
|
|
245
|
+
terminate() {
|
|
246
|
+
// Reject all pending RPC calls so callers don't hang forever
|
|
247
|
+
for (const [, { reject }] of this.pending) {
|
|
248
|
+
reject(new Error('VLM Worker terminated'));
|
|
249
|
+
}
|
|
250
|
+
this.pending.clear();
|
|
251
|
+
this.worker?.terminate();
|
|
252
|
+
this.worker = null;
|
|
253
|
+
this._isInitialized = false;
|
|
254
|
+
this._isModelLoaded = false;
|
|
255
|
+
}
|
|
256
|
+
// ---- Internal RPC ----
|
|
257
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
258
|
+
send(type, payload, transferables) {
|
|
259
|
+
return new Promise((resolve, reject) => {
|
|
260
|
+
if (!this.worker) {
|
|
261
|
+
reject(new Error('VLM Worker not initialized'));
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const id = this.nextId++;
|
|
265
|
+
this.pending.set(id, { resolve, reject });
|
|
266
|
+
this.worker.postMessage({ type, id, payload }, transferables ?? []);
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
handleMessage(e) {
|
|
270
|
+
const { id, type, payload } = e.data;
|
|
271
|
+
// Progress messages (id=-1) are not RPC responses
|
|
272
|
+
if (type === 'progress') {
|
|
273
|
+
this.emitProgress(payload.stage);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const pending = this.pending.get(id);
|
|
277
|
+
if (!pending)
|
|
278
|
+
return;
|
|
279
|
+
this.pending.delete(id);
|
|
280
|
+
if (type === 'error') {
|
|
281
|
+
pending.reject(new Error(payload.message));
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
pending.resolve(payload);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=VLMWorkerBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VLMWorkerBridge.js","sourceRoot":"","sources":["../../src/Infrastructure/VLMWorkerBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - VLM Worker Runtime
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates the Worker-side logic for VLM inference. This module runs
|
|
5
|
+
* inside a dedicated Web Worker and manages its own WASM instance
|
|
6
|
+
* (separate from the main-thread SDK).
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* - Loads its OWN WASM instance (separate from the main thread SDK)
|
|
10
|
+
* - Reads model files from OPFS directly (no large postMessage transfers)
|
|
11
|
+
* - Communicates via typed postMessage RPC
|
|
12
|
+
*
|
|
13
|
+
* Why a separate WASM instance?
|
|
14
|
+
* The C function `rac_vlm_component_process` is synchronous and blocks for
|
|
15
|
+
* ~100s (2B model in WASM). Running it on the main thread freezes the entire UI.
|
|
16
|
+
* A Worker with its own WASM instance allows inference to happen concurrently.
|
|
17
|
+
*
|
|
18
|
+
* IMPORTANT: This file must NOT import from WASMBridge.ts or other SDK modules
|
|
19
|
+
* that assume a main-thread context. The Worker has its own WASM instance and
|
|
20
|
+
* should be self-contained. Only `type`-only imports are safe.
|
|
21
|
+
*/
|
|
22
|
+
import type { VLMWorkerResult } from './VLMWorkerBridge';
|
|
23
|
+
export type { VLMWorkerResult };
|
|
24
|
+
/**
|
|
25
|
+
* Start the VLM Worker runtime.
|
|
26
|
+
*
|
|
27
|
+
* Call this once from the Worker entry point. It sets up the `self.onmessage`
|
|
28
|
+
* handler that processes RPC commands from the main-thread VLMWorkerBridge.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // workers/vlm-worker.ts
|
|
33
|
+
* import { startVLMWorkerRuntime } from '../Infrastructure/VLMWorkerRuntime';
|
|
34
|
+
* startVLMWorkerRuntime();
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function startVLMWorkerRuntime(): void;
|
|
38
|
+
//# sourceMappingURL=VLMWorkerRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VLMWorkerRuntime.d.ts","sourceRoot":"","sources":["../../src/Infrastructure/VLMWorkerRuntime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,OAAO,KAAK,EAAuC,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAI9F,YAAY,EAAE,eAAe,EAAE,CAAC;AAirBhC;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C"}
|