@tryhamster/gerbil 1.0.0-rc.8 → 1.0.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.
Files changed (179) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +247 -84
  3. package/dist/architectures-C1I5V3Dt.mjs +6070 -0
  4. package/dist/architectures-C1I5V3Dt.mjs.map +1 -0
  5. package/dist/browser/index.d.ts +264 -588
  6. package/dist/browser/index.d.ts.map +1 -1
  7. package/dist/browser/index.js +585 -2334
  8. package/dist/browser/index.js.map +1 -1
  9. package/dist/cli.mjs +625 -1098
  10. package/dist/cli.mjs.map +1 -1
  11. package/dist/defaults-9komdrbY.mjs +24 -0
  12. package/dist/defaults-9komdrbY.mjs.map +1 -0
  13. package/dist/frameworks/express.d.mts +1 -3
  14. package/dist/frameworks/express.d.mts.map +1 -1
  15. package/dist/frameworks/express.mjs +7 -7
  16. package/dist/frameworks/express.mjs.map +1 -1
  17. package/dist/frameworks/fastify.d.mts +1 -1
  18. package/dist/frameworks/fastify.d.mts.map +1 -1
  19. package/dist/frameworks/fastify.mjs +3 -3
  20. package/dist/frameworks/fastify.mjs.map +1 -1
  21. package/dist/frameworks/hono.d.mts +1 -1
  22. package/dist/frameworks/hono.d.mts.map +1 -1
  23. package/dist/frameworks/hono.mjs +4 -4
  24. package/dist/frameworks/hono.mjs.map +1 -1
  25. package/dist/frameworks/next.d.mts +3 -2
  26. package/dist/frameworks/next.d.mts.map +1 -1
  27. package/dist/frameworks/next.mjs +4 -4
  28. package/dist/frameworks/next.mjs.map +1 -1
  29. package/dist/frameworks/react.d.mts +1 -1
  30. package/dist/frameworks/trpc.d.mts +1 -1
  31. package/dist/frameworks/trpc.d.mts.map +1 -1
  32. package/dist/frameworks/trpc.mjs +4 -4
  33. package/dist/frameworks/trpc.mjs.map +1 -1
  34. package/dist/gerbil-BHrJJIa4.mjs +1656 -0
  35. package/dist/gerbil-BHrJJIa4.mjs.map +1 -0
  36. package/dist/gerbil-BT9fCydo.d.mts +488 -0
  37. package/dist/gerbil-BT9fCydo.d.mts.map +1 -0
  38. package/dist/gerbil-DomNfIr1.mjs +4 -0
  39. package/dist/gpu/hooks.d.mts +520 -0
  40. package/dist/gpu/hooks.d.mts.map +1 -0
  41. package/dist/gpu/hooks.mjs +1188 -0
  42. package/dist/gpu/hooks.mjs.map +1 -0
  43. package/dist/gpu/index.d.mts +2 -0
  44. package/dist/gpu/index.mjs +6 -0
  45. package/dist/gpu-33qCAtHW.mjs +3615 -0
  46. package/dist/gpu-33qCAtHW.mjs.map +1 -0
  47. package/dist/index-Dgmb2kE3.d.mts +245 -0
  48. package/dist/index-Dgmb2kE3.d.mts.map +1 -0
  49. package/dist/index-jEAL2s-A.d.mts +2022 -0
  50. package/dist/index-jEAL2s-A.d.mts.map +1 -0
  51. package/dist/index.d.mts +22 -487
  52. package/dist/index.d.mts.map +1 -1
  53. package/dist/index.mjs +13 -8
  54. package/dist/index.mjs.map +1 -1
  55. package/dist/indexeddb-store-BWIMtxxH.mjs +103 -0
  56. package/dist/indexeddb-store-BWIMtxxH.mjs.map +1 -0
  57. package/dist/indexeddb-store-ClH12Xnl.mjs +4 -0
  58. package/dist/integrations/ai-sdk.d.mts +75 -6
  59. package/dist/integrations/ai-sdk.d.mts.map +1 -1
  60. package/dist/integrations/ai-sdk.mjs +131 -15
  61. package/dist/integrations/ai-sdk.mjs.map +1 -1
  62. package/dist/integrations/langchain.d.mts +1 -1
  63. package/dist/integrations/langchain.d.mts.map +1 -1
  64. package/dist/integrations/langchain.mjs +5 -5
  65. package/dist/integrations/langchain.mjs.map +1 -1
  66. package/dist/integrations/llamaindex.d.mts +1 -1
  67. package/dist/integrations/llamaindex.d.mts.map +1 -1
  68. package/dist/integrations/llamaindex.mjs +5 -5
  69. package/dist/integrations/llamaindex.mjs.map +1 -1
  70. package/dist/integrations/mcp-client.mjs +3 -3
  71. package/dist/integrations/mcp-client.mjs.map +1 -1
  72. package/dist/integrations/mcp.d.mts +3 -2
  73. package/dist/integrations/mcp.d.mts.map +1 -1
  74. package/dist/integrations/mcp.mjs +5 -5
  75. package/dist/{mcp-BvbriaBy.mjs → mcp-1DaMsaBc.mjs} +4 -4
  76. package/dist/mcp-1DaMsaBc.mjs.map +1 -0
  77. package/dist/memory/index.d.mts +3 -0
  78. package/dist/memory/index.mjs +6 -0
  79. package/dist/memory-D1P7Tmda.mjs +4 -0
  80. package/dist/memory-DVN0MnIG.mjs +132 -0
  81. package/dist/memory-DVN0MnIG.mjs.map +1 -0
  82. package/dist/memory-Dj0J1v88.mjs +294 -0
  83. package/dist/memory-Dj0J1v88.mjs.map +1 -0
  84. package/dist/moonshine-stt-BLyVoRpB.mjs +4 -0
  85. package/dist/moonshine-stt-v_P_Ci_m.mjs +11936 -0
  86. package/dist/moonshine-stt-v_P_Ci_m.mjs.map +1 -0
  87. package/dist/{one-liner-s-lD8rCC.mjs → one-liner-DnQn7HJK.mjs} +14 -16
  88. package/dist/one-liner-DnQn7HJK.mjs.map +1 -0
  89. package/dist/repl-jV5gcJFA.mjs +9 -0
  90. package/dist/skills/index.d.mts +270 -320
  91. package/dist/skills/index.d.mts.map +1 -1
  92. package/dist/skills/index.mjs +5 -5
  93. package/dist/{skills-CD3Orlex.mjs → skills-DX8D59UH.mjs} +187 -32
  94. package/dist/skills-DX8D59UH.mjs.map +1 -0
  95. package/dist/{tools-Bi1P7Xoy.mjs → tools-DQ1mPUw5.mjs} +34 -22
  96. package/dist/tools-DQ1mPUw5.mjs.map +1 -0
  97. package/dist/{types-CiTc7ez3.d.mts → types-D6FiR_oh.d.mts} +106 -12
  98. package/dist/types-D6FiR_oh.d.mts.map +1 -0
  99. package/dist/types-DQBe2lFo.d.mts +165 -0
  100. package/dist/types-DQBe2lFo.d.mts.map +1 -0
  101. package/dist/{utils-CZBZ8dgR.mjs → utils-DKO55ZmZ.mjs} +1 -1
  102. package/dist/{utils-CZBZ8dgR.mjs.map → utils-DKO55ZmZ.mjs.map} +1 -1
  103. package/dist/vector-B0panuy6.mjs +95 -0
  104. package/dist/vector-B0panuy6.mjs.map +1 -0
  105. package/docs/PROJECT-STATE.md +321 -0
  106. package/docs/adding-a-model-family.md +280 -0
  107. package/docs/ai-sdk.md +70 -61
  108. package/docs/architecture/overview.md +17 -7
  109. package/docs/browser.md +203 -8
  110. package/docs/embeddings.md +156 -0
  111. package/docs/gerbil-site-native-migration.md +217 -0
  112. package/docs/gpu-engine/architectures.md +398 -0
  113. package/docs/gpu-engine/ir.md +372 -0
  114. package/docs/gpu-engine/kernels.md +718 -0
  115. package/docs/gpu-engine/paper.html +1759 -0
  116. package/docs/gpu-engine/paper.md +2109 -0
  117. package/docs/gpu-engine/safetensors.md +312 -0
  118. package/docs/gpu-engine/tokenizer.md +302 -0
  119. package/docs/memory-rag.md +91 -0
  120. package/docs/metal-safari-intel.md +190 -0
  121. package/docs/mobile-failure-diagnosis.md +124 -0
  122. package/docs/mobile.md +99 -0
  123. package/docs/observability.md +230 -0
  124. package/docs/onnx-removal-plan.md +339 -0
  125. package/docs/research/autoresearch-portable.md +904 -0
  126. package/docs/research/dispatch-reduction-hivemind.md +84 -0
  127. package/docs/research/ios-safari-model-caching.md +117 -0
  128. package/docs/research/mobile-webgpu-speed-fusion.md +135 -0
  129. package/docs/research/native-stt-model-selection.md +49 -0
  130. package/docs/research/native-tts-model-selection.md +90 -0
  131. package/docs/research/native-vs-chromium-decision.md +152 -0
  132. package/docs/research/nemotron-mamba2-inference.md +910 -0
  133. package/docs/research/qwen35-multimodal.md +293 -0
  134. package/docs/research/qwen36-gemma4-targets.md +337 -0
  135. package/docs/research/sota-embedding-models.md +179 -0
  136. package/docs/research/sota-mobile-models-2026.md +263 -0
  137. package/docs/research/sota-modality-models.md +202 -0
  138. package/docs/research/tps-baselines.md +71 -0
  139. package/docs/research/webgpu-m4-reference.md +104 -0
  140. package/docs/site-update-plan.md +155 -0
  141. package/docs/structured-output.md +123 -0
  142. package/docs/stt.md +63 -446
  143. package/docs/tts.md +77 -499
  144. package/docs/vision.md +100 -338
  145. package/package.json +22 -7
  146. package/dist/chrome-backend-CORwaIyC.mjs +0 -1212
  147. package/dist/chrome-backend-CORwaIyC.mjs.map +0 -1
  148. package/dist/chrome-backend-DIKYoWj-.mjs +0 -3
  149. package/dist/gerbil-CJ3ifloF.mjs +0 -4
  150. package/dist/gerbil-Dw4Qj77e.mjs +0 -1631
  151. package/dist/gerbil-Dw4Qj77e.mjs.map +0 -1
  152. package/dist/gerbil-qOTe1nl2.d.mts +0 -431
  153. package/dist/gerbil-qOTe1nl2.d.mts.map +0 -1
  154. package/dist/kokoro-BNTb6egA.mjs +0 -20210
  155. package/dist/kokoro-BNTb6egA.mjs.map +0 -1
  156. package/dist/kokoro-DFRQ1OeM.js +0 -20212
  157. package/dist/kokoro-DFRQ1OeM.js.map +0 -1
  158. package/dist/mcp-BvbriaBy.mjs.map +0 -1
  159. package/dist/one-liner-s-lD8rCC.mjs.map +0 -1
  160. package/dist/repl-DveXw36T.mjs +0 -9
  161. package/dist/skills-CD3Orlex.mjs.map +0 -1
  162. package/dist/stt-CpLYbGFd.mjs +0 -433
  163. package/dist/stt-CpLYbGFd.mjs.map +0 -1
  164. package/dist/stt-DRPLEEHB.mjs +0 -3
  165. package/dist/stt-Te8Qz-Ay.js +0 -433
  166. package/dist/stt-Te8Qz-Ay.js.map +0 -1
  167. package/dist/tools-Bi1P7Xoy.mjs.map +0 -1
  168. package/dist/transformers.web-DokyH3rP.js +0 -3
  169. package/dist/transformers.web-M6mCnEYJ.js +0 -30382
  170. package/dist/transformers.web-M6mCnEYJ.js.map +0 -1
  171. package/dist/tts-C0xx3CtE.js +0 -724
  172. package/dist/tts-C0xx3CtE.js.map +0 -1
  173. package/dist/tts-DXgsKGCe.mjs +0 -3
  174. package/dist/tts-DeGANMNV.mjs +0 -730
  175. package/dist/tts-DeGANMNV.mjs.map +0 -1
  176. package/dist/types-CiTc7ez3.d.mts.map +0 -1
  177. /package/dist/{auto-update-S9s5-g0C.mjs → auto-update-BVaLXcDE.mjs} +0 -0
  178. /package/dist/{chunk-CkXuGtQK.mjs → chunk-B9cbKln6.mjs} +0 -0
  179. /package/dist/{microphone-DaMZFRuR.mjs → microphone-Bqmoz9_K.mjs} +0 -0
