| import { useCallback, useEffect, useState } from 'react' |
|
|
| import { Model, InferenceEngine } from '@janhq/core' |
|
|
| import { atom, useAtomValue } from 'jotai' |
|
|
| import { activeModelAtom } from './useActiveModel' |
|
|
| import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' |
| import { activeThreadAtom } from '@/helpers/atoms/Thread.atom' |
|
|
| export const lastUsedModel = atom<Model | undefined>(undefined) |
|
|
| export const LAST_USED_MODEL_ID = 'last-used-model-id' |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export default function useRecommendedModel() { |
| const activeModel = useAtomValue(activeModelAtom) |
| const [sortedModels, setSortedModels] = useState<Model[]>([]) |
| const [recommendedModel, setRecommendedModel] = useState<Model | undefined>() |
| const activeThread = useAtomValue(activeThreadAtom) |
| const downloadedModels = useAtomValue(downloadedModelsAtom) |
|
|
| const getAndSortDownloadedModels = useCallback(async (): Promise<Model[]> => { |
| const models = downloadedModels.sort((a, b) => |
| a.engine !== InferenceEngine.nitro && b.engine === InferenceEngine.nitro |
| ? 1 |
| : -1 |
| ) |
| setSortedModels(models) |
| return models |
| }, [downloadedModels]) |
|
|
| const getRecommendedModel = useCallback(async (): Promise< |
| Model | undefined |
| > => { |
| const models = await getAndSortDownloadedModels() |
| if (!activeThread) return |
| const modelId = activeThread.assistants[0]?.model.id |
| const model = models.find((model) => model.id === modelId) |
|
|
| if (model) { |
| setRecommendedModel(model) |
| } |
|
|
| if (activeModel) { |
| |
| console.debug(`Using active model ${activeModel.id}`) |
| setRecommendedModel(activeModel) |
| return |
| } |
|
|
| |
|
|
| if (models.length === 0) { |
| |
| console.debug("No downloaded models, can't recommend anything") |
| return |
| } |
|
|
| |
| const lastUsedModelId = localStorage.getItem(LAST_USED_MODEL_ID) |
|
|
| |
| |
| if (!lastUsedModelId) { |
| console.debug( |
| `No last used model, using first model in list ${models[0].id}}` |
| ) |
| setRecommendedModel(models[0]) |
| return |
| } |
|
|
| const lastUsedModel = models.find((model) => model.id === lastUsedModelId) |
| if (!lastUsedModel) { |
| |
| |
| console.debug( |
| `Last used model ${lastUsedModelId} not found, using first model in list ${models[0].id}}` |
| ) |
| setRecommendedModel(models[0]) |
| return |
| } |
|
|
| console.debug(`Using last used model ${lastUsedModel.id}`) |
| setRecommendedModel(lastUsedModel) |
| |
| }, [getAndSortDownloadedModels, activeThread]) |
|
|
| useEffect(() => { |
| getRecommendedModel() |
| }, [getRecommendedModel]) |
|
|
| return { recommendedModel, downloadedModels: sortedModels } |
| } |
|
|