diff --git a/backend/requirements.txt b/backend/requirements.txt index fa6d9a2..dfb2f96 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -33,3 +33,8 @@ transformers==4.57.1 # Sentence Transformers(更新到最新稳定版本以修复 FutureWarning) sentence-transformers==5.1.2 + +# PyTorch 版本锁定(用于打包环境) +torch==2.8.0 +torchvision==0.23.0 +torchaudio==2.8.0 diff --git a/frontend/src/pages/ProjectList.tsx b/frontend/src/pages/ProjectList.tsx index a022cfe..213a829 100644 --- a/frontend/src/pages/ProjectList.tsx +++ b/frontend/src/pages/ProjectList.tsx @@ -412,6 +412,11 @@ export default function ProjectList() { icon: , label: 'API 设置', }, + { + key: 'mumu-api', + icon: , + label: 'MuMuのAPI', + }, ], }, ]; @@ -442,6 +447,11 @@ export default function ProjectList() { icon: , label: 'API 设置', }, + { + key: 'mumu-api', + icon: , + label: 'MuMuのAPI', + }, ]; return ( @@ -550,6 +560,10 @@ export default function ProjectList() { selectedKeys={[activeView]} style={{ borderRight: 0, paddingTop: 12, width: '100%' }} onClick={({ key }) => { + if (key === 'mumu-api') { + window.open('https://api.mumuverse.space', '_blank', 'noopener,noreferrer'); + return; + } changeView(key as ProjectListView); }} items={collapsed ? sideMenuItemsCollapsed : sideMenuItems} @@ -751,6 +765,11 @@ export default function ProjectList() { selectedKeys={[activeView]} style={{ borderRight: 0, paddingTop: 8 }} onClick={({ key }) => { + if (key === 'mumu-api') { + window.open('https://api.mumuverse.space', '_blank', 'noopener,noreferrer'); + setDrawerVisible(false); + return; + } changeView(key as ProjectListView); setDrawerVisible(false); }} diff --git a/frontend/src/pages/Settings.tsx b/frontend/src/pages/Settings.tsx index 5549dc0..1139ebd 100644 --- a/frontend/src/pages/Settings.tsx +++ b/frontend/src/pages/Settings.tsx @@ -280,12 +280,29 @@ export default function SettingsPage() { { value: 'openai', label: 'OpenAI Compatible', defaultUrl: 'https://api.openai.com/v1' }, // { value: 'anthropic', label: 'Anthropic (Claude)', defaultUrl: 'https://api.anthropic.com' }, { value: 'gemini', label: 'Google Gemini', defaultUrl: 'https://generativelanguage.googleapis.com/v1beta' }, + { + value: 'mumu', + label: 'MuMuのAPI', + defaultUrl: 'https://api.mumuverse.space/v1', + defaultModel: 'gemini-3-flash-preview' + }, ]; + const selectedProvider = Form.useWatch('api_provider', form); + const selectedPresetProvider = Form.useWatch('api_provider', presetForm); + const handleProviderChange = (value: string) => { const provider = apiProviders.find(p => p.value === value); - if (provider && provider.defaultUrl) { - form.setFieldValue('api_base_url', provider.defaultUrl); + if (provider) { + const nextValues: Record = {}; + if (provider.defaultUrl) { + nextValues.api_base_url = provider.defaultUrl; + } + if (provider.value === 'mumu') { + nextValues.api_key = ''; + nextValues.llm_model = provider.defaultModel || 'gemini-3-flash-preview'; + } + form.setFieldsValue(nextValues); } // 清空模型列表,需要重新获取 setModelOptions([]); @@ -488,8 +505,16 @@ export default function SettingsPage() { // 预设编辑窗口:提供商变更时更新默认URL并清空模型列表 const handlePresetProviderChange = (value: string) => { const provider = apiProviders.find(p => p.value === value); - if (provider && provider.defaultUrl) { - presetForm.setFieldValue('api_base_url', provider.defaultUrl); + if (provider) { + const nextValues: Record = {}; + if (provider.defaultUrl) { + nextValues.api_base_url = provider.defaultUrl; + } + if (provider.value === 'mumu') { + nextValues.api_key = ''; + nextValues.llm_model = provider.defaultModel || 'gemini-3-flash-preview'; + } + presetForm.setFieldsValue(nextValues); } // 清空模型列表,需要重新获取 setPresetModelOptions([]); @@ -780,6 +805,8 @@ export default function SettingsPage() { // return 'purple'; case 'gemini': return 'green'; + case 'mumu': + return 'magenta'; default: return 'default'; } @@ -1050,6 +1077,30 @@ export default function SettingsPage() { + {selectedProvider === 'mumu' && ( + + + 已自动填入专属地址,API Key 保持留空。免费注册后即可获取可用 Key。 + +
+ +
+ + } + style={{ marginBottom: 16 }} + /> + )} + @@ -1568,8 +1619,33 @@ export default function SettingsPage() { + + {selectedPresetProvider === 'mumu' && ( + + + 已自动填入专属地址,API Key 保持留空。免费注册后即可获取可用 Key。 + +
+ +
+ + } + style={{ marginBottom: 16 }} + /> + )}