package/dist/index.mjs CHANGED
@@ -1,14 +1,19 @@
1
- import { a as ResponseCache, c as getGlobalCache, i as resolveModel, n as BUILTIN_MODELS, o as clearGlobalCache, r as listBuiltinModels, s as configureGlobalCache, t as Gerbil } from "./gerbil-Dw4Qj77e.mjs";
2
- import { n as getChromeCachedModels, r as refreshCachedModelSizes, t as ChromeGPUBackend } from "./chrome-backend-CORwaIyC.mjs";
3
- import "./utils-CZBZ8dgR.mjs";
4
- import { c as stream, i as generate, n as embed, o as json, r as embedBatch, s as one_liner_default, t as dispose } from "./one-liner-s-lD8rCC.mjs";
5
- import { i as resampleAudio, n as WhisperSTT, r as decodeWav, t as WHISPER_MODELS } from "./stt-CpLYbGFd.mjs";
6
- import { a as TTS_MODELS, c as listTTSModels, n as KokoroTTS, s as getTTSModelConfig, t as KOKORO_VOICES } from "./tts-DeGANMNV.mjs";
1
+ import { a as resolveModel, c as configureGlobalCache, i as listBuiltinModels, l as getGlobalCache, n as BUILTIN_MODELS, o as ResponseCache, r as DEFAULT_MODEL, s as clearGlobalCache, t as Gerbil } from "./gerbil-BHrJJIa4.mjs";
2
+ import "./utils-DKO55ZmZ.mjs";
3
+ import { a as generateObject, c as one_liner_default, i as generate, l as stream, n as embed, r as embedBatch, s as json, t as dispose } from "./one-liner-DnQn7HJK.mjs";
4
+ import { t as DEFAULT_MODELS } from "./defaults-9komdrbY.mjs";
5
+ import "./architectures-C1I5V3Dt.mjs";
6
+ import { t as WebGPUEngine, y as KaniTTS } from "./gpu-33qCAtHW.mjs";
7
+ import { t as MoonshineSTT } from "./moonshine-stt-v_P_Ci_m.mjs";
8
+ import { a as createInMemoryStore, n as createMemory, t as Memory } from "./memory-Dj0J1v88.mjs";
9
+ import { n as createFileStore, r as createGerbilEmbedder } from "./memory-DVN0MnIG.mjs";
10
+ import "./vector-B0panuy6.mjs";
11
+ import { n as createIndexedDBStore } from "./indexeddb-store-BWIMtxxH.mjs";
7
12
 
