@tryhamster/gerbil 1.1.2 → 1.2.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 (110) hide show
  1. package/README.md +18 -16
  2. package/dist/{architectures-wan0swXu.mjs → architectures-Ol7yUmKf.mjs} +128 -68
  3. package/dist/architectures-Ol7yUmKf.mjs.map +1 -0
  4. package/dist/cli.mjs +8 -8
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/{defaults-9komdrbY.mjs → defaults-bJcmOaRG.mjs} +2 -2
  7. package/dist/defaults-bJcmOaRG.mjs.map +1 -0
  8. package/dist/frameworks/express.mjs +1 -1
  9. package/dist/frameworks/fastify.mjs +1 -1
  10. package/dist/frameworks/hono.mjs +1 -1
  11. package/dist/frameworks/next.d.mts +2 -2
  12. package/dist/frameworks/next.mjs +1 -1
  13. package/dist/frameworks/trpc.mjs +1 -1
  14. package/dist/gerbil-BjGA5L2E.mjs +4 -0
  15. package/dist/{gerbil-DZbWbIm2.d.mts → gerbil-CCVOEU-J.d.mts} +2 -2
  16. package/dist/{gerbil-DZbWbIm2.d.mts.map → gerbil-CCVOEU-J.d.mts.map} +1 -1
  17. package/dist/{gerbil-CQspp8fS.mjs → gerbil-Cv7rXGOV.mjs} +2 -2
  18. package/dist/{gerbil-CQspp8fS.mjs.map → gerbil-Cv7rXGOV.mjs.map} +1 -1
  19. package/dist/gpu/hooks.d.mts +27 -10
  20. package/dist/gpu/hooks.d.mts.map +1 -1
  21. package/dist/gpu/hooks.mjs +19 -12
  22. package/dist/gpu/hooks.mjs.map +1 -1
  23. package/dist/gpu/index.d.mts +2 -2
  24. package/dist/gpu/index.mjs +5 -5
  25. package/dist/{gpu-BYCQ5aTI.mjs → gpu-BWLMlkVW.mjs} +78 -21
  26. package/dist/gpu-BWLMlkVW.mjs.map +1 -0
  27. package/dist/{index-CKszv3lt.d.mts → index-CSLqgNu-.d.mts} +212 -133
  28. package/dist/index-CSLqgNu-.d.mts.map +1 -0
  29. package/dist/index.d.mts +2 -2
  30. package/dist/index.mjs +6 -6
  31. package/dist/integrations/ai-sdk.mjs +1 -1
  32. package/dist/integrations/langchain.mjs +1 -1
  33. package/dist/integrations/llamaindex.mjs +1 -1
  34. package/dist/integrations/mcp.d.mts +2 -2
  35. package/dist/integrations/mcp.mjs +4 -4
  36. package/dist/{mcp-CszII8GJ.mjs → mcp-C0yKaH39.mjs} +3 -3
  37. package/dist/{mcp-CszII8GJ.mjs.map → mcp-C0yKaH39.mjs.map} +1 -1
  38. package/dist/{moonshine-stt-DDUm5WfP.mjs → moonshine-stt-C4GKK-h5.mjs} +45 -5
  39. package/dist/{moonshine-stt-DDUm5WfP.mjs.map → moonshine-stt-C4GKK-h5.mjs.map} +1 -1
  40. package/dist/moonshine-stt-zJ9YEi1X.mjs +4 -0
  41. package/dist/{one-liner-DVche8Eg.mjs → one-liner-DfJh2O0X.mjs} +2 -2
  42. package/dist/{one-liner-DVche8Eg.mjs.map → one-liner-DfJh2O0X.mjs.map} +1 -1
  43. package/dist/repl-DTSxHD6t.mjs +9 -0
  44. package/dist/skills/index.d.mts +2 -2
  45. package/dist/skills/index.d.mts.map +1 -1
  46. package/dist/skills/index.mjs +3 -3
  47. package/dist/{skills-BQI-VSn2.mjs → skills-B5cDRVJ1.mjs} +2 -2
  48. package/dist/{skills-BQI-VSn2.mjs.map → skills-B5cDRVJ1.mjs.map} +1 -1
  49. package/package.json +1 -2
  50. package/dist/architectures-wan0swXu.mjs.map +0 -1
  51. package/dist/defaults-9komdrbY.mjs.map +0 -1
  52. package/dist/gerbil-tHnYb9nZ.mjs +0 -4
  53. package/dist/gpu-BYCQ5aTI.mjs.map +0 -1
  54. package/dist/index-CKszv3lt.d.mts.map +0 -1
  55. package/dist/moonshine-stt-BtR-KiSP.mjs +0 -4
  56. package/dist/repl-BYJA2U7t.mjs +0 -9
  57. package/docs/PROJECT-STATE.md +0 -321
  58. package/docs/adding-a-model-family.md +0 -280
  59. package/docs/ai-sdk.md +0 -205
  60. package/docs/architecture/README.md +0 -84
  61. package/docs/architecture/caching.md +0 -227
  62. package/docs/architecture/inference.md +0 -176
  63. package/docs/architecture/overview.md +0 -189
  64. package/docs/architecture/streaming.md +0 -261
  65. package/docs/architecture/webgpu.md +0 -213
  66. package/docs/browser.md +0 -762
  67. package/docs/cli.md +0 -155
  68. package/docs/embeddings.md +0 -156
  69. package/docs/frameworks.md +0 -90
  70. package/docs/gerbil-site-native-migration.md +0 -217
  71. package/docs/gpu-engine/architectures.md +0 -398
  72. package/docs/gpu-engine/ir.md +0 -372
  73. package/docs/gpu-engine/kernels.md +0 -718
  74. package/docs/gpu-engine/paper.html +0 -1759
  75. package/docs/gpu-engine/paper.md +0 -2109
  76. package/docs/gpu-engine/safetensors.md +0 -312
  77. package/docs/gpu-engine/tokenizer.md +0 -302
  78. package/docs/kernel-research-queue.md +0 -85
  79. package/docs/mcp-client.md +0 -224
  80. package/docs/mcp.md +0 -109
  81. package/docs/memory-rag.md +0 -91
  82. package/docs/memory.md +0 -301
  83. package/docs/metal-safari-intel.md +0 -190
  84. package/docs/mobile-failure-diagnosis.md +0 -124
  85. package/docs/mobile.md +0 -99
  86. package/docs/observability.md +0 -230
  87. package/docs/onnx-removal-plan.md +0 -339
  88. package/docs/repl.md +0 -473
  89. package/docs/research/autoresearch-portable.md +0 -933
  90. package/docs/research/dispatch-reduction-hivemind.md +0 -84
  91. package/docs/research/ios-safari-model-caching.md +0 -117
  92. package/docs/research/mobile-webgpu-speed-fusion.md +0 -135
  93. package/docs/research/native-stt-model-selection.md +0 -49
  94. package/docs/research/native-tts-model-selection.md +0 -90
  95. package/docs/research/native-vs-chromium-decision.md +0 -152
  96. package/docs/research/nemotron-mamba2-inference.md +0 -910
  97. package/docs/research/qwen35-multimodal.md +0 -293
  98. package/docs/research/qwen36-gemma4-targets.md +0 -337
  99. package/docs/research/sota-embedding-models.md +0 -179
  100. package/docs/research/sota-mobile-models-2026.md +0 -263
  101. package/docs/research/sota-modality-models.md +0 -202
  102. package/docs/research/tps-baselines.md +0 -71
  103. package/docs/research/webgpu-m4-reference.md +0 -104
  104. package/docs/site-update-plan.md +0 -155
  105. package/docs/skills.md +0 -261
  106. package/docs/structured-output.md +0 -123
  107. package/docs/stt.md +0 -111
  108. package/docs/tools.md +0 -304
  109. package/docs/tts.md +0 -147
  110. package/docs/vision.md +0 -158
