import { FormFieldConfig, FormFieldType, RenderField, } from '@/components/dynamic-form'; import { SelectWithSearch, SelectWithSearchFlagOptionType, } from '@/components/originui/select-with-search'; import { SliderInputFormField } from '@/components/slider-input-form-field'; import { Button } from '@/components/ui/button'; import { FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { Radio } from '@/components/ui/radio'; import { Spin } from '@/components/ui/spin'; import { Switch } from '@/components/ui/switch'; import { LlmModelType } from '@/constants/knowledge'; import { useTranslate } from '@/hooks/common-hooks'; import { useComposeLlmOptionsByModelTypes } from '@/hooks/use-llm-request'; import { cn } from '@/lib/utils'; import { t } from 'i18next'; import { Settings } from 'lucide-react'; import { useMemo, useState } from 'react'; import { ControllerRenderProps, FieldValues, useFormContext, } from 'react-hook-form'; import { MetadataType, useManageMetadata, util, } from '../../components/metedata/hooks/use-manage-modal'; import { IMetaDataReturnJSONSettings } from '../../components/metedata/interface'; import { ManageMetadataModal } from '../../components/metedata/manage-modal'; import { useHandleKbEmbedding, useHasParsedDocument, useSelectChunkMethodList, useSelectEmbeddingModelOptions, } from '../hooks'; interface IProps { line?: 1 | 2; isEdit?: boolean; label?: string; name?: string; } export function ChunkMethodItem(props: IProps) { const { line } = props; const { t } = useTranslate('knowledgeConfiguration'); const form = useFormContext(); // const handleChunkMethodSelectChange = useHandleChunkMethodSelectChange(form); const parserList = useSelectChunkMethodList(); return ( (
{t('builtIn')}
)} /> ); } export const EmbeddingSelect = ({ isEdit, field, name, disabled = false, }: { isEdit: boolean; field: FieldValues; name?: string; disabled?: boolean; }) => { const { t } = useTranslate('knowledgeConfiguration'); const form = useFormContext(); const embeddingModelOptions = useSelectEmbeddingModelOptions(); const { handleChange } = useHandleKbEmbedding(); const oldValue = useMemo(() => { const embdStr = form.getValues(name || 'embd_id'); return embdStr || ''; }, [form]); const [loading, setLoading] = useState(false); return ( { field.onChange(value); if (isEdit && disabled) { setLoading(true); const res = await handleChange({ embed_id: value, // callback: field.onChange, }); if (res.code !== 0) { field.onChange(oldValue); } setLoading(false); } }} disabled={disabled && !isEdit} value={field.value} options={embeddingModelOptions} placeholder={t('embeddingModelPlaceholder')} /> ); }; export function EmbeddingModelItem({ line = 1, isEdit }: IProps) { const { t } = useTranslate('knowledgeConfiguration'); const form = useFormContext(); const disabled = useHasParsedDocument(isEdit); return ( <> (
{t('embeddingModel')}
)} /> ); } export function ParseTypeItem({ line = 2 }: { line?: number }) { const { t } = useTranslate('knowledgeConfiguration'); const form = useFormContext(); return ( (
{t('parseType')}
{t('builtIn')} {t('manualSetup')}
)} /> ); } export function EnableAutoGenerateItem() { const { t } = useTranslate('knowledgeConfiguration'); const form = useFormContext(); return ( (
{t('enableAutoGenerate')}
)} /> ); } export function EnableTocToggle() { const { t } = useTranslate('knowledgeConfiguration'); const form = useFormContext(); return ( (
{t('tocExtraction')}
)} /> ); } export function ImageContextWindow() { const { t } = useTranslate('knowledgeConfiguration'); const form = useFormContext(); return ( (
)} /> ); } export function OverlappedPercent() { return ( ); } export function AutoMetadata({ type = MetadataType.Setting, otherData, }: { type?: MetadataType; otherData?: Record; }) { // get metadata field const form = useFormContext(); const { manageMetadataVisible, showManageMetadataModal, hideManageMetadataModal, tableData, config: metadataConfig, } = useManageMetadata(); const autoMetadataField: FormFieldConfig = { name: 'parser_config.enable_metadata', label: t('knowledgeConfiguration.autoMetadata'), type: FormFieldType.Custom, horizontal: true, defaultValue: true, tooltip: t('knowledgeConfiguration.autoMetadataTip'), render: (fieldProps: ControllerRenderProps) => (
), }; const handleSaveMetadata = (data?: IMetaDataReturnJSONSettings) => { form.setValue('parser_config.metadata', data || []); }; return ( <> {manageMetadataVisible && (
{t('knowledgeDetails.metadata.metadataGenerationSettings')}
{t('knowledgeDetails.metadata.changesAffectNewParses')}
) } visible={manageMetadataVisible} hideModal={hideManageMetadataModal} // selectedRowKeys={selectedRowKeys} tableData={tableData} isCanAdd={metadataConfig.isCanAdd} isDeleteSingleValue={metadataConfig.isDeleteSingleValue} type={metadataConfig.type} otherData={metadataConfig.record} isShowDescription={true} isShowValueSwitch={true} isVerticalShowValue={false} success={(data?: IMetaDataReturnJSONSettings) => { handleSaveMetadata(data); }} /> )} ); } export const LLMSelect = ({ isEdit, field, disabled = false, }: { isEdit: boolean; field: FieldValues; name?: string; disabled?: boolean; }) => { const { t } = useTranslate('knowledgeConfiguration'); const modelOptions = useComposeLlmOptionsByModelTypes([ LlmModelType.Chat, LlmModelType.Image2text, ]); return ( { field.onChange(value); }} disabled={disabled && !isEdit} value={field.value} options={modelOptions as SelectWithSearchFlagOptionType[]} placeholder={t('embeddingModelPlaceholder')} /> ); }; export function LLMModelItem({ line = 1, isEdit, label, name }: IProps) { const { t } = useTranslate('knowledgeConfiguration'); const form = useFormContext(); const disabled = useHasParsedDocument(isEdit); return ( <> (
{label ?? t('llmModel')}
)} /> ); }