@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
package/dist/metrics.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getModelPreset } from "./models.js";
|
|
2
|
+
import { vendorForModel } from "./history.js";
|
|
3
|
+
/** Build a RuntimeStats record from multimodal generation telemetry (tokens + first-token time). */
|
|
4
|
+
export function buildMultimodalStats(gen, modelId) {
|
|
5
|
+
const elapsedMs = Math.max(0, gen.endedMs - gen.startedMs);
|
|
6
|
+
const completionTokens = gen.completionTokens > 0 ? gen.completionTokens : undefined;
|
|
7
|
+
const ttftS = gen.firstTokenMs !== undefined ? Math.max(0, (gen.firstTokenMs - gen.startedMs) / 1000) : undefined;
|
|
8
|
+
const decodeSeconds = gen.firstTokenMs !== undefined ? Math.max(0.001, (gen.endedMs - gen.firstTokenMs) / 1000) : elapsedMs / 1000;
|
|
9
|
+
const measured = completionTokens !== undefined && elapsedMs > 0 ? completionTokens / (elapsedMs / 1000) : undefined;
|
|
10
|
+
return {
|
|
11
|
+
rawText: "",
|
|
12
|
+
model: modelId,
|
|
13
|
+
backend: "transformers-js",
|
|
14
|
+
finishReason: "stop",
|
|
15
|
+
measuredElapsedMs: elapsedMs,
|
|
16
|
+
completionTokens,
|
|
17
|
+
totalTokens: completionTokens,
|
|
18
|
+
measuredCompletionTokensPerSecond: measured,
|
|
19
|
+
extra: {
|
|
20
|
+
e2e_latency_s: elapsedMs / 1000,
|
|
21
|
+
decode_tokens_per_s: completionTokens !== undefined ? completionTokens / decodeSeconds : undefined,
|
|
22
|
+
time_to_first_token_s: ttftS,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Map a generation's RuntimeStats to a persistable RunRecord, attributing the run to the model that
|
|
28
|
+
* produced the stats (not whatever is currently selected). Returns null for stats without a model
|
|
29
|
+
* (error placeholders) so failed runs never pollute history.
|
|
30
|
+
*/
|
|
31
|
+
export function runRecordFromStats(caseKey, stats) {
|
|
32
|
+
if (!stats.model || stats.model === "n/a")
|
|
33
|
+
return null;
|
|
34
|
+
const preset = getModelPreset(stats.model);
|
|
35
|
+
const extra = stats.extra;
|
|
36
|
+
return {
|
|
37
|
+
ts: Date.now(),
|
|
38
|
+
model: preset.shortName,
|
|
39
|
+
vendor: vendorForModel(preset),
|
|
40
|
+
backend: stats.backend === "transformers-js" ? "transformers-js" : "webllm",
|
|
41
|
+
case: caseKey,
|
|
42
|
+
promptTokens: stats.promptTokens ?? 0,
|
|
43
|
+
completionTokens: stats.completionTokens ?? 0,
|
|
44
|
+
decode: extra?.decode_tokens_per_s ?? stats.measuredCompletionTokensPerSecond ?? 0,
|
|
45
|
+
ttft: extra?.time_to_first_token_s ?? 0,
|
|
46
|
+
totalMs: stats.measuredElapsedMs,
|
|
47
|
+
measured: stats.measuredCompletionTokensPerSecond ?? 0,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Word-count proxy for non-generative transcription runs: ASR pipelines (Whisper/Moonshine) produce
|
|
52
|
+
* no token telemetry, so callers may log `{ completionTokens: wordCount }` instead. Exposed as an
|
|
53
|
+
* explicit helper so the unit substitution is a visible policy, not a silent one.
|
|
54
|
+
*/
|
|
55
|
+
export function wordCountGenStats(text, startedMs, endedMs) {
|
|
56
|
+
const words = text ? text.trim().split(/\s+/).filter(Boolean).length : 0;
|
|
57
|
+
return { completionTokens: words, startedMs, endedMs };
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type StorageEstimateSnapshot = {
|
|
2
|
+
usage?: number;
|
|
3
|
+
quota?: number;
|
|
4
|
+
};
|
|
5
|
+
export type CacheCleanupScopeResult = {
|
|
6
|
+
kind: "cache-storage" | "indexeddb" | "opfs" | "transformers-cache";
|
|
7
|
+
name: string;
|
|
8
|
+
supported: boolean;
|
|
9
|
+
cleared: boolean;
|
|
10
|
+
error?: string;
|
|
11
|
+
};
|
|
12
|
+
export type CacheCleanupResult = {
|
|
13
|
+
before?: StorageEstimateSnapshot;
|
|
14
|
+
after?: StorageEstimateSnapshot;
|
|
15
|
+
freedBytes?: number;
|
|
16
|
+
scopes: CacheCleanupScopeResult[];
|
|
17
|
+
};
|
|
18
|
+
export declare const WEBLLM_CACHE_SCOPES: readonly ["webllm/model", "webllm/config", "webllm/wasm"];
|
|
19
|
+
export declare function estimateOriginStorage(): Promise<StorageEstimateSnapshot | undefined>;
|
|
20
|
+
export declare function deleteWebLLMModelArtifactsFromBrowserStorage(): Promise<CacheCleanupResult>;
|
|
21
|
+
export declare function deleteTransformersModelArtifactsFromBrowserStorage(): Promise<CacheCleanupScopeResult>;
|
|
22
|
+
export declare const TRANSFORMERS_CACHE_SCOPE = "transformers-cache";
|
|
23
|
+
export type IndividualModelCacheStatus = {
|
|
24
|
+
supported: boolean;
|
|
25
|
+
downloaded: boolean;
|
|
26
|
+
detail: string;
|
|
27
|
+
};
|
|
28
|
+
export declare function hasTransformersModelInBrowserCache(repoId: string): Promise<IndividualModelCacheStatus>;
|
|
29
|
+
export declare function deleteTransformersModelFromBrowserCache(repoId: string): Promise<number>;
|
|
30
|
+
export type ModelCacheTarget = {
|
|
31
|
+
modelId: string;
|
|
32
|
+
repoLabels: string[];
|
|
33
|
+
artifactUrls: string[];
|
|
34
|
+
};
|
|
35
|
+
export type CachedModelStatus = {
|
|
36
|
+
downloaded: boolean;
|
|
37
|
+
matchedEntries: number;
|
|
38
|
+
storageKinds: string[];
|
|
39
|
+
sampleKeys: string[];
|
|
40
|
+
};
|
|
41
|
+
export type IndividualModelCleanupResult = CacheCleanupResult & {
|
|
42
|
+
targetModelId: string;
|
|
43
|
+
deletedEntries: CacheCleanupScopeResult[];
|
|
44
|
+
matchedBefore: CachedModelStatus;
|
|
45
|
+
};
|
|
46
|
+
export declare function getCachedModelStatus(target: ModelCacheTarget): Promise<CachedModelStatus>;
|
|
47
|
+
export declare function deleteOneModelArtifactsFromBrowserStorage(target: ModelCacheTarget): Promise<IndividualModelCleanupResult>;
|
|
48
|
+
export declare function matchesModelCacheTarget(cacheKey: string, target: ModelCacheTarget): boolean;
|
|
49
|
+
//# sourceMappingURL=model-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-cache.d.ts","sourceRoot":"","sources":["../src/model-cache.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,eAAe,GAAG,WAAW,GAAG,MAAM,GAAG,oBAAoB,CAAC;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,KAAK,CAAC,EAAE,uBAAuB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,uBAAuB,EAAE,CAAC;CACnC,CAAC;AAKF,eAAO,MAAM,mBAAmB,2DAItB,CAAC;AAGX,wBAAsB,qBAAqB,IAAI,OAAO,CACpD,uBAAuB,GAAG,SAAS,CACpC,CAWA;AAED,wBAAsB,4CAA4C,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAsBhG;AAsID,wBAAsB,kDAAkD,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAE3G;AAOD,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAsB,kCAAkC,CACtD,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,0BAA0B,CAAC,CA8BrC;AAED,wBAAsB,uCAAuC,CAC3D,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAejB;AAgBD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,kBAAkB,GAAG;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,uBAAuB,EAAE,CAAC;IAC1C,aAAa,EAAE,iBAAiB,CAAC;CAClC,CAAC;AAEF,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAe5B;AAED,wBAAsB,yCAAyC,CAC7D,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,4BAA4B,CAAC,CA+BvC;AA+PD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAcT"}
|
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
// These are the WebLLM artifact stores used by the SDK's selectable cache backends. Deleting these
|
|
2
|
+
// targets model downloads only; it does not call caches.keys()/indexedDB.databases() broadly and
|
|
3
|
+
// does not touch localStorage, cookies, or unrelated site data.
|
|
4
|
+
export const WEBLLM_CACHE_SCOPES = [
|
|
5
|
+
"webllm/model",
|
|
6
|
+
"webllm/config",
|
|
7
|
+
"webllm/wasm",
|
|
8
|
+
];
|
|
9
|
+
const WEBLLM_OPFS_ROOT = "tvmjs-opfs-store";
|
|
10
|
+
export async function estimateOriginStorage() {
|
|
11
|
+
try {
|
|
12
|
+
const estimate = await navigator.storage?.estimate?.();
|
|
13
|
+
if (!estimate)
|
|
14
|
+
return undefined;
|
|
15
|
+
return {
|
|
16
|
+
usage: typeof estimate.usage === "number" ? estimate.usage : undefined,
|
|
17
|
+
quota: typeof estimate.quota === "number" ? estimate.quota : undefined,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function deleteWebLLMModelArtifactsFromBrowserStorage() {
|
|
25
|
+
const before = await estimateOriginStorage();
|
|
26
|
+
const scopes = [];
|
|
27
|
+
for (const scope of WEBLLM_CACHE_SCOPES) {
|
|
28
|
+
scopes.push(await deleteCacheStorageScope(scope));
|
|
29
|
+
}
|
|
30
|
+
for (const scope of WEBLLM_CACHE_SCOPES) {
|
|
31
|
+
scopes.push(await deleteIndexedDBDatabase(scope));
|
|
32
|
+
}
|
|
33
|
+
scopes.push(await deleteOPFSWebLLMRoot());
|
|
34
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
35
|
+
const after = await estimateOriginStorage();
|
|
36
|
+
const freedBytes = typeof before?.usage === "number" && typeof after?.usage === "number"
|
|
37
|
+
? Math.max(0, before.usage - after.usage)
|
|
38
|
+
: undefined;
|
|
39
|
+
return { before, after, freedBytes, scopes };
|
|
40
|
+
}
|
|
41
|
+
async function deleteCacheStorageScope(name) {
|
|
42
|
+
if (!("caches" in globalThis)) {
|
|
43
|
+
return {
|
|
44
|
+
kind: "cache-storage",
|
|
45
|
+
name,
|
|
46
|
+
supported: false,
|
|
47
|
+
cleared: false,
|
|
48
|
+
error: "Cache Storage API is unavailable.",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const cleared = await caches.delete(name);
|
|
53
|
+
return { kind: "cache-storage", name, supported: true, cleared };
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return {
|
|
57
|
+
kind: "cache-storage",
|
|
58
|
+
name,
|
|
59
|
+
supported: true,
|
|
60
|
+
cleared: false,
|
|
61
|
+
error: formatUnknownError(error),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function deleteIndexedDBDatabase(name) {
|
|
66
|
+
if (!("indexedDB" in globalThis)) {
|
|
67
|
+
return {
|
|
68
|
+
kind: "indexeddb",
|
|
69
|
+
name,
|
|
70
|
+
supported: false,
|
|
71
|
+
cleared: false,
|
|
72
|
+
error: "IndexedDB is unavailable.",
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return new Promise((resolve) => {
|
|
76
|
+
let settled = false;
|
|
77
|
+
let blocked = false;
|
|
78
|
+
const request = indexedDB.deleteDatabase(name);
|
|
79
|
+
const finish = (result) => {
|
|
80
|
+
if (settled)
|
|
81
|
+
return;
|
|
82
|
+
settled = true;
|
|
83
|
+
clearTimeout(timer);
|
|
84
|
+
resolve(result);
|
|
85
|
+
};
|
|
86
|
+
const timer = setTimeout(() => {
|
|
87
|
+
finish({
|
|
88
|
+
kind: "indexeddb",
|
|
89
|
+
name,
|
|
90
|
+
supported: true,
|
|
91
|
+
cleared: false,
|
|
92
|
+
error: blocked
|
|
93
|
+
? "Deletion is blocked by an open IndexedDB connection. Close other tabs for this site and try again."
|
|
94
|
+
: "IndexedDB deletion timed out. Close other tabs for this site and try again.",
|
|
95
|
+
});
|
|
96
|
+
}, 5000);
|
|
97
|
+
request.onblocked = () => {
|
|
98
|
+
blocked = true;
|
|
99
|
+
};
|
|
100
|
+
request.onsuccess = () => {
|
|
101
|
+
finish({ kind: "indexeddb", name, supported: true, cleared: true });
|
|
102
|
+
};
|
|
103
|
+
request.onerror = () => {
|
|
104
|
+
finish({
|
|
105
|
+
kind: "indexeddb",
|
|
106
|
+
name,
|
|
107
|
+
supported: true,
|
|
108
|
+
cleared: false,
|
|
109
|
+
error: request.error?.message ?? "Unknown IndexedDB error.",
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async function deleteOPFSWebLLMRoot() {
|
|
115
|
+
try {
|
|
116
|
+
const storage = navigator.storage;
|
|
117
|
+
if (typeof storage?.getDirectory !== "function") {
|
|
118
|
+
return {
|
|
119
|
+
kind: "opfs",
|
|
120
|
+
name: WEBLLM_OPFS_ROOT,
|
|
121
|
+
supported: false,
|
|
122
|
+
cleared: false,
|
|
123
|
+
error: "OPFS is unavailable.",
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const root = await storage.getDirectory();
|
|
127
|
+
await root.removeEntry(WEBLLM_OPFS_ROOT, { recursive: true });
|
|
128
|
+
return {
|
|
129
|
+
kind: "opfs",
|
|
130
|
+
name: WEBLLM_OPFS_ROOT,
|
|
131
|
+
supported: true,
|
|
132
|
+
cleared: true,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
if (error instanceof DOMException && error.name === "NotFoundError") {
|
|
137
|
+
return {
|
|
138
|
+
kind: "opfs",
|
|
139
|
+
name: WEBLLM_OPFS_ROOT,
|
|
140
|
+
supported: true,
|
|
141
|
+
cleared: false,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
kind: "opfs",
|
|
146
|
+
name: WEBLLM_OPFS_ROOT,
|
|
147
|
+
supported: true,
|
|
148
|
+
cleared: false,
|
|
149
|
+
error: formatUnknownError(error),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
export async function deleteTransformersModelArtifactsFromBrowserStorage() {
|
|
154
|
+
return deleteCacheStorageScope(TRANSFORMERS_CACHE_SCOPE);
|
|
155
|
+
}
|
|
156
|
+
function formatUnknownError(error) {
|
|
157
|
+
if (error instanceof Error)
|
|
158
|
+
return error.message;
|
|
159
|
+
return String(error);
|
|
160
|
+
}
|
|
161
|
+
export const TRANSFORMERS_CACHE_SCOPE = "transformers-cache";
|
|
162
|
+
export async function hasTransformersModelInBrowserCache(repoId) {
|
|
163
|
+
if (!("caches" in globalThis)) {
|
|
164
|
+
return {
|
|
165
|
+
supported: false,
|
|
166
|
+
downloaded: false,
|
|
167
|
+
detail: "Cache Storage API is unavailable.",
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const cache = await caches.open(TRANSFORMERS_CACHE_SCOPE);
|
|
172
|
+
const keys = await cache.keys();
|
|
173
|
+
const matchCount = keys.filter((request) => isTransformersModelRequest(request.url, repoId)).length;
|
|
174
|
+
return {
|
|
175
|
+
supported: true,
|
|
176
|
+
downloaded: matchCount > 0,
|
|
177
|
+
detail: matchCount > 0
|
|
178
|
+
? `${matchCount} cached Transformers.js artifacts found.`
|
|
179
|
+
: "No cached Transformers.js artifacts found.",
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
return {
|
|
184
|
+
supported: true,
|
|
185
|
+
downloaded: false,
|
|
186
|
+
detail: `Could not inspect Transformers.js cache: ${formatUnknownError(error)}`,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export async function deleteTransformersModelFromBrowserCache(repoId) {
|
|
191
|
+
if (!("caches" in globalThis))
|
|
192
|
+
return 0;
|
|
193
|
+
const cache = await caches.open(TRANSFORMERS_CACHE_SCOPE);
|
|
194
|
+
const keys = await cache.keys();
|
|
195
|
+
let deleted = 0;
|
|
196
|
+
for (const request of keys) {
|
|
197
|
+
if (isTransformersModelRequest(request.url, repoId) &&
|
|
198
|
+
(await cache.delete(request))) {
|
|
199
|
+
deleted += 1;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return deleted;
|
|
203
|
+
}
|
|
204
|
+
function isTransformersModelRequest(url, repoId) {
|
|
205
|
+
const normalizedRepo = repoId.replace(/^\/+|\/+$/g, "");
|
|
206
|
+
const encodedRepo = normalizedRepo
|
|
207
|
+
.split("/")
|
|
208
|
+
.map(encodeURIComponent)
|
|
209
|
+
.join("/");
|
|
210
|
+
return (url.includes(`/${normalizedRepo}/resolve/`) ||
|
|
211
|
+
url.includes(`/${encodedRepo}/resolve/`) ||
|
|
212
|
+
url.includes(`/hf-transformers/${normalizedRepo}/resolve/`) ||
|
|
213
|
+
url.includes(`/hf-transformers/${encodedRepo}/resolve/`));
|
|
214
|
+
}
|
|
215
|
+
export async function getCachedModelStatus(target) {
|
|
216
|
+
const [cacheKeys, indexedDbKeys, transformerKeys] = await Promise.all([
|
|
217
|
+
listMatchingCacheStorageKeys(target),
|
|
218
|
+
listMatchingIndexedDBKeys(target),
|
|
219
|
+
listMatchingTransformersCacheKeys(target),
|
|
220
|
+
]);
|
|
221
|
+
const matches = [...cacheKeys, ...indexedDbKeys, ...transformerKeys];
|
|
222
|
+
const storageKinds = Array.from(new Set(matches.map((entry) => entry.kind)));
|
|
223
|
+
return {
|
|
224
|
+
downloaded: matches.length > 0,
|
|
225
|
+
matchedEntries: matches.length,
|
|
226
|
+
storageKinds,
|
|
227
|
+
sampleKeys: matches.slice(0, 5).map((entry) => entry.key),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
export async function deleteOneModelArtifactsFromBrowserStorage(target) {
|
|
231
|
+
const before = await estimateOriginStorage();
|
|
232
|
+
const matchedBefore = await getCachedModelStatus(target);
|
|
233
|
+
const deletedEntries = [];
|
|
234
|
+
for (const scope of WEBLLM_CACHE_SCOPES) {
|
|
235
|
+
deletedEntries.push(...(await deleteMatchingCacheStorageKeys(scope, target)));
|
|
236
|
+
}
|
|
237
|
+
for (const scope of WEBLLM_CACHE_SCOPES) {
|
|
238
|
+
deletedEntries.push(...(await deleteMatchingIndexedDBKeys(scope, target)));
|
|
239
|
+
}
|
|
240
|
+
deletedEntries.push(...(await deleteMatchingTransformersCacheKeys(target)));
|
|
241
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
242
|
+
const after = await estimateOriginStorage();
|
|
243
|
+
const freedBytes = typeof before?.usage === "number" && typeof after?.usage === "number"
|
|
244
|
+
? Math.max(0, before.usage - after.usage)
|
|
245
|
+
: undefined;
|
|
246
|
+
return {
|
|
247
|
+
targetModelId: target.modelId,
|
|
248
|
+
before,
|
|
249
|
+
after,
|
|
250
|
+
freedBytes,
|
|
251
|
+
scopes: deletedEntries,
|
|
252
|
+
deletedEntries,
|
|
253
|
+
matchedBefore,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
async function listMatchingTransformersCacheKeys(target) {
|
|
257
|
+
if (!("caches" in globalThis))
|
|
258
|
+
return [];
|
|
259
|
+
try {
|
|
260
|
+
const cache = await caches.open(TRANSFORMERS_CACHE_SCOPE);
|
|
261
|
+
const requests = await cache.keys();
|
|
262
|
+
return requests
|
|
263
|
+
.filter((request) => matchesModelCacheTarget(request.url, target))
|
|
264
|
+
.map((request) => ({
|
|
265
|
+
kind: "transformers-cache",
|
|
266
|
+
scope: TRANSFORMERS_CACHE_SCOPE,
|
|
267
|
+
key: request.url,
|
|
268
|
+
}));
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
return [];
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
async function deleteMatchingTransformersCacheKeys(target) {
|
|
275
|
+
if (!("caches" in globalThis)) {
|
|
276
|
+
return [
|
|
277
|
+
{
|
|
278
|
+
kind: "transformers-cache",
|
|
279
|
+
name: TRANSFORMERS_CACHE_SCOPE,
|
|
280
|
+
supported: false,
|
|
281
|
+
cleared: false,
|
|
282
|
+
error: "Cache Storage API is unavailable.",
|
|
283
|
+
},
|
|
284
|
+
];
|
|
285
|
+
}
|
|
286
|
+
const results = [];
|
|
287
|
+
try {
|
|
288
|
+
const cache = await caches.open(TRANSFORMERS_CACHE_SCOPE);
|
|
289
|
+
const requests = await cache.keys();
|
|
290
|
+
for (const request of requests) {
|
|
291
|
+
if (!matchesModelCacheTarget(request.url, target))
|
|
292
|
+
continue;
|
|
293
|
+
const cleared = await cache.delete(request);
|
|
294
|
+
results.push({
|
|
295
|
+
kind: "transformers-cache",
|
|
296
|
+
name: `${TRANSFORMERS_CACHE_SCOPE}:${request.url}`,
|
|
297
|
+
supported: true,
|
|
298
|
+
cleared,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
results.push({
|
|
304
|
+
kind: "transformers-cache",
|
|
305
|
+
name: TRANSFORMERS_CACHE_SCOPE,
|
|
306
|
+
supported: true,
|
|
307
|
+
cleared: false,
|
|
308
|
+
error: formatUnknownError(error),
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
return results;
|
|
312
|
+
}
|
|
313
|
+
async function listMatchingCacheStorageKeys(target) {
|
|
314
|
+
if (!("caches" in globalThis))
|
|
315
|
+
return [];
|
|
316
|
+
const matches = [];
|
|
317
|
+
for (const scope of WEBLLM_CACHE_SCOPES) {
|
|
318
|
+
try {
|
|
319
|
+
const cache = await caches.open(scope);
|
|
320
|
+
const requests = await cache.keys();
|
|
321
|
+
for (const request of requests) {
|
|
322
|
+
if (matchesModelCacheTarget(request.url, target)) {
|
|
323
|
+
matches.push({ kind: "cache-storage", scope, key: request.url });
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
// Ignore per-scope read failures in status checks. The delete action reports errors.
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return matches;
|
|
332
|
+
}
|
|
333
|
+
async function listMatchingIndexedDBKeys(target) {
|
|
334
|
+
if (!("indexedDB" in globalThis))
|
|
335
|
+
return [];
|
|
336
|
+
const matches = [];
|
|
337
|
+
for (const scope of WEBLLM_CACHE_SCOPES) {
|
|
338
|
+
try {
|
|
339
|
+
const keys = await listIndexedDBUrlKeys(scope);
|
|
340
|
+
for (const key of keys) {
|
|
341
|
+
if (matchesModelCacheTarget(key, target)) {
|
|
342
|
+
matches.push({ kind: "indexeddb", scope, key });
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
// Ignore per-scope read failures in status checks. The delete action reports errors.
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return matches;
|
|
351
|
+
}
|
|
352
|
+
async function deleteMatchingCacheStorageKeys(scope, target) {
|
|
353
|
+
if (!("caches" in globalThis)) {
|
|
354
|
+
return [
|
|
355
|
+
{
|
|
356
|
+
kind: "cache-storage",
|
|
357
|
+
name: scope,
|
|
358
|
+
supported: false,
|
|
359
|
+
cleared: false,
|
|
360
|
+
error: "Cache Storage API is unavailable.",
|
|
361
|
+
},
|
|
362
|
+
];
|
|
363
|
+
}
|
|
364
|
+
const results = [];
|
|
365
|
+
try {
|
|
366
|
+
const cache = await caches.open(scope);
|
|
367
|
+
const requests = await cache.keys();
|
|
368
|
+
for (const request of requests) {
|
|
369
|
+
if (!matchesModelCacheTarget(request.url, target))
|
|
370
|
+
continue;
|
|
371
|
+
const cleared = await cache.delete(request);
|
|
372
|
+
results.push({
|
|
373
|
+
kind: "cache-storage",
|
|
374
|
+
name: `${scope}:${request.url}`,
|
|
375
|
+
supported: true,
|
|
376
|
+
cleared,
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
results.push({
|
|
382
|
+
kind: "cache-storage",
|
|
383
|
+
name: scope,
|
|
384
|
+
supported: true,
|
|
385
|
+
cleared: false,
|
|
386
|
+
error: formatUnknownError(error),
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
return results;
|
|
390
|
+
}
|
|
391
|
+
async function deleteMatchingIndexedDBKeys(scope, target) {
|
|
392
|
+
if (!("indexedDB" in globalThis)) {
|
|
393
|
+
return [
|
|
394
|
+
{
|
|
395
|
+
kind: "indexeddb",
|
|
396
|
+
name: scope,
|
|
397
|
+
supported: false,
|
|
398
|
+
cleared: false,
|
|
399
|
+
error: "IndexedDB is unavailable.",
|
|
400
|
+
},
|
|
401
|
+
];
|
|
402
|
+
}
|
|
403
|
+
const results = [];
|
|
404
|
+
try {
|
|
405
|
+
const keys = await listIndexedDBUrlKeys(scope);
|
|
406
|
+
for (const key of keys) {
|
|
407
|
+
if (!matchesModelCacheTarget(key, target))
|
|
408
|
+
continue;
|
|
409
|
+
await deleteIndexedDBUrlKey(scope, key);
|
|
410
|
+
results.push({
|
|
411
|
+
kind: "indexeddb",
|
|
412
|
+
name: `${scope}:${key}`,
|
|
413
|
+
supported: true,
|
|
414
|
+
cleared: true,
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
catch (error) {
|
|
419
|
+
results.push({
|
|
420
|
+
kind: "indexeddb",
|
|
421
|
+
name: scope,
|
|
422
|
+
supported: true,
|
|
423
|
+
cleared: false,
|
|
424
|
+
error: formatUnknownError(error),
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
return results;
|
|
428
|
+
}
|
|
429
|
+
function listIndexedDBUrlKeys(dbName) {
|
|
430
|
+
return new Promise((resolve, reject) => {
|
|
431
|
+
const request = indexedDB.open(dbName, 1);
|
|
432
|
+
request.onupgradeneeded = () => {
|
|
433
|
+
// The database did not exist yet. Avoid creating extra object stores for status checks.
|
|
434
|
+
request.transaction?.abort();
|
|
435
|
+
resolve([]);
|
|
436
|
+
};
|
|
437
|
+
request.onerror = () => {
|
|
438
|
+
if (request.error?.name === "AbortError")
|
|
439
|
+
return;
|
|
440
|
+
reject(request.error ?? new Error(`Could not open ${dbName}`));
|
|
441
|
+
};
|
|
442
|
+
request.onsuccess = () => {
|
|
443
|
+
const db = request.result;
|
|
444
|
+
if (!db.objectStoreNames.contains("urls")) {
|
|
445
|
+
db.close();
|
|
446
|
+
resolve([]);
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
const tx = db.transaction("urls", "readonly");
|
|
450
|
+
const store = tx.objectStore("urls");
|
|
451
|
+
const keyRequest = store.getAllKeys();
|
|
452
|
+
keyRequest.onsuccess = () => {
|
|
453
|
+
db.close();
|
|
454
|
+
resolve(keyRequest.result.map((key) => String(key)));
|
|
455
|
+
};
|
|
456
|
+
keyRequest.onerror = () => {
|
|
457
|
+
db.close();
|
|
458
|
+
reject(keyRequest.error ?? new Error(`Could not list keys for ${dbName}`));
|
|
459
|
+
};
|
|
460
|
+
};
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
function deleteIndexedDBUrlKey(dbName, key) {
|
|
464
|
+
return new Promise((resolve, reject) => {
|
|
465
|
+
const request = indexedDB.open(dbName, 1);
|
|
466
|
+
request.onerror = () => reject(request.error ?? new Error(`Could not open ${dbName}`));
|
|
467
|
+
request.onsuccess = () => {
|
|
468
|
+
const db = request.result;
|
|
469
|
+
if (!db.objectStoreNames.contains("urls")) {
|
|
470
|
+
db.close();
|
|
471
|
+
resolve();
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
const tx = db.transaction("urls", "readwrite");
|
|
475
|
+
const store = tx.objectStore("urls");
|
|
476
|
+
const deleteRequest = store.delete(key);
|
|
477
|
+
deleteRequest.onsuccess = () => {
|
|
478
|
+
db.close();
|
|
479
|
+
resolve();
|
|
480
|
+
};
|
|
481
|
+
deleteRequest.onerror = () => {
|
|
482
|
+
db.close();
|
|
483
|
+
reject(deleteRequest.error ?? new Error(`Could not delete ${key}`));
|
|
484
|
+
};
|
|
485
|
+
};
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
export function matchesModelCacheTarget(cacheKey, target) {
|
|
489
|
+
const decodedKey = safelyDecode(cacheKey);
|
|
490
|
+
const matchers = new Set([
|
|
491
|
+
target.modelId,
|
|
492
|
+
...target.repoLabels,
|
|
493
|
+
...target.artifactUrls,
|
|
494
|
+
...target.artifactUrls.map((url) => safelyDecode(url)),
|
|
495
|
+
]);
|
|
496
|
+
for (const rawMatcher of matchers) {
|
|
497
|
+
const matcher = rawMatcher.trim();
|
|
498
|
+
if (matcher && decodedKey.includes(matcher))
|
|
499
|
+
return true;
|
|
500
|
+
}
|
|
501
|
+
return false;
|
|
502
|
+
}
|
|
503
|
+
function safelyDecode(value) {
|
|
504
|
+
try {
|
|
505
|
+
return decodeURIComponent(value);
|
|
506
|
+
}
|
|
507
|
+
catch {
|
|
508
|
+
return value;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
//# sourceMappingURL=model-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-cache.js","sourceRoot":"","sources":["../src/model-cache.ts"],"names":[],"mappings":"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"}
|