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.
Files changed (28) hide show
  1. package/README.md +18 -12
  2. package/dist/cli.js +28 -9
  3. package/dist/webdist/assets/{ChatScreen-DwW1RFdb.js → ChatScreen-DOn_DZb9.js} +2 -2
  4. package/dist/webdist/assets/{CustomizeScreen-DSE61GGl.js → CustomizeScreen-DGojsyt3.js} +1 -1
  5. package/dist/webdist/assets/{DeveloperScreen-BYGLUEKp.js → DeveloperScreen-Den6YJCd.js} +1 -1
  6. package/dist/webdist/assets/{EnginesScreen-D1fV7OUs.js → EnginesScreen-CY8Rx5yb.js} +2 -2
  7. package/dist/webdist/assets/ModelDetailDialog-B9XwOIZ1.js +1 -0
  8. package/dist/webdist/assets/{ModelDirs-BnEgYeD7.js → ModelDirs-Dc-YpeRq.js} +1 -1
  9. package/dist/webdist/assets/{ModelsScreen-CsIWlTix.js → ModelsScreen-C16M_nz8.js} +1 -1
  10. package/dist/webdist/assets/{SettingsScreen-BsoeEYxo.js → SettingsScreen-jOTEJsnP.js} +1 -1
  11. package/dist/webdist/assets/check-BfxrDSv2.js +1 -0
  12. package/dist/webdist/assets/{circle-x-BMU1-bqZ.js → circle-x-DS6mPliy.js} +1 -1
  13. package/dist/webdist/assets/{common-CsaPxOo6.js → common-daa_TZVO.js} +1 -1
  14. package/dist/webdist/assets/{copy-button-VN55eluX.js → copy-button-BGhg8Khu.js} +1 -1
  15. package/dist/webdist/assets/{dialog-oym6ZR4Z.js → dialog-DZNAqEWA.js} +1 -1
  16. package/dist/webdist/assets/{index-DdsLEQg8.js → index-DGA-rUGx.js} +2 -2
  17. package/dist/webdist/assets/{pencil-BUeTGZ2m.js → pencil-B6GM9rGh.js} +1 -1
  18. package/dist/webdist/assets/{personas-B44JP8XF.js → personas-6VEsCmkv.js} +1 -1
  19. package/dist/webdist/assets/{plus-B4N6E4A9.js → plus-DRWkUqro.js} +1 -1
  20. package/dist/webdist/assets/{refresh-cw-35eljdhP.js → refresh-cw-C0HV0_ff.js} +1 -1
  21. package/dist/webdist/assets/{save-AXon2pXP.js → save-C_BZqFjv.js} +1 -1
  22. package/dist/webdist/assets/{skeleton-BqBFt4sB.js → skeleton-3ybK_JTt.js} +1 -1
  23. package/dist/webdist/assets/{sparkles-C1EIsU4T.js → sparkles-CMAmCCVI.js} +1 -1
  24. package/dist/webdist/assets/{trash-2-BOZ6n1d2.js → trash-2-Bwu1AKhQ.js} +1 -1
  25. package/dist/webdist/index.html +1 -1
  26. package/package.json +4 -4
  27. package/dist/webdist/assets/ModelDetailDialog-DOWC_r7x.js +0 -1
  28. 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/Turbo-LLM/main/turbollm/web/public/brand/turbollm-icon-512.jpeg?v=2" width="92" height="92" alt="TurboLLM" />
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/Turbo-LLM/main/assets/how-it-works.svg?v=2" width="860" alt="How TurboLLM works: clients -> one lightweight daemon -> any engine on your GPU" />
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** | ✅ | ❌ one runtime | ❌ hidden | ❌ |
412
- | **Auto-tune** launch flags to your GPU | ✅ | | | ❌ |
413
- | **Measured** t/s in the model list | ✅ | ◐ | ◐ | ❌ |
414
- | **Anthropic** API (tool use) → Claude Code | ✅ | | | ❌ |
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
- | **Auto-load the requested model** (hot-swap pool) | ✅ | | | ❌ |
417
- | Use existing model folders (no re-download) | ✅ | ◐ | | ❌ |
418
- | Speculative decoding (NextN / MTP / draft) | ✅ | ◐ draft | | ❌ |
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/Turbo-LLM/blob/main/turbollm/LICENSE.md).
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 expertCount = cfg2.num_local_experts ?? cfg2.num_experts ?? 0;
3354
- const bits = cfg2.quantization?.bits;
3355
- const quant = bits ? `${bits}bit` : "fp16";
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
- if (toolDefs.length > 0) reqBody.tools = toolDefs;
7576
- if (conv.toolPolicy === "force_web_search" && toolIter <= 2 && toolDefs.some((t) => t.function.name === "web_search")) {
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`, {