import { useState, useMemo, useEffect } from 'react'; import TextareaAutosize from 'react-textarea-autosize'; import type { Assistant, TPreset } from 'librechat-data-provider'; import type { TModelSelectProps, Option } from '~/common'; import { cn, defaultTextProps, removeFocusRings, mapAssistants, createDropdownSetter, } from '~/utils'; import { Label, HoverCard, SelectDropDown, HoverCardTrigger } from '~/components/ui'; import { useLocalize, useDebouncedInput, useAssistantListMap } from '~/hooks'; import OptionHover from './OptionHover'; import { ESide } from '~/common'; export default function Settings({ conversation, setOption, models, readonly }: TModelSelectProps) { const localize = useLocalize(); const defaultOption = useMemo( () => ({ label: localize('com_endpoint_use_active_assistant'), value: '' }), [localize], ); const assistantListMap = useAssistantListMap((res) => mapAssistants(res.data)); const { model, endpoint, assistant_id, endpointType, promptPrefix, instructions } = conversation ?? {}; const currentList = useMemo( () => Object.values(assistantListMap?.[endpoint ?? ''] ?? {}) as Assistant[], [assistantListMap, endpoint], ); const assistants = useMemo(() => { const currentAssistants = (currentList ?? []).map(({ id, name }) => ({ label: name, value: id, })); return [defaultOption, ...currentAssistants].filter(Boolean); }, [currentList, defaultOption]); const [onPromptPrefixChange, promptPrefixValue] = useDebouncedInput({ setOption, optionKey: 'promptPrefix', initialValue: promptPrefix, }); const [onInstructionsChange, instructionsValue] = useDebouncedInput({ setOption, optionKey: 'instructions', initialValue: instructions, }); const activeAssistant = useMemo(() => { if (assistant_id) { return assistantListMap[endpoint ?? '']?.[assistant_id]; } return null; }, [assistant_id, assistantListMap, endpoint]); const modelOptions = useMemo(() => { return models.map((model) => ({ label: model === activeAssistant?.model ? `${model} (${localize('com_endpoint_assistant_model')})` : model, value: model, })); }, [models, activeAssistant, localize]); const [assistantValue, setAssistantValue] = useState