@missionsquad/browserai 0.1.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/LICENSE +15 -0
- package/README.md +229 -0
- package/dist/audio/clip.d.ts +51 -0
- package/dist/audio/clip.d.ts.map +1 -0
- package/dist/audio/clip.js +71 -0
- package/dist/audio/clip.js.map +1 -0
- package/dist/audio/decode.d.ts +7 -0
- package/dist/audio/decode.d.ts.map +1 -0
- package/dist/audio/decode.js +19 -0
- package/dist/audio/decode.js.map +1 -0
- package/dist/audio/pcm.d.ts +13 -0
- package/dist/audio/pcm.d.ts.map +1 -0
- package/dist/audio/pcm.js +66 -0
- package/dist/audio/pcm.js.map +1 -0
- package/dist/audio/recorder.d.ts +40 -0
- package/dist/audio/recorder.d.ts.map +1 -0
- package/dist/audio/recorder.js +127 -0
- package/dist/audio/recorder.js.map +1 -0
- package/dist/audio/streaming-player.d.ts +29 -0
- package/dist/audio/streaming-player.d.ts.map +1 -0
- package/dist/audio/streaming-player.js +82 -0
- package/dist/audio/streaming-player.js.map +1 -0
- package/dist/client.d.ts +195 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +638 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +81 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +52 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +74 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +18 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +43 -0
- package/dist/events.js.map +1 -0
- package/dist/generation.d.ts +12 -0
- package/dist/generation.d.ts.map +1 -0
- package/dist/generation.js +30 -0
- package/dist/generation.js.map +1 -0
- package/dist/hardware.d.ts +23 -0
- package/dist/hardware.d.ts.map +1 -0
- package/dist/hardware.js +150 -0
- package/dist/hardware.js.map +1 -0
- package/dist/history.d.ts +81 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +193 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/inference.d.ts +89 -0
- package/dist/inference.d.ts.map +1 -0
- package/dist/inference.js +411 -0
- package/dist/inference.js.map +1 -0
- package/dist/json.d.ts +22 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +145 -0
- package/dist/json.js.map +1 -0
- package/dist/metrics.d.ts +18 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +59 -0
- package/dist/metrics.js.map +1 -0
- package/dist/model-cache.d.ts +49 -0
- package/dist/model-cache.d.ts.map +1 -0
- package/dist/model-cache.js +511 -0
- package/dist/model-cache.js.map +1 -0
- package/dist/model-source.d.ts +27 -0
- package/dist/model-source.d.ts.map +1 -0
- package/dist/model-source.js +110 -0
- package/dist/model-source.js.map +1 -0
- package/dist/models.d.ts +103 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +1052 -0
- package/dist/models.js.map +1 -0
- package/dist/multimodal.d.ts +261 -0
- package/dist/multimodal.d.ts.map +1 -0
- package/dist/multimodal.js +506 -0
- package/dist/multimodal.js.map +1 -0
- package/dist/prompt.d.ts +13 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +32 -0
- package/dist/prompt.js.map +1 -0
- package/dist/proxy-verify.d.ts +10 -0
- package/dist/proxy-verify.d.ts.map +1 -0
- package/dist/proxy-verify.js +98 -0
- package/dist/proxy-verify.js.map +1 -0
- package/dist/schema-validator.d.ts +6 -0
- package/dist/schema-validator.d.ts.map +1 -0
- package/dist/schema-validator.js +104 -0
- package/dist/schema-validator.js.map +1 -0
- package/dist/schema.d.ts +98 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +115 -0
- package/dist/schema.js.map +1 -0
- package/dist/text-utils.d.ts +8 -0
- package/dist/text-utils.d.ts.map +1 -0
- package/dist/text-utils.js +14 -0
- package/dist/text-utils.js.map +1 -0
- package/dist/voice/helpers.d.ts +35 -0
- package/dist/voice/helpers.d.ts.map +1 -0
- package/dist/voice/helpers.js +49 -0
- package/dist/voice/helpers.js.map +1 -0
- package/dist/voice/voice-pipeline.d.ts +155 -0
- package/dist/voice/voice-pipeline.d.ts.map +1 -0
- package/dist/voice/voice-pipeline.js +407 -0
- package/dist/voice/voice-pipeline.js.map +1 -0
- package/dist/webllm.worker.d.ts +2 -0
- package/dist/webllm.worker.d.ts.map +1 -0
- package/dist/webllm.worker.js +8 -0
- package/dist/webllm.worker.js.map +1 -0
- package/package.json +62 -0
- package/src/audio/clip.ts +94 -0
- package/src/audio/decode.ts +19 -0
- package/src/audio/pcm.ts +62 -0
- package/src/audio/recorder.ts +146 -0
- package/src/audio/streaming-player.ts +99 -0
- package/src/client.ts +784 -0
- package/src/config.ts +104 -0
- package/src/errors.ts +81 -0
- package/src/events.ts +53 -0
- package/src/generation.ts +39 -0
- package/src/hardware.ts +193 -0
- package/src/history.ts +257 -0
- package/src/index.ts +203 -0
- package/src/inference.ts +579 -0
- package/src/json.ts +169 -0
- package/src/metrics.ts +63 -0
- package/src/model-cache.ts +637 -0
- package/src/model-source.ts +142 -0
- package/src/models.ts +1171 -0
- package/src/multimodal.ts +697 -0
- package/src/prompt.ts +33 -0
- package/src/proxy-verify.ts +113 -0
- package/src/schema-validator.ts +117 -0
- package/src/schema.ts +118 -0
- package/src/text-utils.ts +12 -0
- package/src/voice/helpers.ts +59 -0
- package/src/voice/voice-pipeline.ts +513 -0
- package/src/webllm.worker.ts +9 -0
- package/worker-template/README.md +39 -0
- package/worker-template/cloudflare-worker.ts +389 -0
- package/worker-template/wrangler.jsonc +19 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { MicrophoneError } from "../errors.js";
|
|
2
|
+
import { decodeAudioTo16kMono } from "./decode.js";
|
|
3
|
+
export class MicRecorder {
|
|
4
|
+
#options;
|
|
5
|
+
#pending = false;
|
|
6
|
+
#abortPending = false;
|
|
7
|
+
#take = null;
|
|
8
|
+
constructor(options = {}) {
|
|
9
|
+
this.#options = options;
|
|
10
|
+
}
|
|
11
|
+
/** Whether a take is currently being captured (true between a successful start() and stop()). */
|
|
12
|
+
get recording() {
|
|
13
|
+
return this.#take !== null;
|
|
14
|
+
}
|
|
15
|
+
#streamEnded() {
|
|
16
|
+
try {
|
|
17
|
+
this.#options.onStreamEnded?.();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// A throwing host disposal hook must not interrupt mic/context teardown.
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Start capturing. No-op (returns false) when already recording or a start is mid-flight.
|
|
25
|
+
* @throws {MicrophoneError} when the mic cannot be acquired (`permissionDenied` set for denials).
|
|
26
|
+
*/
|
|
27
|
+
async start() {
|
|
28
|
+
if (this.#pending || this.#take)
|
|
29
|
+
return false;
|
|
30
|
+
this.#pending = true; // claimed synchronously before the getUserMedia await (double-press guard)
|
|
31
|
+
let stream = null;
|
|
32
|
+
let ctx = null;
|
|
33
|
+
try {
|
|
34
|
+
stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
35
|
+
if (this.#abortPending) {
|
|
36
|
+
// cancel() ran while the permission prompt / acquisition was pending — release and bail.
|
|
37
|
+
this.#abortPending = false;
|
|
38
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
ctx = new AudioContext();
|
|
42
|
+
const source = ctx.createMediaStreamSource(stream);
|
|
43
|
+
try {
|
|
44
|
+
this.#options.onStreamReady?.({ context: ctx, source, stream });
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// A throwing host visualization hook must not abort the take.
|
|
48
|
+
}
|
|
49
|
+
const recorder = new MediaRecorder(stream);
|
|
50
|
+
const chunks = [];
|
|
51
|
+
recorder.ondataavailable = (event) => chunks.push(event.data);
|
|
52
|
+
recorder.start();
|
|
53
|
+
this.#take = { ctx, stream, recorder, chunks };
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
// Release anything acquired before the failure — otherwise the mic indicator stays lit.
|
|
58
|
+
stream?.getTracks().forEach((track) => track.stop());
|
|
59
|
+
this.#streamEnded();
|
|
60
|
+
if (ctx)
|
|
61
|
+
void ctx.close().catch(() => undefined);
|
|
62
|
+
throw new MicrophoneError(error);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
this.#pending = false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Stop the take and decode it to 16 kHz mono PCM. Returns null when nothing was recorded (no
|
|
70
|
+
* take in flight, or an empty capture). Always releases the mic, even if stopping throws.
|
|
71
|
+
*/
|
|
72
|
+
async stop() {
|
|
73
|
+
const take = this.#take;
|
|
74
|
+
this.#take = null; // claim synchronously so a re-entrant stop can't double-clean
|
|
75
|
+
if (!take)
|
|
76
|
+
return null;
|
|
77
|
+
const { recorder, stream, ctx, chunks } = take;
|
|
78
|
+
try {
|
|
79
|
+
await new Promise((resolve) => {
|
|
80
|
+
// The recorder auto-stops when its track ends (device unplugged, permission revoked). stop()
|
|
81
|
+
// would then be a silent no-op and onstop would never fire — resolve immediately instead.
|
|
82
|
+
if (recorder.state === "inactive") {
|
|
83
|
+
resolve();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
recorder.onstop = () => resolve();
|
|
87
|
+
recorder.stop();
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
// Always release the mic and context — even if stop() threw (legacy InvalidStateError).
|
|
92
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
93
|
+
this.#streamEnded();
|
|
94
|
+
await ctx.close().catch(() => undefined);
|
|
95
|
+
}
|
|
96
|
+
const blob = new Blob(chunks, { type: recorder.mimeType || "audio/webm" });
|
|
97
|
+
if (blob.size === 0)
|
|
98
|
+
return null;
|
|
99
|
+
return decodeAudioTo16kMono(await blob.arrayBuffer());
|
|
100
|
+
}
|
|
101
|
+
/** Abandon a take without decoding it (releases the mic; the audio is discarded). Also aborts a start() still awaiting the permission prompt. */
|
|
102
|
+
async cancel() {
|
|
103
|
+
if (this.#pending && !this.#take)
|
|
104
|
+
this.#abortPending = true; // start() releases the mic when getUserMedia resolves
|
|
105
|
+
const take = this.#take;
|
|
106
|
+
this.#take = null;
|
|
107
|
+
if (!take)
|
|
108
|
+
return;
|
|
109
|
+
const { recorder, stream, ctx } = take;
|
|
110
|
+
try {
|
|
111
|
+
await new Promise((resolve) => {
|
|
112
|
+
if (recorder.state === "inactive") {
|
|
113
|
+
resolve();
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
recorder.onstop = () => resolve();
|
|
117
|
+
recorder.stop();
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
122
|
+
this.#streamEnded();
|
|
123
|
+
await ctx.close().catch(() => undefined);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=recorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../src/audio/recorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type StreamingAudioPlayer = {
|
|
2
|
+
/** Schedule one PCM chunk to play back-to-back after everything already scheduled. */
|
|
3
|
+
push(samples: Float32Array, sampleRate: number): void;
|
|
4
|
+
/** No more chunks; resolves (and tears down) once everything scheduled has finished playing. */
|
|
5
|
+
end(): Promise<void>;
|
|
6
|
+
/** Barge-in/error: stop playback now and tear down. Idempotent. */
|
|
7
|
+
stop(): void;
|
|
8
|
+
};
|
|
9
|
+
export type StreamingAudioPlayerOptions = {
|
|
10
|
+
/**
|
|
11
|
+
* Called once with the player's audio graph so hosts can tap it for visualization (e.g. connect an
|
|
12
|
+
* AnalyserNode to `gain`). The audible path is gain → destination only — do not connect the tap to
|
|
13
|
+
* the destination or audio doubles.
|
|
14
|
+
*/
|
|
15
|
+
onGraphReady?: (graph: {
|
|
16
|
+
context: AudioContext;
|
|
17
|
+
gain: GainNode;
|
|
18
|
+
}) => void;
|
|
19
|
+
/** Called during teardown, before the context closes — dispose whatever onGraphReady created. */
|
|
20
|
+
onTeardown?: () => void;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Gapless player for streamed TTS: schedules each chunk's PCM into one AudioContext end-to-end.
|
|
24
|
+
* Chunks are butt-joined at a running cursor; if synthesis falls behind playback this yields a small
|
|
25
|
+
* silent gap rather than overlap. Teardown (close ctx) is idempotent, and `stop()` resolves any
|
|
26
|
+
* in-flight `end()` promise so a barge-in can never hang a waiting turn.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createStreamingAudioPlayer(options?: StreamingAudioPlayerOptions): StreamingAudioPlayer;
|
|
29
|
+
//# sourceMappingURL=streaming-player.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-player.d.ts","sourceRoot":"","sources":["../../src/audio/streaming-player.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG;IACjC,sFAAsF;IACtF,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,gGAAgG;IAChG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,mEAAmE;IACnE,IAAI,IAAI,IAAI,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1E,iGAAiG;IACjG,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,2BAAgC,GAAG,oBAAoB,CAwE1G"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gapless player for streamed TTS: schedules each chunk's PCM into one AudioContext end-to-end.
|
|
3
|
+
* Chunks are butt-joined at a running cursor; if synthesis falls behind playback this yields a small
|
|
4
|
+
* silent gap rather than overlap. Teardown (close ctx) is idempotent, and `stop()` resolves any
|
|
5
|
+
* in-flight `end()` promise so a barge-in can never hang a waiting turn.
|
|
6
|
+
*/
|
|
7
|
+
export function createStreamingAudioPlayer(options = {}) {
|
|
8
|
+
const ctx = new AudioContext();
|
|
9
|
+
const gain = ctx.createGain();
|
|
10
|
+
gain.connect(ctx.destination);
|
|
11
|
+
try {
|
|
12
|
+
options.onGraphReady?.({ context: ctx, gain });
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// A throwing host visualization tap must not break (or leak) the player.
|
|
16
|
+
}
|
|
17
|
+
let nextTime = ctx.currentTime;
|
|
18
|
+
let pending = 0;
|
|
19
|
+
let ended = false;
|
|
20
|
+
let torn = false;
|
|
21
|
+
let onDrained = null;
|
|
22
|
+
const teardown = () => {
|
|
23
|
+
if (torn)
|
|
24
|
+
return;
|
|
25
|
+
torn = true;
|
|
26
|
+
try {
|
|
27
|
+
options.onTeardown?.();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Host tap disposal errors must not prevent the context from closing.
|
|
31
|
+
}
|
|
32
|
+
void ctx.close().catch(() => undefined);
|
|
33
|
+
};
|
|
34
|
+
const maybeDrain = () => {
|
|
35
|
+
if (ended && pending === 0) {
|
|
36
|
+
teardown();
|
|
37
|
+
onDrained?.();
|
|
38
|
+
onDrained = null;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
return {
|
|
42
|
+
push(samples, sampleRate) {
|
|
43
|
+
if (torn || samples.length === 0)
|
|
44
|
+
return;
|
|
45
|
+
// The context is often created outside a click call stack — resume defensively (autoplay policy).
|
|
46
|
+
if (ctx.state === "suspended")
|
|
47
|
+
void ctx.resume().catch(() => undefined);
|
|
48
|
+
const buffer = ctx.createBuffer(1, samples.length, sampleRate);
|
|
49
|
+
buffer.getChannelData(0).set(samples);
|
|
50
|
+
const source = ctx.createBufferSource();
|
|
51
|
+
source.buffer = buffer;
|
|
52
|
+
source.connect(gain);
|
|
53
|
+
// If synthesis is slower than playback this yields a small silent gap rather than overlap.
|
|
54
|
+
const startAt = Math.max(nextTime, ctx.currentTime);
|
|
55
|
+
pending += 1;
|
|
56
|
+
source.onended = () => {
|
|
57
|
+
pending -= 1;
|
|
58
|
+
maybeDrain();
|
|
59
|
+
};
|
|
60
|
+
source.start(startAt);
|
|
61
|
+
nextTime = startAt + buffer.duration;
|
|
62
|
+
},
|
|
63
|
+
end() {
|
|
64
|
+
ended = true;
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
if (pending === 0 || torn) {
|
|
67
|
+
teardown();
|
|
68
|
+
resolve();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
onDrained = resolve;
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
stop() {
|
|
75
|
+
ended = true;
|
|
76
|
+
teardown();
|
|
77
|
+
onDrained?.();
|
|
78
|
+
onDrained = null;
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=streaming-player.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-player.js","sourceRoot":"","sources":["../../src/audio/streaming-player.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import type { MLCEngineInterface } from "@mlc-ai/web-llm";
|
|
2
|
+
import type { ModelPreset, ModelTask } from "./models.js";
|
|
3
|
+
import type { ChatMessage, GenerationResult, RuntimeStats, TransformersModule, TransformersTextGenerationPipeline, TransformersTokenizer } from "./inference.js";
|
|
4
|
+
import type { RuntimeParameters } from "./generation.js";
|
|
5
|
+
import type { MultimodalHandle, MultimodalTransformers, RawAudio, SttResult, TtsTextSplitter, VlmResult } from "./multimodal.js";
|
|
6
|
+
import type { BrowserAIConfig, ResolvedConfig } from "./config.js";
|
|
7
|
+
import type { HardwareSnapshot } from "./hardware.js";
|
|
8
|
+
import type { CacheCleanupResult, CachedModelStatus, IndividualModelCleanupResult, ModelCacheTarget, StorageEstimateSnapshot } from "./model-cache.js";
|
|
9
|
+
import type { RunRecord } from "./history.js";
|
|
10
|
+
import { RunHistoryStore } from "./history.js";
|
|
11
|
+
import { TypedEmitter } from "./events.js";
|
|
12
|
+
import type { SynthClip, SynthesizeClipOptions } from "./audio/clip.js";
|
|
13
|
+
/**
|
|
14
|
+
* One loaded model and its engine handles. Exactly one backend group is populated: WebLLM
|
|
15
|
+
* (`engine` + `worker`), a Transformers.js text LM (`transformersGenerator`/`Tokenizer`/`Module`),
|
|
16
|
+
* or a multimodal handle (`multimodal` + `mmModule`, for STT/TTS/VLM/Gemma). `slots` are the
|
|
17
|
+
* capability slots it occupies ({@link modelSlots}).
|
|
18
|
+
*/
|
|
19
|
+
export type LoadedModel = {
|
|
20
|
+
modelId: string;
|
|
21
|
+
slots: ModelTask[];
|
|
22
|
+
backend: "webllm" | "transformers-js";
|
|
23
|
+
engine: MLCEngineInterface | null;
|
|
24
|
+
worker: Worker | null;
|
|
25
|
+
transformersGenerator: TransformersTextGenerationPipeline | null;
|
|
26
|
+
transformersTokenizer: TransformersTokenizer | null;
|
|
27
|
+
transformersModule: TransformersModule | null;
|
|
28
|
+
multimodal: MultimodalHandle | null;
|
|
29
|
+
mmModule: MultimodalTransformers | null;
|
|
30
|
+
};
|
|
31
|
+
export type LoadProgress = {
|
|
32
|
+
modelId: string;
|
|
33
|
+
progress: number;
|
|
34
|
+
status?: string;
|
|
35
|
+
file?: string;
|
|
36
|
+
};
|
|
37
|
+
export type BrowserAIEvents = {
|
|
38
|
+
/** Download/initialization progress for the model currently loading (progress 0–1). */
|
|
39
|
+
loadprogress: LoadProgress;
|
|
40
|
+
/** Human-readable engine status lines (loading, loaded-in-Ns, proxy checks…). */
|
|
41
|
+
status: {
|
|
42
|
+
message: string;
|
|
43
|
+
};
|
|
44
|
+
modelloaded: {
|
|
45
|
+
model: LoadedModel;
|
|
46
|
+
};
|
|
47
|
+
modelunloaded: {
|
|
48
|
+
modelId: string;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
export type LoadOptions = {
|
|
52
|
+
/**
|
|
53
|
+
* WebLLM-only context-window override. Ignored when ≤0 or equal to the model's tested default
|
|
54
|
+
* ({@link DEFAULT_CONTEXT_LENGTH}); otherwise clamped to [512, 32768] and merged into the model
|
|
55
|
+
* record's overrides. Transformers.js and multimodal loads ignore it.
|
|
56
|
+
*/
|
|
57
|
+
contextLength?: number | null;
|
|
58
|
+
/** Per-call progress callback (also emitted as the "loadprogress" event). */
|
|
59
|
+
onProgress?: (info: LoadProgress) => void;
|
|
60
|
+
};
|
|
61
|
+
export type GenerateTextOptions = {
|
|
62
|
+
/** Overrides merged over the loaded model's preset defaults. */
|
|
63
|
+
runtime?: Partial<RuntimeParameters>;
|
|
64
|
+
/** JSON Schema for WebLLM constrained decoding (prompt-only backends receive it via the prompt). */
|
|
65
|
+
schema?: unknown;
|
|
66
|
+
/** Stream callback — receives the FULL accumulated text so far on each delta. */
|
|
67
|
+
onDelta?: (fullText: string) => void;
|
|
68
|
+
/** Reset the WebLLM KV cache before generating (default true). */
|
|
69
|
+
resetChat?: boolean;
|
|
70
|
+
};
|
|
71
|
+
export type TtsOverrides = {
|
|
72
|
+
voice?: string;
|
|
73
|
+
speed?: number;
|
|
74
|
+
pitch?: number;
|
|
75
|
+
};
|
|
76
|
+
export type StreamingTtsSession = {
|
|
77
|
+
/** Push text incrementally (e.g. LLM deltas); sentences are synthesized as they complete. */
|
|
78
|
+
splitter: TtsTextSplitter;
|
|
79
|
+
/** One RawAudio per synthesized sentence, in order. Pull-driven. */
|
|
80
|
+
chunks: AsyncIterable<RawAudio>;
|
|
81
|
+
/**
|
|
82
|
+
* MUST be called when the session is finished (after the chunks iterator completes or is
|
|
83
|
+
* abandoned) — it releases the TTS model's serialization lock so other speech work can run.
|
|
84
|
+
*/
|
|
85
|
+
release: () => void;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* The BrowserAI client: model catalog + capability-slot manager + inference façade.
|
|
89
|
+
*
|
|
90
|
+
* Models load into one of four capability slots — text / vision / stt / tts — with at most one
|
|
91
|
+
* model per slot (up to four resident at once). Loading a model whose slots conflict with loaded
|
|
92
|
+
* models replaces the conflicting owners. Loads/unloads are single-flight, and runs are serialized
|
|
93
|
+
* per loaded model, so concurrent calls queue instead of driving one engine from two places.
|
|
94
|
+
*/
|
|
95
|
+
export declare class BrowserAI extends TypedEmitter<BrowserAIEvents> {
|
|
96
|
+
#private;
|
|
97
|
+
readonly config: ResolvedConfig;
|
|
98
|
+
constructor(config?: BrowserAIConfig);
|
|
99
|
+
/** The full model catalog. */
|
|
100
|
+
get presets(): readonly ModelPreset[];
|
|
101
|
+
/** Catalog lookup without fallback. */
|
|
102
|
+
getPreset(modelId: string): ModelPreset | undefined;
|
|
103
|
+
/** Currently loaded models (read-only snapshot). */
|
|
104
|
+
get loadedModels(): readonly LoadedModel[];
|
|
105
|
+
/** The loaded model occupying `task`, if any (≤1 owner per slot — enforced at load). */
|
|
106
|
+
slotOwner(task: ModelTask): LoadedModel | undefined;
|
|
107
|
+
textModel(): LoadedModel | undefined;
|
|
108
|
+
visionModel(): LoadedModel | undefined;
|
|
109
|
+
sttModel(): LoadedModel | undefined;
|
|
110
|
+
ttsModel(): LoadedModel | undefined;
|
|
111
|
+
/** Every capability slot currently filled by a loaded model. */
|
|
112
|
+
occupiedSlots(): Set<ModelTask>;
|
|
113
|
+
/** Whether `preset` can load without evicting anything (all its slots are free). */
|
|
114
|
+
isLoadable(preset: ModelPreset): boolean;
|
|
115
|
+
/** True while a load/unload/delete is in flight or any generation run is executing. */
|
|
116
|
+
isBusy(): boolean;
|
|
117
|
+
/** True while a load/unload/cache-delete lifecycle operation is in flight. */
|
|
118
|
+
get loading(): boolean;
|
|
119
|
+
/** The most recent hardware probe (from the last load), if any. */
|
|
120
|
+
get lastHardwareSnapshot(): HardwareSnapshot | null;
|
|
121
|
+
/** Probe WebGPU + hardware now (also refreshes {@link lastHardwareSnapshot}). */
|
|
122
|
+
probeHardware(): Promise<HardwareSnapshot>;
|
|
123
|
+
/** The run log configured by `config.history` (created lazily; localStorage-backed by default). */
|
|
124
|
+
get history(): RunHistoryStore;
|
|
125
|
+
/**
|
|
126
|
+
* Map a run's stats to a {@link RunRecord} and append it to {@link history}. Returns the record,
|
|
127
|
+
* or null for stats without a model (error placeholders are never logged).
|
|
128
|
+
*/
|
|
129
|
+
logRun(caseKey: string, stats: RuntimeStats): RunRecord | null;
|
|
130
|
+
/**
|
|
131
|
+
* Load a model by catalog id. Evicts any loaded models occupying the slots this one needs
|
|
132
|
+
* (whole-model eviction: a multi-slot owner is fully released even for a one-slot conflict).
|
|
133
|
+
* Single-flight: a second load while one is in flight throws.
|
|
134
|
+
*
|
|
135
|
+
* @throws {UnknownModelError} for an id not in the catalog.
|
|
136
|
+
* @throws {WebGPUUnavailableError} when WebGPU is required and unavailable. Only ASR-pipeline and
|
|
137
|
+
* TTS presets fall back to wasm; text, vision, Gemma and audio-LLM presets require WebGPU.
|
|
138
|
+
* @throws {ModelLoadError} wrapping any backend load failure.
|
|
139
|
+
*/
|
|
140
|
+
load(modelId: string, options?: LoadOptions): Promise<LoadedModel>;
|
|
141
|
+
/** Unload one model, waiting out its in-flight runs. No-op when the id is not loaded. */
|
|
142
|
+
unload(modelId: string): Promise<void>;
|
|
143
|
+
/** Unload every loaded model. */
|
|
144
|
+
unloadAll(): Promise<void>;
|
|
145
|
+
/**
|
|
146
|
+
* Run one text generation against the loaded Text-slot model. A Gemma-4 multimodal handle has no
|
|
147
|
+
* WebLLM engine or Transformers.js LM pipeline, so it routes through the Gemma text path;
|
|
148
|
+
* everything else goes to the shared backend-agnostic generator. Runtime parameters default to
|
|
149
|
+
* the loaded model's preset defaults, with `options.runtime` merged on top.
|
|
150
|
+
*/
|
|
151
|
+
generateText(messages: ChatMessage[], options?: GenerateTextOptions): Promise<GenerationResult>;
|
|
152
|
+
/** Reset the WebLLM KV cache of the loaded text model (e.g. for a "new chat"). Queues behind in-flight runs. */
|
|
153
|
+
resetTextChat(): Promise<void>;
|
|
154
|
+
/** Transcribe 16 kHz mono PCM (or a URL) with the loaded Transcription-slot model. */
|
|
155
|
+
transcribe(audio: Float32Array | string, onDelta?: (text: string) => void): Promise<SttResult>;
|
|
156
|
+
/** Synthesize speech with the loaded Speech-slot model. Returns the raw model audio. */
|
|
157
|
+
synthesize(text: string, overrides?: TtsOverrides): Promise<RawAudio>;
|
|
158
|
+
/**
|
|
159
|
+
* Synthesize speech and package it as a playable clip (pitch baked into the blob, original PCM
|
|
160
|
+
* kept for re-pitching). Voice/speed/pitch default to the client's TTS config.
|
|
161
|
+
*/
|
|
162
|
+
synthesizeToClip(text: string, overrides?: TtsOverrides & Pick<SynthesizeClipOptions, "createUrl">): Promise<SynthClip>;
|
|
163
|
+
/** Whether the loaded Speech-slot model supports sentence-streaming synthesis (Kokoro). */
|
|
164
|
+
supportsStreamingTts(): boolean;
|
|
165
|
+
/**
|
|
166
|
+
* Begin a streaming TTS session on the loaded Kokoro model: push LLM deltas into `splitter`,
|
|
167
|
+
* consume `chunks` (one RawAudio per sentence), then call `release()` when done. The session
|
|
168
|
+
* holds the TTS model's serialization lock until released so no other speech run interleaves —
|
|
169
|
+
* the returned promise resolves only once the lock is actually held (queued behind in-flight
|
|
170
|
+
* speech runs), and the Kokoro stream is created after that point.
|
|
171
|
+
* @throws {MissingModelError} when no Speech model is loaded or it cannot stream.
|
|
172
|
+
*/
|
|
173
|
+
createStreamingTts(overrides?: Pick<TtsOverrides, "voice" | "speed">): Promise<StreamingTtsSession>;
|
|
174
|
+
/** Ask a question about an image with the loaded Image-slot model (VLM or Gemma). */
|
|
175
|
+
describeImage(imageSrc: string, prompt: string, onDelta?: (text: string) => void): Promise<VlmResult>;
|
|
176
|
+
/** Whether a model's artifacts are present in browser storage (Cache API / IndexedDB). */
|
|
177
|
+
cacheStatus(modelId: string): Promise<CachedModelStatus>;
|
|
178
|
+
/** Origin-wide storage usage/quota estimate (browser-rounded). */
|
|
179
|
+
estimateStorage(): Promise<StorageEstimateSnapshot | undefined>;
|
|
180
|
+
/**
|
|
181
|
+
* Delete one model's downloaded artifacts. If the model is loaded it is released first (its
|
|
182
|
+
* in-flight runs are awaited). Targets model artifact storage only.
|
|
183
|
+
*/
|
|
184
|
+
deleteModelArtifacts(modelId: string): Promise<IndividualModelCleanupResult>;
|
|
185
|
+
/** Delete ALL downloaded model artifacts (WebLLM + Transformers.js), releasing loaded models first. */
|
|
186
|
+
deleteAllModelArtifacts(): Promise<CacheCleanupResult>;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Normalize a context-length override: null/undefined, non-positive, or exactly the tested default
|
|
190
|
+
* ({@link DEFAULT_CONTEXT_LENGTH}) mean "no override"; anything else clamps to [512, 32768].
|
|
191
|
+
*/
|
|
192
|
+
export declare function normalizeContextLength(value: number | null | undefined): number | null;
|
|
193
|
+
/** The cache-target matchers (id, repo labels, artifact URLs) for a preset's downloaded artifacts. */
|
|
194
|
+
export declare function buildModelCacheTarget(preset: ModelPreset): ModelCacheTarget;
|
|
195
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|