import { useState, useMemo, useEffect } from 'react'; import TextareaAutosize from 'react-textarea-autosize'; import { TPreset, defaultOrderQuery } from 'librechat-data-provider'; import type { TModelSelectProps, Option } from '~/common'; import { Label, HoverCard, SelectDropDown, HoverCardTrigger } from '~/components/ui'; import { cn, defaultTextProps, removeFocusOutlines, mapAssistants } from '~/utils'; import { useLocalize, useDebouncedInput } from '~/hooks'; import { useListAssistantsQuery } from '~/data-provider'; 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 { data: assistants = [] } = useListAssistantsQuery(defaultOrderQuery, { select: (res) => [ defaultOption, ...res.data.map(({ id, name }) => ({ label: name, value: id, })), ].filter(Boolean), }); const { data: assistantMap = {} } = useListAssistantsQuery(defaultOrderQuery, { select: (res) => mapAssistants(res.data), }); const { model, endpoint, assistant_id, endpointType, promptPrefix, instructions } = conversation ?? {}; const [onPromptPrefixChange, promptPrefixValue] = useDebouncedInput( setOption, 'promptPrefix', promptPrefix, ); const [onInstructionsChange, instructionsValue] = useDebouncedInput( setOption, 'instructions', instructions, ); const activeAssistant = useMemo(() => { if (assistant_id) { return assistantMap[assistant_id]; } return null; }, [assistant_id, assistantMap]); 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