import React, { useMemo, useEffect } from 'react'; import { ChevronLeft, RotateCcw } from 'lucide-react'; import { getSettingsKeys } from 'librechat-data-provider'; import { useFormContext, useWatch, Controller } from 'react-hook-form'; import { useGetEndpointsQuery } from 'librechat-data-provider/react-query'; import type * as t from 'librechat-data-provider'; import type { AgentForm, AgentModelPanelProps, StringOption } from '~/common'; import { componentMapping } from '~/components/SidePanel/Parameters/components'; import { agentSettings } from '~/components/SidePanel/Parameters/settings'; import { getEndpointField, cn, cardStyle } from '~/utils'; import { SelectDropDown } from '~/components/ui'; import { useLocalize } from '~/hooks'; import { Panel } from '~/common'; export default function Parameters({ setActivePanel, providers, models: modelsData, }: AgentModelPanelProps) { const localize = useLocalize(); const { control, setValue } = useFormContext(); const model = useWatch({ control, name: 'model' }); const providerOption = useWatch({ control, name: 'provider' }); const modelParameters = useWatch({ control, name: 'model_parameters' }); const provider = useMemo(() => { const value = typeof providerOption === 'string' ? providerOption : (providerOption as StringOption | undefined)?.value; return value ?? ''; }, [providerOption]); const models = useMemo( () => (provider ? modelsData[provider] ?? [] : []), [modelsData, provider], ); useEffect(() => { const _model = model ?? ''; if (provider && _model) { const modelExists = models.includes(_model); if (!modelExists) { const newModels = modelsData[provider] ?? []; setValue('model', newModels[0] ?? ''); } } if (provider && !_model) { setValue('model', models[0] ?? ''); } }, [provider, models, modelsData, setValue, model]); const { data: endpointsConfig } = useGetEndpointsQuery(); const bedrockRegions = useMemo(() => { return endpointsConfig?.[provider]?.availableRegions ?? []; }, [endpointsConfig, provider]); const endpointType = useMemo( () => getEndpointField(endpointsConfig, provider, 'type'), [provider, endpointsConfig], ); const parameters = useMemo(() => { const [combinedKey, endpointKey] = getSettingsKeys(endpointType ?? provider, model ?? ''); return agentSettings[combinedKey] ?? agentSettings[endpointKey]; }, [endpointType, model, provider]); const setOption = (optionKey: keyof t.AgentModelParameters) => (value: t.AgentParameterValue) => { setValue(`model_parameters.${optionKey}`, value); }; const handleResetParameters = () => { setValue('model_parameters', {} as t.AgentModelParameters); }; return (
{localize('com_ui_model_parameters')}
{/* Endpoint aka Provider for Agents */}
( <> {error && ( {localize('com_ui_field_required')} )} )} />
{/* Model */}
( <> {provider && error && ( {localize('com_ui_field_required')} )} )} />
{/* Model Parameters */} {parameters && (
{' '} {/* This is the parent element containing all settings */} {/* Below is an example of an applied dynamic setting, each be contained by a div with the column span specified */} {parameters.map((setting) => { const Component = componentMapping[setting.component]; if (!Component) { return null; } const { key, default: defaultValue, ...rest } = setting; if (key === 'region' && bedrockRegions.length) { rest.options = bedrockRegions; } return ( } /> ); })}
{/* Reset Parameters Button */}
)}
); }