* fix: reduce the number of api call Signed-off-by: James <james@jan.ai> * fix: download progress Signed-off-by: James <james@jan.ai> * chore: save blob * fix: server boot up * fix: download state not updating Signed-off-by: James <james@jan.ai> * fix: copy assets * Add Dockerfile CPU for Jan Server and Jan Web * Add Dockerfile GPU for Jan Server and Jan Web * feat: S3 adapter * Update check find count from ./pre-install and correct copy:asserts command * server add bundleDependencies @janhq/core * server add bundleDependencies @janhq/core * fix: update success/failed download state (#1945) * fix: update success/failed download state Signed-off-by: James <james@jan.ai> * fix: download model progress and state handling for both Desktop and Web --------- Signed-off-by: James <james@jan.ai> Co-authored-by: James <james@jan.ai> Co-authored-by: Louis <louis@jan.ai> * chore: refactor * fix: load models empty first time open * Add Docker compose * fix: assistants onUpdate --------- Signed-off-by: James <james@jan.ai> Co-authored-by: James <james@jan.ai> Co-authored-by: Hien To <tominhhien97@gmail.com> Co-authored-by: NamH <NamNh0122@gmail.com>
93 lines
2.2 KiB
TypeScript
93 lines
2.2 KiB
TypeScript
import { useCallback, useContext } from 'react'
|
|
|
|
import {
|
|
Model,
|
|
ExtensionTypeEnum,
|
|
ModelExtension,
|
|
abortDownload,
|
|
joinPath,
|
|
ModelArtifact,
|
|
} from '@janhq/core'
|
|
|
|
import { useSetAtom } from 'jotai'
|
|
|
|
import { FeatureToggleContext } from '@/context/FeatureToggle'
|
|
|
|
import { modelBinFileName } from '@/utils/model'
|
|
|
|
import { setDownloadStateAtom } from './useDownloadState'
|
|
|
|
import { extensionManager } from '@/extension/ExtensionManager'
|
|
import { addDownloadingModelAtom } from '@/helpers/atoms/Model.atom'
|
|
|
|
export default function useDownloadModel() {
|
|
const { ignoreSSL, proxy } = useContext(FeatureToggleContext)
|
|
const setDownloadState = useSetAtom(setDownloadStateAtom)
|
|
const addDownloadingModel = useSetAtom(addDownloadingModelAtom)
|
|
|
|
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)
|
|
|
|
await localDownloadModel(model, ignoreSSL, proxy)
|
|
},
|
|
[ignoreSSL, proxy, addDownloadingModel, setDownloadState]
|
|
)
|
|
|
|
const abortModelDownload = async (model: Model) => {
|
|
await abortDownload(
|
|
await joinPath(['models', model.id, modelBinFileName(model)])
|
|
)
|
|
}
|
|
|
|
return {
|
|
downloadModel,
|
|
abortModelDownload,
|
|
}
|
|
}
|
|
|
|
const localDownloadModel = async (
|
|
model: Model,
|
|
ignoreSSL: boolean,
|
|
proxy: string
|
|
) =>
|
|
extensionManager
|
|
.get<ModelExtension>(ExtensionTypeEnum.Model)
|
|
?.downloadModel(model, { ignoreSSL, proxy })
|