8
13
  //#region src/index.ts
9
14
  var src_default = one_liner_default;
10
- const VERSION = "0.1.0";
15
+ const VERSION = "1.0.0";
11
16
 
12
17
  //#endregion
13
- export { BUILTIN_MODELS, ChromeGPUBackend, Gerbil, KOKORO_VOICES, KokoroTTS, ResponseCache, TTS_MODELS, VERSION, WHISPER_MODELS, WhisperSTT, clearGlobalCache, configureGlobalCache, decodeWav, src_default as default, dispose, embed, embedBatch, generate, getChromeCachedModels, getGlobalCache, getTTSModelConfig, json, listBuiltinModels, listTTSModels, refreshCachedModelSizes, resampleAudio, resolveModel, stream };
18
+ export { BUILTIN_MODELS, DEFAULT_MODEL, DEFAULT_MODELS, Gerbil, KaniTTS, Memory, MoonshineSTT, ResponseCache, VERSION, WebGPUEngine, clearGlobalCache, configureGlobalCache, createFileStore, createGerbilEmbedder, createInMemoryStore, createIndexedDBStore, createMemory, src_default as default, dispose, embed, embedBatch, generate, generateObject, getGlobalCache, json, listBuiltinModels, resolveModel, stream };
14
19
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["gerbil"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * Gerbil - Local LLM inference for Node.js\n *\n * @example Standalone\n * ```ts\n * import { Gerbil } from \"gerbil\";\n *\n * const g = new Gerbil();\n * await g.loadModel(\"qwen3-0.6b\");\n *\n * const result = await g.generate(\"Write a haiku\");\n * console.log(result.text);\n * ```\n *\n * @example One-liner\n * ```ts\n * import gerbil from \"gerbil\";\n *\n * const text = await gerbil(\"Write a haiku\");\n * ```\n *\n * @example AI SDK\n * ```ts\n * import { generateText } from \"ai\";\n * import { gerbil } from \"gerbil/ai\";\n *\n * const { text } = await generateText({\n * model: gerbil(\"qwen3-0.6b\"),\n * prompt: \"Write a haiku\",\n * });\n * ```\n *\n * @example Skills\n * ```ts\n * import { commit, summarize, explain, defineSkill } from \"gerbil/skills\";\n *\n * const msg = await commit({ type: \"conventional\" });\n * const summary = await summarize({ content: document });\n * ```\n */\n\nexport {\n clearGlobalCache,\n configureGlobalCache,\n getGlobalCache,\n ResponseCache,\n} from \"./core/cache.js\";\nexport {\n ChromeGPUBackend,\n getChromeCachedModels,\n refreshCachedModelSizes,\n} from \"./core/chrome-backend.js\";\n// Core\nexport { Gerbil } from \"./core/gerbil.js\";\nexport { BUILTIN_MODELS, listBuiltinModels, resolveModel } from \"./core/models.js\";\n// One-liner API\nexport { dispose, embed, embedBatch, generate, json, stream } from \"./core/one-liner.js\";\n// STT (Speech-to-Text)\nexport { decodeWav, resampleAudio, WHISPER_MODELS, WhisperSTT } from \"./core/stt.js\";\n// TTS (Text-to-Speech)\nexport {\n getTTSModelConfig,\n KOKORO_VOICES,\n KokoroTTS,\n listTTSModels,\n TTS_MODELS,\n} from \"./core/tts.js\";\n\nimport gerbil from \"./core/one-liner.js\";\nexport default gerbil;\n\n// Types\nexport type {\n // TTS types\n AudioChunk,\n CacheConfig,\n EmbedOptions,\n EmbedResult,\n FallbackConfig,\n // Generation types\n GenerateOptions,\n GenerateResult,\n // Config types\n GerbilConfig,\n // Provider types\n GerbilModelSettings,\n GerbilProviderSettings,\n // Vision types\n ImageInput,\n JsonOptions,\n // Load types\n LoadOptions,\n LoadSTTOptions,\n LoadTTSOptions,\n // Model types\n ModelConfig,\n ModelSource,\n ModelStats,\n ProgressInfo,\n // Stats types\n SessionStats,\n SpeakOptions,\n SpeakResult,\n // STT types\n STTModelConfig,\n StreamingTranscriptionOptions,\n StreamingTranscriptionSession,\n SystemInfo,\n TranscribeOptions,\n TranscribeResult,\n TranscribeSegment,\n TTSModelConfig,\n VoiceInfo,\n} from \"./core/types.js\";\n\n// Note: Task/Skill types are now in \"gerbil/skills\"\n// import { CommitInput, SummarizeInput, ... } from \"gerbil/skills\";\n\n// Version\nexport const VERSION = \"0.1.0\";\n"],"mappings":";;;;;;;;AAqEA,kBAAeA;AAkDf,MAAa,UAAU"}
1
+ {"version":3,"file":"index.mjs","names":["gerbil"],"sources":["../src/index.ts"],"sourcesContent":["/**\n * Gerbil - Local LLM inference for Node.js\n *\n * @example Standalone\n * ```ts\n * import { Gerbil } from \"gerbil\";\n *\n * const g = new Gerbil();\n * await g.loadModel(\"qwen3.5-0.8b\");\n *\n * const result = await g.generate(\"Write a haiku\");\n * console.log(result.text);\n * ```\n *\n * @example One-liner\n * ```ts\n * import gerbil from \"gerbil\";\n *\n * const text = await gerbil(\"Write a haiku\");\n * ```\n *\n * @example AI SDK\n * ```ts\n * import { generateText } from \"ai\";\n * import { gerbil } from \"gerbil/ai\";\n *\n * const { text } = await generateText({\n * model: gerbil(\"qwen3.5-0.8b\"),\n * prompt: \"Write a haiku\",\n * });\n * ```\n *\n * @example Skills\n * ```ts\n * import { commit, summarize, explain, defineSkill } from \"gerbil/skills\";\n *\n * const msg = await commit({ type: \"conventional\" });\n * const summary = await summarize({ content: document });\n * ```\n */\n\nexport {\n clearGlobalCache,\n configureGlobalCache,\n getGlobalCache,\n ResponseCache,\n} from \"./core/cache.js\";\n// Core\nexport { Gerbil } from \"./core/gerbil.js\";\nexport {\n BUILTIN_MODELS,\n DEFAULT_MODEL,\n listBuiltinModels,\n resolveModel,\n} from \"./core/models.js\";\n// One-liner API\nexport {\n dispose,\n embed,\n embedBatch,\n generate,\n generateObject,\n json,\n stream,\n} from \"./core/one-liner.js\";\n// Native WebGPU engine (pure compute shaders — no ONNX runtime)\nexport { DEFAULT_MODELS } from \"./gpu/defaults.js\";\nexport {\n type GenerateObjectOptions,\n type GenerateObjectResult,\n type ObjectSchema,\n type ObjectValidator,\n WebGPUEngine,\n} from \"./gpu/index.js\";\n// Native TTS (Text-to-Speech) — Kani-TTS-2 codec LM on WebGPU\nexport {\n KaniTTS,\n type KaniTTSOptions,\n} from \"./gpu/kani-tts.js\";\n// Native STT (Speech-to-Text) — Moonshine encoder-decoder on WebGPU\nexport {\n MoonshineSTT,\n type MoonshineSTTOptions,\n} from \"./gpu/moonshine-stt.js\";\n\nimport gerbil from \"./core/one-liner.js\";\nexport default gerbil;\n\n// Types\nexport type {\n // TTS types\n AudioChunk,\n CacheConfig,\n // Concurrency types\n ConcurrencyConfig,\n EmbedOptions,\n EmbedResult,\n // Telemetry types\n ErrorContext,\n FallbackConfig,\n GenerateEvent,\n // Generation types\n GenerateOptions,\n GenerateResult,\n // Config types\n GerbilConfig,\n // Provider types\n GerbilModelSettings,\n GerbilProviderSettings,\n // Vision types\n ImageInput,\n JsonOptions,\n // Load types\n LoadOptions,\n LoadSTTOptions,\n LoadTTSOptions,\n // Model types\n ModelConfig,\n ModelLoadEvent,\n ModelSource,\n ModelStats,\n PreloadOptions,\n ProgressInfo,\n // Search/Similarity types\n SearchResult,\n // Stats types\n SessionStats,\n SimilarityResult,\n SpeakOptions,\n SpeakResult,\n // STT types\n STTModelConfig,\n StreamingTranscriptionOptions,\n StreamingTranscriptionSession,\n SystemInfo,\n TelemetryConfig,\n TranscribeOptions,\n TranscribeResult,\n TranscribeSegment,\n TTSModelConfig,\n VoiceInfo,\n} from \"./core/types.js\";\n// Memory / RAG types (full surface available at \"gerbil/memory\")\nexport type {\n AddOptions,\n Embedder,\n MemoryExport,\n MemoryMetadata,\n MemoryOptions,\n MemoryRecord,\n MemorySearchResult,\n MemoryStore,\n RecallOptions,\n RecallResult,\n Redactor,\n SearchOptions as MemorySearchOptions,\n} from \"./memory/index.js\";\n// Memory / RAG (full surface available at \"gerbil/memory\")\nexport {\n createFileStore,\n createGerbilEmbedder,\n createIndexedDBStore,\n createInMemoryStore,\n createMemory,\n Memory,\n} from \"./memory/index.js\";\n\n// Note: Task/Skill types are now in \"gerbil/skills\"\n// import { CommitInput, SummarizeInput, ... } from \"gerbil/skills\";\n\n// Version\nexport const VERSION = \"1.0.0\";\n"],"mappings":";;;;;;;;;;;;;AAsFA,kBAAeA;AAqFf,MAAa,UAAU"}
@@ -0,0 +1,103 @@
1
+ import { a as deserializeRecord, i as topK, o as matchesFilter, s as serializeRecord } from "./vector-B0panuy6.mjs";
2
+
3
+ //#region src/memory/stores/indexeddb-store.ts
4
+ /**
5
+ * IndexedDB-backed {@link MemoryStore} for durable browser memory.
6
+ *
7
+ * Records persist across sessions. Embeddings are kept as plain number arrays
8
+ * in the object store (structured-clone friendly) and rehydrated to
9
+ * {@link Float32Array} on read. Search loads candidates and ranks them with
10
+ * the same brute-force cosine scan as the in-memory store — fine for the
11
+ * thousands-of-records scale this targets; see follow-ups for HNSW at scale.
12
+ */
13
+ const DEFAULT_DB_NAME = "gerbil-memory";
14
+ const DEFAULT_STORE_NAME = "records";
15
+ const DEFAULT_K = 5;
16
+ function promisifyRequest(request) {
17
+ return new Promise((resolve, reject) => {
18
+ request.onsuccess = () => resolve(request.result);
19
+ request.onerror = () => reject(request.error);
20
+ });
21
+ }
22
+ /** Durable IndexedDB vector store. */
23
+ var IndexedDBStore = class {
24
+ dbName;
25
+ storeName;
26
+ factory;
27
+ dbPromise = null;
28
+ constructor(options = {}) {
29
+ this.dbName = options.dbName ?? DEFAULT_DB_NAME;
30
+ this.storeName = options.storeName ?? DEFAULT_STORE_NAME;
31
+ const factory = options.indexedDB ?? globalThis.indexedDB;
32
+ if (!factory) throw new Error("IndexedDB is not available. Pass an `indexedDB` factory (e.g. fake-indexeddb) to use IndexedDBStore outside a browser.");
33
+ this.factory = factory;
34
+ }
35
+ openDb() {
36
+ if (!this.dbPromise) this.dbPromise = new Promise((resolve, reject) => {
37
+ const request = this.factory.open(this.dbName, 1);
38
+ request.onupgradeneeded = () => {
39
+ const db = request.result;
40
+ if (!db.objectStoreNames.contains(this.storeName)) db.createObjectStore(this.storeName, { keyPath: "id" });
41
+ };
42
+ request.onsuccess = () => resolve(request.result);
43
+ request.onerror = () => reject(request.error);
44
+ });
45
+ return this.dbPromise;
46
+ }
47
+ async tx(mode) {
48
+ return (await this.openDb()).transaction(this.storeName, mode).objectStore(this.storeName);
49
+ }
50
+ async add(record) {
51
+ await promisifyRequest((await this.tx("readwrite")).put(serializeRecord(record)));
52
+ }
53
+ async addMany(records) {
54
+ const store = await this.tx("readwrite");
55
+ await Promise.all(records.map((record) => promisifyRequest(store.put(serializeRecord(record)))));
56
+ }
57
+ async get(id) {
58
+ const raw = await promisifyRequest((await this.tx("readonly")).get(id));
59
+ return raw ? deserializeRecord(raw) : void 0;
60
+ }
61
+ async all() {
62
+ return (await promisifyRequest((await this.tx("readonly")).getAll())).map(deserializeRecord);
63
+ }
64
+ async search(queryVector, options = {}) {
65
+ const k = options.k ?? DEFAULT_K;
66
+ const records = await this.all();
67
+ const candidates = [];
68
+ for (const record of records) {
69
+ if (!record.embedding) continue;
70
+ if (!matchesFilter(record.metadata, options.filter)) continue;
71
+ candidates.push({
72
+ item: record,
73
+ vector: record.embedding
74
+ });
75
+ }
76
+ return topK(queryVector, candidates, k, options.minScore).map((entry) => ({
77
+ record: entry.item,
78
+ score: entry.score
79
+ }));
80
+ }
81
+ async delete(id) {
82
+ if (!await this.get(id)) return false;
83
+ await promisifyRequest((await this.tx("readwrite")).delete(id));
84
+ return true;
85
+ }
86
+ async list(filter) {
87
+ return (await this.all()).filter((record) => matchesFilter(record.metadata, filter));
88
+ }
89
+ async clear() {
90
+ await promisifyRequest((await this.tx("readwrite")).clear());
91
+ }
92
+ async size() {
93
+ return await promisifyRequest((await this.tx("readonly")).count());
94
+ }
95
+ };
96
+ /** Create an {@link IndexedDBStore}. */
97
+ function createIndexedDBStore(options = {}) {
98
+ return new IndexedDBStore(options);
99
+ }
100
+
101
+ //#endregion
102
+ export { createIndexedDBStore as n, IndexedDBStore as t };
103
+ //# sourceMappingURL=indexeddb-store-BWIMtxxH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexeddb-store-BWIMtxxH.mjs","names":["candidates: { item: MemoryRecord; vector: Float32Array }[]"],"sources":["../src/memory/stores/indexeddb-store.ts"],"sourcesContent":["/**\n * IndexedDB-backed {@link MemoryStore} for durable browser memory.\n *\n * Records persist across sessions. Embeddings are kept as plain number arrays\n * in the object store (structured-clone friendly) and rehydrated to\n * {@link Float32Array} on read. Search loads candidates and ranks them with\n * the same brute-force cosine scan as the in-memory store — fine for the\n * thousands-of-records scale this targets; see follow-ups for HNSW at scale.\n */\n\nimport { deserializeRecord, matchesFilter, serializeRecord } from \"../serialize.js\";\nimport type {\n MemoryRecord,\n MemorySearchResult,\n MemoryStore,\n MetadataFilter,\n SerializedRecord,\n StoreSearchOptions,\n} from \"../types.js\";\nimport { type Scored, topK } from \"../vector.js\";\n\nconst DEFAULT_DB_NAME = \"gerbil-memory\";\nconst DEFAULT_STORE_NAME = \"records\";\nconst DEFAULT_K = 5;\n\n/** Options for {@link createIndexedDBStore}. */\nexport type IndexedDBStoreOptions = {\n /** Database name (default \"gerbil-memory\"). */\n dbName?: string;\n /** Object store name (default \"records\"). */\n storeName?: string;\n /**\n * IndexedDB factory. Defaults to the global `indexedDB` in browsers.\n * Inject a shim (e.g. fake-indexeddb) to use this store under Node.\n */\n indexedDB?: IDBFactory;\n};\n\nfunction promisifyRequest<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\n/** Durable IndexedDB vector store. */\nexport class IndexedDBStore implements MemoryStore {\n private readonly dbName: string;\n private readonly storeName: string;\n private readonly factory: IDBFactory;\n private dbPromise: Promise<IDBDatabase> | null = null;\n\n constructor(options: IndexedDBStoreOptions = {}) {\n this.dbName = options.dbName ?? DEFAULT_DB_NAME;\n this.storeName = options.storeName ?? DEFAULT_STORE_NAME;\n const factory = options.indexedDB ?? globalThis.indexedDB;\n if (!factory) {\n throw new Error(\n \"IndexedDB is not available. Pass an `indexedDB` factory (e.g. fake-indexeddb) to use IndexedDBStore outside a browser.\",\n );\n }\n this.factory = factory;\n }\n\n private openDb(): Promise<IDBDatabase> {\n if (!this.dbPromise) {\n this.dbPromise = new Promise((resolve, reject) => {\n const request = this.factory.open(this.dbName, 1);\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName, { keyPath: \"id\" });\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n }\n return this.dbPromise;\n }\n\n private async tx(mode: IDBTransactionMode): Promise<IDBObjectStore> {\n const db = await this.openDb();\n return db.transaction(this.storeName, mode).objectStore(this.storeName);\n }\n\n async add(record: MemoryRecord): Promise<void> {\n const store = await this.tx(\"readwrite\");\n await promisifyRequest(store.put(serializeRecord(record)));\n }\n\n async addMany(records: MemoryRecord[]): Promise<void> {\n const store = await this.tx(\"readwrite\");\n await Promise.all(\n records.map((record) => promisifyRequest(store.put(serializeRecord(record)))),\n );\n }\n\n async get(id: string): Promise<MemoryRecord | undefined> {\n const store = await this.tx(\"readonly\");\n const raw = await promisifyRequest<SerializedRecord | undefined>(store.get(id));\n return raw ? deserializeRecord(raw) : undefined;\n }\n\n private async all(): Promise<MemoryRecord[]> {\n const store = await this.tx(\"readonly\");\n const raw = await promisifyRequest<SerializedRecord[]>(store.getAll());\n return raw.map(deserializeRecord);\n }\n\n async search(\n queryVector: Float32Array,\n options: StoreSearchOptions = {},\n ): Promise<MemorySearchResult[]> {\n const k = options.k ?? DEFAULT_K;\n const records = await this.all();\n const candidates: { item: MemoryRecord; vector: Float32Array }[] = [];\n for (const record of records) {\n if (!record.embedding) {\n continue;\n }\n if (!matchesFilter(record.metadata, options.filter)) {\n continue;\n }\n candidates.push({ item: record, vector: record.embedding });\n }\n const ranked: Scored<MemoryRecord>[] = topK(queryVector, candidates, k, options.minScore);\n return ranked.map((entry) => ({ record: entry.item, score: entry.score }));\n }\n\n async delete(id: string): Promise<boolean> {\n const existing = await this.get(id);\n if (!existing) {\n return false;\n }\n const store = await this.tx(\"readwrite\");\n await promisifyRequest(store.delete(id));\n return true;\n }\n\n async list(filter?: MetadataFilter): Promise<MemoryRecord[]> {\n const records = await this.all();\n return records.filter((record) => matchesFilter(record.metadata, filter));\n }\n\n async clear(): Promise<void> {\n const store = await this.tx(\"readwrite\");\n await promisifyRequest(store.clear());\n }\n\n async size(): Promise<number> {\n const store = await this.tx(\"readonly\");\n return await promisifyRequest<number>(store.count());\n }\n}\n\n/** Create an {@link IndexedDBStore}. */\nexport function createIndexedDBStore(options: IndexedDBStoreOptions = {}): MemoryStore {\n return new IndexedDBStore(options);\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import "./vector-B0panuy6.mjs";
2
+ import { n as createIndexedDBStore, t as IndexedDBStore } from "./indexeddb-store-BWIMtxxH.mjs";
3
+
4
+ export { IndexedDBStore, createIndexedDBStore };
@@ -1,5 +1,5 @@
1
- import { b as STTModelConfig, g as ModelConfig, l as GerbilModelSettings, u as GerbilProviderSettings } from "../types-CiTc7ez3.mjs";
2
- import { LanguageModelV2, LanguageModelV2CallOptions, LanguageModelV2CallWarning, LanguageModelV2Content, LanguageModelV2FinishReason, LanguageModelV2StreamPart, LanguageModelV2Usage, SpeechModelV2, SpeechModelV2CallOptions, SpeechModelV2CallWarning, TranscriptionModelV2, TranscriptionModelV2CallOptions, TranscriptionModelV2CallWarning } from "@ai-sdk/provider";
1
+ import { T as STTModelConfig, f as GerbilModelSettings, p as GerbilProviderSettings, y as ModelConfig } from "../types-D6FiR_oh.mjs";
2
+ import { EmbeddingModelV2, LanguageModelV2, LanguageModelV2CallOptions, LanguageModelV2CallWarning, LanguageModelV2Content, LanguageModelV2FinishReason, LanguageModelV2StreamPart, LanguageModelV2Usage, SpeechModelV2, SpeechModelV2CallOptions, SpeechModelV2CallWarning, TranscriptionModelV2, TranscriptionModelV2CallOptions, TranscriptionModelV2CallWarning } from "@ai-sdk/provider";
3
3
 
