import { useRecoilState } from 'recoil'; import { useCallback, useEffect, useMemo } from 'react'; import { useQueryClient } from '@tanstack/react-query'; import { QueryKeys, isAgentsEndpoint } from 'librechat-data-provider'; import type { TModelsConfig, TEndpointsConfig } from 'librechat-data-provider'; import { cn, defaultTextProps, removeFocusOutlines, mapEndpoints, getConvoSwitchLogic, } from '~/utils'; import { Input, Label, SelectDropDown, Dialog, DialogClose, DialogButton } from '~/components'; import { useSetIndexOptions, useLocalize, useDebouncedInput } from '~/hooks'; import PopoverButtons from '~/components/Chat/Input/PopoverButtons'; import DialogTemplate from '~/components/ui/DialogTemplate'; import { EndpointSettings } from '~/components/Endpoints'; import { useGetEndpointsQuery } from '~/data-provider'; import { useChatContext } from '~/Providers'; import store from '~/store'; const EditPresetDialog = ({ exportPreset, submitPreset, }: { exportPreset: () => void; submitPreset: () => void; }) => { const localize = useLocalize(); const queryClient = useQueryClient(); const { preset, setPreset } = useChatContext(); const { setOption, setOptions, setAgentOption } = useSetIndexOptions(preset); const [onTitleChange, title] = useDebouncedInput({ setOption, optionKey: 'title', initialValue: preset?.title, }); const [presetModalVisible, setPresetModalVisible] = useRecoilState(store.presetModalVisible); const { data: _endpoints = [] } = useGetEndpointsQuery({ select: mapEndpoints, }); const availableEndpoints = useMemo(() => { return _endpoints.filter((endpoint) => !isAgentsEndpoint(endpoint)); }, [_endpoints]); useEffect(() => { if (!preset) { return; } if (isAgentsEndpoint(preset.endpoint)) { return; } const presetEndpoint = preset.endpoint ?? ''; if (!presetEndpoint) { return; } const modelsConfig = queryClient.getQueryData([QueryKeys.models]); if (!modelsConfig) { return; } const models = modelsConfig[presetEndpoint] as string[] | undefined; if (!models) { return; } if (!models.length) { return; } if (preset.model === models[0]) { return; } if (!models.includes(preset.model ?? '')) { console.log('setting model', models[0]); setOption('model')(models[0]); } if (preset.agentOptions?.model === models[0]) { return; } if ( preset.agentOptions?.model != null && preset.agentOptions.model && !models.includes(preset.agentOptions.model) ) { console.log('setting agent model', models[0]); setAgentOption('model')(models[0]); } }, [preset, queryClient, setOption, setAgentOption]); const switchEndpoint = useCallback( (newEndpoint: string) => { if (!setOptions) { return console.warn('setOptions is not defined'); } const { newEndpointType } = getConvoSwitchLogic({ newEndpoint, modularChat: true, conversation: null, endpointsConfig: queryClient.getQueryData([QueryKeys.endpoints]) ?? {}, }); setOptions({ endpoint: newEndpoint, endpointType: newEndpointType, }); }, [queryClient, setOptions], ); const { endpoint: _endpoint, endpointType, model } = preset || {}; const endpoint = _endpoint ?? ''; if (!endpoint) { return null; } else if (isAgentsEndpoint(endpoint)) { return null; } return ( { setPresetModalVisible(open); if (!open) { setPreset(null); } }} >
} buttons={
{localize('com_endpoint_export')} {localize('com_ui_save')}
} footerClassName="bg-white dark:bg-gray-700" />
); }; export default EditPresetDialog;