* fix: update new api from cortex to support 0.5.0 Signed-off-by: James <namnh0122@gmail.com> * fix stop button for streaming Signed-off-by: James <namnh0122@gmail.com> * fix stop inference for nonstreaming Signed-off-by: James <namnh0122@gmail.com> * chore: remove umami prevent tracking call to vercel Signed-off-by: James <namnh0122@gmail.com> * add warning modal when running more than 2 model concurrently Signed-off-by: James <namnh0122@gmail.com> * fix: skip summarize if abort Signed-off-by: James <namnh0122@gmail.com> * 0.5.0-3 * add inference error popup Signed-off-by: James <namnh0122@gmail.com> * add back import local model Signed-off-by: James <namnh0122@gmail.com> * fix: max token issue (#3225) Signed-off-by: James <namnh0122@gmail.com> * format status Signed-off-by: James <namnh0122@gmail.com> * fix migration missing instructions Signed-off-by: James <namnh0122@gmail.com> * fix: wait for cortex process overlay should be on top (#3224) * fix: wait for cortex process overlay should be on top * chore: update cortex.js * Cortex 0.5.0-5 * add import model to my model screen Signed-off-by: James <namnh0122@gmail.com> * fix: should migrate symlink models (#3226) * fix import on windows (#3229) Signed-off-by: James <namnh0122@gmail.com> * fix yarn lint Signed-off-by: James <namnh0122@gmail.com> * fix: clean up port before start jan (#3232) Signed-off-by: James <namnh0122@gmail.com> --------- Signed-off-by: James <namnh0122@gmail.com> Co-authored-by: Van Pham <64197333+Van-QA@users.noreply.github.com> Co-authored-by: Louis <louis@jan.ai>
131 lines
3.5 KiB
TypeScript
131 lines
3.5 KiB
TypeScript
import { ImportingModel, Model, ModelStatus } from '@janhq/core'
|
|
import { atom } from 'jotai'
|
|
|
|
import { activeThreadAtom, threadsAtom } from './Thread.atom'
|
|
|
|
export const stateModel = atom({ state: 'start', loading: false, model: '' })
|
|
export const activeAssistantModelAtom = atom<Model | undefined>(undefined)
|
|
|
|
export const downloadedModelsAtom = atom<Model[]>([])
|
|
|
|
export const removeDownloadedModelAtom = atom(
|
|
null,
|
|
(get, set, modelId: string) => {
|
|
const downloadedModels = get(downloadedModelsAtom)
|
|
|
|
set(
|
|
downloadedModelsAtom,
|
|
downloadedModels.filter((m) => m.model !== modelId)
|
|
)
|
|
}
|
|
)
|
|
|
|
/// TODO: move this part to another atom
|
|
// store the paths of the models that are being imported
|
|
export const importingModelsAtom = atom<ImportingModel[]>([])
|
|
|
|
export const updateImportingModelProgressAtom = atom(
|
|
null,
|
|
(get, set, importId: string, percentage: number) => {
|
|
const model = get(importingModelsAtom).find((x) => x.importId === importId)
|
|
if (!model) return
|
|
const newModel: ImportingModel = {
|
|
...model,
|
|
status: 'IMPORTING',
|
|
percentage,
|
|
}
|
|
const newList = get(importingModelsAtom).map((x) =>
|
|
x.importId === importId ? newModel : x
|
|
)
|
|
set(importingModelsAtom, newList)
|
|
}
|
|
)
|
|
|
|
export const setImportingModelErrorAtom = atom(
|
|
null,
|
|
(get, set, importId: string, error: string) => {
|
|
const model = get(importingModelsAtom).find((x) => x.importId === importId)
|
|
if (!model) return
|
|
const newModel: ImportingModel = {
|
|
...model,
|
|
status: 'FAILED',
|
|
}
|
|
|
|
console.error(`Importing model ${model} failed`, error)
|
|
const newList = get(importingModelsAtom).map((m) =>
|
|
m.importId === importId ? newModel : m
|
|
)
|
|
set(importingModelsAtom, newList)
|
|
}
|
|
)
|
|
|
|
export const setImportingModelSuccessAtom = atom(
|
|
null,
|
|
(get, set, importId: string) => {
|
|
const model = get(importingModelsAtom).find((x) => x.importId === importId)
|
|
if (!model) return
|
|
const newModel: ImportingModel = {
|
|
...model,
|
|
modelId: undefined,
|
|
status: 'IMPORTED',
|
|
percentage: 100,
|
|
}
|
|
const newList = get(importingModelsAtom).map((x) =>
|
|
x.importId === importId ? newModel : x
|
|
)
|
|
set(importingModelsAtom, newList)
|
|
}
|
|
)
|
|
|
|
export const updateImportingModelAtom = atom(
|
|
null,
|
|
(
|
|
get,
|
|
set,
|
|
importId: string,
|
|
name: string,
|
|
description: string,
|
|
tags: string[]
|
|
) => {
|
|
const model = get(importingModelsAtom).find((x) => x.importId === importId)
|
|
if (!model) return
|
|
const newModel: ImportingModel = {
|
|
...model,
|
|
name,
|
|
importId,
|
|
description,
|
|
tags,
|
|
}
|
|
const newList = get(importingModelsAtom).map((x) =>
|
|
x.importId === importId ? newModel : x
|
|
)
|
|
set(importingModelsAtom, newList)
|
|
}
|
|
)
|
|
|
|
const selectedModelAtom = atom<Model | undefined>(undefined)
|
|
|
|
export const getSelectedModelAtom = atom((get) => get(selectedModelAtom))
|
|
|
|
export const updateSelectedModelAtom = atom(null, (get, set, model: Model) => {
|
|
const activeThread = get(activeThreadAtom)
|
|
if (activeThread) {
|
|
activeThread.assistants[0].model = model.model
|
|
// update threadsAtom
|
|
const allThreads = get(threadsAtom)
|
|
allThreads.forEach((t) => {
|
|
if (t.id === activeThread.id) {
|
|
t.assistants[0].model = model.model
|
|
}
|
|
})
|
|
console.debug(
|
|
`Update threads state list: ${JSON.stringify(allThreads, null, 2)}`
|
|
)
|
|
set(threadsAtom, allThreads)
|
|
}
|
|
console.debug('Set selected model:', JSON.stringify(model, null, 2))
|
|
set(selectedModelAtom, model)
|
|
})
|
|
|
|
export const activeModelsAtom = atom<ModelStatus[]>([])
|