feat: add relative path support for model loading

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.
This commit is contained in:
Akarshan 2025-09-11 13:45:29 +05:30
parent 8f67f29317
commit 7c41408a1a
No known key found for this signature in database
GPG Key ID: D75C9634A870665F

View File

@ -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 backslashes to forwardslashes first.
const norm = p.replace(/\\/g, '/')
return (
norm.startsWith('/') || // POSIX absolute
/^[a-zA-Z]:/.test(norm) || // Driveletter Windows (C: or D:)
/^\/\/[^/]+/.test(norm) // UNC path //server/share
)
}
async planModelLoad(
path: string,
mmprojPath?: string,
requestedCtx?: number
): Promise<ModelPlan> {
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,