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) => {
}}
>
-
+