fix: remote engine revamp issues
This commit is contained in:
parent
df6110b447
commit
f328c357da
@ -194,13 +194,22 @@ const ModelDropdown = ({
|
|||||||
const modelId = activeAssistant?.model?.id
|
const modelId = activeAssistant?.model?.id
|
||||||
|
|
||||||
const model = downloadedModels.find((model) => model.id === modelId)
|
const model = downloadedModels.find((model) => model.id === modelId)
|
||||||
setSelectedModel(model)
|
if (model) {
|
||||||
|
if (
|
||||||
|
engines?.[model.engine]?.[0].type === 'local' ||
|
||||||
|
(engines?.[model.engine]?.[0].api_key?.length ?? 0) > 0
|
||||||
|
)
|
||||||
|
setSelectedModel(model)
|
||||||
|
} else {
|
||||||
|
setSelectedModel(undefined)
|
||||||
|
}
|
||||||
}, [
|
}, [
|
||||||
recommendedModel,
|
recommendedModel,
|
||||||
activeThread,
|
activeThread,
|
||||||
downloadedModels,
|
downloadedModels,
|
||||||
setSelectedModel,
|
setSelectedModel,
|
||||||
activeAssistant?.model?.id,
|
activeAssistant?.model?.id,
|
||||||
|
engines,
|
||||||
])
|
])
|
||||||
|
|
||||||
const isLocalEngine = useCallback(
|
const isLocalEngine = useCallback(
|
||||||
|
|||||||
@ -336,7 +336,8 @@ export default function ModelHandler() {
|
|||||||
|
|
||||||
// Check model engine; we don't want to generate a title when it's not a local engine. remote model using first promp
|
// Check model engine; we don't want to generate a title when it's not a local engine. remote model using first promp
|
||||||
if (
|
if (
|
||||||
!isLocalEngine(engines, activeModelRef.current?.engine as InferenceEngine)
|
activeModelRef.current?.engine !== InferenceEngine.cortex &&
|
||||||
|
activeModelRef.current?.engine !== InferenceEngine.cortex_llamacpp
|
||||||
) {
|
) {
|
||||||
const updatedThread: Thread = {
|
const updatedThread: Thread = {
|
||||||
...thread,
|
...thread,
|
||||||
@ -396,9 +397,7 @@ export default function ModelHandler() {
|
|||||||
|
|
||||||
// 2. Update the title with the result of the inference
|
// 2. Update the title with the result of the inference
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
const engine = EngineManager.instance().get(
|
const engine = EngineManager.instance().get(InferenceEngine.cortex)
|
||||||
messageRequest.model?.engine ?? activeModelRef.current?.engine ?? ''
|
|
||||||
)
|
|
||||||
engine?.inference(messageRequest)
|
engine?.inference(messageRequest)
|
||||||
}, 1000)
|
}, 1000)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -159,7 +159,7 @@ export function useActiveModel() {
|
|||||||
}
|
}
|
||||||
if (!activeModel) return
|
if (!activeModel) return
|
||||||
|
|
||||||
const engine = EngineManager.instance().get(activeModel.engine)
|
const engine = EngineManager.instance().get(InferenceEngine.cortex)
|
||||||
engine?.stopInference()
|
engine?.stopInference()
|
||||||
}, [activeModel, stateModel, stopModel])
|
}, [activeModel, stateModel, stopModel])
|
||||||
|
|
||||||
|
|||||||
@ -33,6 +33,7 @@ export const useConfigurations = () => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
configurePullOptions()
|
configurePullOptions()
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import { atom, useAtomValue } from 'jotai'
|
|||||||
import { activeModelAtom } from './useActiveModel'
|
import { activeModelAtom } from './useActiveModel'
|
||||||
|
|
||||||
import { activeAssistantAtom } from '@/helpers/atoms/Assistant.atom'
|
import { activeAssistantAtom } from '@/helpers/atoms/Assistant.atom'
|
||||||
|
import { installedEnginesAtom } from '@/helpers/atoms/Engines.atom'
|
||||||
import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom'
|
import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom'
|
||||||
import { activeThreadAtom } from '@/helpers/atoms/Thread.atom'
|
import { activeThreadAtom } from '@/helpers/atoms/Thread.atom'
|
||||||
|
|
||||||
@ -30,6 +31,7 @@ export default function useRecommendedModel() {
|
|||||||
const activeThread = useAtomValue(activeThreadAtom)
|
const activeThread = useAtomValue(activeThreadAtom)
|
||||||
const downloadedModels = useAtomValue(downloadedModelsAtom)
|
const downloadedModels = useAtomValue(downloadedModelsAtom)
|
||||||
const activeAssistant = useAtomValue(activeAssistantAtom)
|
const activeAssistant = useAtomValue(activeAssistantAtom)
|
||||||
|
const engines = useAtomValue(installedEnginesAtom)
|
||||||
|
|
||||||
const getAndSortDownloadedModels = useCallback(async (): Promise<Model[]> => {
|
const getAndSortDownloadedModels = useCallback(async (): Promise<Model[]> => {
|
||||||
const models = downloadedModels.sort((a, b) =>
|
const models = downloadedModels.sort((a, b) =>
|
||||||
@ -45,7 +47,12 @@ export default function useRecommendedModel() {
|
|||||||
const getRecommendedModel = useCallback(async (): Promise<
|
const getRecommendedModel = useCallback(async (): Promise<
|
||||||
Model | undefined
|
Model | undefined
|
||||||
> => {
|
> => {
|
||||||
const models = await getAndSortDownloadedModels()
|
const models = (await getAndSortDownloadedModels()).filter((e: Model) =>
|
||||||
|
engines?.[e.engine]?.[0].type === 'local' ||
|
||||||
|
(engines?.[e.engine]?.[0].api_key?.length ?? 0) > 0
|
||||||
|
? true
|
||||||
|
: false
|
||||||
|
)
|
||||||
|
|
||||||
if (!activeThread || !activeAssistant) return
|
if (!activeThread || !activeAssistant) return
|
||||||
const modelId = activeAssistant.model.id
|
const modelId = activeAssistant.model.id
|
||||||
@ -63,10 +70,8 @@ export default function useRecommendedModel() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sort the model, for display purpose
|
// sort the model, for display purpose
|
||||||
|
|
||||||
if (models.length === 0) {
|
if (models.length === 0) {
|
||||||
// if we have no downloaded models, then can't recommend anything
|
// if we have no downloaded models, then can't recommend anything
|
||||||
console.debug("No downloaded models, can't recommend anything")
|
|
||||||
setRecommendedModel(undefined)
|
setRecommendedModel(undefined)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -94,7 +99,7 @@ export default function useRecommendedModel() {
|
|||||||
|
|
||||||
setRecommendedModel(lastUsedModel)
|
setRecommendedModel(lastUsedModel)
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [getAndSortDownloadedModels, activeThread])
|
}, [getAndSortDownloadedModels, activeThread, engines])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getRecommendedModel()
|
getRecommendedModel()
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||||
import { useMemo } from 'react'
|
import { useMemo } from 'react'
|
||||||
|
|
||||||
import { InferenceEngine, EngineConfig } from '@janhq/core'
|
import { InferenceEngine, EngineConfig } from '@janhq/core'
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import { useAtomValue } from 'jotai'
|
|||||||
|
|
||||||
import ModelItem from '@/screens/Hub/ModelList/ModelItem'
|
import ModelItem from '@/screens/Hub/ModelList/ModelItem'
|
||||||
|
|
||||||
|
import { installedEnginesAtom } from '@/helpers/atoms/Engines.atom'
|
||||||
import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom'
|
import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom'
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
@ -14,6 +15,7 @@ type Props = {
|
|||||||
|
|
||||||
const ModelList = ({ models }: Props) => {
|
const ModelList = ({ models }: Props) => {
|
||||||
const downloadedModels = useAtomValue(downloadedModelsAtom)
|
const downloadedModels = useAtomValue(downloadedModelsAtom)
|
||||||
|
const engines = useAtomValue(installedEnginesAtom)
|
||||||
const sortedModels: Model[] = useMemo(() => {
|
const sortedModels: Model[] = useMemo(() => {
|
||||||
const featuredModels: Model[] = []
|
const featuredModels: Model[] = []
|
||||||
const remoteModels: Model[] = []
|
const remoteModels: Model[] = []
|
||||||
@ -22,7 +24,7 @@ const ModelList = ({ models }: Props) => {
|
|||||||
models.forEach((m) => {
|
models.forEach((m) => {
|
||||||
if (m.metadata?.tags?.includes('Featured')) {
|
if (m.metadata?.tags?.includes('Featured')) {
|
||||||
featuredModels.push(m)
|
featuredModels.push(m)
|
||||||
} else if (m.format === 'api') {
|
} else if (engines?.[m.engine]?.[0]?.type === 'remote') {
|
||||||
remoteModels.push(m)
|
remoteModels.push(m)
|
||||||
} else if (downloadedModels.map((m) => m.id).includes(m.id)) {
|
} else if (downloadedModels.map((m) => m.id).includes(m.id)) {
|
||||||
localModels.push(m)
|
localModels.push(m)
|
||||||
@ -40,7 +42,7 @@ const ModelList = ({ models }: Props) => {
|
|||||||
...remainingModels,
|
...remainingModels,
|
||||||
...remoteModels,
|
...remoteModels,
|
||||||
]
|
]
|
||||||
}, [models, downloadedModels])
|
}, [models, downloadedModels, engines])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="relative h-full w-full flex-shrink-0">
|
<div className="relative h-full w-full flex-shrink-0">
|
||||||
|
|||||||
@ -1,6 +1,11 @@
|
|||||||
import { Fragment, useCallback, useState } from 'react'
|
import { Fragment, useCallback, useState } from 'react'
|
||||||
|
|
||||||
import { EngineManager, Model, ModelSettingParams } from '@janhq/core'
|
import {
|
||||||
|
EngineManager,
|
||||||
|
InferenceEngine,
|
||||||
|
Model,
|
||||||
|
ModelSettingParams,
|
||||||
|
} from '@janhq/core'
|
||||||
import { Button, Tooltip, Select, Input, Checkbox } from '@janhq/joi'
|
import { Button, Tooltip, Select, Input, Checkbox } from '@janhq/joi'
|
||||||
|
|
||||||
import { useAtom, useAtomValue, useSetAtom } from 'jotai'
|
import { useAtom, useAtomValue, useSetAtom } from 'jotai'
|
||||||
@ -94,7 +99,7 @@ const LocalServerLeftPanel = () => {
|
|||||||
localStorage.setItem(FIRST_TIME_VISIT_API_SERVER, 'false')
|
localStorage.setItem(FIRST_TIME_VISIT_API_SERVER, 'false')
|
||||||
setFirstTimeVisitAPIServer(false)
|
setFirstTimeVisitAPIServer(false)
|
||||||
}
|
}
|
||||||
const engine = EngineManager.instance().get((model as Model).engine)
|
const engine = EngineManager.instance().get(InferenceEngine.cortex)
|
||||||
engine?.loadModel(model as Model)
|
engine?.loadModel(model as Model)
|
||||||
// startModel(selectedModel.id, false).catch((e) => console.error(e))
|
// startModel(selectedModel.id, false).catch((e) => console.error(e))
|
||||||
setIsLoading(false)
|
setIsLoading(false)
|
||||||
|
|||||||
@ -1,11 +1,14 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable react/no-unescaped-entities */
|
/* eslint-disable react/no-unescaped-entities */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||||
|
|
||||||
import React, { useCallback, useRef, useState, useEffect } from 'react'
|
import React, { useCallback, useRef, useState, useEffect } from 'react'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
EngineConfig as OriginalEngineConfig,
|
EngineConfig as OriginalEngineConfig,
|
||||||
InferenceEngine,
|
InferenceEngine,
|
||||||
|
events,
|
||||||
|
EngineEvent,
|
||||||
} from '@janhq/core'
|
} from '@janhq/core'
|
||||||
|
|
||||||
interface EngineConfig extends OriginalEngineConfig {
|
interface EngineConfig extends OriginalEngineConfig {
|
||||||
@ -64,6 +67,7 @@ const RemoteEngineSettings = ({
|
|||||||
set(updatedEngine, field, value)
|
set(updatedEngine, field, value)
|
||||||
await updateEngine(name, updatedEngine)
|
await updateEngine(name, updatedEngine)
|
||||||
mutate()
|
mutate()
|
||||||
|
events.emit(EngineEvent.OnEngineUpdate, {})
|
||||||
}, 300)
|
}, 300)
|
||||||
},
|
},
|
||||||
[engine, name, mutate]
|
[engine, name, mutate]
|
||||||
|
|||||||
@ -88,6 +88,7 @@ const AssistantSetting: React.FC<Props> = ({ componentData }) => {
|
|||||||
setEngineParamsUpdate,
|
setEngineParamsUpdate,
|
||||||
stopModel,
|
stopModel,
|
||||||
updateThreadMetadata,
|
updateThreadMetadata,
|
||||||
|
resetGenerating,
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { EngineManager } from '@janhq/core'
|
import { EngineManager, InferenceEngine } from '@janhq/core'
|
||||||
import { useAtomValue, useSetAtom } from 'jotai'
|
import { useAtomValue, useSetAtom } from 'jotai'
|
||||||
|
|
||||||
import ModalTroubleShooting, {
|
import ModalTroubleShooting, {
|
||||||
@ -35,7 +35,7 @@ const LoadModelError = () => {
|
|||||||
setMainState(MainViewState.Settings)
|
setMainState(MainViewState.Settings)
|
||||||
if (activeAssistant?.model.engine) {
|
if (activeAssistant?.model.engine) {
|
||||||
const engine = EngineManager.instance().get(
|
const engine = EngineManager.instance().get(
|
||||||
activeAssistant.model.engine
|
InferenceEngine.cortex
|
||||||
)
|
)
|
||||||
engine?.name && setSelectedSettingScreen(engine.name)
|
engine?.name && setSelectedSettingScreen(engine.name)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user