|
import { LlmModelType } from '@/constants/knowledge'; |
|
import { useTranslate } from '@/hooks/common-hooks'; |
|
import { useSelectLlmOptionsByModelType } from '@/hooks/llm-hooks'; |
|
import { Select as AntSelect, Form, message, Slider } from 'antd'; |
|
import { useCallback } from 'react'; |
|
import { useFormContext } from 'react-hook-form'; |
|
import { SingleFormSlider } from './ui/dual-range-slider'; |
|
import { |
|
FormControl, |
|
FormField, |
|
FormItem, |
|
FormLabel, |
|
FormMessage, |
|
} from './ui/form'; |
|
import { |
|
Select, |
|
SelectContent, |
|
SelectGroup, |
|
SelectItem, |
|
SelectLabel, |
|
SelectTrigger, |
|
SelectValue, |
|
} from './ui/select'; |
|
|
|
type FieldType = { |
|
rerank_id?: string; |
|
top_k?: number; |
|
}; |
|
|
|
export const RerankItem = () => { |
|
const { t } = useTranslate('knowledgeDetails'); |
|
const allOptions = useSelectLlmOptionsByModelType(); |
|
const [messageApi, contextHolder] = message.useMessage(); |
|
|
|
const handleChange = useCallback( |
|
(val: string) => { |
|
if (val) { |
|
messageApi.open({ |
|
type: 'warning', |
|
content: t('reRankModelWaring'), |
|
}); |
|
} |
|
}, |
|
[messageApi, t], |
|
); |
|
|
|
return ( |
|
<> |
|
{contextHolder} |
|
<Form.Item |
|
label={t('rerankModel')} |
|
name={'rerank_id'} |
|
tooltip={t('rerankTip')} |
|
> |
|
<AntSelect |
|
options={allOptions[LlmModelType.Rerank]} |
|
allowClear |
|
placeholder={t('rerankPlaceholder')} |
|
onChange={handleChange} |
|
/> |
|
</Form.Item> |
|
</> |
|
); |
|
}; |
|
|
|
const Rerank = () => { |
|
const { t } = useTranslate('knowledgeDetails'); |
|
|
|
return ( |
|
<> |
|
<RerankItem></RerankItem> |
|
<Form.Item noStyle dependencies={['rerank_id']}> |
|
{({ getFieldValue }) => { |
|
const rerankId = getFieldValue('rerank_id'); |
|
return ( |
|
rerankId && ( |
|
<Form.Item<FieldType> |
|
label={t('topK')} |
|
name={'top_k'} |
|
initialValue={1024} |
|
tooltip={t('topKTip')} |
|
> |
|
<Slider max={2048} min={1} /> |
|
</Form.Item> |
|
) |
|
); |
|
}} |
|
</Form.Item> |
|
</> |
|
); |
|
}; |
|
|
|
export default Rerank; |
|
|
|
const RerankId = 'rerank_id'; |
|
|
|
function RerankFormField() { |
|
const form = useFormContext(); |
|
const { t } = useTranslate('knowledgeDetails'); |
|
const allOptions = useSelectLlmOptionsByModelType(); |
|
const options = allOptions[LlmModelType.Rerank]; |
|
|
|
return ( |
|
<FormField |
|
control={form.control} |
|
name={RerankId} |
|
render={({ field }) => ( |
|
<FormItem> |
|
<FormLabel>{t('rerankModel')}</FormLabel> |
|
<FormControl> |
|
<Select onValueChange={field.onChange} {...field}> |
|
<SelectTrigger |
|
value={field.value} |
|
onReset={() => { |
|
form.resetField(RerankId); |
|
}} |
|
> |
|
<SelectValue placeholder={t('rerankPlaceholder')} /> |
|
</SelectTrigger> |
|
<SelectContent> |
|
{options.map((x) => ( |
|
<SelectGroup key={x.label}> |
|
<SelectLabel>{x.label}</SelectLabel> |
|
{x.options.map((y) => ( |
|
<SelectItem |
|
value={y.value} |
|
key={y.value} |
|
disabled={y.disabled} |
|
> |
|
{y.label} |
|
</SelectItem> |
|
))} |
|
</SelectGroup> |
|
))} |
|
</SelectContent> |
|
</Select> |
|
</FormControl> |
|
<FormMessage /> |
|
</FormItem> |
|
)} |
|
/> |
|
); |
|
} |
|
|
|
export function RerankFormFields() { |
|
const { control, watch } = useFormContext(); |
|
const { t } = useTranslate('knowledgeDetails'); |
|
const rerankId = watch(RerankId); |
|
|
|
return ( |
|
<> |
|
<RerankFormField></RerankFormField> |
|
{rerankId && ( |
|
<FormField |
|
control={control} |
|
name={'top_k'} |
|
render={({ field }) => ( |
|
<FormItem> |
|
<FormLabel>{t('topK')}</FormLabel> |
|
<FormControl> |
|
<SingleFormSlider |
|
{...field} |
|
max={2048} |
|
min={1} |
|
></SingleFormSlider> |
|
</FormControl> |
|
<FormMessage /> |
|
</FormItem> |
|
)} |
|
/> |
|
)} |
|
</> |
|
); |
|
} |
|
|