@@ -1,227 +0,0 @@
1
- # Model Caching
2
-
3
- How Gerbil caches models for fast subsequent loads.
4
-
5
- ## Overview
6
-
7
- Model files are large (100MB - 500MB). Gerbil caches them locally to avoid re-downloading:
8
-
9
- | Environment | Cache Location | Mechanism |
10
- |-------------|----------------|-----------|
11
- | Browser | IndexedDB | transformers.js built-in |
12
- | Node.js (CPU) | `~/.cache/huggingface/hub` | transformers.js built-in |
13
- | Node.js (WebGPU) | Chrome's IndexedDB | Via ChromeGPUBackend |
14
-
15
- ## Browser Caching
16
-
17
- ### IndexedDB
18
-
19
- transformers.js automatically caches model files in IndexedDB:
20
-
21
- ```
22
- IndexedDB
23
- └── transformers-cache
24
- └── onnx-community/Qwen3-0.6B-ONNX
25
- ├── tokenizer.json
26
- ├── config.json
27
- ├── model_q4f16.onnx
28
- └── ...
29
- ```
30
-
31
- ### Cache Behavior
32
-
33
- 1. **First load**: Downloads from Hugging Face Hub (~15-30s)
34
- 2. **Subsequent loads**: Reads from IndexedDB (~1-2s)
35
-
36
- ### Checking Cache
37
-
38
- ```typescript
39
- import { getWebGPUInfo } from "@tryhamster/gerbil/browser";
40
-
41
- // Models are cached per-origin
42
- // Same origin = same cache
43
- ```
44
-
45
- ### Clearing Cache
46
-
47
- ```javascript
48
- // In browser DevTools:
49
- indexedDB.deleteDatabase("transformers-cache");
50
- ```
51
-
52
- ## Node.js CPU Caching
53
-
54
- ### Hugging Face Hub Cache
55
-
56
- transformers.js uses the standard HF cache directory:
57
-
58
- ```
59
- ~/.cache/huggingface/hub/
60
- └── models--onnx-community--Qwen3-0.6B-ONNX/
61
- ├── blobs/
62
- │ └── [sha256 hashes]
63
- ├── refs/
64
- │ └── main
65
- └── snapshots/
66
- └── [commit hash]/
67
- ├── tokenizer.json
68
- ├── config.json
69
- └── model_q4.onnx
70
- ```
71
-
72
- ### Environment Variables
73
-
74
- ```bash
75
- # Custom cache directory
76
- export HF_HOME=/path/to/cache
77
- export TRANSFORMERS_CACHE=/path/to/cache
78
-
79
- # Offline mode (use cache only)
80
- export TRANSFORMERS_OFFLINE=1
81
- ```
82
-
83
- ### CLI Cache Management
84
-
85
- ```bash
86
- # View cache
87
- npx @tryhamster/gerbil cache
88
-
89
- # Clear cache
90
- npx @tryhamster/gerbil cache --clean
91
-
92
- # Clear old models
93
- npx @tryhamster/gerbil cache --older-than 30
94
- ```
95
-
96
- ## Node.js WebGPU Caching
97
-
98
- ### ChromeGPUBackend Cache
99
-
100
- When using WebGPU in Node.js, models are cached in Chrome's IndexedDB:
101
-
102
- ```
103
- ~/.gerbil/chrome-cache/
104
- └── Default/
105
- └── IndexedDB/
106
- └── http_127.0.0.1_43724.indexeddb.leveldb/
107
- └── [model cache]
108
- ```
109
-
110
- ### Why a Fixed Port?
111
-
112
- The ChromeGPUBackend uses port 43724 ("GERBI") for a critical reason:
113
-
114
- IndexedDB caches are **origin-specific**. The origin includes:
115
- - Protocol: `http://`
116
- - Host: `127.0.0.1`
117
- - Port: `43724`
118
-
119
- A fixed port ensures the same origin every time → same cache.
120
-
121
- ```typescript
122
- const GERBIL_LOCAL_PORT = 43724; // "GERBI" on phone keypad
123
-
124
- // Always same origin:
125
- // http://127.0.0.1:43724
126
- ```
127
-
128
- ### Cache Persistence
129
-
130
- The Chrome user data directory persists between runs:
131
-
132
- ```typescript
133
- this.userDataDir = join(homedir(), ".gerbil", "chrome-cache");
134
- ```
135
-
136
- This means:
137
- - Model downloads are cached
138
- - Shader compilations are cached
139
- - ~1.5s startup when cached vs ~20s first run
140
-
141
- ## Cache Sizes
142
-
143
- | Model | Download Size | Cache Size |
144
- |-------|--------------|------------|
145
- | qwen3-0.6b | ~400MB | ~400MB |
146
- | smollm2-360m | ~250MB | ~250MB |
147
- | smollm2-135m | ~100MB | ~100MB |
148
-
149
- ## Preloading Models
150
-
151
- ### Browser
152
-
153
- ```typescript
154
- // Preload during idle time
155
- const gerbil = await createGerbilWorker({
156
- modelId: "qwen3-0.6b",
157
- onProgress: (p) => {
158
- if (p.status === "ready") {
159
- console.log("Model cached and ready");
160
- }
161
- },
162
- });
163
-
164
- // Model is now in IndexedDB for instant loads
165
- ```
166
-
167
- ### Node.js
168
-
169
- ```typescript
170
- // Preload in background
171
- const g = new Gerbil();
172
- await g.loadModel("qwen3-0.6b");
173
- // Model is now in HF cache
174
- ```
175
-
176
- ### CLI
177
-
178
- ```bash
179
- # Download without running
180
- npx @tryhamster/gerbil info -m qwen3-0.6b
181
- # Model is now cached
182
- ```
183
-
184
- ## Offline Usage
185
-
186
- Once cached, models work offline:
187
-
188
- ```typescript
189
- // Browser: Works if model is in IndexedDB
190
- const gerbil = await createGerbilWorker({ modelId: "qwen3-0.6b" });
191
-
192
- // Node.js: Set offline mode
193
- process.env.TRANSFORMERS_OFFLINE = "1";
194
- const g = new Gerbil();
195
- await g.loadModel("qwen3-0.6b"); // Uses cache only
196
- ```
197
-
198
- ## Troubleshooting
199
-
200
- ### "Model not found" after cache clear
201
-
202
- Re-download by loading the model:
203
-
204
- ```typescript
205
- await g.loadModel("qwen3-0.6b"); // Will re-download
206
- ```
207
-
208
- ### Cache taking too much space
209
-
210
- ```bash
211
- # View cache size
212
- npx @tryhamster/gerbil cache
213
-
214
- # Clear old models
215
- npx @tryhamster/gerbil cache --older-than 7
216
-
217
- # Clear everything
218
- npx @tryhamster/gerbil cache --clean
219
- ```
220
-
221
- ### Browser cache not persisting
222
-
223
- Check browser settings:
224
- - Cookies/site data must be allowed
225
- - IndexedDB must not be blocked
226
- - Storage quota must not be exceeded
227
-
@@ -1,176 +0,0 @@
1
- # Inference Pipeline
2
-
3
- How Gerbil runs LLM inference using ONNX Runtime and transformers.js.
4
-
5
- ## The Stack
6
-
7
- ```
8
- ┌─────────────────────────────────────┐
9
- │ transformers.js │ ← Tokenization, model loading, generation
10
- ├─────────────────────────────────────┤
11
- │ ONNX Runtime │ ← Neural network execution
12
- ├─────────────────────────────────────┤
13
- │ WebGPU │ CPU │ WASM │ ← Execution backends
14
- └─────────────────────────────────────┘
15
- ```
16
-
17
- ## transformers.js
18
-
19
- [transformers.js](https://huggingface.co/docs/transformers.js) is a JavaScript port of Hugging Face Transformers that runs ONNX models in the browser and Node.js.
20
-
21
- ### Model Loading
22
-
23
- ```typescript
24
- import { AutoModelForCausalLM, AutoTokenizer } from "@huggingface/transformers";
25
-
26
- const tokenizer = await AutoTokenizer.from_pretrained(modelId);
27
- const model = await AutoModelForCausalLM.from_pretrained(modelId, {
28
- dtype: "q4f16", // Quantization
29
- device: "webgpu", // Backend
30
- });
31
- ```
32
-
33
- ### Generation
34
-
35
- ```typescript
36
- const inputs = tokenizer.apply_chat_template(messages, {
37
- add_generation_prompt: true,
38
- return_dict: true,
39
- });
40
-
41
- const output = await model.generate({
42
- ...inputs,
43
- max_new_tokens: 256,
44
- temperature: 0.7,
45
- do_sample: true,
46
- });
47
-
48
- const text = tokenizer.decode(output[0], { skip_special_tokens: true });
49
- ```
50
-
51
- ### Streaming with TextStreamer
52
-
53
- ```typescript
54
- const streamer = new TextStreamer(tokenizer, {
55
- skip_prompt: true,
56
- skip_special_tokens: true,
57
- callback_function: (text) => {
58
- console.log(text); // Called for each token
59
- },
60
- });
61
-
62
- await model.generate({ ...inputs, streamer });
63
- ```
64
-
65
- ## ONNX Runtime
66
-
67
- ONNX Runtime is the execution engine that runs the neural network operations.
68
-
69
- ### Backends
70
-
71
- | Backend | Environment | Speed | Notes |
72
- |---------|-------------|-------|-------|
73
- | **WebGPU** | Browser, Chrome | ~70-100 tok/s | Fastest, requires GPU |
74
- | **CPU** | Node.js | ~10-30 tok/s | Uses SIMD, good on Apple Silicon |
75
- | **WASM** | Browser fallback | ~5-10 tok/s | Works everywhere |
76
-
77
- ### Execution Providers
78
-
79
- ONNX Runtime selects execution providers based on availability:
80
-
81
- ```
82
- WebGPU EP → WASM EP → CPU EP
83
- ```
84
-
85
- Gerbil explicitly requests the desired backend:
86
-
87
- ```typescript
88
- // For WebGPU
89
- await AutoModelForCausalLM.from_pretrained(modelId, { device: "webgpu" });
90
-
91
- // For CPU
92
- await pipeline("text-generation", modelId, { device: "cpu" });
93
- ```
94
-
95
- ## Quantization
96
-
97
- Quantization reduces model size and improves inference speed by using lower-precision numbers.
98
-
99
- ### Quantization Types
100
-
101
- | Type | Weights | Compute | Size Reduction | Use Case |
102
- |------|---------|---------|----------------|----------|
103
- | **fp32** | 32-bit float | 32-bit | 1x (baseline) | Training |
104
- | **fp16** | 16-bit float | 16-bit | 2x | GPU inference |
105
- | **q4f16** | 4-bit int | 16-bit | ~4x | WebGPU inference |
106
- | **q4** | 4-bit int | 32-bit | ~4x | CPU inference |
107
-
108
- ### Why q4f16 for WebGPU?
109
-
110
- WebGPU shaders work best with fp16 compute. The `q4f16` format:
111
- - Stores weights as 4-bit integers (small download)
112
- - Dequantizes to fp16 during inference (fast on GPU)
113
- - Maintains good quality for small models
114
-
115
- ### Model Sizes
116
-
117
- | Model | Original | q4f16 | Download |
118
- |-------|----------|-------|----------|
119
- | Qwen3-0.6B | ~2.4GB | ~400MB | ~400MB |
120
- | SmolLM2-360M | ~1.4GB | ~250MB | ~250MB |
121
- | SmolLM2-135M | ~540MB | ~100MB | ~100MB |
122
-
123
- ## Tokenization
124
-
125
- ### Chat Templates
126
-
127
- Gerbil uses model-specific chat templates to format conversations:
128
-
129
- ```typescript
130
- const messages = [
131
- { role: "system", content: "You are helpful." },
132
- { role: "user", content: "Hello!" },
133
- ];
134
-
135
- const inputs = tokenizer.apply_chat_template(messages, {
136
- add_generation_prompt: true, // Add assistant turn start
137
- return_dict: true, // Return input_ids + attention_mask
138
- enable_thinking: true, // Qwen3 thinking mode
139
- });
140
- ```
141
-
142
- ### Thinking Mode (Qwen3)
143
-
144
- Qwen3 models support a "thinking" mode where the model shows reasoning:
145
-
146
- ```
147
- <think>
148
- Let me work through this step by step...
149
- 127 × 43 = 127 × 40 + 127 × 3 = 5080 + 381 = 5461
150
- </think>
151
- The answer is 5461.
152
- ```
153
-
154
- Enabled via `enable_thinking: true` in the chat template.
155
-
156
- ## KV Cache
157
-
158
- The Key-Value cache stores intermediate attention states to speed up autoregressive generation:
159
-
160
- ```typescript
161
- const { past_key_values, sequences } = await model.generate({
162
- ...inputs,
163
- past_key_values: previousCache, // Reuse from last turn
164
- return_dict_in_generate: true,
165
- });
166
-
167
- // Save for next turn
168
- cache = past_key_values;
169
- ```
170
-
171
- Benefits:
172
- - Faster multi-turn conversations
173
- - Reduced compute for long contexts
174
-
175
- Gerbil manages the KV cache automatically for multi-turn chat.
176
-
@@ -1,189 +0,0 @@
1
- # Architecture Overview
2
-
3
- Gerbil is a local LLM inference library that runs entirely on-device, with no API calls or cloud dependencies.
4
-
5
- ## Core Components
6
-
7
- ### 1. Gerbil Class (`src/core/gerbil.ts`)
8
-
9
- The main entry point for Node.js applications:
10
-
11
- ```typescript
12
- const g = new Gerbil();
13
- await g.loadModel("qwen3-0.6b");
14
- const result = await g.generate("Hello");
15
- ```
16
-
17
- Responsibilities:
18
- - Model loading and lifecycle management
19
- - Device selection (WebGPU vs CPU)
20
- - Generation orchestration
21
- - Streaming coordination
22
- - Session statistics
23
- - Request queue (concurrency control)
24
- - Telemetry hooks for observability
25
-
26
- ### 2. Model Registry (`src/core/models.ts`)
27
-
28
- Maps friendly model IDs to Hugging Face paths:
29
-
30
- ```typescript
31
- const BUILTIN_MODELS = {
32
- "qwen3-0.6b": {
33
- id: "qwen3-0.6b",
34
- path: "onnx-community/Qwen3-0.6B-ONNX",
35
- family: "qwen",
36
- size: "0.6B",
37
- contextLength: 32768,
38
- supportsThinking: true,
39
- },
40
- // ...
41
- };
42
- ```
43
-
44
- ### 3. Chrome GPU Backend (`src/core/chrome-backend.ts`)
45
-
46
- Enables WebGPU in Node.js by using headless Chrome as a GPU accelerator:
47
-
48
- ```
49
- ┌─────────────┐ HTTP ┌──────────────────┐
50
- │ Node.js │◄──────────►│ Headless Chrome │
51
- │ (Gerbil) │ :43724 │ (WebGPU worker) │
52
- └─────────────┘ └──────────────────┘
53
- │ │
54
- │ CDP (DevTools) │ WebGPU
55
- └──────────────────────────┘
56
-
57
- ┌─────▼─────┐
58
- │ GPU │
59
- └───────────┘
60
- ```
61
-
62
- ### 4. Browser Module (`src/browser/index.ts`)
63
-
64
- Provides React hooks and workers for browser applications:
65
-
66
- ```typescript
67
- // LLM worker
68
- const gerbil = await createGerbilWorker({
69
- modelId: "qwen3-0.6b",
70
- onToken: (token) => console.log(token.text),
71
- });
72
-
73
- // React hooks
74
- const { messages, handleSubmit } = useChat();
75
- const { speak, isSpeaking } = useSpeech();
76
- const { startRecording, transcript } = useVoiceInput();
77
- ```
78
-
79
- Uses inline Web Workers for:
80
- - **LLM**: Model loading, token streaming, GPU memory management
81
- - **TTS**: Kokoro/Supertonic speech synthesis
82
- - **STT**: Whisper transcription
83
-
84
- All workers load dependencies from CDN to avoid bundler issues with onnxruntime-web.
85
-
86
- ## Execution Paths
87
-
88
- ### Browser Path
89
-
90
- ```
91
- User Code
92
-
93
-
94
- createGerbilWorker()
95
-
96
-
97
- Web Worker (inline blob)
98
-
99
-
100
- transformers.js
101
-
102
-
103
- ONNX Runtime (WebGPU)
104
-
105
-
106
- GPU
107
- ```
108
-
109
- ### Node.js CPU Path
110
-
111
- ```
112
- User Code
113
-
114
-
115
- Gerbil.generate()
116
-
117
-
118
- transformers.js pipeline
119
-
120
-
121
- ONNX Runtime (CPU)
122
-
123
-
124
- CPU (with SIMD)
125
- ```
126
-
127
- ### Node.js WebGPU Path
128
-
129
- ```
130
- User Code
131
-
132
-
133
- Gerbil.generate()
134
-
135
-
136
- ChromeGPUBackend
137
-
138
-
139
- Headless Chrome (via CDP)
140
-
141
-
142
- transformers.js (in Chrome)
143
-
144
-
145
- ONNX Runtime (WebGPU)
146
-
147
-
148
- GPU
149
- ```
150
-
151
- ## Device Selection
152
-
153
- Gerbil automatically selects the best available backend:
154
-
155
- ```typescript
156
- // Explicit selection
157
- await g.loadModel("qwen3-0.6b", { device: "webgpu" }); // or "cpu"
158
-
159
- // Check current device
160
- g.getDeviceMode(); // "webgpu" | "cpu" | "wasm"
161
- ```
162
-
163
- Priority:
164
- 1. **Browser**: WebGPU → WASM fallback
165
- 2. **Node.js with --gpu**: ChromeGPUBackend (headless Chrome)
166
- 3. **Node.js default**: CPU via ONNX Runtime
167
-
168
- ## File Structure
169
-
170
- ```
171
- src/
172
- ├── core/
173
- │ ├── gerbil.ts # Main Gerbil class
174
- │ ├── models.ts # Model registry
175
- │ ├── types.ts # TypeScript types
176
- │ ├── tools.ts # Tool calling system
177
- │ └── chrome-backend.ts # Node.js WebGPU via Chrome
178
- ├── browser/
179
- │ └── index.ts # React hooks + LLM/TTS/STT workers
180
- ├── skills/
181
- │ └── ... # Built-in skills (commit, summarize, etc.)
182
- ├── integrations/
183
- │ └── ... # AI SDK, LangChain, MCP
184
- ├── frameworks/
185
- │ └── ... # Next.js, Express, React, etc.
186
- └── cli/
187
- └── repl/ # Interactive terminal UI
188
- ```
189
-