@litert-lm/core 0.12.0
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 +145 -0
- package/dist/cleanup.d.ts +25 -0
- package/dist/cleanup.d.ts.map +1 -0
- package/dist/cleanup.js +36 -0
- package/dist/cleanup.js.map +1 -0
- package/dist/conversation.d.ts +43 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +153 -0
- package/dist/conversation.js.map +1 -0
- package/dist/conversation_config.d.ts +107 -0
- package/dist/conversation_config.d.ts.map +1 -0
- package/dist/conversation_config.js +17 -0
- package/dist/conversation_config.js.map +1 -0
- package/dist/engine.d.ts +37 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +200 -0
- package/dist/engine.js.map +1 -0
- package/dist/engine_settings.d.ts +56 -0
- package/dist/engine_settings.d.ts.map +1 -0
- package/dist/engine_settings.js +110 -0
- package/dist/engine_settings.js.map +1 -0
- package/dist/global_litertlm.d.ts +66 -0
- package/dist/global_litertlm.d.ts.map +1 -0
- package/dist/global_litertlm.js +85 -0
- package/dist/global_litertlm.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/litertlm_web.d.ts +32 -0
- package/dist/litertlm_web.d.ts.map +1 -0
- package/dist/litertlm_web.js +75 -0
- package/dist/litertlm_web.js.map +1 -0
- package/dist/load.d.ts +28 -0
- package/dist/load.d.ts.map +1 -0
- package/dist/load.js +43 -0
- package/dist/load.js.map +1 -0
- package/dist/load_litertlm.d.ts +58 -0
- package/dist/load_litertlm.d.ts.map +1 -0
- package/dist/load_litertlm.js +75 -0
- package/dist/load_litertlm.js.map +1 -0
- package/dist/mutex.d.ts +45 -0
- package/dist/mutex.d.ts.map +1 -0
- package/dist/mutex.js +62 -0
- package/dist/mutex.js.map +1 -0
- package/dist/readable_stream_data_stream_wrapper.d.ts +44 -0
- package/dist/readable_stream_data_stream_wrapper.d.ts.map +1 -0
- package/dist/readable_stream_data_stream_wrapper.js +315 -0
- package/dist/readable_stream_data_stream_wrapper.js.map +1 -0
- package/dist/session.d.ts +46 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +88 -0
- package/dist/session.js.map +1 -0
- package/dist/session_config.d.ts +55 -0
- package/dist/session_config.d.ts.map +1 -0
- package/dist/session_config.js +109 -0
- package/dist/session_config.js.map +1 -0
- package/dist/types.d.ts +42 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/dist/url_path_utils.d.ts +28 -0
- package/dist/url_path_utils.d.ts.map +1 -0
- package/dist/url_path_utils.js +34 -0
- package/dist/url_path_utils.js.map +1 -0
- package/dist/wasm_binding_types.d.ts +365 -0
- package/dist/wasm_binding_types.d.ts.map +1 -0
- package/dist/wasm_binding_types.js +39 -0
- package/dist/wasm_binding_types.js.map +1 -0
- package/dist/wasm_feature_detect.d.ts +42 -0
- package/dist/wasm_feature_detect.d.ts.map +1 -0
- package/dist/wasm_feature_detect.js +117 -0
- package/dist/wasm_feature_detect.js.map +1 -0
- package/dist/wasm_utils.d.ts +30 -0
- package/dist/wasm_utils.d.ts.map +1 -0
- package/dist/wasm_utils.js +41 -0
- package/dist/wasm_utils.js.map +1 -0
- package/package.json +46 -0
- package/wasm/litertlm_wasm_compat_internal.js +8400 -0
- package/wasm/litertlm_wasm_compat_internal.wasm +0 -0
- package/wasm/litertlm_wasm_internal.js +8389 -0
- package/wasm/litertlm_wasm_internal.wasm +0 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 The ODML Authors.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
class Slice {
|
|
17
|
+
size;
|
|
18
|
+
data;
|
|
19
|
+
fullyDiscarded = false;
|
|
20
|
+
discardedRegions = [];
|
|
21
|
+
constructor(size) {
|
|
22
|
+
this.size = size;
|
|
23
|
+
}
|
|
24
|
+
discard(start, end) {
|
|
25
|
+
if (this.fullyDiscarded)
|
|
26
|
+
return;
|
|
27
|
+
if (this.discardedRegions.length === 0) {
|
|
28
|
+
// No discarded regions yet, so add this one.
|
|
29
|
+
this.discardedRegions.push([start, end]);
|
|
30
|
+
this.checkFullyDiscarded();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this.discardedRegions.push([start, end]);
|
|
34
|
+
this.discardedRegions.sort((a, b) => a[0] - b[0]);
|
|
35
|
+
// Merge overlapping regions.
|
|
36
|
+
const mergedRegions = [];
|
|
37
|
+
for (const region of this.discardedRegions) {
|
|
38
|
+
const lastRegion = mergedRegions[mergedRegions.length - 1];
|
|
39
|
+
if (!lastRegion || lastRegion[1] < region[0]) {
|
|
40
|
+
mergedRegions.push(region);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
lastRegion[1] = Math.max(lastRegion[1], region[1]);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
this.discardedRegions = mergedRegions;
|
|
47
|
+
this.checkFullyDiscarded();
|
|
48
|
+
}
|
|
49
|
+
getDiscardedRegions(start = 0, end = this.size) {
|
|
50
|
+
const result = [];
|
|
51
|
+
for (const [rStart, rEnd] of this.discardedRegions) {
|
|
52
|
+
// If the region starts after the end of the requested range,
|
|
53
|
+
// no further regions will overlap.
|
|
54
|
+
if (rStart >= end) {
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
// If the region ends before or at the start of the requested range, skip
|
|
58
|
+
// it.
|
|
59
|
+
if (rEnd <= start) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
result.push([rStart, rEnd]);
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
checkFullyDiscarded() {
|
|
67
|
+
if (this.discardedRegions.length === 1 &&
|
|
68
|
+
this.discardedRegions[0][0] === 0 &&
|
|
69
|
+
this.discardedRegions[0][1] === this.size) {
|
|
70
|
+
this.fullyDiscarded = true;
|
|
71
|
+
this.data = undefined;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Wraps a ReadableStream for use in LiteRT LM C++ streamed model loading.
|
|
77
|
+
*/
|
|
78
|
+
export class ReadableStreamDataStreamWrapper {
|
|
79
|
+
stream;
|
|
80
|
+
getWasmHeap;
|
|
81
|
+
bytesPerSlice;
|
|
82
|
+
slices = [];
|
|
83
|
+
streamDone = false;
|
|
84
|
+
globalPosition = 0;
|
|
85
|
+
reader;
|
|
86
|
+
leftoverData;
|
|
87
|
+
isReading = false;
|
|
88
|
+
constructor(stream,
|
|
89
|
+
// Heap is detached whenever it's resized, so we get it each time.
|
|
90
|
+
getWasmHeap, bytesPerSlice = 10_000_000) {
|
|
91
|
+
this.stream = stream;
|
|
92
|
+
this.getWasmHeap = getWasmHeap;
|
|
93
|
+
this.bytesPerSlice = bytesPerSlice;
|
|
94
|
+
try {
|
|
95
|
+
this.reader = { byobReader: this.stream.getReader({ mode: 'byob' }) };
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
this.reader = { defaultReader: this.stream.getReader() };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
*getViews(start, end) {
|
|
102
|
+
if (start >= end) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// A scratch buffer for creating new slices if needed.
|
|
106
|
+
// If the slice is fully discarded, we'll reuse this buffer instead of
|
|
107
|
+
// creating a new one.
|
|
108
|
+
let scratchBuffer;
|
|
109
|
+
let previousSlice;
|
|
110
|
+
let position = start;
|
|
111
|
+
while (position < end) {
|
|
112
|
+
const sliceIndex = Math.floor(position / this.bytesPerSlice);
|
|
113
|
+
const slicePosition = position % this.bytesPerSlice;
|
|
114
|
+
const sliceStartGlobalPosition = sliceIndex * this.bytesPerSlice;
|
|
115
|
+
let slice = this.slices[sliceIndex];
|
|
116
|
+
if (!slice) {
|
|
117
|
+
if (!previousSlice || !previousSlice.fullyDiscarded) {
|
|
118
|
+
// Make a new scratch buffer since the old one was assigned to the
|
|
119
|
+
// previous slice (or there is no previous slice).
|
|
120
|
+
scratchBuffer = new Uint8Array(this.bytesPerSlice);
|
|
121
|
+
}
|
|
122
|
+
slice = new Slice(this.bytesPerSlice);
|
|
123
|
+
slice.data = scratchBuffer;
|
|
124
|
+
this.slices[sliceIndex] = slice;
|
|
125
|
+
}
|
|
126
|
+
const viewEnd = Math.min(this.bytesPerSlice, end - sliceStartGlobalPosition);
|
|
127
|
+
const discardView = () => {
|
|
128
|
+
slice.discard(slicePosition, viewEnd);
|
|
129
|
+
};
|
|
130
|
+
const viewLength = viewEnd - slicePosition;
|
|
131
|
+
const setView = (view) => {
|
|
132
|
+
// Necessary when a BYOB reader invalidates the buffer.
|
|
133
|
+
slice.data = new Uint8Array(view.buffer, 0, view.buffer.byteLength);
|
|
134
|
+
scratchBuffer = slice.data;
|
|
135
|
+
};
|
|
136
|
+
const checkReadable = () => {
|
|
137
|
+
const discardedRegions = slice.getDiscardedRegions(slicePosition, viewEnd);
|
|
138
|
+
if (discardedRegions.length > 0) {
|
|
139
|
+
const globalDiscardedRegions = discardedRegions.map(([start, end]) => `[${start + sliceStartGlobalPosition}, ${end + sliceStartGlobalPosition}]`);
|
|
140
|
+
throw new Error(`Slice ${sliceIndex} for data at ${position} overlaps discarded regions: [${globalDiscardedRegions.join(', ')}]`);
|
|
141
|
+
}
|
|
142
|
+
if (!slice.data) {
|
|
143
|
+
throw new Error(`No ArrayBuffer for slice ${sliceIndex} at position ${position}`);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
const getView = () => {
|
|
147
|
+
checkReadable();
|
|
148
|
+
return new Uint8Array(slice.data.buffer, slice.data.byteOffset + slicePosition, slice.data.byteOffset + viewLength);
|
|
149
|
+
};
|
|
150
|
+
yield {
|
|
151
|
+
getView,
|
|
152
|
+
discardView,
|
|
153
|
+
setView,
|
|
154
|
+
checkReadable,
|
|
155
|
+
};
|
|
156
|
+
previousSlice = slice;
|
|
157
|
+
position += viewLength;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async readInternal(destAddress, offset, count, discard) {
|
|
161
|
+
if (this.isReading) {
|
|
162
|
+
throw new Error('Concurrent reads are not supported');
|
|
163
|
+
}
|
|
164
|
+
this.isReading = true;
|
|
165
|
+
try {
|
|
166
|
+
// 1. Read and cache all unfetched data before the requested region.
|
|
167
|
+
for (const { getView, setView, checkReadable } of this.getViews(this.globalPosition, offset)) {
|
|
168
|
+
checkReadable();
|
|
169
|
+
// We do not discard or change destAddress here as this is before the
|
|
170
|
+
// requested region.
|
|
171
|
+
const newView = await this.fillBufferFromStream(getView());
|
|
172
|
+
setView(newView);
|
|
173
|
+
if (newView.length === 0) {
|
|
174
|
+
break; // Hit EOF early
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// 2. Copy cached data from existing slices. This may be a no-op if none
|
|
178
|
+
// of the requested region is cached.
|
|
179
|
+
const endOfCachedRead = Math.min(this.globalPosition, offset + count);
|
|
180
|
+
for (const { getView, discardView } of this.getViews(offset, endOfCachedRead)) {
|
|
181
|
+
const view = getView();
|
|
182
|
+
this.getWasmHeap().set(view, destAddress);
|
|
183
|
+
if (discard)
|
|
184
|
+
discardView();
|
|
185
|
+
destAddress += view.length;
|
|
186
|
+
}
|
|
187
|
+
// 3. Read and optionally cache remaining unfetched data and copy it to
|
|
188
|
+
// the destination.
|
|
189
|
+
const startOfUncachedRead = Math.max(endOfCachedRead, offset);
|
|
190
|
+
for (const { getView, setView, discardView } of this.getViews(startOfUncachedRead, offset + count)) {
|
|
191
|
+
// If we are already at EOF (e.g. from step 1 or a previous iteration
|
|
192
|
+
// here), stop reading
|
|
193
|
+
if (this.streamDone && this.globalPosition <= startOfUncachedRead)
|
|
194
|
+
break;
|
|
195
|
+
const newView = await this.fillBufferFromStream(getView());
|
|
196
|
+
setView(newView);
|
|
197
|
+
this.getWasmHeap().set(newView, destAddress);
|
|
198
|
+
if (discard)
|
|
199
|
+
discardView();
|
|
200
|
+
destAddress += newView.length;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
this.isReading = false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async fillBufferFromStream(buffer) {
|
|
208
|
+
// Must read byteLength now as buffer will be invalidated.
|
|
209
|
+
const byteLength = buffer.byteLength;
|
|
210
|
+
if (byteLength === 0) {
|
|
211
|
+
return buffer;
|
|
212
|
+
}
|
|
213
|
+
const byteOffset = buffer.byteOffset;
|
|
214
|
+
let bytesRead = 0;
|
|
215
|
+
let arrayBuffer = buffer.buffer;
|
|
216
|
+
while (bytesRead < byteLength) {
|
|
217
|
+
if (this.streamDone &&
|
|
218
|
+
(!this.leftoverData || this.leftoverData.length === 0)) {
|
|
219
|
+
throw new Error(`Read from stream returned early EOF at position ${this.globalPosition}. Expected ${byteLength - bytesRead} more bytes.`);
|
|
220
|
+
}
|
|
221
|
+
if (this.reader.byobReader) {
|
|
222
|
+
// Create a view of the remaining region to be written to. We have to
|
|
223
|
+
// do this each time since the BYOB reader will detach the view and
|
|
224
|
+
// its underlying ArrayBuffer.
|
|
225
|
+
const view = new Uint8Array(arrayBuffer, byteOffset + bytesRead, byteLength - bytesRead);
|
|
226
|
+
const result = await this.reader.byobReader.read(view);
|
|
227
|
+
if (result.done) {
|
|
228
|
+
this.streamDone = true;
|
|
229
|
+
}
|
|
230
|
+
if (!result.value) {
|
|
231
|
+
throw new Error('Read from stream returned null value');
|
|
232
|
+
}
|
|
233
|
+
this.globalPosition += result.value.byteLength;
|
|
234
|
+
bytesRead += result.value.byteLength;
|
|
235
|
+
arrayBuffer = result.value.buffer;
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
let chunk;
|
|
239
|
+
if (this.leftoverData && this.leftoverData.length > 0) {
|
|
240
|
+
chunk = this.leftoverData;
|
|
241
|
+
this.leftoverData = undefined;
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
const result = await this.reader.defaultReader.read();
|
|
245
|
+
if (result.done) {
|
|
246
|
+
this.streamDone = true;
|
|
247
|
+
if (!result.value) {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (!result.value) {
|
|
252
|
+
throw new Error('Read from stream returned null value');
|
|
253
|
+
}
|
|
254
|
+
chunk = result.value;
|
|
255
|
+
}
|
|
256
|
+
const bytesNeeded = byteLength - bytesRead;
|
|
257
|
+
const bytesToCopy = Math.min(chunk.length, bytesNeeded);
|
|
258
|
+
const destView = new Uint8Array(arrayBuffer, byteOffset + bytesRead, bytesToCopy);
|
|
259
|
+
destView.set(chunk.subarray(0, bytesToCopy));
|
|
260
|
+
if (chunk.length > bytesToCopy) {
|
|
261
|
+
this.leftoverData = chunk.subarray(bytesToCopy);
|
|
262
|
+
}
|
|
263
|
+
this.globalPosition += bytesToCopy;
|
|
264
|
+
bytesRead += bytesToCopy;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const result = new Uint8Array(arrayBuffer, byteOffset, bytesRead);
|
|
268
|
+
if (result.length !== byteLength) {
|
|
269
|
+
throw new Error(`Read from stream returned ${result.length} bytes, expected ${byteLength}`);
|
|
270
|
+
}
|
|
271
|
+
return result;
|
|
272
|
+
}
|
|
273
|
+
doDiscard(offset, count) {
|
|
274
|
+
for (const { discardView } of this.getViews(offset, offset + count)) {
|
|
275
|
+
discardView();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async readAndDiscard(destAddress, offset, count) {
|
|
279
|
+
try {
|
|
280
|
+
await this.readInternal(destAddress >>> 0, toNumber(offset), toNumber(count), true);
|
|
281
|
+
return {};
|
|
282
|
+
}
|
|
283
|
+
catch (e) {
|
|
284
|
+
return { error: e };
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async readAndPreserve(destAddress, offset, count) {
|
|
288
|
+
try {
|
|
289
|
+
await this.readInternal(destAddress >>> 0, toNumber(offset), toNumber(count), false);
|
|
290
|
+
return {};
|
|
291
|
+
}
|
|
292
|
+
catch (e) {
|
|
293
|
+
return { error: e };
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
async discard(offset, count) {
|
|
297
|
+
try {
|
|
298
|
+
this.doDiscard(toNumber(offset), toNumber(count));
|
|
299
|
+
return {};
|
|
300
|
+
}
|
|
301
|
+
catch (e) {
|
|
302
|
+
return { error: e };
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
function toNumber(val) {
|
|
307
|
+
if (typeof val === 'number') {
|
|
308
|
+
return val;
|
|
309
|
+
}
|
|
310
|
+
if (val > Number.MAX_SAFE_INTEGER) {
|
|
311
|
+
throw new Error(`BigInt value ${val} too large to be represented as a number`);
|
|
312
|
+
}
|
|
313
|
+
return Number(val);
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=readable_stream_data_stream_wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readable_stream_data_stream_wrapper.js","sourceRoot":"","sources":["../src/readable_stream_data_stream_wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,KAAK;IAKY;IAJrB,IAAI,CAA2B;IAC/B,cAAc,GAAG,KAAK,CAAC;IACf,gBAAgB,GAA4B,EAAE,CAAC;IAEvD,YAAqB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAErC,OAAO,CAAC,KAAa,EAAE,GAAW;QAChC,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QAChC,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,6CAA6C;YAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAElD,6BAA6B;QAC7B,MAAM,aAAa,GAA4B,EAAE,CAAC;QAClD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC;QAEtC,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED,mBAAmB,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI;QAC5C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACnD,6DAA6D;YAC7D,mCAAmC;YACnC,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;gBAClB,MAAM;YACR,CAAC;YACD,yEAAyE;YACzE,MAAM;YACN,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;gBAClB,SAAS;YACX,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAClC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACjC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,+BAA+B;IAcrB;IAEA;IACR;IAhBL,MAAM,GAAY,EAAE,CAAC;IACrB,UAAU,GAAG,KAAK,CAAC;IACnB,cAAc,GAAG,CAAC,CAAC;IAEnB,MAAM,CAIR;IACE,YAAY,CAAc;IAC1B,SAAS,GAAG,KAAK,CAAC;IAE1B,YACqB,MAAkC;IACnD,kEAAkE;IACjD,WAA6B,EACrC,gBAAgB,UAAU;QAHlB,WAAM,GAAN,MAAM,CAA4B;QAElC,gBAAW,GAAX,WAAW,CAAkB;QACrC,kBAAa,GAAb,aAAa,CAAa;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,EAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC,EAAC,CAAC;QACpE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,GAAG,EAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAEO,CAAE,QAAQ,CAAC,KAAa,EAAE,GAAW;QAM3C,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,sDAAsD;QACtD,sEAAsE;QACtE,sBAAsB;QACtB,IAAI,aAAgD,CAAC;QACrD,IAAI,aAA8B,CAAC;QACnC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,OAAO,QAAQ,GAAG,GAAG,EAAE,CAAC;YACtB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;YAC7D,MAAM,aAAa,GAAG,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;YACpD,MAAM,wBAAwB,GAAG,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC;YAEjE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;oBACpD,kEAAkE;oBAClE,kDAAkD;oBAClD,aAAa,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACrD,CAAC;gBACD,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACtC,KAAK,CAAC,IAAI,GAAG,aAAa,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;YAClC,CAAC;YAED,MAAM,OAAO,GACT,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,GAAG,wBAAwB,CAAC,CAAC;YAEjE,MAAM,WAAW,GAAG,GAAG,EAAE;gBACvB,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACxC,CAAC,CAAC;YAEF,MAAM,UAAU,GAAG,OAAO,GAAG,aAAa,CAAC;YAE3C,MAAM,OAAO,GAAG,CAAC,IAA6B,EAAE,EAAE;gBAChD,uDAAuD;gBACvD,KAAK,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACpE,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC;YAC7B,CAAC,CAAC;YAEF,MAAM,aAAa,GAAG,GAAG,EAAE;gBACzB,MAAM,gBAAgB,GAClB,KAAK,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBACtD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChC,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,GAAG,CAC/C,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,wBAAwB,KAClD,GAAG,GAAG,wBAAwB,GAAG,CAAC,CAAC;oBAC3C,MAAM,IAAI,KAAK,CAAC,SAAS,UAAU,gBAC/B,QAAQ,iCACR,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBAChB,MAAM,IAAI,KAAK,CACX,4BAA4B,UAAU,gBAAgB,QAAQ,EAAE,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,aAAa,EAAE,CAAC;gBAChB,OAAO,IAAI,UAAU,CACjB,KAAK,CAAC,IAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAK,CAAC,UAAU,GAAG,aAAa,EAC1D,KAAK,CAAC,IAAK,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC;YAC3C,CAAC,CAAC;YAEF,MAAM;gBACJ,OAAO;gBACP,WAAW;gBACX,OAAO;gBACP,aAAa;aACd,CAAC;YAEF,aAAa,GAAG,KAAK,CAAC;YACtB,QAAQ,IAAI,UAAU,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CACtB,WAAmB,EAAE,MAAc,EAAE,KAAa,EAClD,OAAgB;QAClB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,oEAAoE;YACpE,KAAK,MAAM,EAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAC,IAAI,IAAI,CAAC,QAAQ,CACpD,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC;gBACtC,aAAa,EAAE,CAAC;gBAChB,qEAAqE;gBACrE,oBAAoB;gBACpB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;gBACjB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,CAAE,gBAAgB;gBAC1B,CAAC;YACH,CAAC;YAED,wEAAwE;YACxE,qCAAqC;YACrC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;YACtE,KAAK,MAAM,EAAC,OAAO,EAAE,WAAW,EAAC,IAAI,IAAI,CAAC,QAAQ,CACzC,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAC1C,IAAI,OAAO;oBAAE,WAAW,EAAE,CAAC;gBAC3B,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC;YAC7B,CAAC;YAED,uEAAuE;YACvE,mBAAmB;YACnB,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YAC9D,KAAK,MAAM,EAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAC,IAAI,IAAI,CAAC,QAAQ,CAClD,mBAAmB,EAAE,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC;gBAC9C,qEAAqE;gBACrE,sBAAsB;gBACtB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,cAAc,IAAI,mBAAmB;oBAC/D,MAAM;gBACR,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;gBACjB,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBAC7C,IAAI,OAAO;oBAAE,WAAW,EAAE,CAAC;gBAC3B,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;YAChC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,MAA+B;QAEhE,0DAA0D;QAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAErC,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAChC,OAAO,SAAS,GAAG,UAAU,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,UAAU;gBACf,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,mDACZ,IAAI,CAAC,cAAc,cACnB,UAAU,GAAG,SAAS,cAAc,CAAC,CAAC;YAC5C,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC3B,qEAAqE;gBACrE,mEAAmE;gBACnE,8BAA8B;gBAC9B,MAAM,IAAI,GAAG,IAAI,UAAU,CACvB,WAAW,EAAE,UAAU,GAAG,SAAS,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;gBACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACzB,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;gBAC1D,CAAC;gBACD,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC/C,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;gBACrC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,IAAI,KAAiB,CAAC;gBACtB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtD,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;oBAC1B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;oBACtD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;wBAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;wBACvB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;4BAClB,SAAS;wBACX,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;wBAClB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;oBAC1D,CAAC;oBACD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBACvB,CAAC;gBAED,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;gBAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBACxD,MAAM,QAAQ,GACV,IAAI,UAAU,CAAC,WAAW,EAAE,UAAU,GAAG,SAAS,EAAE,WAAW,CAAC,CAAC;gBACrE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;gBAE7C,IAAI,KAAK,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;oBAC/B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBAClD,CAAC;gBAED,IAAI,CAAC,cAAc,IAAI,WAAW,CAAC;gBACnC,SAAS,IAAI,WAAW,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAElE,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,6BACZ,MAAM,CAAC,MAAM,oBAAoB,UAAU,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,SAAS,CAAC,MAAc,EAAE,KAAa;QAC7C,KAAK,MAAM,EAAC,WAAW,EAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC;YAClE,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAChB,WAAmB,EAAE,MAAqB,EAC1C,KAAoB;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CACnB,WAAW,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;YAChE,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAC,KAAK,EAAE,CAAU,EAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CACjB,WAAmB,EAAE,MAAqB,EAC1C,KAAoB;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CACnB,WAAW,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;YACjE,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAC,KAAK,EAAE,CAAU,EAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAqB,EAAE,KAAoB;QAEvD,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAC,KAAK,EAAE,CAAU,EAAC,CAAC;QAC7B,CAAC;IACH,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,GAAkB;IAClC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,GAAG,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACX,gBAAgB,GAAG,0CAA0C,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 The ODML Authors.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { Mutex } from './mutex';
|
|
17
|
+
import { SessionConfig } from './session_config';
|
|
18
|
+
import { RecursiveRequired } from './types';
|
|
19
|
+
import { Responses as WasmResponses, Session as WasmSession } from './wasm_binding_types';
|
|
20
|
+
/**
|
|
21
|
+
* LiteRT-LM Session
|
|
22
|
+
*/
|
|
23
|
+
export declare class Session {
|
|
24
|
+
private readonly session;
|
|
25
|
+
private readonly mutexes;
|
|
26
|
+
readonly config: RecursiveRequired<SessionConfig>;
|
|
27
|
+
private isBusy;
|
|
28
|
+
constructor(session: WasmSession, mutexes: {
|
|
29
|
+
executor: Mutex;
|
|
30
|
+
});
|
|
31
|
+
runPrefill(inputs: string[]): Promise<void>;
|
|
32
|
+
runDecode(): Promise<Responses>;
|
|
33
|
+
/**
|
|
34
|
+
* Sends a signal to cancel any current generation.
|
|
35
|
+
*/
|
|
36
|
+
cancel(): void;
|
|
37
|
+
delete(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
declare class Responses {
|
|
40
|
+
private readonly responses;
|
|
41
|
+
constructor(responses: WasmResponses);
|
|
42
|
+
getTexts(): string[];
|
|
43
|
+
delete(): void;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAC,aAAa,EAAmC,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAC,SAAS,IAAI,aAAa,EAAE,OAAO,IAAI,WAAW,EAAC,MAAM,sBAAsB,CAAC;AAKxF;;GAEG;AACH,qBAAa,OAAO;IAIN,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAe,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH3E,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAClD,OAAO,CAAC,MAAM,CAAS;gBAEM,OAAO,EAAE,WAAW,EAAmB,OAAO,EAAE;QAC3E,QAAQ,EAAE,KAAK,CAAC;KACjB;IAMK,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3C,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IAerC;;OAEG;IACH,MAAM;IAIA,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAK9B;AAED,cAAM,SAAS;IACD,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,aAAa;IAErD,QAAQ,IAAI,MAAM,EAAE;IAKpB,MAAM;CAGP"}
|
package/dist/session.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 The ODML Authors.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { wasmSessionConfigToSessionConfig } from './session_config';
|
|
17
|
+
import { consumeEmscriptenVectorToArray } from './wasm_utils';
|
|
18
|
+
const BUSY_MESSAGE = 'Session is busy. An operation is already in progress.';
|
|
19
|
+
/**
|
|
20
|
+
* LiteRT-LM Session
|
|
21
|
+
*/
|
|
22
|
+
export class Session {
|
|
23
|
+
session;
|
|
24
|
+
mutexes;
|
|
25
|
+
config;
|
|
26
|
+
isBusy = false;
|
|
27
|
+
constructor(session, mutexes) {
|
|
28
|
+
this.session = session;
|
|
29
|
+
this.mutexes = mutexes;
|
|
30
|
+
const wasmSessionConfig = session.getSessionConfig();
|
|
31
|
+
this.config = wasmSessionConfigToSessionConfig(wasmSessionConfig);
|
|
32
|
+
wasmSessionConfig.delete();
|
|
33
|
+
}
|
|
34
|
+
async runPrefill(inputs) {
|
|
35
|
+
if (this.isBusy) {
|
|
36
|
+
throw new Error(BUSY_MESSAGE);
|
|
37
|
+
}
|
|
38
|
+
this.isBusy = true;
|
|
39
|
+
try {
|
|
40
|
+
await this.mutexes.executor.acquireAndRun(async () => {
|
|
41
|
+
await this.session.runPrefill(inputs);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
this.isBusy = false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async runDecode() {
|
|
49
|
+
if (this.isBusy) {
|
|
50
|
+
throw new Error(BUSY_MESSAGE);
|
|
51
|
+
}
|
|
52
|
+
this.isBusy = true;
|
|
53
|
+
try {
|
|
54
|
+
return await this.mutexes.executor.acquireAndRun(async () => {
|
|
55
|
+
const wasmResponses = await this.session.runDecode();
|
|
56
|
+
return new Responses(wasmResponses);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
this.isBusy = false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Sends a signal to cancel any current generation.
|
|
65
|
+
*/
|
|
66
|
+
cancel() {
|
|
67
|
+
this.session.cancelProcess();
|
|
68
|
+
}
|
|
69
|
+
async delete() {
|
|
70
|
+
await this.mutexes.executor.acquireAndRun(() => {
|
|
71
|
+
this.session.delete();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
class Responses {
|
|
76
|
+
responses;
|
|
77
|
+
constructor(responses) {
|
|
78
|
+
this.responses = responses;
|
|
79
|
+
}
|
|
80
|
+
getTexts() {
|
|
81
|
+
const texts = this.responses.getTexts();
|
|
82
|
+
return consumeEmscriptenVectorToArray(texts);
|
|
83
|
+
}
|
|
84
|
+
delete() {
|
|
85
|
+
this.responses.delete();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAgB,gCAAgC,EAAC,MAAM,kBAAkB,CAAC;AAGjF,OAAO,EAAC,8BAA8B,EAAC,MAAM,cAAc,CAAC;AAE5D,MAAM,YAAY,GAAG,uDAAuD,CAAC;AAE7E;;GAEG;AACH,MAAM,OAAO,OAAO;IAIW;IAAuC;IAH3D,MAAM,CAAmC;IAC1C,MAAM,GAAG,KAAK,CAAC;IAEvB,YAA6B,OAAoB,EAAmB,OAEnE;QAF4B,YAAO,GAAP,OAAO,CAAa;QAAmB,YAAO,GAAP,OAAO,CAE1E;QACC,MAAM,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,gCAAgC,CAAC,iBAAiB,CAAC,CAAC;QAClE,iBAAiB,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAgB;QAC/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;gBACnD,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;gBAC1D,MAAM,aAAa,GAAkB,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACpE,OAAO,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE;YAC7C,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,SAAS;IACgB;IAA7B,YAA6B,SAAwB;QAAxB,cAAS,GAAT,SAAS,CAAe;IAAG,CAAC;IAEzD,QAAQ;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QACxC,OAAO,8BAA8B,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 The ODML Authors.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { RecursiveRequired } from './types';
|
|
17
|
+
import { Backend, SamplerType, SessionConfig as WasmSessionConfig } from './wasm_binding_types';
|
|
18
|
+
export { SamplerType };
|
|
19
|
+
/**
|
|
20
|
+
* Configures how to sample the next token.
|
|
21
|
+
*/
|
|
22
|
+
export interface SamplerParameters {
|
|
23
|
+
type?: SamplerType;
|
|
24
|
+
k?: number;
|
|
25
|
+
p?: number;
|
|
26
|
+
temperature?: number;
|
|
27
|
+
seed?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Configures a LiteRT-LM Session.
|
|
31
|
+
*/
|
|
32
|
+
export interface SessionConfig {
|
|
33
|
+
audioModalityEnabled?: boolean;
|
|
34
|
+
visionModalityEnabled?: boolean;
|
|
35
|
+
samplerParams?: SamplerParameters;
|
|
36
|
+
stopTokenIds?: number[][];
|
|
37
|
+
startTokenId?: number;
|
|
38
|
+
numOutputCandidates?: number;
|
|
39
|
+
samplerBackend?: Backend;
|
|
40
|
+
applyPromptTemplateInSession?: boolean;
|
|
41
|
+
useExternalSampler?: boolean;
|
|
42
|
+
maxOutputTokens?: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Converts a SessionConfig to a WasmSessionConfig.
|
|
46
|
+
*/
|
|
47
|
+
export declare function sessionConfigToWasmSessionConfig(sessionConfig: SessionConfig, wasm?: import("./wasm_binding_types").LiteRtLmWasm): WasmSessionConfig;
|
|
48
|
+
/**
|
|
49
|
+
* Converts a WasmSessionConfig to a SessionConfig.
|
|
50
|
+
*
|
|
51
|
+
* All fields will be populated with the WASM object's values, which may be
|
|
52
|
+
* default values if they were not set.
|
|
53
|
+
*/
|
|
54
|
+
export declare function wasmSessionConfigToSessionConfig(wasmSessionConfig: WasmSessionConfig): RecursiveRequired<SessionConfig>;
|
|
55
|
+
//# sourceMappingURL=session_config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session_config.d.ts","sourceRoot":"","sources":["../src/session_config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAC,OAAO,EAAE,WAAW,EAAE,aAAa,IAAI,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAI9F,OAAO,EAAC,WAAW,EAAC,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC5C,aAAa,EAAE,aAAa,EAC5B,IAAI,8CAAmC,GAAG,iBAAiB,CA6D9D;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAC5C,iBAAiB,EAAE,iBAAiB,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAwB1E"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 The ODML Authors.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { getGlobalLiteRtLm } from './global_litertlm';
|
|
17
|
+
import { SamplerType } from './wasm_binding_types';
|
|
18
|
+
import { consumeEmscriptenVectorToArray, fillEmscriptenVector } from './wasm_utils';
|
|
19
|
+
// Re-export SamplerType as it's compatible with the TS API.
|
|
20
|
+
export { SamplerType };
|
|
21
|
+
/**
|
|
22
|
+
* Converts a SessionConfig to a WasmSessionConfig.
|
|
23
|
+
*/
|
|
24
|
+
export function sessionConfigToWasmSessionConfig(sessionConfig, wasm = getGlobalLiteRtLm().liteRtLmWasm) {
|
|
25
|
+
const wasmSessionConfig = wasm.SessionConfig.createDefault();
|
|
26
|
+
if (sessionConfig.audioModalityEnabled !== undefined) {
|
|
27
|
+
wasmSessionConfig.setAudioModalityEnabled(sessionConfig.audioModalityEnabled);
|
|
28
|
+
}
|
|
29
|
+
if (sessionConfig.visionModalityEnabled !== undefined) {
|
|
30
|
+
wasmSessionConfig.setVisionModalityEnabled(sessionConfig.visionModalityEnabled);
|
|
31
|
+
}
|
|
32
|
+
if (sessionConfig.samplerParams !== undefined) {
|
|
33
|
+
const samplerParams = wasmSessionConfig.getMutableSamplerParams();
|
|
34
|
+
if (sessionConfig.samplerParams.type !== undefined) {
|
|
35
|
+
samplerParams.setType({ value: sessionConfig.samplerParams.type });
|
|
36
|
+
}
|
|
37
|
+
if (sessionConfig.samplerParams.k !== undefined) {
|
|
38
|
+
samplerParams.setK(sessionConfig.samplerParams.k);
|
|
39
|
+
}
|
|
40
|
+
if (sessionConfig.samplerParams.p !== undefined) {
|
|
41
|
+
samplerParams.setP(sessionConfig.samplerParams.p);
|
|
42
|
+
}
|
|
43
|
+
if (sessionConfig.samplerParams.temperature !== undefined) {
|
|
44
|
+
samplerParams.setTemperature(sessionConfig.samplerParams.temperature);
|
|
45
|
+
}
|
|
46
|
+
if (sessionConfig.samplerParams.seed !== undefined) {
|
|
47
|
+
samplerParams.setSeed(sessionConfig.samplerParams.seed);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (sessionConfig.startTokenId !== undefined) {
|
|
51
|
+
wasmSessionConfig.setStartTokenId(sessionConfig.startTokenId);
|
|
52
|
+
}
|
|
53
|
+
if (sessionConfig.numOutputCandidates !== undefined) {
|
|
54
|
+
wasmSessionConfig.setNumOutputCandidates(sessionConfig.numOutputCandidates);
|
|
55
|
+
}
|
|
56
|
+
if (sessionConfig.samplerBackend !== undefined) {
|
|
57
|
+
wasmSessionConfig.setSamplerBackend({ value: sessionConfig.samplerBackend });
|
|
58
|
+
}
|
|
59
|
+
if (sessionConfig.applyPromptTemplateInSession !== undefined) {
|
|
60
|
+
wasmSessionConfig.setApplyPromptTemplateInSession(sessionConfig.applyPromptTemplateInSession);
|
|
61
|
+
}
|
|
62
|
+
if (sessionConfig.useExternalSampler !== undefined) {
|
|
63
|
+
wasmSessionConfig.setUseExternalSampler(sessionConfig.useExternalSampler);
|
|
64
|
+
}
|
|
65
|
+
if (sessionConfig.maxOutputTokens !== undefined) {
|
|
66
|
+
wasmSessionConfig.setMaxOutputTokens(sessionConfig.maxOutputTokens);
|
|
67
|
+
}
|
|
68
|
+
if (sessionConfig.stopTokenIds !== undefined) {
|
|
69
|
+
const outerVec = new wasm.VectorVectorInt();
|
|
70
|
+
for (const innerArr of sessionConfig.stopTokenIds) {
|
|
71
|
+
const innerVec = new wasm.VectorInt();
|
|
72
|
+
fillEmscriptenVector(innerArr, innerVec);
|
|
73
|
+
outerVec.push_back(innerVec);
|
|
74
|
+
innerVec.delete();
|
|
75
|
+
}
|
|
76
|
+
wasmSessionConfig.setStopTokenIds(outerVec);
|
|
77
|
+
outerVec.delete();
|
|
78
|
+
}
|
|
79
|
+
return wasmSessionConfig;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Converts a WasmSessionConfig to a SessionConfig.
|
|
83
|
+
*
|
|
84
|
+
* All fields will be populated with the WASM object's values, which may be
|
|
85
|
+
* default values if they were not set.
|
|
86
|
+
*/
|
|
87
|
+
export function wasmSessionConfigToSessionConfig(wasmSessionConfig) {
|
|
88
|
+
const samplerParams = wasmSessionConfig.getMutableSamplerParams();
|
|
89
|
+
return {
|
|
90
|
+
audioModalityEnabled: wasmSessionConfig.getAudioModalityEnabled(),
|
|
91
|
+
visionModalityEnabled: wasmSessionConfig.getVisionModalityEnabled(),
|
|
92
|
+
samplerParams: {
|
|
93
|
+
type: samplerParams.type().value,
|
|
94
|
+
k: samplerParams.k(),
|
|
95
|
+
p: samplerParams.p(),
|
|
96
|
+
temperature: samplerParams.temperature(),
|
|
97
|
+
seed: samplerParams.seed(),
|
|
98
|
+
},
|
|
99
|
+
stopTokenIds: consumeEmscriptenVectorToArray(wasmSessionConfig.getStopTokenIds())
|
|
100
|
+
.map(consumeEmscriptenVectorToArray),
|
|
101
|
+
startTokenId: wasmSessionConfig.getStartTokenId(),
|
|
102
|
+
numOutputCandidates: wasmSessionConfig.getNumOutputCandidates(),
|
|
103
|
+
samplerBackend: wasmSessionConfig.getSamplerBackend().value,
|
|
104
|
+
applyPromptTemplateInSession: wasmSessionConfig.getApplyPromptTemplateInSession(),
|
|
105
|
+
useExternalSampler: wasmSessionConfig.getUseExternalSampler(),
|
|
106
|
+
maxOutputTokens: wasmSessionConfig.getMaxOutputTokens(),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=session_config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session_config.js","sourceRoot":"","sources":["../src/session_config.ts"],"names":[],"mappings":"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"}
|