@tryhamster/gerbil 1.0.0-rc.9 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +318 -104
- package/dist/architectures-C1I5V3Dt.mjs +6070 -0
- package/dist/architectures-C1I5V3Dt.mjs.map +1 -0
- package/dist/browser/index.d.ts +276 -590
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +592 -2334
- package/dist/browser/index.js.map +1 -1
- package/dist/cli.mjs +625 -1098
- package/dist/cli.mjs.map +1 -1
- package/dist/defaults-9komdrbY.mjs +24 -0
- package/dist/defaults-9komdrbY.mjs.map +1 -0
- package/dist/frameworks/express.d.mts +1 -3
- package/dist/frameworks/express.d.mts.map +1 -1
- package/dist/frameworks/express.mjs +7 -7
- package/dist/frameworks/express.mjs.map +1 -1
- package/dist/frameworks/fastify.d.mts +1 -1
- package/dist/frameworks/fastify.d.mts.map +1 -1
- package/dist/frameworks/fastify.mjs +3 -3
- package/dist/frameworks/fastify.mjs.map +1 -1
- package/dist/frameworks/hono.d.mts +1 -1
- package/dist/frameworks/hono.d.mts.map +1 -1
- package/dist/frameworks/hono.mjs +4 -4
- package/dist/frameworks/hono.mjs.map +1 -1
- package/dist/frameworks/next.d.mts +3 -2
- package/dist/frameworks/next.d.mts.map +1 -1
- package/dist/frameworks/next.mjs +4 -4
- package/dist/frameworks/next.mjs.map +1 -1
- package/dist/frameworks/react.d.mts +1 -1
- package/dist/frameworks/trpc.d.mts +1 -1
- package/dist/frameworks/trpc.d.mts.map +1 -1
- package/dist/frameworks/trpc.mjs +4 -4
- package/dist/frameworks/trpc.mjs.map +1 -1
- package/dist/gerbil-BetB5xb0.d.mts +488 -0
- package/dist/gerbil-BetB5xb0.d.mts.map +1 -0
- package/dist/gerbil-CTZUa8EZ.mjs +4 -0
- package/dist/gerbil-DNniplr4.mjs +1656 -0
- package/dist/gerbil-DNniplr4.mjs.map +1 -0
- package/dist/gpu/hooks.d.mts +640 -0
- package/dist/gpu/hooks.d.mts.map +1 -0
- package/dist/gpu/hooks.mjs +1369 -0
- package/dist/gpu/hooks.mjs.map +1 -0
- package/dist/gpu/index.d.mts +2 -0
- package/dist/gpu/index.mjs +6 -0
- package/dist/gpu-DFuglcEx.mjs +3790 -0
- package/dist/gpu-DFuglcEx.mjs.map +1 -0
- package/dist/index-Dgmb2kE3.d.mts +245 -0
- package/dist/index-Dgmb2kE3.d.mts.map +1 -0
- package/dist/index-DukkJRMj.d.mts +2114 -0
- package/dist/index-DukkJRMj.d.mts.map +1 -0
- package/dist/index.d.mts +22 -487
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +13 -8
- package/dist/index.mjs.map +1 -1
- package/dist/indexeddb-store-BWIMtxxH.mjs +103 -0
- package/dist/indexeddb-store-BWIMtxxH.mjs.map +1 -0
- package/dist/indexeddb-store-ClH12Xnl.mjs +4 -0
- package/dist/integrations/ai-sdk.d.mts +75 -6
- package/dist/integrations/ai-sdk.d.mts.map +1 -1
- package/dist/integrations/ai-sdk.mjs +131 -15
- package/dist/integrations/ai-sdk.mjs.map +1 -1
- package/dist/integrations/langchain.d.mts +1 -1
- package/dist/integrations/langchain.d.mts.map +1 -1
- package/dist/integrations/langchain.mjs +5 -5
- package/dist/integrations/langchain.mjs.map +1 -1
- package/dist/integrations/llamaindex.d.mts +1 -1
- package/dist/integrations/llamaindex.d.mts.map +1 -1
- package/dist/integrations/llamaindex.mjs +5 -5
- package/dist/integrations/llamaindex.mjs.map +1 -1
- package/dist/integrations/mcp-client.mjs +3 -3
- package/dist/integrations/mcp-client.mjs.map +1 -1
- package/dist/integrations/mcp.d.mts +3 -2
- package/dist/integrations/mcp.d.mts.map +1 -1
- package/dist/integrations/mcp.mjs +5 -5
- package/dist/{mcp-BvbriaBy.mjs → mcp-D2vvH1Xc.mjs} +4 -4
- package/dist/mcp-D2vvH1Xc.mjs.map +1 -0
- package/dist/memory/index.d.mts +3 -0
- package/dist/memory/index.mjs +6 -0
- package/dist/memory-D1P7Tmda.mjs +4 -0
- package/dist/memory-DVN0MnIG.mjs +132 -0
- package/dist/memory-DVN0MnIG.mjs.map +1 -0
- package/dist/memory-Dj0J1v88.mjs +294 -0
- package/dist/memory-Dj0J1v88.mjs.map +1 -0
- package/dist/moonshine-stt-17dpP1kr.mjs +4 -0
- package/dist/moonshine-stt-4ojLtMq7.mjs +11962 -0
- package/dist/moonshine-stt-4ojLtMq7.mjs.map +1 -0
- package/dist/{one-liner-s-lD8rCC.mjs → one-liner-JhdIPxzF.mjs} +14 -16
- package/dist/one-liner-JhdIPxzF.mjs.map +1 -0
- package/dist/repl-BDRkwPGX.mjs +9 -0
- package/dist/skills/index.d.mts +270 -320
- package/dist/skills/index.d.mts.map +1 -1
- package/dist/skills/index.mjs +5 -5
- package/dist/{skills-CD3Orlex.mjs → skills-CU694Dc8.mjs} +187 -32
- package/dist/skills-CU694Dc8.mjs.map +1 -0
- package/dist/{tools-Bi1P7Xoy.mjs → tools-DQ1mPUw5.mjs} +34 -22
- package/dist/tools-DQ1mPUw5.mjs.map +1 -0
- package/dist/types-DQBe2lFo.d.mts +165 -0
- package/dist/types-DQBe2lFo.d.mts.map +1 -0
- package/dist/{types-CiTc7ez3.d.mts → types-LlyYILII.d.mts} +112 -14
- package/dist/types-LlyYILII.d.mts.map +1 -0
- package/dist/{utils-CZBZ8dgR.mjs → utils-DKO55ZmZ.mjs} +1 -1
- package/dist/{utils-CZBZ8dgR.mjs.map → utils-DKO55ZmZ.mjs.map} +1 -1
- package/dist/vector-B0panuy6.mjs +95 -0
- package/dist/vector-B0panuy6.mjs.map +1 -0
- package/docs/PROJECT-STATE.md +321 -0
- package/docs/adding-a-model-family.md +280 -0
- package/docs/ai-sdk.md +70 -61
- package/docs/architecture/overview.md +17 -7
- package/docs/browser.md +203 -8
- package/docs/embeddings.md +156 -0
- package/docs/gerbil-site-native-migration.md +217 -0
- package/docs/gpu-engine/architectures.md +398 -0
- package/docs/gpu-engine/ir.md +372 -0
- package/docs/gpu-engine/kernels.md +718 -0
- package/docs/gpu-engine/paper.html +1759 -0
- package/docs/gpu-engine/paper.md +2109 -0
- package/docs/gpu-engine/safetensors.md +312 -0
- package/docs/gpu-engine/tokenizer.md +302 -0
- package/docs/memory-rag.md +91 -0
- package/docs/metal-safari-intel.md +190 -0
- package/docs/mobile-failure-diagnosis.md +124 -0
- package/docs/mobile.md +99 -0
- package/docs/observability.md +230 -0
- package/docs/onnx-removal-plan.md +339 -0
- package/docs/research/autoresearch-portable.md +904 -0
- package/docs/research/dispatch-reduction-hivemind.md +84 -0
- package/docs/research/ios-safari-model-caching.md +117 -0
- package/docs/research/mobile-webgpu-speed-fusion.md +135 -0
- package/docs/research/native-stt-model-selection.md +49 -0
- package/docs/research/native-tts-model-selection.md +90 -0
- package/docs/research/native-vs-chromium-decision.md +152 -0
- package/docs/research/nemotron-mamba2-inference.md +910 -0
- package/docs/research/qwen35-multimodal.md +293 -0
- package/docs/research/qwen36-gemma4-targets.md +337 -0
- package/docs/research/sota-embedding-models.md +179 -0
- package/docs/research/sota-mobile-models-2026.md +263 -0
- package/docs/research/sota-modality-models.md +202 -0
- package/docs/research/tps-baselines.md +71 -0
- package/docs/research/webgpu-m4-reference.md +104 -0
- package/docs/site-update-plan.md +155 -0
- package/docs/structured-output.md +123 -0
- package/docs/stt.md +63 -446
- package/docs/tts.md +77 -499
- package/docs/vision.md +100 -338
- package/package.json +22 -7
- package/dist/chrome-backend-CORwaIyC.mjs +0 -1212
- package/dist/chrome-backend-CORwaIyC.mjs.map +0 -1
- package/dist/chrome-backend-DIKYoWj-.mjs +0 -3
- package/dist/gerbil-CJ3ifloF.mjs +0 -4
- package/dist/gerbil-Dw4Qj77e.mjs +0 -1631
- package/dist/gerbil-Dw4Qj77e.mjs.map +0 -1
- package/dist/gerbil-qOTe1nl2.d.mts +0 -431
- package/dist/gerbil-qOTe1nl2.d.mts.map +0 -1
- package/dist/kokoro-BNTb6egA.mjs +0 -20210
- package/dist/kokoro-BNTb6egA.mjs.map +0 -1
- package/dist/kokoro-CMOGDSgT.js +0 -20212
- package/dist/kokoro-CMOGDSgT.js.map +0 -1
- package/dist/mcp-BvbriaBy.mjs.map +0 -1
- package/dist/one-liner-s-lD8rCC.mjs.map +0 -1
- package/dist/repl-DveXw36T.mjs +0 -9
- package/dist/skills-CD3Orlex.mjs.map +0 -1
- package/dist/stt-Bu-E23Sc.js +0 -433
- package/dist/stt-Bu-E23Sc.js.map +0 -1
- package/dist/stt-CpLYbGFd.mjs +0 -433
- package/dist/stt-CpLYbGFd.mjs.map +0 -1
- package/dist/stt-DRPLEEHB.mjs +0 -3
- package/dist/tools-Bi1P7Xoy.mjs.map +0 -1
- package/dist/transformers.web-DiD1gTwk.js +0 -44695
- package/dist/transformers.web-DiD1gTwk.js.map +0 -1
- package/dist/transformers.web-u34VxRFM.js +0 -3
- package/dist/tts-CqroPaSK.js +0 -724
- package/dist/tts-CqroPaSK.js.map +0 -1
- package/dist/tts-DXgsKGCe.mjs +0 -3
- package/dist/tts-DeGANMNV.mjs +0 -730
- package/dist/tts-DeGANMNV.mjs.map +0 -1
- package/dist/types-CiTc7ez3.d.mts.map +0 -1
- /package/dist/{auto-update-S9s5-g0C.mjs → auto-update-BVaLXcDE.mjs} +0 -0
- /package/dist/{chunk-CkXuGtQK.mjs → chunk-B9cbKln6.mjs} +0 -0
- /package/dist/{microphone-DaMZFRuR.mjs → microphone-Bqmoz9_K.mjs} +0 -0
package/dist/index.mjs
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
import
|
|
3
|
-
import "./
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
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-DNniplr4.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-JhdIPxzF.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-DFuglcEx.mjs";
|
|
7
|
+
import { t as MoonshineSTT } from "./moonshine-stt-4ojLtMq7.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 = "
|
|
15
|
+
const VERSION = "1.0.0";
|
|
11
16
|
|
|
12
17
|
//#endregion
|
|
13
|
-
export { BUILTIN_MODELS,
|
|
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
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
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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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
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-LlyYILII.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: "
|
|
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.
|
|
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.
|
|
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":";;;;;
|
|
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-
|
|
2
|
-
import "../utils-
|
|
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-DNniplr4.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 || "
|
|
200
|
-
if (!
|
|
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
|
|
218
|
+
details: `Unknown voice "${voice}", using default`
|
|
205
219
|
});
|
|
206
|
-
voice = "
|
|
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: "
|
|
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.
|
|
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
|
|
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 = () =>
|
|
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 = () =>
|
|
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.
|
|
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
|