import React, { useState } from 'react' import { Slider, Input, Tooltip, TooltipArrow, TooltipContent, TooltipPortal, TooltipTrigger, } from '@janhq/uikit' import { useAtomValue, useSetAtom } from 'jotai' import { InfoIcon } from 'lucide-react' import { useActiveModel } from '@/hooks/useActiveModel' import { useClickOutside } from '@/hooks/useClickOutside' import useUpdateModelParameters from '@/hooks/useUpdateModelParameters' import { getConfigurationsData } from '@/utils/componentSettings' import { toSettingParams } from '@/utils/model_param' import { selectedModelAtom } from '../DropdownListSidebar' import { engineParamsUpdateAtom, getActiveThreadIdAtom, getActiveThreadModelParamsAtom, } from '@/helpers/atoms/Thread.atom' type Props = { name: string title: string description: string min: number max: number step: number value: number } const SliderRightPanel: React.FC = ({ name, title, min, max, step, description, value, }) => { const { updateModelParameter } = useUpdateModelParameters() const threadId = useAtomValue(getActiveThreadIdAtom) const activeModelParams = useAtomValue(getActiveThreadModelParamsAtom) const modelSettingParams = toSettingParams(activeModelParams) const engineParams = getConfigurationsData(modelSettingParams) const setEngineParamsUpdate = useSetAtom(engineParamsUpdateAtom) const selectedModel = useAtomValue(selectedModelAtom) const { stopModel } = useActiveModel() const [showTooltip, setShowTooltip] = useState({ max: false, min: false }) useClickOutside(() => setShowTooltip({ max: false, min: false }), null, []) const onValueChanged = (e: number[]) => { if (!threadId) return if (engineParams.some((x) => x.name.includes(name))) { setEngineParamsUpdate(true) stopModel() } else { setEngineParamsUpdate(false) } updateModelParameter(threadId, name, e[0]) } const maxValue = (name: string) => { switch (name) { case 'max_tokens': return selectedModel?.parameters.max_tokens || max case 'ctx_len': return selectedModel?.settings.ctx_len || max default: return max } } return (

{title}

{description}

{min}

{maxValue(name) as number}

{ if (Number(e.target.value) > Number(maxValue(name))) { onValueChanged([Number(maxValue(name))]) setShowTooltip({ max: true, min: false }) } else if (Number(e.target.value) < Number(min)) { onValueChanged([Number(min)]) setShowTooltip({ max: false, min: true }) } else { onValueChanged([Number(e.target.value)]) setShowTooltip({ max: false, min: false }) } }} /> {showTooltip.max && ( Automatically set to the maximum allowed tokens )} {showTooltip.min && ( Automatically set to the minimum allowed tokens )}
) } export default SliderRightPanel