* feat: tensorrt-llm-extension * fix: loading * feat: add download tensorrt llm runner Signed-off-by: James <james@jan.ai> * feat: update to rollupjs instead of webpack for monitoring extension Signed-off-by: James <james@jan.ai> * feat: move update nvidia info to monitor extension Signed-off-by: James <james@jan.ai> * allow download tensorrt Signed-off-by: James <james@jan.ai> * update Signed-off-by: James <james@jan.ai> * allow download tensor rt based on gpu setting Signed-off-by: James <james@jan.ai> * update downloaded models Signed-off-by: James <james@jan.ai> * feat: add extension compatibility * dynamic tensor rt engines Signed-off-by: James <james@jan.ai> * update models Signed-off-by: James <james@jan.ai> * chore: remove ts-ignore * feat: getting installation state from extension Signed-off-by: James <james@jan.ai> * chore: adding type for decompress Signed-off-by: James <james@jan.ai> * feat: update according Louis's comment Signed-off-by: James <james@jan.ai> * feat: add progress for installing extension Signed-off-by: James <james@jan.ai> * chore: remove args from extension installation * fix: model download does not work properly * fix: do not allow user to stop tensorrtllm inference * fix: extension installed style * fix: download tensorrt does not update state Signed-off-by: James <james@jan.ai> * chore: replace int4 by fl16 * feat: modal for installing extension Signed-off-by: James <james@jan.ai> * fix: start download immediately after press install Signed-off-by: James <james@jan.ai> * fix: error switching between engines * feat: rename inference provider to ai engine and refactor to core * fix: missing ulid * fix: core bundler * feat: add cancel extension installing Signed-off-by: James <james@jan.ai> * remove mocking for mac Signed-off-by: James <james@jan.ai> * fix: show models only when extension is ready * add tensorrt badge for model Signed-off-by: James <james@jan.ai> * fix: copy * fix: add compatible check (#2342) * fix: add compatible check Signed-off-by: James <james@jan.ai> * fix: copy * fix: font * fix: copy * fix: broken monitoring extension * chore: bump engine * fix: copy * fix: model copy * fix: copy * fix: model json --------- Signed-off-by: James <james@jan.ai> Co-authored-by: James <james@jan.ai> Co-authored-by: Louis <louis@jan.ai> * fix: vulkan support * fix: installation button padding * fix: empty script * fix: remove hard code string --------- Signed-off-by: James <james@jan.ai> Co-authored-by: James <james@jan.ai> Co-authored-by: NamH <NamNh0122@gmail.com>
116 lines
2.7 KiB
TypeScript
116 lines
2.7 KiB
TypeScript
import { useCallback } from 'react'
|
|
|
|
import {
|
|
Model,
|
|
ExtensionTypeEnum,
|
|
ModelExtension,
|
|
abortDownload,
|
|
joinPath,
|
|
ModelArtifact,
|
|
DownloadState,
|
|
GpuSetting,
|
|
} from '@janhq/core'
|
|
|
|
import { useAtomValue, useSetAtom } from 'jotai'
|
|
|
|
import { setDownloadStateAtom } from './useDownloadState'
|
|
|
|
import useGpuSetting from './useGpuSetting'
|
|
|
|
import { extensionManager } from '@/extension/ExtensionManager'
|
|
import {
|
|
ignoreSslAtom,
|
|
proxyAtom,
|
|
proxyEnabledAtom,
|
|
} from '@/helpers/atoms/AppConfig.atom'
|
|
import { addDownloadingModelAtom } from '@/helpers/atoms/Model.atom'
|
|
|
|
export default function useDownloadModel() {
|
|
const ignoreSSL = useAtomValue(ignoreSslAtom)
|
|
const proxy = useAtomValue(proxyAtom)
|
|
const proxyEnabled = useAtomValue(proxyEnabledAtom)
|
|
const setDownloadState = useSetAtom(setDownloadStateAtom)
|
|
const addDownloadingModel = useSetAtom(addDownloadingModelAtom)
|
|
|
|
const { getGpuSettings } = useGpuSetting()
|
|
|
|
const downloadModel = useCallback(
|
|
async (model: Model) => {
|
|
const childProgresses: DownloadState[] = model.sources.map(
|
|
(source: ModelArtifact) => ({
|
|
fileName: source.filename,
|
|
modelId: model.id,
|
|
time: {
|
|
elapsed: 0,
|
|
remaining: 0,
|
|
},
|
|
speed: 0,
|
|
percent: 0,
|
|
size: {
|
|
total: 0,
|
|
transferred: 0,
|
|
},
|
|
downloadState: 'downloading',
|
|
})
|
|
)
|
|
|
|
// set an initial download state
|
|
setDownloadState({
|
|
fileName: '',
|
|
modelId: model.id,
|
|
time: {
|
|
elapsed: 0,
|
|
remaining: 0,
|
|
},
|
|
speed: 0,
|
|
percent: 0,
|
|
size: {
|
|
total: 0,
|
|
transferred: 0,
|
|
},
|
|
children: childProgresses,
|
|
downloadState: 'downloading',
|
|
})
|
|
|
|
addDownloadingModel(model)
|
|
const gpuSettings = await getGpuSettings()
|
|
await localDownloadModel(
|
|
model,
|
|
ignoreSSL,
|
|
proxyEnabled ? proxy : '',
|
|
gpuSettings
|
|
)
|
|
},
|
|
[
|
|
ignoreSSL,
|
|
proxy,
|
|
proxyEnabled,
|
|
getGpuSettings,
|
|
addDownloadingModel,
|
|
setDownloadState,
|
|
]
|
|
)
|
|
|
|
const abortModelDownload = useCallback(async (model: Model) => {
|
|
for (const source of model.sources) {
|
|
const path = await joinPath(['models', model.id, source.filename])
|
|
await abortDownload(path)
|
|
}
|
|
}, [])
|
|
|
|
return {
|
|
downloadModel,
|
|
abortModelDownload,
|
|
}
|
|
}
|
|
|
|
const localDownloadModel = async (
|
|
model: Model,
|
|
ignoreSSL: boolean,
|
|
proxy: string,
|
|
gpuSettings?: GpuSetting
|
|
) =>
|
|
extensionManager
|
|
.get<ModelExtension>(ExtensionTypeEnum.Model)
|
|
?.downloadModel(model, gpuSettings, { ignoreSSL, proxy })
|