@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.
Files changed (64) hide show
  1. package/README.md +24 -0
  2. package/dist/browser/index.d.ts +62 -1
  3. package/dist/browser/index.d.ts.map +1 -1
  4. package/dist/browser/index.js +208 -51
  5. package/dist/browser/index.js.map +1 -1
  6. package/dist/cli.mjs +7 -7
  7. package/dist/cli.mjs.map +1 -1
  8. package/dist/frameworks/express.d.mts +1 -1
  9. package/dist/frameworks/express.mjs +2 -1
  10. package/dist/frameworks/express.mjs.map +1 -1
  11. package/dist/frameworks/fastify.d.mts +1 -1
  12. package/dist/frameworks/fastify.mjs +2 -1
  13. package/dist/frameworks/fastify.mjs.map +1 -1
  14. package/dist/frameworks/hono.d.mts +1 -1
  15. package/dist/frameworks/hono.mjs +2 -1
  16. package/dist/frameworks/hono.mjs.map +1 -1
  17. package/dist/frameworks/next.d.mts +2 -2
  18. package/dist/frameworks/next.mjs +2 -1
  19. package/dist/frameworks/next.mjs.map +1 -1
  20. package/dist/frameworks/react.d.mts +1 -1
  21. package/dist/frameworks/react.d.mts.map +1 -1
  22. package/dist/frameworks/trpc.d.mts +1 -1
  23. package/dist/frameworks/trpc.mjs +2 -1
  24. package/dist/frameworks/trpc.mjs.map +1 -1
  25. package/dist/{gerbil-BcWjCGtM.mjs → gerbil-BZklpDhM.mjs} +207 -1
  26. package/dist/gerbil-BZklpDhM.mjs.map +1 -0
  27. package/dist/gerbil-CAMb_nrK.mjs +5 -0
  28. package/dist/{gerbil-E12cYLNi.d.mts → gerbil-DJygY0sJ.d.mts} +71 -2
  29. package/dist/gerbil-DJygY0sJ.d.mts.map +1 -0
  30. package/dist/index.d.mts +3 -3
  31. package/dist/index.d.mts.map +1 -1
  32. package/dist/index.mjs +2 -2
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/integrations/ai-sdk.d.mts +16 -1
  35. package/dist/integrations/ai-sdk.d.mts.map +1 -1
  36. package/dist/integrations/ai-sdk.mjs +19 -2
  37. package/dist/integrations/ai-sdk.mjs.map +1 -1
  38. package/dist/integrations/langchain.d.mts +1 -1
  39. package/dist/integrations/langchain.mjs +2 -1
  40. package/dist/integrations/langchain.mjs.map +1 -1
  41. package/dist/integrations/llamaindex.d.mts +1 -1
  42. package/dist/integrations/llamaindex.mjs +2 -1
  43. package/dist/integrations/llamaindex.mjs.map +1 -1
  44. package/dist/integrations/mcp.d.mts +2 -2
  45. package/dist/integrations/mcp.mjs +5 -4
  46. package/dist/{mcp-DXqxF7ri.mjs → mcp-ZCC5OR7B.mjs} +3 -3
  47. package/dist/{mcp-DXqxF7ri.mjs.map → mcp-ZCC5OR7B.mjs.map} +1 -1
  48. package/dist/{one-liner-UtQX47IT.mjs → one-liner-mH5SKPvT.mjs} +2 -2
  49. package/dist/{one-liner-UtQX47IT.mjs.map → one-liner-mH5SKPvT.mjs.map} +1 -1
  50. package/dist/{repl-FjIaBVFD.mjs → repl-CSM1IBP1.mjs} +3 -3
  51. package/dist/skills/index.d.mts +7 -7
  52. package/dist/skills/index.d.mts.map +1 -1
  53. package/dist/skills/index.mjs +4 -3
  54. package/dist/{skills-BmlseBpJ.mjs → skills-CPB_9YfF.mjs} +2 -2
  55. package/dist/{skills-BmlseBpJ.mjs.map → skills-CPB_9YfF.mjs.map} +1 -1
  56. package/dist/{types-Bgb_89Bh.d.mts → types-evP8RShr.d.mts} +8 -2
  57. package/dist/types-evP8RShr.d.mts.map +1 -0
  58. package/docs/ai-sdk.md +18 -0
  59. package/docs/browser.md +34 -0
  60. package/package.json +1 -1
  61. package/dist/gerbil-BcWjCGtM.mjs.map +0 -1
  62. package/dist/gerbil-CBQkuQ9i.mjs +0 -4
  63. package/dist/gerbil-E12cYLNi.d.mts.map +0 -1
  64. 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
@@ -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":"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"}
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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"}
@@ -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 pendingRequestsRef = useRef(/* @__PURE__ */ new Map());
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 (loadRequestedRef.current || isReady) return;
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
- if (!isReady) {
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
- if (!isReady) {
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