diff --git a/web/src/components/knowledge-base-item.tsx b/web/src/components/knowledge-base-item.tsx index 1ab32dd66..9e723df87 100644 --- a/web/src/components/knowledge-base-item.tsx +++ b/web/src/components/knowledge-base-item.tsx @@ -98,6 +98,7 @@ export function KnowledgeBaseFormField() { placeholder={t('knowledgeBasesMessage')} variant="inverted" maxCount={100} + defaultValue={field.value} {...field} /> diff --git a/web/src/components/rerank.tsx b/web/src/components/rerank.tsx index 34439fdfd..08add5251 100644 --- a/web/src/components/rerank.tsx +++ b/web/src/components/rerank.tsx @@ -3,6 +3,7 @@ import { useTranslate } from '@/hooks/common-hooks'; import { useSelectLlmOptionsByModelType } from '@/hooks/llm-hooks'; import { Select as AntSelect, Form, Slider } from 'antd'; import { useFormContext } from 'react-hook-form'; +import { SingleFormSlider } from './ui/dual-range-slider'; import { FormControl, FormField, @@ -19,7 +20,6 @@ import { SelectTrigger, SelectValue, } from './ui/select'; -import { FormSlider } from './ui/slider'; type FieldType = { rerank_id?: string; @@ -140,7 +140,11 @@ export function RerankFormFields() { {t('topK')} - + diff --git a/web/src/components/similarity-slider/index.tsx b/web/src/components/similarity-slider/index.tsx index 308b496c7..04cd1587f 100644 --- a/web/src/components/similarity-slider/index.tsx +++ b/web/src/components/similarity-slider/index.tsx @@ -1,6 +1,7 @@ import { useTranslate } from '@/hooks/common-hooks'; import { Form, Slider } from 'antd'; import { useFormContext } from 'react-hook-form'; +import { SingleFormSlider } from '../ui/dual-range-slider'; import { FormControl, FormField, @@ -8,7 +9,6 @@ import { FormLabel, FormMessage, } from '../ui/form'; -import { FormSlider } from '../ui/slider'; type FieldType = { similarity_threshold?: number; @@ -51,28 +51,51 @@ const SimilaritySlider = ({ export default SimilaritySlider; interface SimilaritySliderFormFieldProps { - name?: string; + vectorSimilarityWeightName?: string; } export function SimilaritySliderFormField({ - name = 'vector_similarity_weight', + vectorSimilarityWeightName = 'vector_similarity_weight', }: SimilaritySliderFormFieldProps) { const form = useFormContext(); const { t } = useTranslate('knowledgeDetails'); return ( - ( - - {t('vectorSimilarityWeight')} - - - - - - )} - /> + <> + ( + + {t('similarityThreshold')} + + + + + + )} + /> + ( + + {t('vectorSimilarityWeight')} + + + + + + )} + /> + ); } diff --git a/web/src/components/top-n-item.tsx b/web/src/components/top-n-item.tsx index 8c1c52d58..636a7a4f0 100644 --- a/web/src/components/top-n-item.tsx +++ b/web/src/components/top-n-item.tsx @@ -1,6 +1,7 @@ import { useTranslate } from '@/hooks/common-hooks'; import { Form, Slider } from 'antd'; import { useFormContext } from 'react-hook-form'; +import { SingleFormSlider } from './ui/dual-range-slider'; import { FormControl, FormField, @@ -8,7 +9,6 @@ import { FormLabel, FormMessage, } from './ui/form'; -import { FormSlider } from './ui/slider'; type FieldType = { top_n?: number; @@ -52,7 +52,7 @@ export function TopNFormField({ max = 30 }: SimilaritySliderFormFieldProps) { {t('topN')} - + diff --git a/web/src/components/ui/dual-range-slider.tsx b/web/src/components/ui/dual-range-slider.tsx new file mode 100644 index 000000000..3d2be3937 --- /dev/null +++ b/web/src/components/ui/dual-range-slider.tsx @@ -0,0 +1,78 @@ +'use client'; + +import * as SliderPrimitive from '@radix-ui/react-slider'; +import * as React from 'react'; + +import { cn } from '@/lib/utils'; + +interface DualRangeSliderProps + extends React.ComponentProps { + labelPosition?: 'top' | 'bottom'; + label?: (value: number | undefined) => React.ReactNode; +} + +const DualRangeSlider = React.forwardRef< + React.ElementRef, + DualRangeSliderProps +>(({ className, label, labelPosition = 'top', ...props }, ref) => { + const initialValue = Array.isArray(props.value) + ? props.value + : [props.min, props.max]; + + return ( + + + + + {initialValue.map((value, index) => ( + + + {label && ( + + {label(value)} + + )} + + + ))} + + ); +}); +DualRangeSlider.displayName = 'DualRangeSlider'; + +type SingleSliderProps = Omit< + React.ComponentPropsWithoutRef, + 'onChange' | 'value' +> & { onChange: (value: number) => void; value: number }; + +const SingleFormSlider = React.forwardRef< + React.ElementRef, + SingleSliderProps +>(({ value, onChange, ...props }, ref) => { + return ( + value} + value={[value]} + onValueChange={(vals) => { + onChange(vals[0]); + }} + {...props} + /> + ); +}); + +export { DualRangeSlider, SingleFormSlider }; diff --git a/web/src/pages/agent/form/retrieval-form/next.tsx b/web/src/pages/agent/form/retrieval-form/next.tsx index 8b7dbae60..82747e7c8 100644 --- a/web/src/pages/agent/form/retrieval-form/next.tsx +++ b/web/src/pages/agent/form/retrieval-form/next.tsx @@ -26,7 +26,7 @@ const RetrievalForm = ({ form, node }: INextOperatorForm) => { }} > - +