{item.name}
diff --git a/web/src/pages/user-setting/setting-model/components/used-model.tsx b/web/src/pages/user-setting/setting-model/components/used-model.tsx
index 3973f6fb6..91c7bc066 100644
--- a/web/src/pages/user-setting/setting-model/components/used-model.tsx
+++ b/web/src/pages/user-setting/setting-model/components/used-model.tsx
@@ -9,7 +9,7 @@ export const UsedModel = ({
handleAddModel: (factory: string) => void;
handleEditModel: (model: any, factory: LlmItem) => void;
}) => {
- const { factoryList, myLlmList: llmList, loading } = useSelectLlmList();
+ const { myLlmList: llmList } = useSelectLlmList();
return (
diff --git a/web/src/pages/user-setting/setting-model/hooks.tsx b/web/src/pages/user-setting/setting-model/hooks.tsx
index 4d0708a42..9fc620d3d 100644
--- a/web/src/pages/user-setting/setting-model/hooks.tsx
+++ b/web/src/pages/user-setting/setting-model/hooks.tsx
@@ -1,3 +1,4 @@
+import { LLMFactory } from '@/constants/llm';
import { useSetModalState, useShowDeleteConfirm } from '@/hooks/common-hooks';
import {
IApiKeySavingParams,
@@ -16,6 +17,7 @@ import { getRealModelName } from '@/utils/llm-util';
import { useQueryClient } from '@tanstack/react-query';
import { useCallback, useState } from 'react';
import { ApiKeyPostBody } from '../interface';
+import { MinerUFormValues } from './modal/mineru-modal';
type SavingParamsState = Omit;
@@ -459,3 +461,42 @@ export const useHandleDeleteFactory = (llmFactory: string) => {
return { handleDeleteFactory, deleteFactory };
};
+
+export const useSubmitMinerU = () => {
+ const { addLlm, loading } = useAddLlm();
+ const {
+ visible: mineruVisible,
+ hideModal: hideMineruModal,
+ showModal: showMineruModal,
+ } = useSetModalState();
+
+ const onMineruOk = useCallback(
+ async (payload: MinerUFormValues) => {
+ const cfg = {
+ ...payload,
+ mineru_delete_output: payload.mineru_delete_output ?? true ? '1' : '0',
+ };
+ const req: IAddLlmRequestBody = {
+ llm_factory: LLMFactory.MinerU,
+ llm_name: payload.llm_name,
+ model_type: 'ocr',
+ api_key: cfg,
+ api_base: '',
+ max_tokens: 0,
+ };
+ const ret = await addLlm(req);
+ if (ret === 0) {
+ hideMineruModal();
+ }
+ },
+ [addLlm, hideMineruModal],
+ );
+
+ return {
+ mineruVisible,
+ hideMineruModal,
+ showMineruModal,
+ onMineruOk,
+ mineruLoading: loading,
+ };
+};
diff --git a/web/src/pages/user-setting/setting-model/index.tsx b/web/src/pages/user-setting/setting-model/index.tsx
index 1e7086019..af7907bb0 100644
--- a/web/src/pages/user-setting/setting-model/index.tsx
+++ b/web/src/pages/user-setting/setting-model/index.tsx
@@ -13,6 +13,7 @@ import {
useSubmitFishAudio,
useSubmitGoogle,
useSubmitHunyuan,
+ useSubmitMinerU,
useSubmitOllama,
useSubmitSpark,
useSubmitSystemModelSetting,
@@ -26,6 +27,7 @@ import BedrockModal from './modal/bedrock-modal';
import FishAudioModal from './modal/fish-audio-modal';
import GoogleModal from './modal/google-modal';
import HunyuanModal from './modal/hunyuan-modal';
+import MinerUModal from './modal/mineru-modal';
import TencentCloudModal from './modal/next-tencent-modal';
import OllamaModal from './modal/ollama-modal';
import SparkModal from './modal/spark-modal';
@@ -128,6 +130,14 @@ const ModelProviders = () => {
AzureAddingLoading,
} = useSubmitAzure();
+ const {
+ mineruVisible,
+ hideMineruModal,
+ showMineruModal,
+ onMineruOk,
+ mineruLoading,
+ } = useSubmitMinerU();
+
const ModalMap = useMemo(
() => ({
[LLMFactory.Bedrock]: showBedrockAddingModal,
@@ -139,17 +149,19 @@ const ModelProviders = () => {
[LLMFactory.TencentCloud]: showTencentCloudAddingModal,
[LLMFactory.GoogleCloud]: showGoogleAddingModal,
[LLMFactory.AzureOpenAI]: showAzureAddingModal,
+ [LLMFactory.MinerU]: showMineruModal,
}),
[
showBedrockAddingModal,
showVolcAddingModal,
showHunyuanAddingModal,
- showTencentCloudAddingModal,
showSparkAddingModal,
showyiyanAddingModal,
showFishAudioAddingModal,
+ showTencentCloudAddingModal,
showGoogleAddingModal,
showAzureAddingModal,
+ showMineruModal,
],
);
@@ -289,6 +301,12 @@ const ModelProviders = () => {
loading={AzureAddingLoading}
llmFactory={LLMFactory.AzureOpenAI}
>
+
);
};
diff --git a/web/src/pages/user-setting/setting-model/modal/mineru-modal/index.tsx b/web/src/pages/user-setting/setting-model/modal/mineru-modal/index.tsx
new file mode 100644
index 000000000..7833467db
--- /dev/null
+++ b/web/src/pages/user-setting/setting-model/modal/mineru-modal/index.tsx
@@ -0,0 +1,148 @@
+import { RAGFlowFormItem } from '@/components/ragflow-form';
+import { ButtonLoading } from '@/components/ui/button';
+import {
+ Dialog,
+ DialogContent,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+} from '@/components/ui/dialog';
+import { Form } from '@/components/ui/form';
+import { Input } from '@/components/ui/input';
+import { RAGFlowSelect } from '@/components/ui/select';
+import { Switch } from '@/components/ui/switch';
+import { LLMFactory } from '@/constants/llm';
+import { IModalProps } from '@/interfaces/common';
+import { buildOptions } from '@/utils/form';
+import { zodResolver } from '@hookform/resolvers/zod';
+import { t } from 'i18next';
+import { useForm } from 'react-hook-form';
+import { useTranslation } from 'react-i18next';
+import { z } from 'zod';
+import { LLMHeader } from '../../components/llm-header';
+
+const FormSchema = z.object({
+ llm_name: z.string().min(1, {
+ message: t('setting.mineru.modelNameRequired'),
+ }),
+ mineru_apiserver: z.string().optional(),
+ mineru_output_dir: z.string().optional(),
+ mineru_backend: z.enum([
+ 'pipeline',
+ 'vlm-transformers',
+ 'vlm-vllm-engine',
+ 'vlm-http-client',
+ ]),
+ mineru_server_url: z.string().optional(),
+ mineru_delete_output: z.boolean(),
+});
+
+export type MinerUFormValues = z.infer
;
+
+const MinerUModal = ({
+ visible,
+ hideModal,
+ onOk,
+ loading,
+}: IModalProps) => {
+ const { t } = useTranslation();
+
+ const backendOptions = buildOptions([
+ 'pipeline',
+ 'vlm-transformers',
+ 'vlm-vllm-engine',
+ 'vlm-http-client',
+ ]);
+
+ const form = useForm({
+ resolver: zodResolver(FormSchema),
+ defaultValues: {
+ mineru_backend: 'pipeline',
+ mineru_delete_output: true,
+ },
+ });
+
+ const handleOk = async (values: MinerUFormValues) => {
+ const ret = await onOk?.(values as any);
+ if (ret) {
+ hideModal?.();
+ }
+ };
+
+ return (
+
+ );
+};
+
+export default MinerUModal;