diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSettingsPopup.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSettingsPopup.tsx deleted file mode 100644 index 237c4a8bc..000000000 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSettingsPopup.tsx +++ /dev/null @@ -1,326 +0,0 @@ -import { DownOutlined, WarningOutlined } from '@ant-design/icons' -import { TopView } from '@renderer/components/TopView' -import { DEFAULT_KNOWLEDGE_DOCUMENT_COUNT } from '@renderer/config/constant' -import { getEmbeddingMaxContext } from '@renderer/config/embedings' -import { isEmbeddingModel, isRerankModel } from '@renderer/config/models' -import { NOT_SUPPORTED_REANK_PROVIDERS } from '@renderer/config/providers' -// import { SUPPORTED_REANK_PROVIDERS } from '@renderer/config/providers' -import { useKnowledge } from '@renderer/hooks/useKnowledge' -import { useProviders } from '@renderer/hooks/useProvider' -import { SettingHelpText } from '@renderer/pages/settings' -import { getModelUniqId } from '@renderer/services/ModelService' -import { KnowledgeBase } from '@renderer/types' -import { Alert, Form, Input, InputNumber, Modal, Select, Slider } from 'antd' -import { sortBy } from 'lodash' -import { useEffect, useState } from 'react' -import { useTranslation } from 'react-i18next' -import styled from 'styled-components' - -interface ShowParams { - base: KnowledgeBase -} - -interface FormData { - name: string - model: string - documentCount?: number - dimensions?: number - chunkSize?: number - chunkOverlap?: number - threshold?: number - rerankModel?: string -} - -interface Props extends ShowParams { - resolve: (data: any) => void -} - -const PopupContainer: React.FC = ({ base: _base, resolve }) => { - const [open, setOpen] = useState(true) - const [showAdvanced, setShowAdvanced] = useState(false) - const [form] = Form.useForm() - const { t } = useTranslation() - const { providers } = useProviders() - const { base, updateKnowledgeBase } = useKnowledge(_base.id) - - useEffect(() => { - form.setFieldsValue({ documentCount: base?.documentCount || 6 }) - }, [base, form]) - - if (!base) { - resolve(null) - return null - } - - const selectOptions = providers - .filter((p) => p.models.length > 0) - .map((p) => ({ - label: p.isSystem ? t(`provider.${p.id}`) : p.name, - title: p.name, - options: sortBy(p.models, 'name') - .filter((model) => isEmbeddingModel(model) && !isRerankModel(model)) - .map((m) => ({ - label: m.name, - value: getModelUniqId(m) - })) - })) - .filter((group) => group.options.length > 0) - - const rerankSelectOptions = providers - .filter((p) => p.models.length > 0) - .filter((p) => !NOT_SUPPORTED_REANK_PROVIDERS.includes(p.id)) - .map((p) => ({ - label: p.isSystem ? t(`provider.${p.id}`) : p.name, - title: p.name, - options: sortBy(p.models, 'name') - .filter((model) => isRerankModel(model)) - .map((m) => ({ - label: m.name, - value: getModelUniqId(m) - })) - })) - .filter((group) => group.options.length > 0) - - const onOk = async () => { - try { - const values = await form.validateFields() - const newBase = { - ...base, - name: values.name, - documentCount: values.documentCount || DEFAULT_KNOWLEDGE_DOCUMENT_COUNT, - dimensions: values.dimensions || base.dimensions, - chunkSize: values.chunkSize, - chunkOverlap: values.chunkOverlap, - threshold: values.threshold ?? undefined, - rerankModel: values.rerankModel - ? providers.flatMap((p) => p.models).find((m) => getModelUniqId(m) === values.rerankModel) - : undefined - } - updateKnowledgeBase(newBase) - setOpen(false) - setTimeout(() => resolve(newBase), 350) - } catch (error) { - console.error('Validation failed:', error) - } - } - - const onCancel = () => { - setOpen(false) - } - - const onClose = () => { - resolve(null) - } - - KnowledgeSettingsPopup.hide = onCancel - - return ( - -
- - - - - - - - - {t('models.rerank_model_not_support_provider', { - provider: NOT_SUPPORTED_REANK_PROVIDERS.map((id) => t(`provider.${id}`)) - })} - - - - - - - setShowAdvanced(!showAdvanced)}> - - {t('common.advanced_settings')} - - -
- maxContext) { - return Promise.reject( - new Error(t('knowledge.dimensions_size_too_large', { max_context: maxContext })) - ) - } - return Promise.resolve() - } - } - ]}> - - - maxContext) { - return Promise.reject(new Error(t('knowledge.chunk_size_too_large', { max_context: maxContext }))) - } - return Promise.resolve() - } - } - ]}> - - - ({ - validator(_, value) { - if (!value || getFieldValue('chunkSize') > value) { - return Promise.resolve() - } - return Promise.reject(new Error(t('message.error.chunk_overlap_too_large'))) - } - }) - ]} - dependencies={['chunkSize']}> - - - - 1 || value < 0)) { - return Promise.reject(new Error(t('knowledge.threshold_too_large_or_small'))) - } - return Promise.resolve() - } - } - ]}> - - - - } - /> -
-
-
- ) -} - -const TopViewKey = 'KnowledgeSettingsPopup' - -const AdvancedSettingsButton = styled.div` - cursor: pointer; - margin-bottom: 16px; - margin-top: -10px; - color: var(--color-primary); - display: flex; - align-items: center; -` - -export default class KnowledgeSettingsPopup { - static hide() { - TopView.hide(TopViewKey) - } - - static show(props: ShowParams) { - return new Promise((resolve) => { - TopView.show( - { - resolve(v) - TopView.hide(TopViewKey) - }} - />, - TopViewKey - ) - }) - } -} diff --git a/src/renderer/src/pages/settings/ToolSettings/PreprocessSettings/PreprocessSettings.tsx b/src/renderer/src/pages/settings/ToolSettings/PreprocessSettings/PreprocessSettings.tsx index 1be72340d..b9653414b 100644 --- a/src/renderer/src/pages/settings/ToolSettings/PreprocessSettings/PreprocessSettings.tsx +++ b/src/renderer/src/pages/settings/ToolSettings/PreprocessSettings/PreprocessSettings.tsx @@ -6,7 +6,7 @@ import { PreprocessProvider } from '@renderer/types' import { hasObjectKey } from '@renderer/utils' import { Avatar, Divider, Flex, Input, InputNumber, Segmented } from 'antd' import Link from 'antd/es/typography/Link' -import { FC, useEffect, useState } from 'react' +import { FC, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -31,6 +31,8 @@ const PreprocessProviderSettings: FC = ({ provider: _provider }) => { const [apiKey, setApiKey] = useState(preprocessProvider.apiKey || '') const [apiHost, setApiHost] = useState(preprocessProvider.apiHost || '') const [options, setOptions] = useState(preprocessProvider.options || {}) + // todo: remove this after the next release + const hasSetDefaultApiKey = useRef(false) const preprocessProviderConfig = PREPROCESS_PROVIDER_CONFIG[preprocessProvider.id] const apiKeyWebsite = preprocessProviderConfig?.websites?.apiKey @@ -38,6 +40,12 @@ const PreprocessProviderSettings: FC = ({ provider: _provider }) => { useEffect(() => { setApiKey(preprocessProvider.apiKey ?? '') + // todo: remove this after the next release + if (preprocessProvider.id === 'mineru' && !preprocessProvider.apiKey && !hasSetDefaultApiKey.current) { + setApiKey(import.meta.env.RENDERER_VITE_MINERU_KEY) + console.log('Using default Mineru API key from environment variable.') + hasSetDefaultApiKey.current = true + } setApiHost(preprocessProvider.apiHost ?? '') setOptions(preprocessProvider.options ?? {}) }, [preprocessProvider.apiKey, preprocessProvider.apiHost, preprocessProvider.options])