turbollm 1.4.0 → 1.4.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 +18 -12
- package/dist/cli.js +28 -9
- package/dist/webdist/assets/{ChatScreen-DwW1RFdb.js → ChatScreen-DOn_DZb9.js} +2 -2
- package/dist/webdist/assets/{CustomizeScreen-DSE61GGl.js → CustomizeScreen-DGojsyt3.js} +1 -1
- package/dist/webdist/assets/{DeveloperScreen-BYGLUEKp.js → DeveloperScreen-Den6YJCd.js} +1 -1
- package/dist/webdist/assets/{EnginesScreen-D1fV7OUs.js → EnginesScreen-CY8Rx5yb.js} +2 -2
- package/dist/webdist/assets/ModelDetailDialog-B9XwOIZ1.js +1 -0
- package/dist/webdist/assets/{ModelDirs-BnEgYeD7.js → ModelDirs-Dc-YpeRq.js} +1 -1
- package/dist/webdist/assets/{ModelsScreen-CsIWlTix.js → ModelsScreen-C16M_nz8.js} +1 -1
- package/dist/webdist/assets/{SettingsScreen-BsoeEYxo.js → SettingsScreen-jOTEJsnP.js} +1 -1
- package/dist/webdist/assets/check-BfxrDSv2.js +1 -0
- package/dist/webdist/assets/{circle-x-BMU1-bqZ.js → circle-x-DS6mPliy.js} +1 -1
- package/dist/webdist/assets/{common-CsaPxOo6.js → common-daa_TZVO.js} +1 -1
- package/dist/webdist/assets/{copy-button-VN55eluX.js → copy-button-BGhg8Khu.js} +1 -1
- package/dist/webdist/assets/{dialog-oym6ZR4Z.js → dialog-DZNAqEWA.js} +1 -1
- package/dist/webdist/assets/{index-DdsLEQg8.js → index-DGA-rUGx.js} +2 -2
- package/dist/webdist/assets/{pencil-BUeTGZ2m.js → pencil-B6GM9rGh.js} +1 -1
- package/dist/webdist/assets/{personas-B44JP8XF.js → personas-6VEsCmkv.js} +1 -1
- package/dist/webdist/assets/{plus-B4N6E4A9.js → plus-DRWkUqro.js} +1 -1
- package/dist/webdist/assets/{refresh-cw-35eljdhP.js → refresh-cw-C0HV0_ff.js} +1 -1
- package/dist/webdist/assets/{save-AXon2pXP.js → save-C_BZqFjv.js} +1 -1
- package/dist/webdist/assets/{skeleton-BqBFt4sB.js → skeleton-3ybK_JTt.js} +1 -1
- package/dist/webdist/assets/{sparkles-C1EIsU4T.js → sparkles-CMAmCCVI.js} +1 -1
- package/dist/webdist/assets/{trash-2-BOZ6n1d2.js → trash-2-Bwu1AKhQ.js} +1 -1
- package/dist/webdist/index.html +1 -1
- package/package.json +4 -4
- package/dist/webdist/assets/ModelDetailDialog-DOWC_r7x.js +0 -1
- package/dist/webdist/assets/check-BEcwngnz.js +0 -1
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/mohitsoni48/
|
|
2
|
+
<img src="https://raw.githubusercontent.com/mohitsoni48/TurboLLM/main/turbollm/web/public/brand/turbollm-icon-512.jpeg?v=2" width="92" height="92" alt="TurboLLM" />
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<h1 align="center">TurboLLM</h1>
|
|
@@ -30,7 +30,7 @@ API any tool can talk to. TurboLLM is the **performance & bleeding-edge layer fo
|
|
|
30
30
|
LLMs** — built for people who today hand-compile forks and hunt forums for the right flags.
|
|
31
31
|
|
|
32
32
|
<p align="center">
|
|
33
|
-
<img src="https://raw.githubusercontent.com/mohitsoni48/
|
|
33
|
+
<img src="https://raw.githubusercontent.com/mohitsoni48/TurboLLM/main/assets/how-it-works.svg?v=2" width="860" alt="How TurboLLM works: clients -> one lightweight daemon -> any engine on your GPU" />
|
|
34
34
|
</p>
|
|
35
35
|
|
|
36
36
|
---
|
|
@@ -404,21 +404,27 @@ your machine.
|
|
|
404
404
|
|
|
405
405
|
## How TurboLLM compares
|
|
406
406
|
|
|
407
|
-
Focused on the differences that matter — all four are good tools.
|
|
407
|
+
Focused on the differences that matter — all four are good tools, and the others move fast.
|
|
408
|
+
Marks reflect mid-2026; verify the moving rows against each tool's current docs.
|
|
408
409
|
|
|
409
410
|
| | **TurboLLM** | LM Studio | Ollama | Open WebUI |
|
|
410
411
|
|---|:---:|:---:|:---:|:---:|
|
|
411
|
-
| Run **any engine / community forks** | ✅ | ❌
|
|
412
|
-
| **
|
|
413
|
-
| **Measured** t/s in the model list | ✅ | ◐ | ◐ | ❌ |
|
|
414
|
-
| **Anthropic** API (
|
|
412
|
+
| Run **any engine / community forks** | ✅ | ❌ llama.cpp/MLX only | ❌ hidden | ❌ frontend |
|
|
413
|
+
| **Benchmark-based auto-tune** of launch flags | ✅ | ◐ basic offload | ◐ basic offload | ❌ |
|
|
414
|
+
| **Measured** t/s in the model list | ✅ | ◐ per-run | ◐ `--verbose` | ❌ |
|
|
415
|
+
| **Anthropic** API (`/v1/messages`) → Claude Code | ✅ | ✅ 0.4.1+ | ✅ v0.14+ | ❌ |
|
|
415
416
|
| OpenAI-compatible API | ✅ | ✅ | ✅ | ◐ proxy |
|
|
416
|
-
|
|
|
417
|
-
| Use existing model folders (no re-download) | ✅ | ◐ |
|
|
418
|
-
| Speculative decoding (
|
|
417
|
+
| Auto-load the requested model / multi-model pool | ✅ | ✅ JIT | ✅ | ❌ |
|
|
418
|
+
| Use existing model folders (no re-download) | ✅ | ◐ import | ◐ import | ❌ frontend |
|
|
419
|
+
| Speculative decoding (draft / MTP) | ✅ | ✅ | ◐ env flag | ❌ |
|
|
419
420
|
| Web UI from any LAN device | ✅ | ❌ | ❌ | ✅ |
|
|
420
421
|
| **Lightweight** (no Electron / no Python) | ✅ npm | ❌ Electron | ✅ Go | ❌ Python |
|
|
421
|
-
| Offline-first · no telemetry | ✅ | ◐ | ✅ | ✅ |
|
|
422
|
+
| Offline-first · **no telemetry** | ✅ | ◐ analytics on by default | ✅ | ✅ |
|
|
423
|
+
|
|
424
|
+
LM Studio and Ollama both added Anthropic `/v1/messages` endpoints in 2026, so the API rows are
|
|
425
|
+
now parity — Claude Code works against any of them. TurboLLM's durable edges are **any engine
|
|
426
|
+
including community forks**, **benchmark-based auto-tuning with a VRAM-fit verdict + measured t/s
|
|
427
|
+
before you commit**, and **zero telemetry**.
|
|
422
428
|
|
|
423
429
|
Prefer Open WebUI's chat breadth? It works great pointed at TurboLLM's OpenAI endpoint.
|
|
424
430
|
|
|
@@ -463,6 +469,6 @@ shadcn/ui frontend. One TypeScript codebase, shipped as an npm package.
|
|
|
463
469
|
Source-available under the **Functional Source License 1.1 (Apache-2.0 future grant)** — SPDX
|
|
464
470
|
**`FSL-1.1-ALv2`**. Free for personal use, internal business use, education, and research; the
|
|
465
471
|
only restriction is shipping a competing product. Each release converts to Apache-2.0 two
|
|
466
|
-
years after it's published. Full text: [LICENSE.md](https://github.com/mohitsoni48/
|
|
472
|
+
years after it's published. Full text: [LICENSE.md](https://github.com/mohitsoni48/TurboLLM/blob/main/turbollm/LICENSE.md).
|
|
467
473
|
|
|
468
474
|
<p align="center"><sub>Built for people who refuse to wait for the mainstream to bless the fast path. ⚡</sub></p>
|
package/dist/cli.js
CHANGED
|
@@ -3310,6 +3310,24 @@ function walk(dir, out) {
|
|
|
3310
3310
|
}
|
|
3311
3311
|
}
|
|
3312
3312
|
}
|
|
3313
|
+
function detectSafetensorsQuant(cfg2) {
|
|
3314
|
+
const qc = cfg2.quantization_config;
|
|
3315
|
+
if (qc?.quant_method) {
|
|
3316
|
+
const method = qc.quant_method.toLowerCase();
|
|
3317
|
+
const group0 = qc.config_groups ? Object.values(qc.config_groups)[0] : void 0;
|
|
3318
|
+
const wBits = group0?.weights?.num_bits ?? qc.bits;
|
|
3319
|
+
if (method === "compressed-tensors") {
|
|
3320
|
+
if (wBits) {
|
|
3321
|
+
const aBits = group0?.input_activations?.num_bits ?? 16;
|
|
3322
|
+
return `w${wBits}a${aBits}`;
|
|
3323
|
+
}
|
|
3324
|
+
return "compressed-tensors";
|
|
3325
|
+
}
|
|
3326
|
+
return wBits ? `${method}-${wBits}bit` : method;
|
|
3327
|
+
}
|
|
3328
|
+
const mlxBits = cfg2.quantization?.bits;
|
|
3329
|
+
return mlxBits ? `${mlxBits}bit` : "fp16";
|
|
3330
|
+
}
|
|
3313
3331
|
function mlxEntryFor(dir) {
|
|
3314
3332
|
let cfg2 = {};
|
|
3315
3333
|
let parseError = null;
|
|
@@ -3350,10 +3368,10 @@ function mlxEntryFor(dir) {
|
|
|
3350
3368
|
}
|
|
3351
3369
|
} catch {
|
|
3352
3370
|
}
|
|
3353
|
-
const
|
|
3354
|
-
const
|
|
3355
|
-
const quant =
|
|
3356
|
-
const arch2 = cfg2.model_type || cfg2.architectures?.[0] || "unknown";
|
|
3371
|
+
const lm = cfg2.text_config ?? {};
|
|
3372
|
+
const expertCount = cfg2.num_local_experts ?? cfg2.num_experts ?? lm.num_local_experts ?? lm.num_experts ?? 0;
|
|
3373
|
+
const quant = detectSafetensorsQuant(cfg2);
|
|
3374
|
+
const arch2 = cfg2.model_type || cfg2.architectures?.[0] || lm.model_type || "unknown";
|
|
3357
3375
|
const name = basename(dir).replace(/[-_]/g, " ").replace(/\s+/g, " ").trim();
|
|
3358
3376
|
return {
|
|
3359
3377
|
key: `${name.toLowerCase()}|mlx-${quant}|${sizeBytes}`,
|
|
@@ -3365,9 +3383,9 @@ function mlxEntryFor(dir) {
|
|
|
3365
3383
|
sizeLabel: "",
|
|
3366
3384
|
arch: arch2,
|
|
3367
3385
|
quant,
|
|
3368
|
-
nativeCtx: cfg2.max_position_embeddings ?? 0,
|
|
3369
|
-
blockCount: cfg2.num_hidden_layers ?? 0,
|
|
3370
|
-
headCountKv: cfg2.num_key_value_heads ?? 0,
|
|
3386
|
+
nativeCtx: cfg2.max_position_embeddings ?? lm.max_position_embeddings ?? 0,
|
|
3387
|
+
blockCount: cfg2.num_hidden_layers ?? lm.num_hidden_layers ?? 0,
|
|
3388
|
+
headCountKv: cfg2.num_key_value_heads ?? lm.num_key_value_heads ?? 0,
|
|
3371
3389
|
moe: expertCount > 0,
|
|
3372
3390
|
expertCount,
|
|
3373
3391
|
nextnLayers: 0,
|
|
@@ -7572,8 +7590,9 @@ async function runGeneration(d, stream, ctx) {
|
|
|
7572
7590
|
reqBody.reasoning_budget = 0;
|
|
7573
7591
|
reqBody.chat_template_kwargs = { enable_thinking: false };
|
|
7574
7592
|
}
|
|
7575
|
-
|
|
7576
|
-
if (
|
|
7593
|
+
const toolsSupported = (d.registry.active()?.kind ?? "") !== "vllm" && toolDefs.length > 0;
|
|
7594
|
+
if (toolsSupported) reqBody.tools = toolDefs;
|
|
7595
|
+
if (toolsSupported && conv.toolPolicy === "force_web_search" && toolIter <= 2 && toolDefs.some((t) => t.function.name === "web_search")) {
|
|
7577
7596
|
reqBody.tool_choice = { type: "function", function: { name: "web_search" } };
|
|
7578
7597
|
}
|
|
7579
7598
|
const res = await fetch(`${target}/v1/chat/completions`, {
|