From c81a33f382d153cbdc2b024ae932496bff7b617f Mon Sep 17 00:00:00 2001 From: NamH Date: Mon, 18 Mar 2024 07:38:35 +0700 Subject: [PATCH] fix: move tensorrt executable to engine (#2400) * fix: move tensorrt executable to engine Signed-off-by: James * some update Signed-off-by: hiro * chore: bump tensorrt version * fix: wrong destroy path * fix: install extensions in parallel * chore: update path for tensorrt engine (#2404) Signed-off-by: James Co-authored-by: James --------- Signed-off-by: James Signed-off-by: hiro Co-authored-by: James Co-authored-by: hiro Co-authored-by: Louis --- core/src/api/index.ts | 3 +- core/src/core.ts | 7 +- .../extensions/ai-engines/LocalOAIEngine.ts | 6 +- core/src/extensions/monitoring.ts | 3 +- core/src/fs.ts | 3 + core/src/node/api/processors/fsExt.ts | 12 ++ core/src/node/extension/store.ts | 19 +-- .../types/miscellaneous/systemResourceInfo.ts | 24 ++++ extensions/monitoring-extension/src/index.ts | 11 +- .../monitoring-extension/src/node/index.ts | 26 ++++- .../tensorrt-llm-extension/package.json | 2 + .../tensorrt-llm-extension/rollup.config.ts | 10 +- .../src/@types/global.d.ts | 1 + .../tensorrt-llm-extension/src/index.ts | 101 +++++++++++++--- .../tensorrt-llm-extension/src/node/index.ts | 109 ++++++++++++------ .../CoreExtensions/TensorRtExtensionItem.tsx | 6 +- web/services/appService.ts | 24 +++- 17 files changed, 283 insertions(+), 84 deletions(-) diff --git a/core/src/api/index.ts b/core/src/api/index.ts index f97593934f..f3b4fe10f2 100644 --- a/core/src/api/index.ts +++ b/core/src/api/index.ts @@ -33,7 +33,7 @@ export enum AppRoute { stopServer = 'stopServer', log = 'log', logServer = 'logServer', - systemInformations = 'systemInformations', + systemInformation = 'systemInformation', showToast = 'showToast', } @@ -95,6 +95,7 @@ export enum FileManagerRoute { getUserHomePath = 'getUserHomePath', fileStat = 'fileStat', writeBlob = 'writeBlob', + mkdir = 'mkdir', } export type ApiFunction = (...args: any[]) => any diff --git a/core/src/core.ts b/core/src/core.ts index b8cbd3162c..47c0fe6f2c 100644 --- a/core/src/core.ts +++ b/core/src/core.ts @@ -1,4 +1,4 @@ -import { DownloadRequest, FileStat, NetworkConfig } from './types' +import { DownloadRequest, FileStat, NetworkConfig, SystemInformation } from './types' /** * Execute a extension module function in main process @@ -110,7 +110,8 @@ const isSubdirectory: (from: string, to: string) => Promise = (from: st * Get system information * @returns {Promise} - A promise that resolves with the system information. */ -const systemInformations: () => Promise = () => global.core.api?.systemInformations() +const systemInformation: () => Promise = () => + global.core.api?.systemInformation() /** * Show toast message from browser processes. @@ -146,7 +147,7 @@ export { log, isSubdirectory, getUserHomePath, - systemInformations, + systemInformation, showToast, FileStat, } diff --git a/core/src/extensions/ai-engines/LocalOAIEngine.ts b/core/src/extensions/ai-engines/LocalOAIEngine.ts index 79dbcbf5e7..89444ff0fc 100644 --- a/core/src/extensions/ai-engines/LocalOAIEngine.ts +++ b/core/src/extensions/ai-engines/LocalOAIEngine.ts @@ -1,4 +1,4 @@ -import { executeOnMain, getJanDataFolderPath, joinPath } from '../../core' +import { executeOnMain, getJanDataFolderPath, joinPath, systemInformation } from '../../core' import { events } from '../../events' import { Model, ModelEvent } from '../../types' import { OAIEngine } from './OAIEngine' @@ -30,11 +30,11 @@ export abstract class LocalOAIEngine extends OAIEngine { if (model.engine.toString() !== this.provider) return const modelFolder = await joinPath([await getJanDataFolderPath(), this.modelFolder, model.id]) - + const systemInfo = await systemInformation() const res = await executeOnMain(this.nodeModule, this.loadModelFunctionName, { modelFolder, model, - }) + }, systemInfo) if (res?.error) { events.emit(ModelEvent.OnModelFail, { diff --git a/core/src/extensions/monitoring.ts b/core/src/extensions/monitoring.ts index 8d61580fca..2d75e0218b 100644 --- a/core/src/extensions/monitoring.ts +++ b/core/src/extensions/monitoring.ts @@ -1,5 +1,5 @@ import { BaseExtension, ExtensionTypeEnum } from '../extension' -import { GpuSetting, MonitoringInterface } from '../index' +import { GpuSetting, MonitoringInterface, OperatingSystemInfo } from '../index' /** * Monitoring extension for system monitoring. @@ -16,4 +16,5 @@ export abstract class MonitoringExtension extends BaseExtension implements Monit abstract getGpuSetting(): Promise abstract getResourcesInfo(): Promise abstract getCurrentLoad(): Promise + abstract getOsInfo(): Promise } diff --git a/core/src/fs.ts b/core/src/fs.ts index 71538ae9cc..1c6d96ef01 100644 --- a/core/src/fs.ts +++ b/core/src/fs.ts @@ -37,6 +37,8 @@ const readdirSync = (...args: any[]) => global.core.api?.readdirSync(...args) */ const mkdirSync = (...args: any[]) => global.core.api?.mkdirSync(...args) +const mkdir = (...args: any[]) => global.core.api?.mkdir(...args) + /** * Removes a directory at the specified path. * @returns {Promise} A Promise that resolves when the directory is removed successfully. @@ -92,6 +94,7 @@ export const fs = { existsSync, readdirSync, mkdirSync, + mkdir, rmdirSync, unlinkSync, appendFileSync, diff --git a/core/src/node/api/processors/fsExt.ts b/core/src/node/api/processors/fsExt.ts index 4787da65b3..0f7dde6d9c 100644 --- a/core/src/node/api/processors/fsExt.ts +++ b/core/src/node/api/processors/fsExt.ts @@ -88,4 +88,16 @@ export class FSExt implements Processor { }) }) } + + mkdir(path: string): Promise { + return new Promise((resolve, reject) => { + fs.mkdir(path, { recursive: true }, (err) => { + if (err) { + reject(err) + } else { + resolve() + } + }) + }) + } } diff --git a/core/src/node/extension/store.ts b/core/src/node/extension/store.ts index 93b1aeb2b6..630756485d 100644 --- a/core/src/node/extension/store.ts +++ b/core/src/node/extension/store.ts @@ -93,8 +93,7 @@ export function persistExtensions() { */ export async function installExtensions(extensions: any) { const installed: Extension[] = [] - for (const ext of extensions) { - // Set install options and activation based on input type + const installations = extensions.map((ext: any): Promise => { const isObject = typeof ext === 'object' const spec = isObject ? [ext.specifier, ext] : [ext] const activate = isObject ? ext.activate !== false : true @@ -102,15 +101,17 @@ export async function installExtensions(extensions: any) { // Install and possibly activate extension const extension = new Extension(...spec) if (!extension.origin) { - continue + return Promise.resolve() } - await extension._install() - if (activate) extension.setActive(true) + return extension._install().then(() => { + if (activate) extension.setActive(true) + // Add extension to store if needed + addExtension(extension) + installed.push(extension) + }) + }) - // Add extension to store if needed - addExtension(extension) - installed.push(extension) - } + await Promise.all(installations) // Return list of all installed extensions return installed diff --git a/core/src/types/miscellaneous/systemResourceInfo.ts b/core/src/types/miscellaneous/systemResourceInfo.ts index f7dd4a82ba..fb059b1ba8 100644 --- a/core/src/types/miscellaneous/systemResourceInfo.ts +++ b/core/src/types/miscellaneous/systemResourceInfo.ts @@ -30,3 +30,27 @@ export type GpuSettingInfo = { name: string arch?: string } + +export type SystemInformation = { + gpuSetting: GpuSetting + osInfo?: OperatingSystemInfo +} + +export const SupportedPlatforms = ['win32', 'linux', 'darwin'] as const +export type SupportedPlatformTuple = typeof SupportedPlatforms +export type SupportedPlatform = SupportedPlatformTuple[number] + +export type OperatingSystemInfo = { + platform: SupportedPlatform | 'unknown' + arch: string + release: string + machine: string + version: string + totalMem: number + freeMem: number +} + +export type CpuCoreInfo = { + model: string + speed: number +} diff --git a/extensions/monitoring-extension/src/index.ts b/extensions/monitoring-extension/src/index.ts index c7f53455dd..7ef40e7bec 100644 --- a/extensions/monitoring-extension/src/index.ts +++ b/extensions/monitoring-extension/src/index.ts @@ -1,4 +1,9 @@ -import { GpuSetting, MonitoringExtension, executeOnMain } from '@janhq/core' +import { + GpuSetting, + MonitoringExtension, + OperatingSystemInfo, + executeOnMain, +} from '@janhq/core' /** * JanMonitoringExtension is a extension that provides system monitoring functionality. @@ -41,4 +46,8 @@ export default class JanMonitoringExtension extends MonitoringExtension { getCurrentLoad(): Promise { return executeOnMain(NODE, 'getCurrentLoad') } + + getOsInfo(): Promise { + return executeOnMain(NODE, 'getOsInfo') + } } diff --git a/extensions/monitoring-extension/src/node/index.ts b/extensions/monitoring-extension/src/node/index.ts index 25f1511120..00fa7d0f64 100644 --- a/extensions/monitoring-extension/src/node/index.ts +++ b/extensions/monitoring-extension/src/node/index.ts @@ -1,9 +1,16 @@ -import { GpuSetting, GpuSettingInfo, ResourceInfo } from '@janhq/core' +import { + GpuSetting, + GpuSettingInfo, + OperatingSystemInfo, + ResourceInfo, + SupportedPlatforms, +} from '@janhq/core' import { getJanDataFolderPath, log } from '@janhq/core/node' import { mem, cpu } from 'node-os-utils' import { exec } from 'child_process' import { writeFileSync, existsSync, readFileSync, mkdirSync } from 'fs' import path from 'path' +import os from 'os' /** * Path to the settings directory @@ -320,3 +327,20 @@ const updateCudaExistence = ( data.is_initial = false return data } + +export const getOsInfo = (): OperatingSystemInfo => { + const platform = + SupportedPlatforms.find((p) => p === process.platform) || 'unknown' + + const osInfo: OperatingSystemInfo = { + platform: platform, + arch: process.arch, + release: os.release(), + machine: os.machine(), + version: os.version(), + totalMem: os.totalmem(), + freeMem: os.freemem(), + } + + return osInfo +} diff --git a/extensions/tensorrt-llm-extension/package.json b/extensions/tensorrt-llm-extension/package.json index af1dba8539..ec54a82c15 100644 --- a/extensions/tensorrt-llm-extension/package.json +++ b/extensions/tensorrt-llm-extension/package.json @@ -18,6 +18,8 @@ "0.1.0" ] }, + "tensorrtVersion": "0.1.6", + "provider": "nitro-tensorrt-llm", "scripts": { "build": "tsc --module commonjs && rollup -c rollup.config.ts", "build:publish:win32": "rimraf *.tgz --glob && npm run build && cpx \"bin/**\" \"dist/bin\" && npm pack && cpx *.tgz ../../pre-install", diff --git a/extensions/tensorrt-llm-extension/rollup.config.ts b/extensions/tensorrt-llm-extension/rollup.config.ts index 33e45823be..ee8d050d3f 100644 --- a/extensions/tensorrt-llm-extension/rollup.config.ts +++ b/extensions/tensorrt-llm-extension/rollup.config.ts @@ -16,9 +16,10 @@ export default [ plugins: [ replace({ EXTENSION_NAME: JSON.stringify(packageJson.name), - TENSORRT_VERSION: JSON.stringify('0.1.5'), + TENSORRT_VERSION: JSON.stringify(packageJson.tensorrtVersion), + PROVIDER: JSON.stringify(packageJson.provider), DOWNLOAD_RUNNER_URL: - process.platform === 'darwin' || process.platform === 'win32' + process.platform === 'win32' ? JSON.stringify( 'https://github.com/janhq/nitro-tensorrt-llm/releases/download/windows-v/nitro-windows-v-amd64-tensorrt-llm-.tar.gz' ) @@ -52,11 +53,14 @@ export default [ }, plugins: [ replace({ + EXTENSION_NAME: JSON.stringify(packageJson.name), + TENSORRT_VERSION: JSON.stringify(packageJson.tensorrtVersion), + PROVIDER: JSON.stringify(packageJson.provider), LOAD_MODEL_URL: JSON.stringify( `${packageJson.config?.protocol ?? 'http'}://${packageJson.config?.host}:${packageJson.config?.port}/inferences/tensorrtllm/loadmodel` ), TERMINATE_ENGINE_URL: JSON.stringify( - `${packageJson.config?.protocol ?? 'http'}://${packageJson.config?.host}:${packageJson.config?.port}/inferences/processmanager/destroy` + `${packageJson.config?.protocol ?? 'http'}://${packageJson.config?.host}:${packageJson.config?.port}/processmanager/destroy` ), ENGINE_HOST: JSON.stringify(packageJson.config?.host ?? '127.0.0.1'), ENGINE_PORT: JSON.stringify(packageJson.config?.port ?? '3928'), diff --git a/extensions/tensorrt-llm-extension/src/@types/global.d.ts b/extensions/tensorrt-llm-extension/src/@types/global.d.ts index 905e86380a..9cf5b60900 100644 --- a/extensions/tensorrt-llm-extension/src/@types/global.d.ts +++ b/extensions/tensorrt-llm-extension/src/@types/global.d.ts @@ -8,3 +8,4 @@ declare const DOWNLOAD_RUNNER_URL: string declare const TENSORRT_VERSION: string declare const COMPATIBILITY: object declare const EXTENSION_NAME: string +declare const PROVIDER: string diff --git a/extensions/tensorrt-llm-extension/src/index.ts b/extensions/tensorrt-llm-extension/src/index.ts index 02c6768413..f8e2f775ed 100644 --- a/extensions/tensorrt-llm-extension/src/index.ts +++ b/extensions/tensorrt-llm-extension/src/index.ts @@ -16,11 +16,12 @@ import { executeOnMain, joinPath, showToast, - systemInformations, + systemInformation, LocalOAIEngine, fs, MessageRequest, ModelEvent, + getJanDataFolderPath, } from '@janhq/core' import models from '../models.json' @@ -34,11 +35,12 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { * Override custom function name for loading and unloading model * Which are implemented from node module */ - override provider = 'nitro-tensorrt-llm' + override provider = PROVIDER override inferenceUrl = INFERENCE_URL override nodeModule = NODE private supportedGpuArch = ['turing', 'ampere', 'ada'] + private supportedPlatform = ['win32', 'linux'] compatibility() { return COMPATIBILITY as unknown as Compatibility @@ -54,7 +56,7 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { } override async install(): Promise { - const info = await systemInformations() + const info = await systemInformation() console.debug( `TensorRTLLMExtension installing pre-requisites... ${JSON.stringify(info)}` ) @@ -83,12 +85,19 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { return } - const binaryFolderPath = await executeOnMain( - this.nodeModule, - 'binaryFolder' - ) - if (!(await fs.existsSync(binaryFolderPath))) { - await fs.mkdirSync(binaryFolderPath) + const janDataFolderPath = await getJanDataFolderPath() + const engineVersion = TENSORRT_VERSION + + const executableFolderPath = await joinPath([ + janDataFolderPath, + 'engines', + this.provider, + engineVersion, + firstGpu.arch, + ]) + + if (!(await fs.existsSync(executableFolderPath))) { + await fs.mkdir(executableFolderPath) } const placeholderUrl = DOWNLOAD_RUNNER_URL @@ -100,7 +109,7 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { const tarball = await baseName(url) - const tarballFullPath = await joinPath([binaryFolderPath, tarball]) + const tarballFullPath = await joinPath([executableFolderPath, tarball]) const downloadRequest: DownloadRequest = { url, localPath: tarballFullPath, @@ -109,12 +118,16 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { } downloadFile(downloadRequest) - // TODO: wrap this into a Promise const onFileDownloadSuccess = async (state: DownloadState) => { // if other download, ignore if (state.fileName !== tarball) return events.off(DownloadEvent.onFileDownloadSuccess, onFileDownloadSuccess) - await executeOnMain(this.nodeModule, 'decompressRunner', tarballFullPath) + await executeOnMain( + this.nodeModule, + 'decompressRunner', + tarballFullPath, + executableFolderPath + ) events.emit(DownloadEvent.onFileUnzipSuccess, state) // Prepopulate models as soon as it's ready @@ -144,13 +157,65 @@ export default class TensorRTLLMExtension extends LocalOAIEngine { } override async installationState(): Promise { - // For now, we just check the executable of nitro x tensor rt - const isNitroExecutableAvailable = await executeOnMain( - this.nodeModule, - 'isNitroExecutableAvailable' - ) + const info = await systemInformation() + + const gpuSetting: GpuSetting | undefined = info.gpuSetting + if (gpuSetting === undefined) { + console.warn( + 'No GPU setting found. TensorRT-LLM extension is not installed' + ) + return 'NotInstalled' // TODO: maybe disabled / incompatible is more appropriate + } + + if (gpuSetting.gpus.length === 0) { + console.warn('No GPU found. TensorRT-LLM extension is not installed') + return 'NotInstalled' + } + + const firstGpu = gpuSetting.gpus[0] + if (!firstGpu.name.toLowerCase().includes('nvidia')) { + console.error('No Nvidia GPU found. Please check your GPU setting.') + return 'NotInstalled' + } - return isNitroExecutableAvailable ? 'Installed' : 'NotInstalled' + if (firstGpu.arch === undefined) { + console.error('No GPU architecture found. Please check your GPU setting.') + return 'NotInstalled' + } + + if (!this.supportedGpuArch.includes(firstGpu.arch)) { + console.error( + `Your GPU: ${firstGpu} is not supported. Only 20xx, 30xx, 40xx series are supported.` + ) + return 'NotInstalled' + } + + const osInfo = info.osInfo + if (!osInfo) { + console.error('No OS information found. Please check your OS setting.') + return 'NotInstalled' + } + + if (!this.supportedPlatform.includes(osInfo.platform)) { + console.error( + `Your OS: ${osInfo.platform} is not supported. Only Windows and Linux are supported.` + ) + return 'NotInstalled' + } + const janDataFolderPath = await getJanDataFolderPath() + const engineVersion = TENSORRT_VERSION + + const enginePath = await joinPath([ + janDataFolderPath, + 'engines', + this.provider, + engineVersion, + firstGpu.arch, + osInfo.platform === 'win32' ? 'nitro.exe' : 'nitro', + ]) + + // For now, we just check the executable of nitro x tensor rt + return (await fs.existsSync(enginePath)) ? 'Installed' : 'NotInstalled' } override onInferenceStopped() { diff --git a/extensions/tensorrt-llm-extension/src/node/index.ts b/extensions/tensorrt-llm-extension/src/node/index.ts index 252468fc1b..3766b5524c 100644 --- a/extensions/tensorrt-llm-extension/src/node/index.ts +++ b/extensions/tensorrt-llm-extension/src/node/index.ts @@ -2,13 +2,16 @@ import path from 'path' import { ChildProcessWithoutNullStreams, spawn } from 'child_process' import tcpPortUsed from 'tcp-port-used' import fetchRT from 'fetch-retry' -import { log } from '@janhq/core/node' -import { existsSync } from 'fs' +import { log, getJanDataFolderPath } from '@janhq/core/node' import decompress from 'decompress' +import { SystemInformation } from '@janhq/core' // Polyfill fetch with retry const fetchRetry = fetchRT(fetch) +const supportedPlatform = (): string[] => ['win32', 'linux'] +const supportedGpuArch = (): string[] => ['turing', 'ampere', 'ada'] + /** * The response object for model init operation. */ @@ -24,7 +27,10 @@ let subprocess: ChildProcessWithoutNullStreams | undefined = undefined * Initializes a engine subprocess to load a machine learning model. * @param params - The model load settings. */ -async function loadModel(params: any): Promise<{ error: Error | undefined }> { +async function loadModel( + params: any, + systemInfo?: SystemInformation +): Promise<{ error: Error | undefined }> { // modelFolder is the absolute path to the running model folder // e.g. ~/jan/models/llama-2 let modelFolder = params.modelFolder @@ -33,7 +39,10 @@ async function loadModel(params: any): Promise<{ error: Error | undefined }> { engine_path: modelFolder, ctx_len: params.model.settings.ctx_len ?? 2048, } - return runEngineAndLoadModel(settings) + if (!systemInfo) { + throw new Error('Cannot get system info. Unable to start nitro x tensorrt.') + } + return runEngineAndLoadModel(settings, systemInfo) } /** @@ -67,9 +76,12 @@ function unloadModel(): Promise { * 2. Load model into engine subprocess * @returns */ -async function runEngineAndLoadModel(settings: ModelLoadParams) { +async function runEngineAndLoadModel( + settings: ModelLoadParams, + systemInfo: SystemInformation +) { return unloadModel() - .then(runEngine) + .then(() => runEngine(systemInfo)) .then(() => loadModelRequest(settings)) .catch((err) => { // TODO: Broadcast error so app could display proper error message @@ -81,7 +93,7 @@ async function runEngineAndLoadModel(settings: ModelLoadParams) { /** * Loads a LLM model into the Engine subprocess by sending a HTTP POST request. */ -function loadModelRequest( +async function loadModelRequest( settings: ModelLoadParams ): Promise<{ error: Error | undefined }> { debugLog(`Loading model with params ${JSON.stringify(settings)}`) @@ -107,23 +119,66 @@ function loadModelRequest( /** * Spawns engine subprocess. */ -function runEngine(): Promise { +async function runEngine(systemInfo: SystemInformation): Promise { debugLog(`Spawning engine subprocess...`) + if (systemInfo.gpuSetting == null) { + return Promise.reject( + 'No GPU information found. Please check your GPU setting.' + ) + } + + if (systemInfo.gpuSetting.gpus.length === 0) { + return Promise.reject('No GPU found. Please check your GPU setting.') + } + + if (systemInfo.osInfo == null) { + return Promise.reject( + 'No OS information found. Please check your OS setting.' + ) + } + const platform = systemInfo.osInfo.platform + if (platform == null || supportedPlatform().includes(platform) === false) { + return Promise.reject( + 'No OS architecture found. Please check your OS setting.' + ) + } + + const gpu = systemInfo.gpuSetting.gpus[0] + if (gpu.name.toLowerCase().includes('nvidia') === false) { + return Promise.reject('No Nvidia GPU found. Please check your GPU setting.') + } + const gpuArch = gpu.arch + if (gpuArch == null || supportedGpuArch().includes(gpuArch) === false) { + return Promise.reject( + `Your GPU: ${gpu.name} is not supported. Only ${supportedGpuArch().join( + ', ' + )} series are supported.` + ) + } + const janDataFolderPath = await getJanDataFolderPath() + const tensorRtVersion = TENSORRT_VERSION + const provider = PROVIDER return new Promise((resolve, reject) => { // Current directory by default - let binaryFolder = path.join(__dirname, '..', 'bin') - // Binary path - const binary = path.join( - binaryFolder, - process.platform === 'win32' ? 'nitro.exe' : 'nitro' + + const executableFolderPath = path.join( + janDataFolderPath, + 'engines', + provider, + tensorRtVersion, + gpuArch + ) + const nitroExecutablePath = path.join( + executableFolderPath, + platform === 'win32' ? 'nitro.exe' : 'nitro' ) const args: string[] = ['1', ENGINE_HOST, ENGINE_PORT] // Execute the binary - debugLog(`Spawn nitro at path: ${binary}, and args: ${args}`) - subprocess = spawn(binary, args, { - cwd: binaryFolder, + debugLog(`Spawn nitro at path: ${nitroExecutablePath}, and args: ${args}`) + subprocess = spawn(nitroExecutablePath, args, { + cwd: executableFolderPath, env: { ...process.env, }, @@ -155,12 +210,7 @@ function debugLog(message: string, level: string = 'Debug') { log(`[TENSORRT_LLM_NITRO]::${level}:${message}`) } -const binaryFolder = async (): Promise => { - return path.join(__dirname, '..', 'bin') -} - -const decompressRunner = async (zipPath: string) => { - const output = path.join(__dirname, '..', 'bin') +const decompressRunner = async (zipPath: string, output: string) => { console.debug(`Decompressing ${zipPath} to ${output}...`) try { const files = await decompress(zipPath, output) @@ -170,22 +220,11 @@ const decompressRunner = async (zipPath: string) => { } } -const isNitroExecutableAvailable = async (): Promise => { - const binary = path.join( - __dirname, - '..', - 'bin', - process.platform === 'win32' ? 'nitro.exe' : 'nitro' - ) - - return existsSync(binary) -} - export default { - binaryFolder, + supportedPlatform, + supportedGpuArch, decompressRunner, loadModel, unloadModel, dispose: unloadModel, - isNitroExecutableAvailable, } diff --git a/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx b/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx index c11041ffe0..60677b1850 100644 --- a/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx +++ b/web/screens/Settings/CoreExtensions/TensorRtExtensionItem.tsx @@ -5,7 +5,7 @@ import { GpuSetting, InstallationState, abortDownload, - systemInformations, + systemInformation, } from '@janhq/core' import { Badge, @@ -51,7 +51,7 @@ const TensorRtExtensionItem: React.FC = ({ item }) => { useEffect(() => { const getSystemInfos = async () => { - const info = await systemInformations() + const info = await systemInformation() if (!info) { setIsGpuSupported(false) return @@ -112,7 +112,7 @@ const TensorRtExtensionItem: React.FC = ({ item }) => { } const description = marked.parse(item.description ?? '', { async: false }) - console.log(description) + return (
diff --git a/web/services/appService.ts b/web/services/appService.ts index 9327d55c34..16060e2d94 100644 --- a/web/services/appService.ts +++ b/web/services/appService.ts @@ -1,20 +1,32 @@ -import { ExtensionTypeEnum, MonitoringExtension } from '@janhq/core' +import { + ExtensionTypeEnum, + MonitoringExtension, + SystemInformation, +} from '@janhq/core' import { toaster } from '@/containers/Toast' import { extensionManager } from '@/extension' export const appService = { - systemInformations: async () => { - const gpuSetting = await extensionManager - ?.get(ExtensionTypeEnum.SystemMonitoring) - ?.getGpuSetting() + systemInformation: async (): Promise => { + const monitorExtension = extensionManager?.get( + ExtensionTypeEnum.SystemMonitoring + ) + if (!monitorExtension) { + console.warn('System monitoring extension not found') + return undefined + } + + const gpuSetting = await monitorExtension.getGpuSetting() + const osInfo = await monitorExtension.getOsInfo() return { gpuSetting, - // TODO: Other system information + osInfo, } }, + showToast: (title: string, description: string) => { toaster({ title,