@tryhamster/gerbil 1.0.0-rc.12 → 1.0.0-rc.13
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 +24 -0
- package/dist/browser/index.d.ts +62 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +208 -51
- package/dist/browser/index.js.map +1 -1
- package/dist/cli.mjs +7 -7
- package/dist/cli.mjs.map +1 -1
- package/dist/frameworks/express.d.mts +1 -1
- package/dist/frameworks/express.mjs +2 -1
- package/dist/frameworks/express.mjs.map +1 -1
- package/dist/frameworks/fastify.d.mts +1 -1
- package/dist/frameworks/fastify.mjs +2 -1
- package/dist/frameworks/fastify.mjs.map +1 -1
- package/dist/frameworks/hono.d.mts +1 -1
- package/dist/frameworks/hono.mjs +2 -1
- package/dist/frameworks/hono.mjs.map +1 -1
- package/dist/frameworks/next.d.mts +2 -2
- package/dist/frameworks/next.mjs +2 -1
- package/dist/frameworks/next.mjs.map +1 -1
- package/dist/frameworks/react.d.mts +1 -1
- package/dist/frameworks/react.d.mts.map +1 -1
- package/dist/frameworks/trpc.d.mts +1 -1
- package/dist/frameworks/trpc.mjs +2 -1
- package/dist/frameworks/trpc.mjs.map +1 -1
- package/dist/{gerbil-BcWjCGtM.mjs → gerbil-BZklpDhM.mjs} +207 -1
- package/dist/gerbil-BZklpDhM.mjs.map +1 -0
- package/dist/gerbil-CAMb_nrK.mjs +5 -0
- package/dist/{gerbil-E12cYLNi.d.mts → gerbil-DJygY0sJ.d.mts} +71 -2
- package/dist/gerbil-DJygY0sJ.d.mts.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/integrations/ai-sdk.d.mts +16 -1
- package/dist/integrations/ai-sdk.d.mts.map +1 -1
- package/dist/integrations/ai-sdk.mjs +19 -2
- package/dist/integrations/ai-sdk.mjs.map +1 -1
- package/dist/integrations/langchain.d.mts +1 -1
- package/dist/integrations/langchain.mjs +2 -1
- package/dist/integrations/langchain.mjs.map +1 -1
- package/dist/integrations/llamaindex.d.mts +1 -1
- package/dist/integrations/llamaindex.mjs +2 -1
- package/dist/integrations/llamaindex.mjs.map +1 -1
- package/dist/integrations/mcp.d.mts +2 -2
- package/dist/integrations/mcp.mjs +5 -4
- package/dist/{mcp-DXqxF7ri.mjs → mcp-ZCC5OR7B.mjs} +3 -3
- package/dist/{mcp-DXqxF7ri.mjs.map → mcp-ZCC5OR7B.mjs.map} +1 -1
- package/dist/{one-liner-UtQX47IT.mjs → one-liner-mH5SKPvT.mjs} +2 -2
- package/dist/{one-liner-UtQX47IT.mjs.map → one-liner-mH5SKPvT.mjs.map} +1 -1
- package/dist/{repl-FjIaBVFD.mjs → repl-CSM1IBP1.mjs} +3 -3
- package/dist/skills/index.d.mts +7 -7
- package/dist/skills/index.d.mts.map +1 -1
- package/dist/skills/index.mjs +4 -3
- package/dist/{skills-BmlseBpJ.mjs → skills-CPB_9YfF.mjs} +2 -2
- package/dist/{skills-BmlseBpJ.mjs.map → skills-CPB_9YfF.mjs.map} +1 -1
- package/dist/{types-Bgb_89Bh.d.mts → types-evP8RShr.d.mts} +8 -2
- package/dist/types-evP8RShr.d.mts.map +1 -0
- package/docs/ai-sdk.md +18 -0
- package/docs/browser.md +34 -0
- package/package.json +1 -1
- package/dist/gerbil-BcWjCGtM.mjs.map +0 -1
- package/dist/gerbil-CBQkuQ9i.mjs +0 -4
- package/dist/gerbil-E12cYLNi.d.mts.map +0 -1
- package/dist/types-Bgb_89Bh.d.mts.map +0 -1
package/README.md
CHANGED
|
@@ -69,6 +69,30 @@ npm install @tryhamster/gerbil
|
|
|
69
69
|
|
|
70
70
|
After global install, use `gerbil` directly instead of `npx @tryhamster/gerbil`.
|
|
71
71
|
|
|
72
|
+
## Model Preloading
|
|
73
|
+
|
|
74
|
+
Download models ahead of time so users don't wait:
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
import { Gerbil } from "@tryhamster/gerbil";
|
|
78
|
+
|
|
79
|
+
const g = new Gerbil();
|
|
80
|
+
|
|
81
|
+
// Option 1: Preload for later (download only, free memory)
|
|
82
|
+
await g.preloadModel("qwen3-0.6b", {
|
|
83
|
+
onProgress: (p) => console.log(p.status, p.progress),
|
|
84
|
+
});
|
|
85
|
+
// Later: loads from disk cache (fast, no network)
|
|
86
|
+
await g.loadModel("qwen3-0.6b");
|
|
87
|
+
|
|
88
|
+
// Option 2: Preload and keep in memory (instant use)
|
|
89
|
+
await g.preloadModel("qwen3-0.6b", { keepLoaded: true });
|
|
90
|
+
// Instant - no loading needed
|
|
91
|
+
await g.generate("Hello");
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Works for all model types: `preloadTTS()`, `preloadSTT()`, `preloadEmbedding()`.
|
|
95
|
+
|
|
72
96
|
## Quick Start
|
|
73
97
|
|
|
74
98
|
```typescript
|
package/dist/browser/index.d.ts
CHANGED
|
@@ -1082,6 +1082,63 @@ type UseEmbeddingReturn = {
|
|
|
1082
1082
|
* ```
|
|
1083
1083
|
*/
|
|
1084
1084
|
declare function useEmbedding(options?: UseEmbeddingOptions): UseEmbeddingReturn;
|
|
1085
|
+
/** Progress callback for preloading */
|
|
1086
|
+
type PreloadProgress = {
|
|
1087
|
+
status: "downloading" | "loading" | "ready" | "error";
|
|
1088
|
+
file?: string;
|
|
1089
|
+
progress?: number;
|
|
1090
|
+
message?: string;
|
|
1091
|
+
};
|
|
1092
|
+
/** Preload options */
|
|
1093
|
+
type PreloadOptions = {
|
|
1094
|
+
onProgress?: (progress: PreloadProgress) => void;
|
|
1095
|
+
};
|
|
1096
|
+
/**
|
|
1097
|
+
* Preload a chat/LLM model (downloads to IndexedDB cache)
|
|
1098
|
+
*
|
|
1099
|
+
* Call this during app initialization to ensure the model is ready
|
|
1100
|
+
* when users need it.
|
|
1101
|
+
*
|
|
1102
|
+
* @example
|
|
1103
|
+
* ```ts
|
|
1104
|
+
* // In your app's initialization
|
|
1105
|
+
* import { preloadChatModel } from "@tryhamster/gerbil/browser";
|
|
1106
|
+
*
|
|
1107
|
+
* await preloadChatModel("qwen3-0.6b", {
|
|
1108
|
+
* onProgress: (p) => console.log(p.status, p.progress),
|
|
1109
|
+
* });
|
|
1110
|
+
*
|
|
1111
|
+
* // Later, useChat will load instantly from cache
|
|
1112
|
+
* ```
|
|
1113
|
+
*/
|
|
1114
|
+
declare function preloadChatModel(modelId: string, options?: PreloadOptions): Promise<void>;
|
|
1115
|
+
/**
|
|
1116
|
+
* Preload an embedding model
|
|
1117
|
+
*
|
|
1118
|
+
* @example
|
|
1119
|
+
* ```ts
|
|
1120
|
+
* await preloadEmbeddingModel("Xenova/all-MiniLM-L6-v2");
|
|
1121
|
+
* ```
|
|
1122
|
+
*/
|
|
1123
|
+
declare function preloadEmbeddingModel(modelId?: string, options?: PreloadOptions): Promise<void>;
|
|
1124
|
+
/**
|
|
1125
|
+
* Preload a TTS model
|
|
1126
|
+
*
|
|
1127
|
+
* @example
|
|
1128
|
+
* ```ts
|
|
1129
|
+
* await preloadTTSModel("kokoro-82m");
|
|
1130
|
+
* ```
|
|
1131
|
+
*/
|
|
1132
|
+
declare function preloadTTSModel(modelId?: TTSModelId, options?: PreloadOptions): Promise<void>;
|
|
1133
|
+
/**
|
|
1134
|
+
* Preload an STT model
|
|
1135
|
+
*
|
|
1136
|
+
* @example
|
|
1137
|
+
* ```ts
|
|
1138
|
+
* await preloadSTTModel("whisper-tiny.en");
|
|
1139
|
+
* ```
|
|
1140
|
+
*/
|
|
1141
|
+
declare function preloadSTTModel(modelId?: string, options?: PreloadOptions): Promise<void>;
|
|
1085
1142
|
/**
|
|
1086
1143
|
* Check if WebGPU is supported
|
|
1087
1144
|
*/
|
|
@@ -1100,7 +1157,11 @@ declare const _default: {
|
|
|
1100
1157
|
createGerbilWorker: typeof createGerbilWorker;
|
|
1101
1158
|
playAudio: typeof playAudio;
|
|
1102
1159
|
createAudioPlayer: typeof createAudioPlayer;
|
|
1160
|
+
preloadChatModel: typeof preloadChatModel;
|
|
1161
|
+
preloadEmbeddingModel: typeof preloadEmbeddingModel;
|
|
1162
|
+
preloadTTSModel: typeof preloadTTSModel;
|
|
1163
|
+
preloadSTTModel: typeof preloadSTTModel;
|
|
1103
1164
|
};
|
|
1104
1165
|
//#endregion
|
|
1105
|
-
export { AudioChunk, BUILTIN_MODELS, BrowserEmbedResult, BrowserSearchResult, BrowserVoiceInfo, CacheConfig, CompleteOptions, EmbedOptions, EmbedResult, FallbackConfig, GenerateOptions, GenerateResult, GenerateStreamOptions, GerbilConfig, GerbilModelSettings, GerbilProviderSettings, GerbilWorker, GerbilWorkerOptions, ImageInput, JsonOptions, LoadOptions, LoadSTTOptions, LoadTTSOptions, LoadingProgress, Message, ModelConfig, ModelSource, ModelStats, ProgressInfo, STTModelConfig, STTProgress, SearchResult, SessionStats, SimilarityResult, SpeakOptions, SpeakResult, StreamingTranscriptionOptions, StreamingTranscriptionSession, SystemInfo, TTSModelConfig, TTSModelId, TTSProgress, TranscribeOptions, TranscribeResult, TranscribeSegment, UseChatOptions, UseChatReturn, UseCompletionOptions, UseCompletionReturn, UseEmbeddingOptions, UseEmbeddingReturn, UseSpeechOptions, UseSpeechReturn, UseVoiceChatOptions, UseVoiceChatReturn, UseVoiceInputOptions, UseVoiceInputReturn, VoiceChatMessage, VoiceInfo, WorkerComplete, WorkerProgress, WorkerToken, createAudioPlayer, createGerbilWorker, _default as default, getWebGPUInfo, isWebGPUSupported, playAudio, useChat, useCompletion, useEmbedding, useSpeech, useVoiceChat, useVoiceInput };
|
|
1166
|
+
export { AudioChunk, BUILTIN_MODELS, BrowserEmbedResult, BrowserSearchResult, BrowserVoiceInfo, CacheConfig, CompleteOptions, EmbedOptions, EmbedResult, FallbackConfig, GenerateOptions, GenerateResult, GenerateStreamOptions, GerbilConfig, GerbilModelSettings, GerbilProviderSettings, GerbilWorker, GerbilWorkerOptions, ImageInput, JsonOptions, LoadOptions, LoadSTTOptions, LoadTTSOptions, LoadingProgress, Message, ModelConfig, ModelSource, ModelStats, PreloadOptions, PreloadProgress, ProgressInfo, STTModelConfig, STTProgress, SearchResult, SessionStats, SimilarityResult, SpeakOptions, SpeakResult, StreamingTranscriptionOptions, StreamingTranscriptionSession, SystemInfo, TTSModelConfig, TTSModelId, TTSProgress, TranscribeOptions, TranscribeResult, TranscribeSegment, UseChatOptions, UseChatReturn, UseCompletionOptions, UseCompletionReturn, UseEmbeddingOptions, UseEmbeddingReturn, UseSpeechOptions, UseSpeechReturn, UseVoiceChatOptions, UseVoiceChatReturn, UseVoiceInputOptions, UseVoiceInputReturn, VoiceChatMessage, VoiceInfo, WorkerComplete, WorkerProgress, WorkerToken, createAudioPlayer, createGerbilWorker, _default as default, getWebGPUInfo, isWebGPUSupported, playAudio, preloadChatModel, preloadEmbeddingModel, preloadSTTModel, preloadTTSModel, useChat, useCompletion, useEmbedding, useSpeech, useVoiceChat, useVoiceInput };
|
|
1106
1167
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/core/types.ts","../../src/core/models.ts","../../src/browser/index.ts"],"sourcesContent":[],"mappings":";;;;AAyBY,KAfA,WAAA,GAeW;EASX,EAAA,EAAA,MAAA;EAWA,IAAA,EAAA,MAAA;EAmCA,WAAA,EAAA,MAAc;EA8Bd,IAAA,EAAA,MAAA;EAkBA,aAAA,EAAY,MAAA;EAQZ,gBAAW,EAAA,OAAA;EAWX,YAAA,EAAA,OAAY;EAWZ;EAkBA,cAAW,CAAA,EAAA,OAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/core/types.ts","../../src/core/models.ts","../../src/browser/index.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/browser/index.js
CHANGED
|
@@ -1878,7 +1878,7 @@ function useVoiceInput(options = {}) {
|
|
|
1878
1878
|
const fullTranscriptRef = useRef("");
|
|
1879
1879
|
const transcribeResolveRef = useRef(null);
|
|
1880
1880
|
const transcribeRejectRef = useRef(null);
|
|
1881
|
-
const resolveSTTModel = (modelId) => {
|
|
1881
|
+
const resolveSTTModel$1 = (modelId) => {
|
|
1882
1882
|
return {
|
|
1883
1883
|
"whisper-tiny": "onnx-community/whisper-tiny",
|
|
1884
1884
|
"whisper-tiny.en": "onnx-community/whisper-tiny.en",
|
|
@@ -1969,7 +1969,7 @@ function useVoiceInput(options = {}) {
|
|
|
1969
1969
|
};
|
|
1970
1970
|
worker.postMessage({
|
|
1971
1971
|
type: "load",
|
|
1972
|
-
payload: { model: resolveSTTModel(model) }
|
|
1972
|
+
payload: { model: resolveSTTModel$1(model) }
|
|
1973
1973
|
});
|
|
1974
1974
|
return () => {
|
|
1975
1975
|
mountedRef.current = false;
|
|
@@ -2348,7 +2348,7 @@ function useVoiceChat(options = {}) {
|
|
|
2348
2348
|
const isListening = stage === "listening";
|
|
2349
2349
|
const isProcessing = stage === "transcribing" || stage === "thinking";
|
|
2350
2350
|
const isSpeaking = stage === "speaking";
|
|
2351
|
-
const resolveSTTModel = (modelId) => {
|
|
2351
|
+
const resolveSTTModel$1 = (modelId) => {
|
|
2352
2352
|
return {
|
|
2353
2353
|
"whisper-tiny": "onnx-community/whisper-tiny",
|
|
2354
2354
|
"whisper-tiny.en": "onnx-community/whisper-tiny.en",
|
|
@@ -2381,7 +2381,7 @@ function useVoiceChat(options = {}) {
|
|
|
2381
2381
|
sttWorker.onerror = (e) => reject(new Error(e.message));
|
|
2382
2382
|
sttWorker.postMessage({
|
|
2383
2383
|
type: "load",
|
|
2384
|
-
payload: { model: resolveSTTModel(sttModel) }
|
|
2384
|
+
payload: { model: resolveSTTModel$1(sttModel) }
|
|
2385
2385
|
});
|
|
2386
2386
|
});
|
|
2387
2387
|
if (cancelled || !mountedRef.current) {
|
|
@@ -2831,7 +2831,8 @@ function useEmbedding(options = {}) {
|
|
|
2831
2831
|
const [loadingProgress, setLoadingProgress] = useState(null);
|
|
2832
2832
|
const workerRef = useRef(null);
|
|
2833
2833
|
const loadRequestedRef = useRef(false);
|
|
2834
|
-
const
|
|
2834
|
+
const readyPromiseRef = useRef(null);
|
|
2835
|
+
const readyResolveRef = useRef(null);
|
|
2835
2836
|
const cosineSimilarity = useCallback((a, b) => {
|
|
2836
2837
|
if (a.length !== b.length) throw new Error(`Vector dimensions must match: ${a.length} vs ${b.length}`);
|
|
2837
2838
|
let dotProduct = 0;
|
|
@@ -2847,13 +2848,17 @@ function useEmbedding(options = {}) {
|
|
|
2847
2848
|
return dotProduct / magnitude;
|
|
2848
2849
|
}, []);
|
|
2849
2850
|
const load = useCallback(() => {
|
|
2850
|
-
if (
|
|
2851
|
+
if (isReady && workerRef.current) return Promise.resolve();
|
|
2852
|
+
if (loadRequestedRef.current && readyPromiseRef.current) return readyPromiseRef.current;
|
|
2851
2853
|
loadRequestedRef.current = true;
|
|
2852
2854
|
setIsLoading(true);
|
|
2853
2855
|
setLoadingProgress({
|
|
2854
2856
|
status: "loading",
|
|
2855
2857
|
message: "Loading embedding model..."
|
|
2856
2858
|
});
|
|
2859
|
+
readyPromiseRef.current = new Promise((resolve) => {
|
|
2860
|
+
readyResolveRef.current = resolve;
|
|
2861
|
+
});
|
|
2857
2862
|
const worker = createEmbeddingWorker();
|
|
2858
2863
|
workerRef.current = worker;
|
|
2859
2864
|
worker.onmessage = (e) => {
|
|
@@ -2868,23 +2873,19 @@ function useEmbedding(options = {}) {
|
|
|
2868
2873
|
setIsLoading(false);
|
|
2869
2874
|
setIsReady(true);
|
|
2870
2875
|
setLoadingProgress({ status: "ready" });
|
|
2876
|
+
readyResolveRef.current?.();
|
|
2871
2877
|
onReady?.();
|
|
2872
2878
|
} else if (type === "error") {
|
|
2873
2879
|
setIsLoading(false);
|
|
2874
2880
|
setError(payload);
|
|
2875
2881
|
onError?.(payload);
|
|
2876
|
-
} else if (type === "embedding" || type === "embeddings") {
|
|
2877
|
-
const pending = pendingRequestsRef.current.get(type);
|
|
2878
|
-
if (pending) {
|
|
2879
|
-
pending.resolve(payload);
|
|
2880
|
-
pendingRequestsRef.current.delete(type);
|
|
2881
|
-
}
|
|
2882
2882
|
}
|
|
2883
2883
|
};
|
|
2884
2884
|
worker.postMessage({
|
|
2885
2885
|
type: "load",
|
|
2886
2886
|
payload: { model }
|
|
2887
2887
|
});
|
|
2888
|
+
return readyPromiseRef.current;
|
|
2888
2889
|
}, [
|
|
2889
2890
|
model,
|
|
2890
2891
|
isReady,
|
|
@@ -2901,22 +2902,7 @@ function useEmbedding(options = {}) {
|
|
|
2901
2902
|
};
|
|
2902
2903
|
}, [autoLoad, load]);
|
|
2903
2904
|
const embed = useCallback(async (text) => {
|
|
2904
|
-
|
|
2905
|
-
load();
|
|
2906
|
-
await new Promise((resolve) => {
|
|
2907
|
-
const checkReady = setInterval(() => {
|
|
2908
|
-
if (workerRef.current) {
|
|
2909
|
-
const handler = (e) => {
|
|
2910
|
-
if (e.data.type === "ready") {
|
|
2911
|
-
clearInterval(checkReady);
|
|
2912
|
-
resolve();
|
|
2913
|
-
}
|
|
2914
|
-
};
|
|
2915
|
-
workerRef.current.addEventListener("message", handler, { once: true });
|
|
2916
|
-
}
|
|
2917
|
-
}, 100);
|
|
2918
|
-
});
|
|
2919
|
-
}
|
|
2905
|
+
await load();
|
|
2920
2906
|
return new Promise((resolve, reject) => {
|
|
2921
2907
|
const worker = workerRef.current;
|
|
2922
2908
|
if (!worker) {
|
|
@@ -2941,23 +2927,9 @@ function useEmbedding(options = {}) {
|
|
|
2941
2927
|
}
|
|
2942
2928
|
});
|
|
2943
2929
|
});
|
|
2944
|
-
}, [
|
|
2945
|
-
isReady,
|
|
2946
|
-
load,
|
|
2947
|
-
normalize
|
|
2948
|
-
]);
|
|
2930
|
+
}, [load, normalize]);
|
|
2949
2931
|
const embedBatch = useCallback(async (texts) => {
|
|
2950
|
-
|
|
2951
|
-
load();
|
|
2952
|
-
await new Promise((resolve) => {
|
|
2953
|
-
const check = setInterval(() => {
|
|
2954
|
-
if (isReady) {
|
|
2955
|
-
clearInterval(check);
|
|
2956
|
-
resolve();
|
|
2957
|
-
}
|
|
2958
|
-
}, 100);
|
|
2959
|
-
});
|
|
2960
|
-
}
|
|
2932
|
+
await load();
|
|
2961
2933
|
return new Promise((resolve, reject) => {
|
|
2962
2934
|
const worker = workerRef.current;
|
|
2963
2935
|
if (!worker) {
|
|
@@ -2982,11 +2954,7 @@ function useEmbedding(options = {}) {
|
|
|
2982
2954
|
}
|
|
2983
2955
|
});
|
|
2984
2956
|
});
|
|
2985
|
-
}, [
|
|
2986
|
-
isReady,
|
|
2987
|
-
load,
|
|
2988
|
-
normalize
|
|
2989
|
-
]);
|
|
2957
|
+
}, [load, normalize]);
|
|
2990
2958
|
return {
|
|
2991
2959
|
embed,
|
|
2992
2960
|
embedBatch,
|
|
@@ -3026,6 +2994,191 @@ function useEmbedding(options = {}) {
|
|
|
3026
2994
|
};
|
|
3027
2995
|
}
|
|
3028
2996
|
/**
|
|
2997
|
+
* Preload a chat/LLM model (downloads to IndexedDB cache)
|
|
2998
|
+
*
|
|
2999
|
+
* Call this during app initialization to ensure the model is ready
|
|
3000
|
+
* when users need it.
|
|
3001
|
+
*
|
|
3002
|
+
* @example
|
|
3003
|
+
* ```ts
|
|
3004
|
+
* // In your app's initialization
|
|
3005
|
+
* import { preloadChatModel } from "@tryhamster/gerbil/browser";
|
|
3006
|
+
*
|
|
3007
|
+
* await preloadChatModel("qwen3-0.6b", {
|
|
3008
|
+
* onProgress: (p) => console.log(p.status, p.progress),
|
|
3009
|
+
* });
|
|
3010
|
+
*
|
|
3011
|
+
* // Later, useChat will load instantly from cache
|
|
3012
|
+
* ```
|
|
3013
|
+
*/
|
|
3014
|
+
async function preloadChatModel(modelId, options = {}) {
|
|
3015
|
+
const { onProgress } = options;
|
|
3016
|
+
const worker = await createGerbilWorker({
|
|
3017
|
+
modelId,
|
|
3018
|
+
onProgress: (p) => {
|
|
3019
|
+
if (p.status === "downloading") onProgress?.({
|
|
3020
|
+
status: "downloading",
|
|
3021
|
+
file: p.file,
|
|
3022
|
+
progress: p.progress
|
|
3023
|
+
});
|
|
3024
|
+
else onProgress?.({
|
|
3025
|
+
status: "loading",
|
|
3026
|
+
message: p.status
|
|
3027
|
+
});
|
|
3028
|
+
}
|
|
3029
|
+
});
|
|
3030
|
+
onProgress?.({ status: "ready" });
|
|
3031
|
+
worker.terminate();
|
|
3032
|
+
}
|
|
3033
|
+
/**
|
|
3034
|
+
* Preload an embedding model
|
|
3035
|
+
*
|
|
3036
|
+
* @example
|
|
3037
|
+
* ```ts
|
|
3038
|
+
* await preloadEmbeddingModel("Xenova/all-MiniLM-L6-v2");
|
|
3039
|
+
* ```
|
|
3040
|
+
*/
|
|
3041
|
+
async function preloadEmbeddingModel(modelId = "Xenova/all-MiniLM-L6-v2", options = {}) {
|
|
3042
|
+
const { onProgress } = options;
|
|
3043
|
+
return new Promise((resolve, reject) => {
|
|
3044
|
+
const worker = createEmbeddingWorker();
|
|
3045
|
+
worker.onmessage = (e) => {
|
|
3046
|
+
const { type, payload } = e.data;
|
|
3047
|
+
if (type === "progress") {
|
|
3048
|
+
if (payload.status === "progress" && payload.file) onProgress?.({
|
|
3049
|
+
status: "downloading",
|
|
3050
|
+
file: payload.file,
|
|
3051
|
+
progress: Math.round(payload.loaded / payload.total * 100)
|
|
3052
|
+
});
|
|
3053
|
+
} else if (type === "ready") {
|
|
3054
|
+
onProgress?.({ status: "ready" });
|
|
3055
|
+
worker.terminate();
|
|
3056
|
+
resolve();
|
|
3057
|
+
} else if (type === "error") {
|
|
3058
|
+
onProgress?.({
|
|
3059
|
+
status: "error",
|
|
3060
|
+
message: payload
|
|
3061
|
+
});
|
|
3062
|
+
worker.terminate();
|
|
3063
|
+
reject(new Error(payload));
|
|
3064
|
+
}
|
|
3065
|
+
};
|
|
3066
|
+
onProgress?.({
|
|
3067
|
+
status: "loading",
|
|
3068
|
+
message: `Loading ${modelId}...`
|
|
3069
|
+
});
|
|
3070
|
+
worker.postMessage({
|
|
3071
|
+
type: "load",
|
|
3072
|
+
payload: { model: modelId }
|
|
3073
|
+
});
|
|
3074
|
+
});
|
|
3075
|
+
}
|
|
3076
|
+
/**
|
|
3077
|
+
* Preload a TTS model
|
|
3078
|
+
*
|
|
3079
|
+
* @example
|
|
3080
|
+
* ```ts
|
|
3081
|
+
* await preloadTTSModel("kokoro-82m");
|
|
3082
|
+
* ```
|
|
3083
|
+
*/
|
|
3084
|
+
async function preloadTTSModel(modelId = "kokoro-82m", options = {}) {
|
|
3085
|
+
const { onProgress } = options;
|
|
3086
|
+
const modelConfig = TTS_MODELS[modelId];
|
|
3087
|
+
if (!modelConfig) throw new Error(`Unknown TTS model: ${modelId}`);
|
|
3088
|
+
return new Promise((resolve, reject) => {
|
|
3089
|
+
const worker = createTTSWorker();
|
|
3090
|
+
worker.onmessage = (e) => {
|
|
3091
|
+
const { type, payload } = e.data;
|
|
3092
|
+
if (type === "progress") {
|
|
3093
|
+
if (payload.status === "progress" && payload.file) onProgress?.({
|
|
3094
|
+
status: "downloading",
|
|
3095
|
+
file: payload.file,
|
|
3096
|
+
progress: Math.round(payload.loaded / payload.total * 100)
|
|
3097
|
+
});
|
|
3098
|
+
} else if (type === "ready") {
|
|
3099
|
+
onProgress?.({ status: "ready" });
|
|
3100
|
+
worker.terminate();
|
|
3101
|
+
resolve();
|
|
3102
|
+
} else if (type === "error") {
|
|
3103
|
+
onProgress?.({
|
|
3104
|
+
status: "error",
|
|
3105
|
+
message: payload
|
|
3106
|
+
});
|
|
3107
|
+
worker.terminate();
|
|
3108
|
+
reject(new Error(payload));
|
|
3109
|
+
}
|
|
3110
|
+
};
|
|
3111
|
+
onProgress?.({
|
|
3112
|
+
status: "loading",
|
|
3113
|
+
message: `Loading ${modelId}...`
|
|
3114
|
+
});
|
|
3115
|
+
worker.postMessage({
|
|
3116
|
+
type: "load",
|
|
3117
|
+
payload: {
|
|
3118
|
+
modelId,
|
|
3119
|
+
repo: modelConfig.repo,
|
|
3120
|
+
voices: modelConfig.voices
|
|
3121
|
+
}
|
|
3122
|
+
});
|
|
3123
|
+
});
|
|
3124
|
+
}
|
|
3125
|
+
/**
|
|
3126
|
+
* Preload an STT model
|
|
3127
|
+
*
|
|
3128
|
+
* @example
|
|
3129
|
+
* ```ts
|
|
3130
|
+
* await preloadSTTModel("whisper-tiny.en");
|
|
3131
|
+
* ```
|
|
3132
|
+
*/
|
|
3133
|
+
async function preloadSTTModel(modelId = "whisper-tiny.en", options = {}) {
|
|
3134
|
+
const { onProgress } = options;
|
|
3135
|
+
const resolved = resolveSTTModel(modelId);
|
|
3136
|
+
return new Promise((resolve, reject) => {
|
|
3137
|
+
const worker = createSTTWorker();
|
|
3138
|
+
worker.onmessage = (e) => {
|
|
3139
|
+
const { type, payload } = e.data;
|
|
3140
|
+
if (type === "progress") {
|
|
3141
|
+
if (payload.status === "progress" && payload.file) onProgress?.({
|
|
3142
|
+
status: "downloading",
|
|
3143
|
+
file: payload.file,
|
|
3144
|
+
progress: Math.round(payload.loaded / payload.total * 100)
|
|
3145
|
+
});
|
|
3146
|
+
} else if (type === "ready") {
|
|
3147
|
+
onProgress?.({ status: "ready" });
|
|
3148
|
+
worker.terminate();
|
|
3149
|
+
resolve();
|
|
3150
|
+
} else if (type === "error") {
|
|
3151
|
+
onProgress?.({
|
|
3152
|
+
status: "error",
|
|
3153
|
+
message: payload
|
|
3154
|
+
});
|
|
3155
|
+
worker.terminate();
|
|
3156
|
+
reject(new Error(payload));
|
|
3157
|
+
}
|
|
3158
|
+
};
|
|
3159
|
+
onProgress?.({
|
|
3160
|
+
status: "loading",
|
|
3161
|
+
message: `Loading ${modelId}...`
|
|
3162
|
+
});
|
|
3163
|
+
worker.postMessage({
|
|
3164
|
+
type: "load",
|
|
3165
|
+
payload: { modelId: resolved }
|
|
3166
|
+
});
|
|
3167
|
+
});
|
|
3168
|
+
}
|
|
3169
|
+
/** Helper to resolve STT model ID to repo */
|
|
3170
|
+
function resolveSTTModel(modelId) {
|
|
3171
|
+
return {
|
|
3172
|
+
"whisper-tiny": "onnx-community/whisper-tiny",
|
|
3173
|
+
"whisper-tiny.en": "onnx-community/whisper-tiny.en",
|
|
3174
|
+
"whisper-base": "onnx-community/whisper-base",
|
|
3175
|
+
"whisper-base.en": "onnx-community/whisper-base.en",
|
|
3176
|
+
"whisper-small": "onnx-community/whisper-small",
|
|
3177
|
+
"whisper-small.en": "onnx-community/whisper-small.en",
|
|
3178
|
+
"whisper-large-v3-turbo": "onnx-community/whisper-large-v3-turbo"
|
|
3179
|
+
}[modelId] || modelId;
|
|
3180
|
+
}
|
|
3181
|
+
/**
|
|
3029
3182
|
* Check if WebGPU is supported
|
|
3030
3183
|
*/
|
|
3031
3184
|
function isWebGPUSupported() {
|
|
@@ -3055,9 +3208,13 @@ var browser_default = {
|
|
|
3055
3208
|
getWebGPUInfo,
|
|
3056
3209
|
createGerbilWorker,
|
|
3057
3210
|
playAudio,
|
|
3058
|
-
createAudioPlayer
|
|
3211
|
+
createAudioPlayer,
|
|
3212
|
+
preloadChatModel,
|
|
3213
|
+
preloadEmbeddingModel,
|
|
3214
|
+
preloadTTSModel,
|
|
3215
|
+
preloadSTTModel
|
|
3059
3216
|
};
|
|
3060
3217
|
|
|
3061
3218
|
//#endregion
|
|
3062
|
-
export { BUILTIN_MODELS, createAudioPlayer, createGerbilWorker, browser_default as default, getWebGPUInfo, isWebGPUSupported, playAudio, useChat, useCompletion, useEmbedding, useSpeech, useVoiceChat, useVoiceInput };
|
|
3219
|
+
export { BUILTIN_MODELS, createAudioPlayer, createGerbilWorker, browser_default as default, getWebGPUInfo, isWebGPUSupported, playAudio, preloadChatModel, preloadEmbeddingModel, preloadSTTModel, preloadTTSModel, useChat, useCompletion, useEmbedding, useSpeech, useVoiceChat, useVoiceInput };
|
|
3063
3220
|
//# sourceMappingURL=index.js.map
|