turbollm 1.7.0 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -12
- package/bin/turbollm.mjs +29 -25
- package/dist/cli.js +428 -124
- package/dist/webdist/assets/{AgentsScreen-Dy6Pcr_B.js → AgentsScreen-sMeMB3IQ.js} +1 -1
- package/dist/webdist/assets/{ChatScreen-XT3yMWtr.js → ChatScreen-rXB7PrWJ.js} +1 -1
- package/dist/webdist/assets/{CustomizeScreen-hksRI8F6.js → CustomizeScreen-BBwvtk28.js} +1 -1
- package/dist/webdist/assets/DeveloperScreen-fXV-qXB5.js +1 -0
- package/dist/webdist/assets/{EnginesScreen-CAvhN3G3.js → EnginesScreen-CrmYzhio.js} +1 -1
- package/dist/webdist/assets/{MessageBubble-CwO3NgI3.js → MessageBubble-COuZ8jTd.js} +3 -3
- package/dist/webdist/assets/{ModelDetailDialog-Dv0x3tYC.js → ModelDetailDialog-Dlt5uF3h.js} +1 -1
- package/dist/webdist/assets/{ModelDirs-BaoSLHhX.js → ModelDirs-BYN-DmHL.js} +1 -1
- package/dist/webdist/assets/{ModelsScreen-CkMFGoDd.js → ModelsScreen-DncNvsj6.js} +1 -1
- package/dist/webdist/assets/{SettingsScreen-DQ32fA2_.js → SettingsScreen-DXX3r4Ep.js} +1 -1
- package/dist/webdist/assets/{arc-DlFjpdSr.js → arc-BrQAHE5c.js} +1 -1
- package/dist/webdist/assets/{architectureDiagram-3BPJPVTR-pFBox1KQ.js → architectureDiagram-3BPJPVTR-DzOwDk0E.js} +1 -1
- package/dist/webdist/assets/{arrow-left-BJsjxPBS.js → arrow-left-Dp4XRnbs.js} +1 -1
- package/dist/webdist/assets/{blockDiagram-GPEHLZMM-B0UPWZtT.js → blockDiagram-GPEHLZMM-Cbs2lNCh.js} +1 -1
- package/dist/webdist/assets/{c4Diagram-AAUBKEIU-gIXSPwNR.js → c4Diagram-AAUBKEIU-BAull9Yv.js} +1 -1
- package/dist/webdist/assets/channel-Bt5-ol5R.js +1 -0
- package/dist/webdist/assets/check-jMeH6YsH.js +1 -0
- package/dist/webdist/assets/{chevron-down-CpHgu445.js → chevron-down-C5ZMFCtb.js} +1 -1
- package/dist/webdist/assets/{chevron-right-CYjTEILC.js → chevron-right-DNVnXbZ1.js} +1 -1
- package/dist/webdist/assets/{chunk-2J33WTMH-BoxvMF9T.js → chunk-2J33WTMH-B38k4sJL.js} +1 -1
- package/dist/webdist/assets/{chunk-4BX2VUAB-Di3wYJWs.js → chunk-4BX2VUAB-VxAkYvb7.js} +1 -1
- package/dist/webdist/assets/{chunk-55IACEB6-BLqI6bau.js → chunk-55IACEB6-CAz9ZWyR.js} +1 -1
- package/dist/webdist/assets/{chunk-727SXJPM-q0EuKEuw.js → chunk-727SXJPM-CvLX5ghS.js} +1 -1
- package/dist/webdist/assets/{chunk-AQP2D5EJ-BMFuxIuh.js → chunk-AQP2D5EJ-CZ0fsnc1.js} +1 -1
- package/dist/webdist/assets/{chunk-FMBD7UC4-BbyVyd6J.js → chunk-FMBD7UC4-tjHz_yw8.js} +1 -1
- package/dist/webdist/assets/{chunk-ND2GUHAM-CInbMq-r.js → chunk-ND2GUHAM-DVSh5E5_.js} +1 -1
- package/dist/webdist/assets/{chunk-QZHKN3VN-BAkYvJ9H.js → chunk-QZHKN3VN-D1rUM2SU.js} +1 -1
- package/dist/webdist/assets/{circle-check-D1Fzzp2X.js → circle-check-qnghY_qF.js} +1 -1
- package/dist/webdist/assets/{circle-x-Dk1Mtsgt.js → circle-x-FM28MwOL.js} +1 -1
- package/dist/webdist/assets/classDiagram-4FO5ZUOK-jfnUpxOr.js +1 -0
- package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-jfnUpxOr.js +1 -0
- package/dist/webdist/assets/{common-BZUOg168.js → common-BD4Wa3KL.js} +1 -1
- package/dist/webdist/assets/{copy-button-CWk5ixZc.js → copy-button-DypRNkqI.js} +1 -1
- package/dist/webdist/assets/{cose-bilkent-S5V4N54A-B9I8xuFl.js → cose-bilkent-S5V4N54A-DIUqY7o2.js} +1 -1
- package/dist/webdist/assets/{dagre-BM42HDAG-DBN5qMmD.js → dagre-BM42HDAG-BzTcsgZ1.js} +1 -1
- package/dist/webdist/assets/{diagram-2AECGRRQ-CmGPSh2a.js → diagram-2AECGRRQ-DanHH-W_.js} +1 -1
- package/dist/webdist/assets/{diagram-5GNKFQAL-D3KnkSMW.js → diagram-5GNKFQAL-DQ5sWHUL.js} +1 -1
- package/dist/webdist/assets/{diagram-KO2AKTUF-D7cM5kP4.js → diagram-KO2AKTUF-Jqr_pLwu.js} +1 -1
- package/dist/webdist/assets/{diagram-LMA3HP47-CbkHl9Oq.js → diagram-LMA3HP47-BZ89-cp0.js} +1 -1
- package/dist/webdist/assets/{diagram-OG6HWLK6-D6t7nOOv.js → diagram-OG6HWLK6-cidBc5qa.js} +1 -1
- package/dist/webdist/assets/{dialog-CkBHSegf.js → dialog-3hyZ9j4e.js} +1 -1
- package/dist/webdist/assets/{erDiagram-TEJ5UH35-JS8JzvNq.js → erDiagram-TEJ5UH35-DEAKZN7b.js} +1 -1
- package/dist/webdist/assets/{flowDiagram-I6XJVG4X-BwMtMrHu.js → flowDiagram-I6XJVG4X-Cyx8gMzN.js} +1 -1
- package/dist/webdist/assets/{ganttDiagram-6RSMTGT7-C-wMnJb7.js → ganttDiagram-6RSMTGT7-CqXYW44d.js} +1 -1
- package/dist/webdist/assets/{gitGraphDiagram-PVQCEYII-CmaAN2hw.js → gitGraphDiagram-PVQCEYII-0dv_zKYA.js} +1 -1
- package/dist/webdist/assets/{index-CUj3iHti.js → index-CriwC5VH.js} +2 -2
- package/dist/webdist/assets/{infoDiagram-5YYISTIA-DKn67bh9.js → infoDiagram-5YYISTIA-PxeM6E3u.js} +1 -1
- package/dist/webdist/assets/{ishikawaDiagram-YF4QCWOH-Ba1O-jRt.js → ishikawaDiagram-YF4QCWOH-BnNdTjj1.js} +1 -1
- package/dist/webdist/assets/{journeyDiagram-JHISSGLW-3jjcJZn2.js → journeyDiagram-JHISSGLW-D3AHUGxz.js} +1 -1
- package/dist/webdist/assets/{kanban-definition-UN3LZRKU-Dxyq8Dv_.js → kanban-definition-UN3LZRKU-YARl6SUt.js} +1 -1
- package/dist/webdist/assets/{linear-Cbah9FEU.js → linear-CMEhaWGh.js} +1 -1
- package/dist/webdist/assets/{mermaid.core-BGMPViwt.js → mermaid.core-Dfl2pPvv.js} +4 -4
- package/dist/webdist/assets/{mindmap-definition-RKZ34NQL-83sJsd2O.js → mindmap-definition-RKZ34NQL-BojWC6jk.js} +1 -1
- package/dist/webdist/assets/{pencil-Dd9X6iv6.js → pencil-CS33zp9q.js} +1 -1
- package/dist/webdist/assets/personas-CzcXp8zg.js +75 -0
- package/dist/webdist/assets/{pieDiagram-4H26LBE5-DD6VQLn8.js → pieDiagram-4H26LBE5-cjsdMtJJ.js} +1 -1
- package/dist/webdist/assets/{plus-CV0QBMWx.js → plus-BO3vGy6f.js} +1 -1
- package/dist/webdist/assets/{quadrantDiagram-W4KKPZXB-CaOiBtJ-.js → quadrantDiagram-W4KKPZXB-DYVcgQuL.js} +1 -1
- package/dist/webdist/assets/{refresh-cw-Dr6SqmsF.js → refresh-cw-Cco9RapO.js} +1 -1
- package/dist/webdist/assets/{requirementDiagram-4Y6WPE33-BOJpE9a_.js → requirementDiagram-4Y6WPE33-Dkj58nhB.js} +1 -1
- package/dist/webdist/assets/{sankeyDiagram-5OEKKPKP-Bn-kiFX4.js → sankeyDiagram-5OEKKPKP-l3GwUuNl.js} +1 -1
- package/dist/webdist/assets/{save-YHf8XYeJ.js → save-CSISNMk8.js} +1 -1
- package/dist/webdist/assets/{sequenceDiagram-3UESZ5HK-DZ1wNcJ4.js → sequenceDiagram-3UESZ5HK-CWj1Dplo.js} +1 -1
- package/dist/webdist/assets/{skeleton-DRpa3g92.js → skeleton-CBRf-twG.js} +1 -1
- package/dist/webdist/assets/{stateDiagram-AJRCARHV-KYRqsHqR.js → stateDiagram-AJRCARHV-zbnPRcoE.js} +1 -1
- package/dist/webdist/assets/stateDiagram-v2-BHNVJYJU-Ukx8AVKZ.js +1 -0
- package/dist/webdist/assets/{timeline-definition-PNZ67QCA-DjShwJtM.js → timeline-definition-PNZ67QCA-C_zAo1WZ.js} +1 -1
- package/dist/webdist/assets/{trash-2-COu80uxw.js → trash-2-DJmVqx0w.js} +1 -1
- package/dist/webdist/assets/{vennDiagram-CIIHVFJN-ZMpZCx2T.js → vennDiagram-CIIHVFJN-DxfcocQu.js} +1 -1
- package/dist/webdist/assets/{vram-CNhvTqb8.js → vram-Dn53zt7R.js} +1 -1
- package/dist/webdist/assets/{wardley-L42UT6IY-7jACIdKq.js → wardley-L42UT6IY-BnZ8BinJ.js} +1 -1
- package/dist/webdist/assets/{wardleyDiagram-YWT4CUSO-DKWWvUrP.js → wardleyDiagram-YWT4CUSO-DMk9z7hr.js} +1 -1
- package/dist/webdist/assets/{wrench-BkSH7V5Q.js → wrench-Di5WLTz2.js} +1 -1
- package/dist/webdist/assets/{xychartDiagram-2RQKCTM6-CdjviSb8.js → xychartDiagram-2RQKCTM6-BUtTPXPF.js} +1 -1
- package/dist/webdist/index.html +1 -1
- package/package.json +2 -2
- package/dist/webdist/assets/DeveloperScreen-Bi2h8ovi.js +0 -1
- package/dist/webdist/assets/channel-BtQ7Ppn0.js +0 -1
- package/dist/webdist/assets/check-CnaxmcKg.js +0 -1
- package/dist/webdist/assets/classDiagram-4FO5ZUOK-BqNXe-Qd.js +0 -1
- package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-BqNXe-Qd.js +0 -1
- package/dist/webdist/assets/personas-ZZlSx77v.js +0 -291
- package/dist/webdist/assets/stateDiagram-v2-BHNVJYJU-BUgXWf2c.js +0 -1
package/README.md
CHANGED
|
@@ -79,7 +79,7 @@ TurboLLM does the opposite:
|
|
|
79
79
|
a **VRAM-fit verdict before you load** — no more flag guessing.
|
|
80
80
|
- **📊 Real tokens/sec, never faked.** Speed in the model list is *measured on your machine*
|
|
81
81
|
from actual generation — live while you chat, and remembered per model.
|
|
82
|
-
- **🪶 Lightweight.** A ~
|
|
82
|
+
- **🪶 Lightweight.** A ~2 MB npm package on Node — **no Electron, no bundled Chromium, no
|
|
83
83
|
Python**. It downloads only the engine your GPU actually needs (Vulkan ≈ 38 MB).
|
|
84
84
|
- **🔌 Drop-in APIs.** OpenAI **and** Anthropic-compatible — so Claude Code and every existing
|
|
85
85
|
tool work unchanged.
|
|
@@ -261,6 +261,12 @@ library, and loads it on the fly** if it isn't already running — then keeps up
|
|
|
261
261
|
hot** in an LRU pool so the next switch is instant. An agent (or Claude Code) that hops between a
|
|
262
262
|
coding model, a vision model, and an embedder just names each one and it works — no pre-wiring.
|
|
263
263
|
|
|
264
|
+
**One command wires up more than just Claude Code.** `turbollm launch <cli>` also supports
|
|
265
|
+
`opencode`, `kilo`, `openclaw`, and `hermes` — each gets pointed at TurboLLM the way that tool
|
|
266
|
+
expects (config file merge, or its own CLI command) instead of a manual copy-paste setup. Inside
|
|
267
|
+
Claude Code, `/model` lists your local models directly (with **Auto Model Swap** on in Settings →
|
|
268
|
+
Gateway) so you can switch mid-session instead of only at launch.
|
|
269
|
+
|
|
264
270
|
</details>
|
|
265
271
|
|
|
266
272
|
<details>
|
|
@@ -289,7 +295,7 @@ connected); **Remove** undoes it.
|
|
|
289
295
|
|
|
290
296
|
<br/>
|
|
291
297
|
|
|
292
|
-
- A **~
|
|
298
|
+
- A **~2 MB npm package** on Node — no Electron, no bundled Chromium, no Python.
|
|
293
299
|
- **Offline-first** — no account, no backend, no internet, no telemetry.
|
|
294
300
|
- **Windows · macOS · Linux**, with a CPU fallback when there's no GPU.
|
|
295
301
|
|
|
@@ -370,12 +376,20 @@ turbollm launch claude # auto-loads a model if none is running, th
|
|
|
370
376
|
turbollm launch claude --model qwen3-8b # load a specific model first, then launch
|
|
371
377
|
```
|
|
372
378
|
|
|
373
|
-
It sets Claude Code's `ANTHROPIC_BASE_URL`
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
+
It sets Claude Code's `ANTHROPIC_BASE_URL` and pins `ANTHROPIC_MODEL` to whatever model is
|
|
380
|
+
loaded (so the status line, `/status`, and context-window sizing all reflect the real model),
|
|
381
|
+
then execs `claude`; extra args are forwarded. If no model is loaded it auto-loads your
|
|
382
|
+
last-used one (or the first in your library); `--model` picks a specific one by key or name.
|
|
383
|
+
If `claude` isn't installed, it tells you how.
|
|
384
|
+
|
|
385
|
+
Other coding CLIs work too — `turbollm launch opencode`, `turbollm launch kilo`, and
|
|
386
|
+
`turbollm launch openclaw` write a `turbollm` provider into that tool's own config file
|
|
387
|
+
(preserving anything you already configured) and then launch it. If an existing config can't
|
|
388
|
+
be parsed, TurboLLM refuses to overwrite it and prints how to add the provider by hand.
|
|
389
|
+
`turbollm launch hermes` does the equivalent for [Hermes Agent](https://github.com/NousResearch/hermes-agent)
|
|
390
|
+
via its own `hermes config set` command (its config is YAML, so we drive its CLI instead of
|
|
391
|
+
hand-editing that file). The in-app **Developer** screen also shows copy-paste snippets for
|
|
392
|
+
any OpenAI- or Anthropic-compatible tool (Open WebUI, Kilo Code, opencode, …).
|
|
379
393
|
|
|
380
394
|
---
|
|
381
395
|
|
|
@@ -402,6 +416,7 @@ turbollm --addr 0.0.0.0:6996 # bind all interfaces (LAN sharing)
|
|
|
402
416
|
turbollm --stop # stop a running daemon (any terminal)
|
|
403
417
|
turbollm launch claude # start Claude Code (auto-loads a model if none is running)
|
|
404
418
|
turbollm launch claude --model qwen3-8b # load a specific model, then launch
|
|
419
|
+
turbollm launch opencode # wire opencode (or kilo / openclaw) to TurboLLM, then launch
|
|
405
420
|
```
|
|
406
421
|
|
|
407
422
|
| Flag | Description |
|
|
@@ -415,7 +430,9 @@ turbollm launch claude --model qwen3-8b # load a specific model, then launch
|
|
|
415
430
|
|
|
416
431
|
`turbollm launch claude` also accepts `--model <key|name>` to load a specific model before
|
|
417
432
|
launching; without it, an already-loaded model is used, or the last-used / first model is
|
|
418
|
-
auto-loaded.
|
|
433
|
+
auto-loaded. The same command works with `opencode`, `kilo`, and `openclaw` — each gets a
|
|
434
|
+
`turbollm` provider merged into its own config file before it starts — and with `hermes`,
|
|
435
|
+
which gets configured via its own `hermes config set` command instead.
|
|
419
436
|
|
|
420
437
|
---
|
|
421
438
|
|
|
@@ -429,7 +446,7 @@ Use `--config <file>` to point at an alternate config (its directory becomes the
|
|
|
429
446
|
|
|
430
447
|
## Requirements
|
|
431
448
|
|
|
432
|
-
- **Node.js 22 or newer** — enforced at startup with a clear message. <https://nodejs.org>
|
|
449
|
+
- **Node.js 22.13.0 or newer** — enforced at startup with a clear message. <https://nodejs.org>
|
|
433
450
|
- **Windows, macOS, or Linux.**
|
|
434
451
|
- A GPU is recommended but **not required** — a CPU build is provisioned as a fallback.
|
|
435
452
|
- On Windows, the first time the auto-downloaded `llama-server` runs, SmartScreen/Defender may
|
|
@@ -475,7 +492,7 @@ Prefer Open WebUI's chat breadth? It works great pointed at TurboLLM's OpenAI en
|
|
|
475
492
|
|
|
476
493
|
## Troubleshooting
|
|
477
494
|
|
|
478
|
-
- **`TurboLLM requires Node.js 22 or newer`** — upgrade Node: <https://nodejs.org>.
|
|
495
|
+
- **`TurboLLM requires Node.js 22.13.0 or newer`** — upgrade Node: <https://nodejs.org>.
|
|
479
496
|
- **Model won't load / OOM** — pick a smaller quant (the VRAM verdict warns you), lower GPU
|
|
480
497
|
offload, or close other GPU apps. Failures surface in the Engines screen with the engine log.
|
|
481
498
|
- **Windows Defender / SmartScreen prompt** — that's the upstream `llama-server` binary on
|
|
@@ -502,7 +519,7 @@ node dist/cli.js --port 6996
|
|
|
502
519
|
Frontend hot-reload: `cd web && npm run dev` (proxies `/api` and `/v1` to the daemon on
|
|
503
520
|
:6996).
|
|
504
521
|
|
|
505
|
-
**Stack:** Node ≥22 · TypeScript · Hono · `node:sqlite` · tsup — and a React 19 + Tailwind v4 +
|
|
522
|
+
**Stack:** Node ≥22.13 · TypeScript · Hono · `node:sqlite` · tsup — and a React 19 + Tailwind v4 +
|
|
506
523
|
shadcn/ui frontend. One TypeScript codebase, shipped as an npm package.
|
|
507
524
|
|
|
508
525
|
---
|
package/bin/turbollm.mjs
CHANGED
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Hand-written launcher shim — NOT bundled by tsup. It runs before the bundled
|
|
3
|
-
// daemon (dist/cli.js) loads, so it can do two things that must happen before
|
|
4
|
-
// node:sqlite is imported (the bundle hoists that import, emitting an experimental
|
|
5
|
-
// warning that PowerShell renders as a scary red error block on every run):
|
|
6
|
-
// 1. Guard the Node version with a friendly message (node:sqlite needs Node 22+
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Hand-written launcher shim — NOT bundled by tsup. It runs before the bundled
|
|
3
|
+
// daemon (dist/cli.js) loads, so it can do two things that must happen before
|
|
4
|
+
// node:sqlite is imported (the bundle hoists that import, emitting an experimental
|
|
5
|
+
// warning that PowerShell renders as a scary red error block on every run):
|
|
6
|
+
// 1. Guard the Node version with a friendly message (node:sqlite needs Node 22.13+ —
|
|
7
|
+
// that's when node:sqlite became available WITHOUT the --experimental-sqlite flag;
|
|
8
|
+
// on 22.5.0-22.12.x it's registered only behind that flag, so importing it bare
|
|
9
|
+
// throws ERR_UNKNOWN_BUILTIN_MODULE: "No such built-in module: node:sqlite"
|
|
10
|
+
// (GitHub #40) even though `node -v` reports 22.x).
|
|
11
|
+
// 2. Register a 'warning' filter that swallows the node:sqlite experimental notice
|
|
12
|
+
// while still printing every other warning.
|
|
13
|
+
// Then it hands off to the real CLI via dynamic import (same process; argv intact).
|
|
14
|
+
const [major, minor] = process.versions.node.split('.').map(Number)
|
|
15
|
+
if (major < 22 || (major === 22 && minor < 13)) {
|
|
16
|
+
process.stderr.write(
|
|
17
|
+
`TurboLLM requires Node.js 22.13.0 or newer (needs node:sqlite unflagged).\n` +
|
|
18
|
+
`You are running Node.js ${process.versions.node}.\n` +
|
|
19
|
+
`Please upgrade: https://nodejs.org\n`,
|
|
20
|
+
)
|
|
21
|
+
process.exit(1)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
process.on('warning', (w) => {
|
|
25
|
+
if (w.name === 'ExperimentalWarning' && /SQLite/i.test(w.message)) return
|
|
26
|
+
process.stderr.write(`${w.stack ?? `${w.name}: ${w.message}`}\n`)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
await import('../dist/cli.js')
|