From 7c41408a1aaa59f3261e2727fe19013ed0cab090 Mon Sep 17 00:00:00 2001 From: Akarshan Date: Thu, 11 Sep 2025 13:45:29 +0530 Subject: [PATCH] feat: add relative path support for model loading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implemented `isAbsolutePath` helper to correctly identify POSIX, Windows drive‑letter, and UNC absolute paths. Updated `planModelLoad` to automatically resolve relative model and mmproj paths against the Jan data folder, enhancing usability for users supplying non‑absolute paths. Also refined minor formatting for readability. --- extensions/llamacpp-extension/src/index.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/extensions/llamacpp-extension/src/index.ts b/extensions/llamacpp-extension/src/index.ts index aeec45744..5912f4510 100644 --- a/extensions/llamacpp-extension/src/index.ts +++ b/extensions/llamacpp-extension/src/index.ts @@ -328,7 +328,8 @@ export default class llamacpp_extension extends AIEngine { await this.determineBestBackend(version_backends) } } else { - bestAvailableBackendString = await this.determineBestBackend(version_backends) + bestAvailableBackendString = + await this.determineBestBackend(version_backends) } let settings = structuredClone(SETTINGS) @@ -2047,11 +2048,25 @@ export default class llamacpp_extension extends AIEngine { return { layerSize: modelSize / totalLayers, totalLayers } } + private isAbsolutePath(p: string): boolean { + // Normalize back‑slashes to forward‑slashes first. + const norm = p.replace(/\\/g, '/') + return ( + norm.startsWith('/') || // POSIX absolute + /^[a-zA-Z]:/.test(norm) || // Drive‑letter Windows (C: or D:) + /^\/\/[^/]+/.test(norm) // UNC path //server/share + ) + } + async planModelLoad( path: string, mmprojPath?: string, requestedCtx?: number ): Promise { + if (!this.isAbsolutePath(path)) + path = await joinPath([await getJanDataFolderPath(), path]) + if (mmprojPath && !this.isAbsolutePath(mmprojPath)) + mmprojPath = await joinPath([await getJanDataFolderPath(), path]) const modelSize = await this.getModelSize(path) const memoryInfo = await this.getTotalSystemMemory() const gguf = await readGgufMetadata(path) @@ -2217,8 +2232,7 @@ export default class llamacpp_extension extends AIEngine { // Calculate available system RAM for KV cache const cpuLayers = totalLayers - gpuLayers const modelCPUSize = cpuLayers * layerSize - const mmprojCPUSize = - mmprojSize > 0 && !offloadMmproj ? mmprojSize : 0 + const mmprojCPUSize = mmprojSize > 0 && !offloadMmproj ? mmprojSize : 0 const systemRAMUsed = modelCPUSize + mmprojCPUSize const availableSystemRAMForKVCache = Math.max( 0,