import { useMemo } from 'react'; import TextareaAutosize from 'react-textarea-autosize'; import { openAISettings, EModelEndpoint, imageDetailValue, imageDetailNumeric, } from 'librechat-data-provider'; import type { TModelSelectProps, OnInputNumberChange } from '~/common'; import { Input, Label, Switch, Slider, HoverCard, InputNumber, SelectDropDown, HoverCardTrigger, } from '~/components/ui'; import { cn, defaultTextProps, optionText, removeFocusOutlines, removeFocusRings } from '~/utils'; import { OptionHoverAlt, DynamicTags } from '~/components/SidePanel/Parameters'; import { useLocalize, useDebouncedInput } from '~/hooks'; import OptionHover from './OptionHover'; import { ESide } from '~/common'; export default function Settings({ conversation, setOption, models, readonly }: TModelSelectProps) { const localize = useLocalize(); const { endpoint, endpointType, model, modelLabel, chatGptLabel, promptPrefix, temperature, top_p: topP, frequency_penalty: freqP, presence_penalty: presP, resendFiles, imageDetail, maxContextTokens, max_tokens, } = conversation ?? {}; const [setChatGptLabel, chatGptLabelValue] = useDebouncedInput({ setOption, optionKey: 'chatGptLabel', initialValue: modelLabel ?? chatGptLabel, }); const [setPromptPrefix, promptPrefixValue] = useDebouncedInput({ setOption, optionKey: 'promptPrefix', initialValue: promptPrefix, }); const [setTemperature, temperatureValue] = useDebouncedInput({ setOption, optionKey: 'temperature', initialValue: temperature, }); const [setTopP, topPValue] = useDebouncedInput({ setOption, optionKey: 'top_p', initialValue: topP, }); const [setFreqP, freqPValue] = useDebouncedInput({ setOption, optionKey: 'frequency_penalty', initialValue: freqP, }); const [setPresP, presPValue] = useDebouncedInput({ setOption, optionKey: 'presence_penalty', initialValue: presP, }); const [setMaxContextTokens, maxContextTokensValue] = useDebouncedInput( { setOption, optionKey: 'maxContextTokens', initialValue: maxContextTokens, }, ); const [setMaxOutputTokens, maxOutputTokensValue] = useDebouncedInput({ setOption, optionKey: 'max_tokens', initialValue: max_tokens, }); const optionEndpoint = useMemo(() => endpointType ?? endpoint, [endpoint, endpointType]); const isOpenAI = useMemo( () => optionEndpoint === EModelEndpoint.openAI || optionEndpoint === EModelEndpoint.azureOpenAI, [optionEndpoint], ); if (!conversation) { return null; } const setModel = setOption('model'); const setResendFiles = setOption('resendFiles'); const setImageDetail = setOption('imageDetail'); return (
setTemperature(value[0])} doubleClickHandler={() => setTemperature(openAISettings.temperature.default)} max={openAISettings.temperature.max} min={openAISettings.temperature.min} step={openAISettings.temperature.step} className="flex h-4 w-full" />
setTopP(Number(value))} max={openAISettings.top_p.max} min={openAISettings.top_p.min} step={openAISettings.top_p.step} controls={false} className={cn( defaultTextProps, cn( optionText, 'reset-rc-number-input reset-rc-number-input-text-right h-auto w-12 border-0 group-hover/temp:border-gray-200', ), )} />
setTopP(value[0])} doubleClickHandler={() => setTopP(openAISettings.top_p.default)} max={openAISettings.top_p.max} min={openAISettings.top_p.min} step={openAISettings.top_p.step} className="flex h-4 w-full" />
setFreqP(Number(value))} max={openAISettings.frequency_penalty.max} min={openAISettings.frequency_penalty.min} step={openAISettings.frequency_penalty.step} controls={false} className={cn( defaultTextProps, cn( optionText, 'reset-rc-number-input reset-rc-number-input-text-right h-auto w-12 border-0 group-hover/temp:border-gray-200', ), )} />
setFreqP(value[0])} doubleClickHandler={() => setFreqP(openAISettings.frequency_penalty.default)} max={openAISettings.frequency_penalty.max} min={openAISettings.frequency_penalty.min} step={openAISettings.frequency_penalty.step} className="flex h-4 w-full" />
setPresP(Number(value))} max={openAISettings.presence_penalty.max} min={openAISettings.presence_penalty.min} step={openAISettings.presence_penalty.step} controls={false} className={cn( defaultTextProps, cn( optionText, 'reset-rc-number-input reset-rc-number-input-text-right h-auto w-12 border-0 group-hover/temp:border-gray-200', ), )} />
setPresP(value[0])} doubleClickHandler={() => setPresP(openAISettings.presence_penalty.default)} max={openAISettings.presence_penalty.max} min={openAISettings.presence_penalty.min} step={openAISettings.presence_penalty.step} className="flex h-4 w-full" />
setResendFiles(checked)} disabled={readonly} className="flex" /> setImageDetail(imageDetailValue[value[0]])} doubleClickHandler={() => setImageDetail(openAISettings.imageDetail.default)} max={openAISettings.imageDetail.max} min={openAISettings.imageDetail.min} step={openAISettings.imageDetail.step} />
); }