4
4
  //#region src/integrations/ai-sdk.d.ts
5
5
 
@@ -103,11 +103,46 @@ declare class GerbilTranscriptionModel implements TranscriptionModelV2 {
103
103
  };
104
104
  }>;
105
105
  }
106
+ /** Settings for Gerbil embedding model */
107
+ interface GerbilEmbeddingSettings {
108
+ /** Normalize embeddings (default: true) */
109
+ normalize?: boolean;
110
+ }
111
+ /** Default embedding models */
112
+ declare const EMBEDDING_MODELS: {
113
+ id: string;
114
+ repo: string;
115
+ description: string;
116
+ dimensions: number;
117
+ }[];
118
+ declare class GerbilEmbeddingModel implements EmbeddingModelV2<string> {
119
+ readonly specificationVersion: "v2";
120
+ readonly provider = "gerbil";
121
+ readonly modelId: string;
122
+ readonly maxEmbeddingsPerCall: number;
123
+ readonly supportsParallelCalls = false;
124
+ private instance;
125
+ private readonly settings;
126
+ private loadPromise;
127
+ constructor(modelId: string, settings?: GerbilEmbeddingSettings);
128
+ private getRepo;
129
+ private ensureLoaded;
130
+ doEmbed(options: {
131
+ values: string[];
132
+ abortSignal?: AbortSignal;
133
+ }): Promise<{
134
+ embeddings: number[][];
135
+ usage?: {
136
+ tokens: number;
137
+ };
138
+ }>;
139
+ }
106
140
  type GerbilProvider = {
107
141
  (modelId: string, settings?: GerbilModelSettings): GerbilLanguageModel;
108
142
  languageModel(modelId: string, settings?: GerbilModelSettings): GerbilLanguageModel;
109
143
  speech(modelId?: string, settings?: GerbilSpeechSettings): GerbilSpeechModel;
110
144
  transcription(modelId?: string, settings?: GerbilTranscriptionSettings): GerbilTranscriptionModel;
145
+ embedding(modelId?: string, settings?: GerbilEmbeddingSettings): GerbilEmbeddingModel;
111
146
  listModels(): ModelConfig[];
112
147
  getModel(modelId: string): ModelConfig | undefined;
113
148
  listVoices(): Array<{
@@ -117,17 +152,33 @@ type GerbilProvider = {
117
152
  language: string;
118
153
  }>;
119
154
  listTranscriptionModels(): STTModelConfig[];
155
+ listEmbeddingModels(): typeof EMBEDDING_MODELS;
156
+ /**
157
+ * Preload a model (download without initializing)
158
+ *
159
+ * @param modelId - Model to preload
160
+ * @param options.keepLoaded - Keep model in memory for instant generateText() calls
161
+ */
162
+ preload(modelId: string, options?: {
163
+ onProgress?: (info: {
164
+ status: string;
165
+ progress?: number;
166
+ }) => void;
167
+ keepLoaded?: boolean;
168
+ }): Promise<void>;
169
+ /** Check if a model is cached */
170
+ isCached(modelId: string): Promise<boolean>;
120
171
  };
121
172
  /**
122
173
  * Create a Gerbil provider
123
174
  *
124
175
  * @example
125
176
  * ```ts
126
- * const local = createGerbil({ device: "gpu", dtype: "q4" });
177
+ * const local = createGerbil({ device: "webgpu", dtype: "q4" });
127
178
  *
128
179
  * // Text generation
129
180
  * const { text } = await generateText({
130
- * model: local("qwen3-0.6b"),
181
+ * model: local("qwen3.5-0.8b"),
131
182
  * prompt: "Hello",
132
183
  * });
133
184
  *
@@ -155,7 +206,7 @@ declare function createGerbil(options?: GerbilProviderSettings): GerbilProvider;
155
206
  * import { gerbil } from "gerbil/ai";
156
207
  *
157
208
  * const { text } = await generateText({
158
- * model: gerbil("qwen3-0.6b"),
209
+ * model: gerbil("qwen3.5-0.8b"),
159
210
  * prompt: "Hello",
160
211
  * });
161
212
  * ```
@@ -189,8 +240,26 @@ declare function createGerbil(options?: GerbilProviderSettings): GerbilProvider;
189
240
  * console.log(transcript.text);
190
241
  * console.log(transcript.segments); // Timestamped segments
191
242
  * ```
243
+ *
244
+ * @example Embeddings
245
+ * ```ts
246
+ * import { embed, embedMany } from "ai";
247
+ * import { gerbil } from "gerbil/ai";
248
+ *
249
+ * // Single embedding
250
+ * const { embedding } = await embed({
251
+ * model: gerbil.embedding(), // all-MiniLM-L6-v2 by default
252
+ * value: "Hello world",
253
+ * });
254
+ *
255
+ * // Multiple embeddings
256
+ * const { embeddings } = await embedMany({
257
+ * model: gerbil.embedding(),
258
+ * values: ["Hello", "World", "How are you?"],
259
+ * });
260
+ * ```
192
261
  */
193
262
  declare const gerbil: GerbilProvider;
194
263
  //#endregion
195
- export { GerbilProvider, GerbilSpeechSettings, GerbilTranscriptionSettings, createGerbil, gerbil as default, gerbil };
264
+ export { EMBEDDING_MODELS, GerbilEmbeddingSettings, GerbilProvider, GerbilSpeechSettings, GerbilTranscriptionSettings, createGerbil, gerbil as default, gerbil };
196
265
  //# sourceMappingURL=ai-sdk.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ai-sdk.d.mts","names":[],"sources":["../../src/integrations/ai-sdk.ts"],"sourcesContent":[],"mappings":";;;;;cAwDM,mBAAA,YAA+B,eAsJe,CAAA;EAtJf,SAAA,oBAAA,EAAA,IAAA;EAAe,SAAA,QAAA,GAAA,QAAA;EAsOnC,SAAA,OAAA,EAAA,MAAoB;EAO/B,SAAA,aAAkB,EAvOE,MAuOF,CAAA,MAAA,EAvOiB,MAuOjB,EAAA,CAAA;EASiB,QAAA,QAAA;EAoBb,iBAAA,QAAA;EACjB,iBAAA,gBAAA;EACG,QAAA,WAAA;EAEa,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EA/Pb,mBA+Pa,EAAA,gBAAA,EA9PL,sBA8PK;EAJ4B,QAAA,YAAA;EA7BpB,QAAA,aAAA;EAAa,QAAA,eAAA;EAoI/B,UAAA,CAAA,OAAA,EA3QW,0BA2QgB,CAAA,EA3QU,OA2QV,CAAA;IAKtC,OAAA,wBAAyB,EAAA;IASU,YAAA,6BAAA;IAoBb,KAAA,sBAAA;IAEd,OAAA,EAAA;MAOA,IAAA,EAAA;QAGG,KAAA,EAAA,MAAA;QAZ6C,MAAA,EAAA,MAAA;MA7BpB,CAAA;IAAoB,CAAA;IAiHlD,QAAA,4BAAc,EAAA;EACK,CAAA,CAAA;EAAsB,QAAA,CAAA,OAAA,EAlV3B,0BAkV2B,CAAA,EAlVD,OAkVC,CAAA;IACT,MAAA,gBAAA,0BAAA,CAAA;IAAsB,OAAA,EAAA;MAC5B,IAAA,EAAA;QAAuB,KAAA,EAAA,MAAA;QAChB,MAAA,EAAA,MAAA;MAA8B,CAAA;IAC3D,CAAA;EACa,CAAA,CAAA;;;AAEc,UAzQ1B,oBAAA,CAyQ0B;EA8B3B;EA4EH,KAAA,CAAA,EAAA,MAAuB;;;;cA5W9B,iBAAA,YAA6B;;;;;;;0CASM;;sBAoBb,2BAA2B;WAC5C;cACG;;;;;iBAEa;;;;;;;;;;UAmGV,2BAAA;;;;cAKX,wBAAA,YAAoC;;;;;;;0CASD;;sBAoBb,kCAAkC;;cAEhD;;;;;;;cAOA;;;;;iBAGG;;;;;KAwEL,cAAA;+BACmB,sBAAsB;4CACT,sBAAsB;sCAC5B,uBAAuB;6CAChB,8BAA8B;gBAC3D;6BACa;gBACb;;;;;;6BACa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8Bb,YAAA,WAAsB,yBAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA4EvD,QAAM"}
1
+ {"version":3,"file":"ai-sdk.d.mts","names":[],"sources":["../../src/integrations/ai-sdk.ts"],"sourcesContent":[],"mappings":";;;;;cAiFM,mBAAA,YAA+B,eAsJe,CAAA;EAtJf,SAAA,oBAAA,EAAA,IAAA;EAAe,SAAA,QAAA,GAAA,QAAA;EAsOnC,SAAA,OAAA,EAAA,MAAoB;EAO/B,SAAA,aAAkB,EAvOE,MAuOF,CAAA,MAAA,EAvOiB,MAuOjB,EAAA,CAAA;EASiB,QAAA,QAAA;EAoBb,iBAAA,QAAA;EACjB,iBAAA,gBAAA;EACG,QAAA,WAAA;EAEa,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EA/Pb,mBA+Pa,EAAA,gBAAA,EA9PL,sBA8PK;EAJ4B,QAAA,YAAA;EA7BpB,QAAA,aAAA;EAAa,QAAA,eAAA;EAoI/B,UAAA,CAAA,OAAA,EA3QW,0BA2QgB,CAAA,EA3QU,OA2QV,CAAA;IAKtC,OAAA,wBAAyB,EAAA;IASU,YAAA,6BAAA;IAoBb,KAAA,sBAAA;IAEd,OAAA,EAAA;MAOA,IAAA,EAAA;QAGG,KAAA,EAAA,MAAA;QAZ6C,MAAA,EAAA,MAAA;MA7BpB,CAAA;IAAoB,CAAA;IAkH7C,QAAA,4BAAuB,EAAA;EAM3B,CAAA,CAAA;EAqBP,QAAA,CAAA,OAAA,EA7WoB,0BA6WC,CAAA,EA7WyB,OA6WzB,CAAA;IAWc,MAAA,gBAAA,0BAAA,CAAA;IAwBkB,OAAA,EAAA;MAAgB,IAAA,EAAA;QAnCrC,KAAA,EAAA,MAAA;QAAgB,MAAA,EAAA,MAAA;MAsE1C,CAAA;IACmB,CAAA;EAAsB,CAAA,CAAA;;;AAEf,UAtWrB,oBAAA,CAsWqB;EAAuB;EAChB,KAAA,CAAA,EAAA,MAAA;EAA8B;EAClC,KAAA,CAAA,EAAA,MAAA;;cAjWnC,iBAAA,YAA6B,aAkWnB,CAAA;EACa,SAAA,oBAAA,EAAA,IAAA;EACb,SAAA,QAAA,GAAA,QAAA;EACa,SAAA,OAAA,EAAA,MAAA;EACG,QAAA,QAAA;EAa3B,iBAAA,QAAA;EAEwB,QAAA,WAAA;EAAO,WAAA,CAAA,OAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EA5WK,oBA4WL;EA8BpB,QAAA,YAAY;EAqIf,UAAuB,CAAA,OAAA,EA3fR,wBA2fQ,CAAA,EA3fmB,OA2fnB,CAAA;WA1fzB;cACG;;;;;iBAEa;;;;;;;;;;UAmGV,2BAAA;;;;cAKX,wBAAA,YAAoC;;;;;;;0CASD;;sBAoBb,kCAAkC;;cAEhD;;;;;;;cAOA;;;;;iBAGG;;;;;;UAyEA,uBAAA;;;;;cAMJ;;;;;;cAqBP,oBAAA,YAAgC;;;;;;;;;0CAWG;;;;;kBAwBkB;MAAgB;;;;;;;KAmC/D,cAAA;+BACmB,sBAAsB;4CACT,sBAAsB;sCAC5B,uBAAuB;6CAChB,8BAA8B;yCAClC,0BAA0B;gBACnD;6BACa;gBACb;;;;;;6BACa;gCACG;;;;;;;;;;;;;MAa3B;;6BAEwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8Bb,YAAA,WAAsB,yBAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqIvD,QAAM"}
@@ -1,9 +1,23 @@
1
- import { n as BUILTIN_MODELS, t as Gerbil } from "../gerbil-Dw4Qj77e.mjs";
2
- import "../utils-CZBZ8dgR.mjs";
3
- import { t as WHISPER_MODELS } from "../stt-CpLYbGFd.mjs";
4
- import { t as KOKORO_VOICES } from "../tts-DeGANMNV.mjs";
1
+ import { n as BUILTIN_MODELS, t as Gerbil } from "../gerbil-BHrJJIa4.mjs";
2
+ import "../utils-DKO55ZmZ.mjs";
5
3
 
6
4
  //#region src/integrations/ai-sdk.ts
5
+ const NATIVE_VOICES = [{
6
+ id: "default",
7
+ name: "Default",
8
+ gender: "neutral",
9
+ language: "en-us",
10
+ description: "Kani-TTS-2 native voice"
11
+ }];
12
+ const NATIVE_TRANSCRIPTION_MODELS = [{
13
+ id: "moonshine-base",
14
+ repo: "UsefulSensors/moonshine-base",
15
+ description: "Moonshine native WebGPU STT",
16
+ size: "61M",
17
+ multilingual: false,
18
+ languages: ["en"],
19
+ sampleRate: 16e3
20
+ }];
7
21
  let idCounter = 0;
8
22
  function generateId() {
9
23
  return `gerbil-${Date.now()}-${idCounter += 1}`;
@@ -196,14 +210,14 @@ var GerbilSpeechModel = class {
196
210
  async doGenerate(options) {
197
211
  const warnings = [];
198
212
  const g = await this.ensureLoaded();
199
- let voice = options.voice || this.settings.voice || "af_heart";
200
- if (!KOKORO_VOICES.find((v) => v.id === voice)) {
213
+ let voice = options.voice || this.settings.voice || "default";
214
+ if (!NATIVE_VOICES.find((v) => v.id === voice)) {
201
215
  warnings.push({
202
216
  type: "unsupported-setting",
203
217
  setting: "voice",
204
- details: `Unknown voice "${voice}", using default "af_heart"`
218
+ details: `Unknown voice "${voice}", using default`
205
219
  });
206
- voice = "af_heart";
220
+ voice = "default";
207
221
  }
208
222
  const speed = options.speed ?? this.settings.speed ?? 1;
209
223
  if (options.outputFormat && options.outputFormat !== "wav" && options.outputFormat !== "raw") warnings.push({
@@ -328,16 +342,81 @@ var GerbilTranscriptionModel = class {
328
342
  };
329
343
  }
330
344
  };
345
+ /** Default embedding models */
346
+ const EMBEDDING_MODELS = [
347
+ {
348
+ id: "all-MiniLM-L6-v2",
349
+ repo: "Xenova/all-MiniLM-L6-v2",
350
+ description: "MiniLM L6 v2 - Fast, 384 dimensions",
351
+ dimensions: 384
352
+ },
353
+ {
354
+ id: "bge-small-en-v1.5",
355
+ repo: "Xenova/bge-small-en-v1.5",
356
+ description: "BGE Small EN v1.5 - High quality, 384 dimensions",
357
+ dimensions: 384
358
+ },
359
+ {
360
+ id: "gte-small",
361
+ repo: "Xenova/gte-small",
362
+ description: "GTE Small - General text embeddings, 384 dimensions",
363
+ dimensions: 384
364
+ }
365
+ ];
366
+ var GerbilEmbeddingModel = class {
367
+ specificationVersion = "v2";
368
+ provider = "gerbil";
369
+ modelId;
370
+ maxEmbeddingsPerCall = Infinity;
371
+ supportsParallelCalls = false;
372
+ instance = null;
373
+ settings;
374
+ loadPromise = null;
375
+ constructor(modelId, settings = {}) {
376
+ this.modelId = modelId;
377
+ this.settings = settings;
378
+ }
379
+ getRepo() {
380
+ return EMBEDDING_MODELS.find((m) => m.id === this.modelId)?.repo || this.modelId;
381
+ }
382
+ async ensureLoaded() {
383
+ if (this.instance) return this.instance;
384
+ if (this.loadPromise) {
385
+ await this.loadPromise;
386
+ return this.instance;
387
+ }
388
+ this.instance = new Gerbil();
389
+ return this.instance;
390
+ }
391
+ async doEmbed(options) {
392
+ const g = await this.ensureLoaded();
393
+ const embeddings = [];
394
+ let totalTokens = 0;
395
+ for (const value of options.values) {
396
+ if (options.abortSignal?.aborted) throw new Error("Embedding aborted");
397
+ const result = await g.embed(value, {
398
+ model: this.getRepo(),
399
+ normalize: this.settings.normalize
400
+ });
401
+ embeddings.push(result.vector);
402
+ totalTokens += Math.ceil(value.length / 4);
403
+ }
404
+ return {
405
+ embeddings,
406
+ usage: { tokens: totalTokens }
407
+ };
408
+ }
409
+ };
331
410
  /**
332
411
  * Create a Gerbil provider
333
412
  *
334
413
  * @example
335
414
  * ```ts
336
- * const local = createGerbil({ device: "gpu", dtype: "q4" });
415
+ * const local = createGerbil({ device: "webgpu", dtype: "q4" });
337
416
  *
338
417
  * // Text generation
339
418
  * const { text } = await generateText({
340
- * model: local("qwen3-0.6b"),
419
+ * model: local("qwen3.5-0.8b"),
341
420
  * prompt: "Hello",
342
421
  * });
343
422
  *
@@ -356,22 +435,41 @@ var GerbilTranscriptionModel = class {
356
435
  * ```
357
436
  */
358
437
  function createGerbil(options = {}) {
359
- const createModel = (modelId, settings = {}) => new GerbilLanguageModel(modelId, settings, options);
438
+ const modelCache = /* @__PURE__ */ new Map();
439
+ const createModel = (modelId, settings = {}) => {
440
+ const cached = modelCache.get(modelId);
441
+ if (cached) return cached;
442
+ return new GerbilLanguageModel(modelId, settings, options);
443
+ };
360
444
  const createSpeechModel = (modelId = "kokoro-82m", settings = {}) => new GerbilSpeechModel(modelId, settings);
361
445
  const createTranscriptionModel = (modelId = "whisper-tiny.en", settings = {}) => new GerbilTranscriptionModel(modelId, settings);
446
+ const createEmbeddingModel = (modelId = "all-MiniLM-L6-v2", settings = {}) => new GerbilEmbeddingModel(modelId, settings);
362
447
  const provider = ((modelId, settings) => createModel(modelId, settings ?? {}));
363
448
  provider.languageModel = createModel;
364
449
  provider.speech = createSpeechModel;
365
450
  provider.transcription = createTranscriptionModel;
451
+ provider.embedding = createEmbeddingModel;
366
452
  provider.listModels = () => Object.values(BUILTIN_MODELS);
367
453
  provider.getModel = (id) => BUILTIN_MODELS[id];
368
- provider.listVoices = () => KOKORO_VOICES.map((v) => ({
454
+ provider.listVoices = () => NATIVE_VOICES.map((v) => ({
369
455
  id: v.id,
370
456
  name: v.name,
371
457
  gender: v.gender,
372
458
  language: v.language
373
459
  }));
374
- provider.listTranscriptionModels = () => WHISPER_MODELS;
460
+ provider.listTranscriptionModels = () => NATIVE_TRANSCRIPTION_MODELS;
461
+ provider.listEmbeddingModels = () => EMBEDDING_MODELS;
462
+ provider.preload = async (modelId, opts) => {
463
+ if (opts?.keepLoaded ?? false) {
464
+ const model = new GerbilLanguageModel(modelId, {}, options);
465
+ await model.ensureLoaded();
466
+ modelCache.set(modelId, model);
467
+ } else await new Gerbil().preloadModel(modelId, opts);
468
+ };
469
+ provider.isCached = async (modelId) => {
470
+ if (modelCache.has(modelId)) return true;
471
+ return new Gerbil().isModelCached(modelId);
472
+ };
375
473
  return provider;
376
474
  }
377
475
  /**
@@ -383,7 +481,7 @@ function createGerbil(options = {}) {
383
481
  * import { gerbil } from "gerbil/ai";
384
482
  *
385
483
  * const { text } = await generateText({
386
- * model: gerbil("qwen3-0.6b"),
484
+ * model: gerbil("qwen3.5-0.8b"),
387
485
  * prompt: "Hello",
388
486
  * });
389
487
  * ```
@@ -417,10 +515,28 @@ function createGerbil(options = {}) {
417
515
  * console.log(transcript.text);
418
516
  * console.log(transcript.segments); // Timestamped segments
419
517
  * ```
518
+ *
519
+ * @example Embeddings
520
+ * ```ts
521
+ * import { embed, embedMany } from "ai";
522
+ * import { gerbil } from "gerbil/ai";
523
+ *
524
+ * // Single embedding
525
+ * const { embedding } = await embed({
526
+ * model: gerbil.embedding(), // all-MiniLM-L6-v2 by default
527
+ * value: "Hello world",
528
+ * });
529
+ *
530
+ * // Multiple embeddings
531
+ * const { embeddings } = await embedMany({
532
+ * model: gerbil.embedding(),
533
+ * values: ["Hello", "World", "How are you?"],
534
+ * });
535
+ * ```
420
536
  */
421
537
  const gerbil = createGerbil();
422
538
  var ai_sdk_default = gerbil;
423
539
 
424
540
  //#endregion
425
- export { createGerbil, ai_sdk_default as default, gerbil };
541
+ export { EMBEDDING_MODELS, createGerbil, ai_sdk_default as default, gerbil };
426
542
  //# sourceMappingURL=ai-sdk.mjs.map