From d2717fb8df0359d8fea164dc7907d8e3eaba72b4 Mon Sep 17 00:00:00 2001 From: Louis Date: Sun, 12 Jan 2025 16:10:37 +0700 Subject: [PATCH] fix: load model fail on windows --- electron/package.json | 5 +++- .../engine-management-extension/package.json | 6 ++++- .../src/node/index.ts | 27 ++++++++++++++++++- package.json | 1 - 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/electron/package.json b/electron/package.json index c058370a7b..54e34f2476 100644 --- a/electron/package.json +++ b/electron/package.json @@ -82,7 +82,9 @@ "copy:assets": "rimraf --glob \"./pre-install/*.tgz\" && cpx \"../pre-install/*.tgz\" \"./pre-install\"", "version-patch": "jq '.version' package.json | tr -d '\"' > .version.bak && jq --arg ver \"0.1.$(date +%s)\" '.version = $ver' package.json > package.tmp && mv package.tmp package.json", "version-restore": "jq --arg ver $(cat .version.bak) '.version = $ver' package.json > package.tmp && mv package.tmp package.json && rm .version.bak", - "dev": "yarn copy:assets && tsc -p . && yarn version-patch && electron . && yarn version-restore", + "dev:darwin:linux": "yarn copy:assets && tsc -p . && yarn version-patch && electron . && yarn version-restore", + "dev:windows": "yarn copy:assets && tsc -p . && electron .", + "dev": "run-script-os", "compile": "tsc -p .", "start": "electron .", "build": "yarn copy:assets && run-script-os", @@ -129,6 +131,7 @@ "electron-playwright-helpers": "^1.6.0", "eslint": "8.57.0", "eslint-plugin-react": "^7.34.0", + "jq": "^1.7.2", "rimraf": "^5.0.5", "run-script-os": "^1.1.6", "typescript": "^5.3.3", diff --git a/extensions/engine-management-extension/package.json b/extensions/engine-management-extension/package.json index 2a9da41ecd..5ffe2d42af 100644 --- a/extensions/engine-management-extension/package.json +++ b/extensions/engine-management-extension/package.json @@ -10,7 +10,10 @@ "scripts": { "test": "jest", "build": "rolldown -c rolldown.config.mjs", - "build:publish": "rimraf *.tgz --glob || true && yarn build && ../../.github/scripts/auto-sign.sh && npm pack && cpx *.tgz ../../pre-install" + "codesign:darwin": "../../.github/scripts/auto-sign.sh", + "codesign:win32:linux": "echo 'No codesigning required'", + "codesign": "run-script-os", + "build:publish": "rimraf *.tgz --glob || true && yarn build && yarn codesign && npm pack && cpx *.tgz ../../pre-install" }, "exports": { ".": "./dist/index.js", @@ -20,6 +23,7 @@ "cpx": "^1.5.0", "rimraf": "^3.0.2", "rolldown": "^1.0.0-beta.1", + "run-script-os": "^1.1.6", "ts-loader": "^9.5.0", "typescript": "^5.3.3" }, diff --git a/extensions/inference-cortex-extension/src/node/index.ts b/extensions/inference-cortex-extension/src/node/index.ts index 4ce35c83da..dda92fbcff 100644 --- a/extensions/inference-cortex-extension/src/node/index.ts +++ b/extensions/inference-cortex-extension/src/node/index.ts @@ -1,6 +1,7 @@ import path from 'path' -import { getJanDataFolderPath, log, SystemInformation } from '@janhq/core/node' +import { appResourcePath, getJanDataFolderPath, log, SystemInformation } from '@janhq/core/node' import { ProcessWatchdog } from './watchdog' +import { readdir, symlink } from 'fs/promises' // The HOST address to use for the Nitro subprocess const LOCAL_PORT = '39291' @@ -17,7 +18,13 @@ function run(systemInfo?: SystemInformation): Promise { let gpuVisibleDevices = systemInfo?.gpuSetting?.gpus_in_use.join(',') ?? '' let binaryName = `cortex-server${process.platform === 'win32' ? '.exe' : ''}` const binPath = path.join(__dirname, '..', 'bin') + await createEngineSymlinks(binPath) + const executablePath = path.join(binPath, binaryName) + const sharedPath = path.join( + appResourcePath(), + 'shared' + ) // Execute the binary log(`[CORTEX]:: Spawn cortex at path: ${executablePath}`) @@ -46,6 +53,7 @@ function run(systemInfo?: SystemInformation): Promise { GGML_VK_VISIBLE_DEVICES: gpuVisibleDevices, }), }, + cwd: sharedPath, } ) watchdog.start() @@ -53,6 +61,23 @@ function run(systemInfo?: SystemInformation): Promise { }) } +/** + * Create symlinks for the engine shared libraries + * @param binPath + */ +async function createEngineSymlinks(binPath: string) { + const sharedPath = path.join(appResourcePath(), 'shared') + const sharedLibFiles = await readdir(sharedPath) + for (const sharedLibFile of sharedLibFiles) { + if (sharedLibFile.endsWith('.dll') || sharedLibFile.endsWith('.so')) { + const targetDllPath = path.join(sharedPath, sharedLibFile) + const symlinkDllPath = path.join(binPath, sharedLibFile) + await symlink(targetDllPath, symlinkDllPath).catch(console.error) + console.log(`Symlink created: ${targetDllPath} -> ${symlinkDllPath}`) + } + } +} + /** * Every module should have a dispose function * This will be called when the extension is unloaded and should clean up any resources diff --git a/package.json b/package.json index 174b39d96c..743406122b 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "rimraf": "^3.0.2", - "run-script-os": "^1.1.6", "wait-on": "^7.0.1" }, "version": "0.0.0",