import { useTranslate } from '@/hooks/common-hooks'; import { IModalProps } from '@/interfaces/common'; import { IAddLlmRequestBody } from '@/interfaces/request/llm'; import { Flex, Form, Input, Modal, Select, Space, Switch, InputNumber } from 'antd'; import omit from 'lodash/omit'; type FieldType = IAddLlmRequestBody & { vision: boolean }; const { Option } = Select; const llmFactoryToUrlMap = { Ollama: 'https://github.com/infiniflow/ragflow/blob/main/docs/guides/deploy_local_llm.mdx', Xinference: 'https://inference.readthedocs.io/en/latest/user_guide', LocalAI: 'https://localai.io/docs/getting-started/models/', 'LM-Studio': 'https://lmstudio.ai/docs/basics', 'OpenAI-API-Compatible': 'https://platform.openai.com/docs/models/gpt-4', TogetherAI: 'https://docs.together.ai/docs/deployment-options', Replicate: 'https://replicate.com/docs/topics/deployments', OpenRouter: 'https://openrouter.ai/docs', HuggingFace: 'https://huggingface.co/docs/text-embeddings-inference/quick_tour', }; type LlmFactory = keyof typeof llmFactoryToUrlMap; const OllamaModal = ({ visible, hideModal, onOk, loading, llmFactory, }: IModalProps & { llmFactory: string }) => { const [form] = Form.useForm(); const { t } = useTranslate('setting'); const handleOk = async () => { const values = await form.validateFields(); const modelType = values.model_type === 'chat' && values.vision ? 'image2text' : values.model_type; const data = { ...omit(values, ['vision']), model_type: modelType, llm_factory: llmFactory, max_tokens:values.max_tokens, }; console.info(data); onOk?.(data); }; const url = llmFactoryToUrlMap[llmFactory as LlmFactory] || 'https://github.com/infiniflow/ragflow/blob/main/docs/guides/deploy_local_llm.mdx'; const optionsMap = { HuggingFace: [ { value: 'embedding', label: 'embedding' }, { value: 'chat', label: 'chat' }, ], Xinference: [ { value: 'chat', label: 'chat' }, { value: 'embedding', label: 'embedding' }, { value: 'rerank', label: 'rerank' }, { value: 'image2text', label: 'image2text' }, { value: 'speech2text', label: 'sequence2text' }, { value: 'tts', label: 'tts' }, ], Default: [ { value: 'chat', label: 'chat' }, { value: 'embedding', label: 'embedding' }, { value: 'rerank', label: 'rerank' }, { value: 'image2text', label: 'image2text' }, ], }; const getOptions = (factory: string) => { return optionsMap[factory as keyof typeof optionsMap] || optionsMap.Default; }; return ( { return ( {t('ollamaLink', { name: llmFactory })} {originNode} ); }} >
label={t('modelType')} name="model_type" initialValue={'embedding'} rules={[{ required: true, message: t('modelTypeMessage') }]} > label={t(llmFactory === 'Xinference' ? 'modelUid' : 'modelName')} name="llm_name" rules={[{ required: true, message: t('modelNameMessage') }]} > label={t('addLlmBaseUrl')} name="api_base" rules={[{ required: true, message: t('baseUrlNameMessage') }]} > label={t('apiKey')} name="api_key" rules={[{ required: false, message: t('apiKeyMessage') }]} > label={t('maxTokens')} name="max_tokens" rules={[ { required: true, message: t('maxTokensMessage') }, { type: 'number', message: t('maxTokensInvalidMessage'), }, ({ getFieldValue }) => ({ validator(_, value) { if (value < 0) { return Promise.reject(new Error(t('maxTokensMinMessage'))); } return Promise.resolve(); }, }), ]} > {({ getFieldValue }) => getFieldValue('model_type') === 'chat' && ( ) }
); }; export default OllamaModal;