turbollm 1.14.3 → 1.14.5
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 +5 -3
- package/dist/{chunk-SEL52AIK.js → chunk-3Z2SF2XI.js} +58 -9
- package/dist/{chunk-PJPEPLCC.js → chunk-WXR3RE6R.js} +22 -3
- package/dist/cli.js +1418 -499
- package/dist/code-routes.js +1 -1
- package/dist/code-run-manager.js +1 -1
- package/dist/{distiller-VMWKFGZ3.js → distiller-X267J2RN.js} +1 -1
- package/dist/webdist/assets/{AgentEditPage-CjfaBnD4.js → AgentEditPage-K_8Kxamh.js} +1 -1
- package/dist/webdist/assets/{ChatScreen-DY8g12qe.js → ChatScreen-B4Ig3tR5.js} +9 -9
- package/dist/webdist/assets/{CodeComposer-O6uw_dEo.js → CodeComposer-D1WJXLdn.js} +1 -1
- package/dist/webdist/assets/{CodeHomeScreen-D9uSHUf-.js → CodeHomeScreen-DG6FZNj8.js} +1 -1
- package/dist/webdist/assets/{CodeSessionScreen-D_rhtCFs.js → CodeSessionScreen-BAtRazPi.js} +1 -1
- package/dist/webdist/assets/{CustomizeScreen-BcFX9Q_V.js → CustomizeScreen-xsUfxqiu.js} +1 -1
- package/dist/webdist/assets/EnginesScreen-CpfnySul.js +10 -0
- package/dist/webdist/assets/{HardwareSection-Cy6agZys.js → HardwareSection-BXDzXTrH.js} +1 -1
- package/dist/webdist/assets/{JevPlaygroundScreen-CCRmBZsL.js → JevPlaygroundScreen-MzKO9H-B.js} +3 -3
- package/dist/webdist/assets/ModelDetailDialog-ChpRG1Wi.js +1 -0
- package/dist/webdist/assets/{ModelLoadMenu-B55tUUUo.js → ModelLoadMenu-DqD8SqyE.js} +1 -1
- package/dist/webdist/assets/{ModelsScreen-C3ZGHSfD.js → ModelsScreen-CSpv0NKR.js} +2 -2
- package/dist/webdist/assets/OnboardingScreen-BTtikAjb.js +1 -0
- package/dist/webdist/assets/{RoutineEditPage-DGx2VNfw.js → RoutineEditPage-xhsMw8uU.js} +1 -1
- package/dist/webdist/assets/{RoutinesPanel-D-EiZue1.js → RoutinesPanel-A47Qrtsa.js} +1 -1
- package/dist/webdist/assets/{SettingsScreen-PSqejyv-.js → SettingsScreen-BIlbFLiz.js} +1 -1
- package/dist/webdist/assets/{SidebarResizeHandle-BEMfZ_M-.js → SidebarResizeHandle-CCBGM-70.js} +1 -1
- package/dist/webdist/assets/{SkillEditPage-a4L48IZM.js → SkillEditPage-D3r6TT6U.js} +1 -1
- package/dist/webdist/assets/{TextClassificationRuntimeLabel-BKeaXzVJ.js → TextClassificationRuntimeLabel-BusPRB63.js} +1 -1
- package/dist/webdist/assets/{ToolApprovalBar-RNePIRp-.js → ToolApprovalBar-aQMa6yF3.js} +3 -3
- package/dist/webdist/assets/{WorkspaceModeTabs-DZdY2nBf.js → WorkspaceModeTabs-S_Z08ap7.js} +1 -1
- package/dist/webdist/assets/WorkspaceScreen-CDWEOdHi.js +1 -0
- package/dist/webdist/assets/{abnfDiagram-N423BO3Z-CxAOKJF6.js → abnfDiagram-N423BO3Z-WkT4niiO.js} +1 -1
- package/dist/webdist/assets/{agent-api-BFbPafmn.js → agent-api-dHhdsF_P.js} +1 -1
- package/dist/webdist/assets/{arc-C5Jiw2Ow.js → arc-C1Qod98t.js} +1 -1
- package/dist/webdist/assets/{architectureDiagram-T3A2C74G-CMYZ8ScY.js → architectureDiagram-T3A2C74G-DmPyVTZM.js} +1 -1
- package/dist/webdist/assets/{arrow-down-CzMySSLm.js → arrow-down-CpI18AXJ.js} +1 -1
- package/dist/webdist/assets/{arrow-up-CvkWv_kZ.js → arrow-up-D3CHtls4.js} +1 -1
- package/dist/webdist/assets/{badge-D4mMa17X.js → badge-DuIEkQ33.js} +1 -1
- package/dist/webdist/assets/{blockDiagram-VBNYF7ZC-wmetya9r.js → blockDiagram-VBNYF7ZC-D99dQ6pM.js} +1 -1
- package/dist/webdist/assets/{c4Diagram-5PPSVZJV-BeV5yKwp.js → c4Diagram-5PPSVZJV-8wCbIZWK.js} +1 -1
- package/dist/webdist/assets/channel-CuosB93r.js +1 -0
- package/dist/webdist/assets/{chat-api-BwO7wZOQ.js → chat-api-CWOSJbG3.js} +1 -1
- package/dist/webdist/assets/{chat-queries-D_0kcurv.js → chat-queries-Bo4yxif9.js} +1 -1
- package/dist/webdist/assets/{chevron-down-BOfiL1lz.js → chevron-down-BPJjG12o.js} +1 -1
- package/dist/webdist/assets/{chevron-left-DSRtQQFP.js → chevron-left-eqT4nGjT.js} +1 -1
- package/dist/webdist/assets/{chevron-right-CVHs_Q7w.js → chevron-right-CD_t-rdH.js} +1 -1
- package/dist/webdist/assets/{chunk-2GRJ4B5K-DjaqqqCb.js → chunk-2GRJ4B5K-BCZwrMcN.js} +1 -1
- package/dist/webdist/assets/{chunk-2Q5K7J3B-VCgCCKpJ.js → chunk-2Q5K7J3B-0bf5RxNa.js} +1 -1
- package/dist/webdist/assets/{chunk-5RXB4S5H-CvqiK9Tg.js → chunk-5RXB4S5H-DE3OSVQ8.js} +1 -1
- package/dist/webdist/assets/{chunk-5VM5RSS4-DtTCp1C3.js → chunk-5VM5RSS4-CmutKtE1.js} +1 -1
- package/dist/webdist/assets/{chunk-6Q2QTUOP-Dsic3APl.js → chunk-6Q2QTUOP-g6Mn906K.js} +1 -1
- package/dist/webdist/assets/{chunk-GF5L2VYU-D8N4oTtR.js → chunk-GF5L2VYU-D3HaNsdk.js} +1 -1
- package/dist/webdist/assets/{chunk-JWPE2WC7-R8PEhhHq.js → chunk-JWPE2WC7-Bp_Yzi1a.js} +1 -1
- package/dist/webdist/assets/{chunk-KBJHAD2P-czwHsnCK.js → chunk-KBJHAD2P-CPKAe-1s.js} +1 -1
- package/dist/webdist/assets/{chunk-RYQCIY6F-CoDqOb16.js → chunk-RYQCIY6F-Cbw8xmRN.js} +1 -1
- package/dist/webdist/assets/{chunk-XXDRQBXY-Cldsz5dr.js → chunk-XXDRQBXY-48EaEmfu.js} +1 -1
- package/dist/webdist/assets/{circle-check-djJJrY1O.js → circle-check-BcMk8p-G.js} +1 -1
- package/dist/webdist/assets/{circle-x-CArlOKoo.js → circle-x-jAeBUHHH.js} +1 -1
- package/dist/webdist/assets/classDiagram-JCYQIIEL-BNyLm9RA.js +1 -0
- package/dist/webdist/assets/classDiagram-v2-OCEON4UE-BNyLm9RA.js +1 -0
- package/dist/webdist/assets/{collapsible-DEDu6inL.js → collapsible-D9Vr6VCp.js} +1 -1
- package/dist/webdist/assets/{common-DHTYD56P.js → common-DOT2z2u9.js} +1 -1
- package/dist/webdist/assets/{cose-bilkent-JH36ORCC-DJJu2A8A.js → cose-bilkent-JH36ORCC-CeIHgYP5.js} +1 -1
- package/dist/webdist/assets/{cynefin-VYW2F7L2-B8S78-EI.js → cynefin-VYW2F7L2-DTMel-Z2.js} +1 -1
- package/dist/webdist/assets/{cynefinDiagram-MW4NZA55-nCDMW2vi.js → cynefinDiagram-MW4NZA55-_VdFnZ3Z.js} +1 -1
- package/dist/webdist/assets/{dagre-VZM6K2ZE-DgF7Th-o.js → dagre-VZM6K2ZE-CWvUzpyy.js} +1 -1
- package/dist/webdist/assets/{diagram-7IWD3JNH-ByjqDhlh.js → diagram-7IWD3JNH-DhZYiT0q.js} +1 -1
- package/dist/webdist/assets/{diagram-B4RE2ZJO-CdtoVUcH.js → diagram-B4RE2ZJO-BhRzmLt2.js} +1 -1
- package/dist/webdist/assets/{diagram-LBJQPF4R-Bz8cz8Iw.js → diagram-LBJQPF4R-CMGkNihd.js} +1 -1
- package/dist/webdist/assets/{diagram-Q27KOJAE-C0jR_yOk.js → diagram-Q27KOJAE-Bblz7Lbt.js} +1 -1
- package/dist/webdist/assets/{diagram-UB23O5K3-NerVDH9H.js → diagram-UB23O5K3-BOmQ81Ue.js} +1 -1
- package/dist/webdist/assets/{dropdown-menu-BrTbP2Ms.js → dropdown-menu-cPdo9ZZP.js} +1 -1
- package/dist/webdist/assets/{ebnfDiagram-BXEA7PRR-U50-9H7G.js → ebnfDiagram-BXEA7PRR-BjfLTZAr.js} +1 -1
- package/dist/webdist/assets/{erDiagram-JOGREHBK-C3st41PU.js → erDiagram-JOGREHBK-DKEWSMft.js} +1 -1
- package/dist/webdist/assets/{file-text-DnQANfo2.js → file-text-CZcdeBUP.js} +1 -1
- package/dist/webdist/assets/{flask-conical-Dqj5KaQl.js → flask-conical-bYNo3nn1.js} +1 -1
- package/dist/webdist/assets/{flowDiagram-UKHOOZJN-DpI16qBt.js → flowDiagram-UKHOOZJN-DqeWOBkV.js} +1 -1
- package/dist/webdist/assets/{folder-input-Do7bM16X.js → folder-input-B2y6pkSW.js} +1 -1
- package/dist/webdist/assets/{folder-plus-DU6plWQY.js → folder-plus-FsmAug1i.js} +1 -1
- package/dist/webdist/assets/{ganttDiagram-PKOTCBZU-ChfxmXjs.js → ganttDiagram-PKOTCBZU-0RAt3msp.js} +1 -1
- package/dist/webdist/assets/{git-branch-DFW4sRVn.js → git-branch-DiLaGeql.js} +1 -1
- package/dist/webdist/assets/{gitGraphDiagram-DS77QQ5N-B7uz0MiG.js → gitGraphDiagram-DS77QQ5N-BzPK0H9P.js} +1 -1
- package/dist/webdist/assets/{globe-CN3jxwvA.js → globe-BsABIeUl.js} +1 -1
- package/dist/webdist/assets/index-Bqa6IN6i.js +15 -0
- package/dist/webdist/assets/{infoDiagram-6WML65LV-CBNjKj7C.js → infoDiagram-6WML65LV-BqUpiKEw.js} +1 -1
- package/dist/webdist/assets/{ishikawaDiagram-WSZJBQD7-tWioVCgq.js → ishikawaDiagram-WSZJBQD7-tD0IcS1A.js} +1 -1
- package/dist/webdist/assets/{journeyDiagram-NVQOT4AX-Cm6j912_.js → journeyDiagram-NVQOT4AX-Ce9iAoBP.js} +1 -1
- package/dist/webdist/assets/{kanban-definition-27J2QSJJ-MYnXca-f.js → kanban-definition-27J2QSJJ-Dhyqj0L0.js} +1 -1
- package/dist/webdist/assets/{linear-DRAAYH9X.js → linear-CSASmH1C.js} +1 -1
- package/dist/webdist/assets/{lock-CW0VPUGW.js → lock-DCxOeYj-.js} +1 -1
- package/dist/webdist/assets/{mermaid.core-CtkhOarB.js → mermaid.core-DSQ7Sqx8.js} +4 -4
- package/dist/webdist/assets/{mindmap-definition-FAOFIHXS-C5e6iYOC.js → mindmap-definition-FAOFIHXS-DhvP5DYu.js} +1 -1
- package/dist/webdist/assets/{monitor-hFoP-Pxj.js → monitor-eXRQjF9w.js} +1 -1
- package/dist/webdist/assets/{pegDiagram-VL7TDLO6-BQ_Voj5w.js → pegDiagram-VL7TDLO6-CLzXNlsf.js} +1 -1
- package/dist/webdist/assets/{pencil-D2iXjVbD.js → pencil-BtrApPfE.js} +1 -1
- package/dist/webdist/assets/personas-XaHDpxp2.js +109 -0
- package/dist/webdist/assets/{pieDiagram-7S7Q4E2Y-DXM9gFZw.js → pieDiagram-7S7Q4E2Y-CKHXWPS9.js} +1 -1
- package/dist/webdist/assets/{quadrantDiagram-CIZ2JOQS-BRa9W3tx.js → quadrantDiagram-CIZ2JOQS-BojJG_t4.js} +1 -1
- package/dist/webdist/assets/{railroadDiagram-AXF67PYL-BVDEirWs.js → railroadDiagram-AXF67PYL-DuD3rtF0.js} +1 -1
- package/dist/webdist/assets/{refresh-cw-Cm6Ic0_8.js → refresh-cw-D6KnKU2_.js} +1 -1
- package/dist/webdist/assets/{remote-failure-BLjio7b3.js → remote-failure-B8nqFhU5.js} +1 -1
- package/dist/webdist/assets/{requirementDiagram-LRYGKXZP-C74l9A1E.js → requirementDiagram-LRYGKXZP-BmoCUywL.js} +1 -1
- package/dist/webdist/assets/{rocket-C-pxXPXZ.js → rocket-B2q37T1r.js} +1 -1
- package/dist/webdist/assets/{rotate-ccw-BRymq87L.js → rotate-ccw-BMo4jBZ1.js} +1 -1
- package/dist/webdist/assets/{sankeyDiagram-W5VNT64P-BsH8Eu-e.js → sankeyDiagram-W5VNT64P-C89EHFeF.js} +1 -1
- package/dist/webdist/assets/{sequenceDiagram-SI44F4Z6-B9XE2EdE.js → sequenceDiagram-SI44F4Z6-BCR7KfeP.js} +1 -1
- package/dist/webdist/assets/{sheet-C2_P3xP2.js → sheet-CD8C6ONJ.js} +1 -1
- package/dist/webdist/assets/{sizeCapture-X5ZJPWSS-UMEN2RGV.js → sizeCapture-X5ZJPWSS-1hcjxDkN.js} +1 -1
- package/dist/webdist/assets/{skeleton-B3RpKtmw.js → skeleton-C1o0gjEg.js} +1 -1
- package/dist/webdist/assets/{sliders-horizontal-Tbar8Iuv.js → sliders-horizontal-DtSuS5yg.js} +1 -1
- package/dist/webdist/assets/{sparkles-DobYQL8n.js → sparkles-C8N5PBOo.js} +1 -1
- package/dist/webdist/assets/{star-EZSc11Fy.js → star-CNv5CnL_.js} +1 -1
- package/dist/webdist/assets/{stateDiagram-OKZ733FA-BYmvfWXV.js → stateDiagram-OKZ733FA-YPW5R4RS.js} +1 -1
- package/dist/webdist/assets/stateDiagram-v2-UEYNNEHI-DIs6tBM2.js +1 -0
- package/dist/webdist/assets/{swimlanes-SLNWSIFB-BXgBtl96.js → swimlanes-SLNWSIFB-Bql7YB-c.js} +2 -2
- package/dist/webdist/assets/swimlanesDiagram-ULZ7WXOC-BzmV1yPG.js +8 -0
- package/dist/webdist/assets/{switch-BkYO439N.js → switch-Dn5plSgD.js} +1 -1
- package/dist/webdist/assets/{terminal-wAhyejeF.js → terminal-Bl-uPRCi.js} +1 -1
- package/dist/webdist/assets/{timeline-definition-Z64GVDOM-HxbgMsz2.js → timeline-definition-Z64GVDOM-BZEdG7ZN.js} +1 -1
- package/dist/webdist/assets/{trash-2-BeJEd3dS.js → trash-2-DTsYIXDi.js} +1 -1
- package/dist/webdist/assets/{vennDiagram-T6HMQDX7-BS199h5Z.js → vennDiagram-T6HMQDX7-Cg9lsn_J.js} +1 -1
- package/dist/webdist/assets/{wardleyDiagram-T6FBY63Y-CiSNOVyM.js → wardleyDiagram-T6FBY63Y-xbljZAia.js} +1 -1
- package/dist/webdist/assets/{wrench-Cb_10Xfp.js → wrench-DbTBzsBR.js} +1 -1
- package/dist/webdist/assets/{xychartDiagram-ELKLHX3M-DcWM8BQj.js → xychartDiagram-ELKLHX3M-CjLE0hzq.js} +1 -1
- package/dist/webdist/index.html +1 -1
- package/package.json +1 -1
- package/dist/webdist/assets/EnginesScreen-D6uiILFx.js +0 -10
- package/dist/webdist/assets/ModelDetailDialog-2CnxrgyZ.js +0 -1
- package/dist/webdist/assets/OnboardingScreen-DibAVHbl.js +0 -1
- package/dist/webdist/assets/WorkspaceScreen-kicamjr8.js +0 -1
- package/dist/webdist/assets/channel-lZjnTXKq.js +0 -1
- package/dist/webdist/assets/classDiagram-JCYQIIEL-s5vmZBiR.js +0 -1
- package/dist/webdist/assets/classDiagram-v2-OCEON4UE-s5vmZBiR.js +0 -1
- package/dist/webdist/assets/index-DRdg25dC.js +0 -15
- package/dist/webdist/assets/personas-BWGXiudT.js +0 -109
- package/dist/webdist/assets/stateDiagram-v2-UEYNNEHI-hXGYjhv4.js +0 -1
- package/dist/webdist/assets/swimlanesDiagram-ULZ7WXOC-Bz4WUleA.js +0 -8
package/README.md
CHANGED
|
@@ -537,8 +537,9 @@ the engine as a swappable component.
|
|
|
537
537
|
|
|
538
538
|
1. Compile or download any `llama-server`-compatible binary — stock
|
|
539
539
|
[llama.cpp](https://github.com/ggml-org/llama.cpp), a community fork, or your own build.
|
|
540
|
-
2. Point TurboLLM at the **folder** — it scans for the
|
|
541
|
-
**capability probe**, and learns exactly which flags and features
|
|
540
|
+
2. Point TurboLLM at the **folder** — or upload the build's **.zip** — and it scans for the
|
|
541
|
+
`llama-server` binary, runs a **capability probe**, and learns exactly which flags and features
|
|
542
|
+
that build supports.
|
|
542
543
|
*(Optional: paste the source repo URL so TurboLLM flags when a newer build ships.)*
|
|
543
544
|
3. Activate it. The load-parameter UI **adapts to that engine** — features the build doesn't
|
|
544
545
|
support are hidden; ones it adds (e.g. low-bit KV cache, NextN) light up.
|
|
@@ -562,7 +563,8 @@ switch between CUDA / ROCm / Metal / SYCL / Vulkan / CPU at any time (it downloa
|
|
|
562
563
|
you choose, LM Studio-style).
|
|
563
564
|
|
|
564
565
|
**Engine types.** **llama.cpp / GGUF**, **KoboldCpp** and **llamafile** (GGUF, every OS),
|
|
565
|
-
**MLX** and **MLX-VLM** (macOS),
|
|
566
|
+
**MLX** and **MLX-VLM** (macOS), **vLLM** (Linux + NVIDIA), and **LiteRT-LM** (Google's on-device
|
|
567
|
+
runtime for `.litertlm` models, CPU or GPU, incl. Android via Termux; experimental) are all first-class engine kinds —
|
|
566
568
|
install from the curated catalog, pick the right one per model, and switch from a single dropdown.
|
|
567
569
|
|
|
568
570
|
**Fully supervised.** Every engine runs under a real state machine: health-gated readiness,
|
|
@@ -48,8 +48,22 @@ var RAPID_MLX_MODEL_ALIAS = "default";
|
|
|
48
48
|
function engineModelAlias(engineKind, modelPath) {
|
|
49
49
|
if (engineKind === "rapid-mlx") return RAPID_MLX_MODEL_ALIAS;
|
|
50
50
|
if (engineKind === "mlx-vlm") return modelPath ?? null;
|
|
51
|
+
if (engineKind === "litert-lm") return modelPath ?? null;
|
|
51
52
|
return engineKind === "mlx" || engineKind === "vllm" || engineKind === "sglang" ? ENGINE_MODEL_ALIAS : null;
|
|
52
53
|
}
|
|
54
|
+
function applyEngineTokenLimit(engineKind, body) {
|
|
55
|
+
if (engineKind !== "litert-lm" || !("max_tokens" in body)) return body;
|
|
56
|
+
const b = body;
|
|
57
|
+
if (b.max_completion_tokens != null && b.max_tokens != null) {
|
|
58
|
+
const capped = Number(b.max_tokens);
|
|
59
|
+
const explicit = Number(b.max_completion_tokens);
|
|
60
|
+
if (Number.isFinite(capped) && Number.isFinite(explicit)) b.max_completion_tokens = Math.min(capped, explicit);
|
|
61
|
+
} else if (b.max_tokens != null) {
|
|
62
|
+
b.max_completion_tokens = b.max_tokens;
|
|
63
|
+
}
|
|
64
|
+
delete b.max_tokens;
|
|
65
|
+
return body;
|
|
66
|
+
}
|
|
53
67
|
|
|
54
68
|
// src/link/link-proxy.ts
|
|
55
69
|
var FACADE_PREFIX = "/api/link";
|
|
@@ -218,17 +232,24 @@ function resolveChatUpstream(d, requestedModel) {
|
|
|
218
232
|
if (!target) {
|
|
219
233
|
return { ok: false, status: 409, code: "model_not_loaded", message: "Engine not running." };
|
|
220
234
|
}
|
|
235
|
+
const engineKind = d.registry.active()?.kind ?? "";
|
|
221
236
|
return {
|
|
222
237
|
ok: true,
|
|
223
238
|
upstream: {
|
|
224
|
-
modelField: engineModelAlias(
|
|
239
|
+
modelField: engineModelAlias(engineKind, d.manager.currentOpts()?.modelPath) ?? ms.model.key,
|
|
225
240
|
modelName: ms.model.name,
|
|
226
241
|
ctxMax: ms.model.ctx ?? DEFAULT_CTX,
|
|
227
|
-
target
|
|
242
|
+
target,
|
|
243
|
+
engineKind
|
|
228
244
|
}
|
|
229
245
|
};
|
|
230
246
|
}
|
|
247
|
+
function shapeForLocalEngine(upstream, body) {
|
|
248
|
+
if (upstream.remote || upstream.engineKind !== "litert-lm" || !body || typeof body !== "object" || Array.isArray(body)) return body;
|
|
249
|
+
return applyEngineTokenLimit(upstream.engineKind, { ...body });
|
|
250
|
+
}
|
|
231
251
|
function callChatUpstream(upstream, body, signal, fetchImpl = fetch, d) {
|
|
252
|
+
body = shapeForLocalEngine(upstream, body);
|
|
232
253
|
const payload = JSON.stringify(body);
|
|
233
254
|
const call = upstream.remote ? (() => {
|
|
234
255
|
const headers = linkHeaders(upstream.remote);
|
|
@@ -1541,7 +1562,7 @@ var BENCH_RATE_LIMIT_MS = 60 * 60 * 1e3;
|
|
|
1541
1562
|
// src/models/scanner.ts
|
|
1542
1563
|
import { existsSync as existsSync8, lstatSync as lstatSync2, readdirSync as readdirSync5, readFileSync as readFileSync8, realpathSync as realpathSync2, rmSync as rmSync4, writeFileSync as writeFileSync6 } from "fs";
|
|
1543
1564
|
import { readdir, realpath, stat } from "fs/promises";
|
|
1544
|
-
import { basename as
|
|
1565
|
+
import { basename as basename4, dirname as dirname4, isAbsolute, join as join12, relative, resolve as resolve2, sep as sep2 } from "path";
|
|
1545
1566
|
|
|
1546
1567
|
// src/gguf/gguf.ts
|
|
1547
1568
|
import { closeSync, openSync, readSync } from "fs";
|
|
@@ -1550,9 +1571,37 @@ import { closeSync, openSync, readSync } from "fs";
|
|
|
1550
1571
|
import { existsSync as existsSync7, lstatSync, readFileSync as readFileSync7 } from "fs";
|
|
1551
1572
|
import { basename as basename2, join as join11 } from "path";
|
|
1552
1573
|
|
|
1574
|
+
// src/models/litertlm.ts
|
|
1575
|
+
import { open } from "fs/promises";
|
|
1576
|
+
import { basename as basename3 } from "path";
|
|
1577
|
+
|
|
1553
1578
|
// src/models/profile.ts
|
|
1554
1579
|
var ROCM_APU_NOMMAP_MIN_BYTES = 30 * 1024 ** 3;
|
|
1555
1580
|
|
|
1581
|
+
// src/engines/litert-lm.ts
|
|
1582
|
+
import { createHash as createHash2 } from "crypto";
|
|
1583
|
+
import { existsSync as existsSync10, mkdirSync as mkdirSync7, readdirSync as readdirSync6, rmSync as rmSync6, statSync as statSync2, writeFileSync as writeFileSync7 } from "fs";
|
|
1584
|
+
import { execFile as execFile3 } from "child_process";
|
|
1585
|
+
import { dirname as dirname5, join as join14 } from "path";
|
|
1586
|
+
import { promisify as promisify3 } from "util";
|
|
1587
|
+
|
|
1588
|
+
// src/engines/mlx.ts
|
|
1589
|
+
import { existsSync as existsSync9, mkdirSync as mkdirSync6, rmSync as rmSync5 } from "fs";
|
|
1590
|
+
import { execFile as execFile2 } from "child_process";
|
|
1591
|
+
import { join as join13 } from "path";
|
|
1592
|
+
import { promisify as promisify2 } from "util";
|
|
1593
|
+
var execFileP2 = promisify2(execFile2);
|
|
1594
|
+
var uvBinName = process.platform === "win32" ? "uv.exe" : "uv";
|
|
1595
|
+
|
|
1596
|
+
// src/engines/litert-lm.ts
|
|
1597
|
+
var execFileP3 = promisify3(execFile3);
|
|
1598
|
+
var NATIVE_LOAD_PROBE = [
|
|
1599
|
+
"import importlib, litert_lm",
|
|
1600
|
+
"ffi = importlib.import_module('litert_lm._ffi')",
|
|
1601
|
+
"load = getattr(ffi, '_get_lib', None)",
|
|
1602
|
+
"load() if callable(load) else None"
|
|
1603
|
+
].join("\n");
|
|
1604
|
+
|
|
1556
1605
|
// src/sysinfo/sysinfo.ts
|
|
1557
1606
|
import { execFileSync as execFileSync3 } from "child_process";
|
|
1558
1607
|
import os from "os";
|
|
@@ -1619,7 +1668,7 @@ async function autoTitleFromConversation(d, convId) {
|
|
|
1619
1668
|
}
|
|
1620
1669
|
|
|
1621
1670
|
// src/code/code-session.ts
|
|
1622
|
-
import { join as
|
|
1671
|
+
import { join as join15, resolve as resolve3 } from "path";
|
|
1623
1672
|
import { readFile as readFile3 } from "fs/promises";
|
|
1624
1673
|
import { Type, Unsafe } from "typebox";
|
|
1625
1674
|
import {
|
|
@@ -2441,7 +2490,7 @@ async function runCodeSession(params) {
|
|
|
2441
2490
|
console.warn(`[code-session] history seed for session ${sessionId} produced ${sessionManager.getEntries().length}/${expectedEntries} expected entries \u2014 falling back to a plain-text history prefix on this turn's prompt`);
|
|
2442
2491
|
task = `${HISTORY_FALLBACK_PREFIX}${renderHistoryFallbackText(summaryText, priorMessages)}${HISTORY_FALLBACK_SUFFIX}${rawTask}`;
|
|
2443
2492
|
}
|
|
2444
|
-
const agentDir =
|
|
2493
|
+
const agentDir = join15(d.store.dir(), "pi-agent");
|
|
2445
2494
|
modelRegistry.registerProvider("local", {
|
|
2446
2495
|
...upstream.provider,
|
|
2447
2496
|
api: "openai-completions",
|
|
@@ -2568,7 +2617,7 @@ async function runCodeSession(params) {
|
|
|
2568
2617
|
await sink({ event: "tool_call", data });
|
|
2569
2618
|
});
|
|
2570
2619
|
};
|
|
2571
|
-
const skillAgentDir =
|
|
2620
|
+
const skillAgentDir = join15(d.store.dir(), "pi-agent");
|
|
2572
2621
|
const skillResourceLoader = new DefaultResourceLoader({
|
|
2573
2622
|
cwd: repoRoot,
|
|
2574
2623
|
agentDir: skillAgentDir,
|
|
@@ -2709,7 +2758,7 @@ async function runCodeSession(params) {
|
|
|
2709
2758
|
await sink({ event: "tool_call", data });
|
|
2710
2759
|
});
|
|
2711
2760
|
};
|
|
2712
|
-
const subAgentDir =
|
|
2761
|
+
const subAgentDir = join15(d.store.dir(), "pi-agent");
|
|
2713
2762
|
const subResourceLoader = new DefaultResourceLoader({
|
|
2714
2763
|
cwd: repoRoot,
|
|
2715
2764
|
agentDir: subAgentDir,
|
|
@@ -3364,7 +3413,7 @@ async function compactCodeSession(params) {
|
|
|
3364
3413
|
return payload;
|
|
3365
3414
|
});
|
|
3366
3415
|
};
|
|
3367
|
-
const compactAgentDir =
|
|
3416
|
+
const compactAgentDir = join15(d.store.dir(), "pi-agent");
|
|
3368
3417
|
const compactResourceLoader = new DefaultResourceLoader({
|
|
3369
3418
|
cwd: repoRoot,
|
|
3370
3419
|
agentDir: compactAgentDir,
|
|
@@ -3463,7 +3512,7 @@ async function lookbackPreCompactionHistory(params) {
|
|
|
3463
3512
|
return payload;
|
|
3464
3513
|
});
|
|
3465
3514
|
};
|
|
3466
|
-
const lookbackAgentDir =
|
|
3515
|
+
const lookbackAgentDir = join15(d.store.dir(), "pi-agent");
|
|
3467
3516
|
const lookbackResourceLoader = new DefaultResourceLoader({
|
|
3468
3517
|
cwd: repoRoot,
|
|
3469
3518
|
agentDir: lookbackAgentDir,
|
|
@@ -31,11 +31,14 @@ var GGMLC_GGUF = {
|
|
|
31
31
|
};
|
|
32
32
|
var NEEDS_PYTHON_ENGINE_LABEL = "needs MLX or vLLM";
|
|
33
33
|
function formatIncompatibility(engineKind, format) {
|
|
34
|
-
const label = format === "gguf" ? "needs llama.cpp" : NEEDS_PYTHON_ENGINE_LABEL;
|
|
34
|
+
const label = format === "gguf" ? "needs llama.cpp" : format === "litertlm" ? "needs LiteRT-LM" : NEEDS_PYTHON_ENGINE_LABEL;
|
|
35
35
|
return { code: "format", label, message: formatMismatchMessage(engineKind, format) };
|
|
36
36
|
}
|
|
37
37
|
function formatMismatchMessage(engineKind, format) {
|
|
38
38
|
if (engineKind === "laya") return "The Laya engine runs only Laya models \u2014 load this one on another engine.";
|
|
39
|
+
if (format === "litertlm") return "This is a LiteRT-LM model (.litertlm) \u2014 activate the LiteRT-LM engine to load it.";
|
|
40
|
+
if (engineKind === "litert-lm")
|
|
41
|
+
return "The active engine is LiteRT-LM \u2014 pick a .litertlm model, or switch to the engine this model's format needs.";
|
|
39
42
|
if (engineKind === "mlx")
|
|
40
43
|
return "The active engine is MLX \u2014 pick a safetensors model, or switch to a llama.cpp engine for GGUF.";
|
|
41
44
|
if (engineKind === "rapid-mlx")
|
|
@@ -61,6 +64,7 @@ function engineAcceptsFormat(engineKind, format) {
|
|
|
61
64
|
if (engineKind === "mlx-vlm") return format === "mlx";
|
|
62
65
|
if (engineKind === "vllm") return format === "mlx";
|
|
63
66
|
if (engineKind === "laya") return false;
|
|
67
|
+
if (engineKind === "litert-lm") return format === "litertlm";
|
|
64
68
|
return format === "gguf";
|
|
65
69
|
}
|
|
66
70
|
function engineRejectsAudioModel(engineKind) {
|
|
@@ -71,8 +75,22 @@ var RAPID_MLX_MODEL_ALIAS = "default";
|
|
|
71
75
|
function engineModelAlias(engineKind, modelPath) {
|
|
72
76
|
if (engineKind === "rapid-mlx") return RAPID_MLX_MODEL_ALIAS;
|
|
73
77
|
if (engineKind === "mlx-vlm") return modelPath ?? null;
|
|
78
|
+
if (engineKind === "litert-lm") return modelPath ?? null;
|
|
74
79
|
return engineKind === "mlx" || engineKind === "vllm" || engineKind === "sglang" ? ENGINE_MODEL_ALIAS : null;
|
|
75
80
|
}
|
|
81
|
+
function applyEngineTokenLimit(engineKind, body) {
|
|
82
|
+
if (engineKind !== "litert-lm" || !("max_tokens" in body)) return body;
|
|
83
|
+
const b = body;
|
|
84
|
+
if (b.max_completion_tokens != null && b.max_tokens != null) {
|
|
85
|
+
const capped = Number(b.max_tokens);
|
|
86
|
+
const explicit = Number(b.max_completion_tokens);
|
|
87
|
+
if (Number.isFinite(capped) && Number.isFinite(explicit)) b.max_completion_tokens = Math.min(capped, explicit);
|
|
88
|
+
} else if (b.max_tokens != null) {
|
|
89
|
+
b.max_completion_tokens = b.max_tokens;
|
|
90
|
+
}
|
|
91
|
+
delete b.max_tokens;
|
|
92
|
+
return body;
|
|
93
|
+
}
|
|
76
94
|
var VENDOR_DISPLAY = {
|
|
77
95
|
nvidia: "NVIDIA",
|
|
78
96
|
amd: "AMD",
|
|
@@ -136,7 +154,7 @@ async function distill(d, material) {
|
|
|
136
154
|
const res = await fetch(`${target}/v1/chat/completions`, {
|
|
137
155
|
method: "POST",
|
|
138
156
|
headers: { "Content-Type": "application/json" },
|
|
139
|
-
body: JSON.stringify({
|
|
157
|
+
body: JSON.stringify(applyEngineTokenLimit(d.registry.active()?.kind ?? "", {
|
|
140
158
|
model,
|
|
141
159
|
messages: [
|
|
142
160
|
{ role: "system", content: DISTILL_SYSTEM },
|
|
@@ -152,7 +170,7 @@ Write ONE reusable skill as raw JSON \u2014 no markdown fences.` }
|
|
|
152
170
|
chat_template_kwargs: { enable_thinking: false },
|
|
153
171
|
response_format: { type: "json_object" },
|
|
154
172
|
stream: false
|
|
155
|
-
}),
|
|
173
|
+
})),
|
|
156
174
|
signal: AbortSignal.timeout(9e4)
|
|
157
175
|
});
|
|
158
176
|
if (!res.ok) return { name: null, description: null, procedure: null };
|
|
@@ -232,6 +250,7 @@ export {
|
|
|
232
250
|
modelIncompatibility,
|
|
233
251
|
ENGINE_MODEL_ALIAS,
|
|
234
252
|
engineModelAlias,
|
|
253
|
+
applyEngineTokenLimit,
|
|
235
254
|
evaluateVariant,
|
|
236
255
|
distillFromConversation,
|
|
237
256
|
distillSkillsFromFolder
|