fix: remote engine revamp issues

This commit is contained in:
Louis 2025-01-17 11:32:13 +07:00
parent df6110b447
commit f328c357da
No known key found for this signature in database
GPG Key ID: 44FA9F4D33C37DE2
11 changed files with 43 additions and 16 deletions

View File

@ -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(

View File

@ -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)
} }

View File

@ -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])

View File

@ -33,6 +33,7 @@ export const useConfigurations = () => {
useEffect(() => { useEffect(() => {
configurePullOptions() configurePullOptions()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []) }, [])
return { return {

View File

@ -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()

View File

@ -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'

View File

@ -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">

View File

@ -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)

View File

@ -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]

View File

@ -88,6 +88,7 @@ const AssistantSetting: React.FC<Props> = ({ componentData }) => {
setEngineParamsUpdate, setEngineParamsUpdate,
stopModel, stopModel,
updateThreadMetadata, updateThreadMetadata,
resetGenerating,
] ]
) )

View File

@ -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)
} }