import { useState } from 'react' import { InferenceEngine, Model } from '@janhq/core' import { Badge, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipTrigger, } from '@janhq/uikit' import { useAtom } from 'jotai' import { MoreVerticalIcon, Trash2Icon, PlayIcon, StopCircleIcon, } from 'lucide-react' import { twMerge } from 'tailwind-merge' import { useActiveModel } from '@/hooks/useActiveModel' import { useClickOutside } from '@/hooks/useClickOutside' import useDeleteModel from '@/hooks/useDeleteModel' import { toGibibytes } from '@/utils/converter' import { serverEnabledAtom } from '@/helpers/atoms/LocalServer.atom' type RowModelProps = { data: Model } export default function RowModel(props: RowModelProps) { const [more, setMore] = useState(false) const [menu, setMenu] = useState(null) const [toggle, setToggle] = useState(null) useClickOutside(() => setMore(false), null, [menu, toggle]) const { activeModel, startModel, stopModel, stateModel } = useActiveModel() const { deleteModel } = useDeleteModel() const isActiveModel = stateModel.model === props.data.id const [serverEnabled, setServerEnabled] = useAtom(serverEnabledAtom) const isRemoteModel = props.data.engine === InferenceEngine.openai || props.data.engine === InferenceEngine.triton_trtllm const onModelActionClick = (modelId: string) => { if (activeModel && activeModel.id === modelId) { stopModel() window.core?.api?.stopServer() setServerEnabled(false) } else if (!serverEnabled) { startModel(modelId) } } return ( {props.data.name} {props.data.id} {props.data.metadata.size ? toGibibytes(props.data.metadata.size) : '-'} v{props.data.version} {isRemoteModel ? ( Active ) : stateModel.loading && stateModel.model === props.data.id ? ( {stateModel.state === 'start' ? 'Starting...' : 'Stopping...'} ) : activeModel && activeModel.id === props.data.id ? ( Active ) : ( Inactive )} {!isRemoteModel && (
{ setMore(!more) }} >
)} {more && (
{ onModelActionClick(props.data.id) setMore(false) }} > {activeModel && activeModel.id === props.data.id ? ( ) : ( )} {isActiveModel ? stateModel.state : 'Start'}  Model
{serverEnabled && ( {activeModel && activeModel.id === props.data.id ? 'The API server is running, change model will stop the server' : 'Threads are disabled while the server is running'} )}
{ setTimeout(async () => { if (!serverEnabled) { await stopModel() deleteModel(props.data) } }, 500) setMore(false) }} > Delete Model
)} ) }