import { useCallback, useEffect, useMemo, useState } from 'react' import { extractInferenceParams, extractModelLoadParams } from '@janhq/core' import { Accordion, AccordionItem, Input } from '@janhq/joi' import { useAtomValue, useSetAtom } from 'jotai' import { AlertTriangleIcon, CheckIcon, CopyIcon, InfoIcon } from 'lucide-react' import EngineSetting from '@/containers/EngineSetting' import { modalTroubleShootingAtom } from '@/containers/ModalTroubleShoot' import ModelDropdown from '@/containers/ModelDropdown' import ModelSetting from '@/containers/ModelSetting' import RightPanelContainer from '@/containers/RightPanelContainer' import { loadModelErrorAtom } from '@/hooks/useActiveModel' import { useClipboard } from '@/hooks/useClipboard' import { getConfigurationsData } from '@/utils/componentSettings' import { LocalAPIserverModelParamsAtom, serverEnabledAtom, } from '@/helpers/atoms/LocalServer.atom' import { selectedModelAtom } from '@/helpers/atoms/Model.atom' const LocalServerRightPanel = () => { const loadModelError = useAtomValue(loadModelErrorAtom) const setLocalAPIserverModelParams = useSetAtom(LocalAPIserverModelParamsAtom) const serverEnabled = useAtomValue(serverEnabledAtom) const setModalTroubleShooting = useSetAtom(modalTroubleShootingAtom) const selectedModel = useAtomValue(selectedModelAtom) const clipboard = useClipboard({ timeout: 1000 }) const [currentModelSettingParams, setCurrentModelSettingParams] = useState( extractModelLoadParams(selectedModel?.settings) ) const overriddenSettings = selectedModel?.settings.ctx_len && selectedModel.settings.ctx_len > 2048 ? { ctx_len: 4096 } : {} useEffect(() => { if (selectedModel) { setCurrentModelSettingParams({ ...selectedModel?.settings, ...overriddenSettings, }) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedModel]) const modelRuntimeParams = extractInferenceParams(selectedModel?.settings) const componentDataRuntimeSetting = getConfigurationsData( modelRuntimeParams, selectedModel ) const componentDataEngineSetting = getConfigurationsData( currentModelSettingParams ) const engineSettings = useMemo( () => componentDataEngineSetting.filter( (x) => x.key !== 'prompt_template' && x.key !== 'embedding' ), [componentDataEngineSetting] ) const modelSettings = useMemo(() => { return componentDataRuntimeSetting.filter( (x) => x.key !== 'prompt_template' ) }, [componentDataRuntimeSetting]) const onUpdateParams = useCallback(() => { // eslint-disable-next-line @typescript-eslint/no-explicit-any setLocalAPIserverModelParams(() => { return { ...currentModelSettingParams } }) }, [currentModelSettingParams, setLocalAPIserverModelParams]) const onValueChanged = useCallback( (key: string, value: string | number | boolean) => { setCurrentModelSettingParams((prevParams) => ({ ...prevParams, [key]: value, })) }, [] ) useEffect(() => { onUpdateParams() }, [currentModelSettingParams, onUpdateParams]) return (

You can concurrently send requests to one active local model and multiple remote models.

{ clipboard.copy(selectedModel?.id) }} suffixIcon={ clipboard.copied ? ( ) : ( ) } />
{loadModelError && serverEnabled && (
Model failed to start. Access{' '} setModalTroubleShooting(true)} > troubleshooting assistance
)}
{modelSettings.length !== 0 && ( )} {engineSettings.length !== 0 && ( )}
) } export default LocalServerRightPanel