// 设置相关功能 let currentConfig = null; let allTools = []; // 全局工具状态映射,用于保存用户在所有页面的修改 // key: 唯一工具标识符(toolKey),value: { enabled: boolean, is_external: boolean, external_mcp: string } let toolStateMap = new Map(); // 生成工具的唯一标识符,用于区分同名但来源不同的工具 function getToolKey(tool) { // 如果是外部工具,使用 external_mcp::tool.name 作为唯一标识 // 如果是内部工具,使用 tool.name 作为标识 if (tool.is_external && tool.external_mcp) { return `${tool.external_mcp}::${tool.name}`; } return tool.name; } // 从localStorage读取每页显示数量,默认为20 const getToolsPageSize = () => { const saved = localStorage.getItem('toolsPageSize'); return saved ? parseInt(saved, 10) : 20; }; let toolsPagination = { page: 1, pageSize: getToolsPageSize(), total: 0, totalPages: 0 }; // 切换设置分类 function switchSettingsSection(section) { // 更新导航项状态 document.querySelectorAll('.settings-nav-item').forEach(item => { item.classList.remove('active'); }); const activeNavItem = document.querySelector(`.settings-nav-item[data-section="${section}"]`); if (activeNavItem) { activeNavItem.classList.add('active'); } // 更新内容区域显示 document.querySelectorAll('.settings-section-content').forEach(content => { content.classList.remove('active'); }); const activeContent = document.getElementById(`settings-section-${section}`); if (activeContent) { activeContent.classList.add('active'); } } // 打开设置 async function openSettings() { // 切换到设置页面 if (typeof switchPage === 'function') { switchPage('settings'); } // 每次打开时清空全局状态映射,重新加载最新配置 toolStateMap.clear(); // 每次打开时重新加载最新配置(系统设置页面不需要加载工具列表) await loadConfig(false); // 清除之前的验证错误状态 document.querySelectorAll('.form-group input').forEach(input => { input.classList.remove('error'); }); // 默认显示基本设置 switchSettingsSection('basic'); } // 关闭设置(保留函数以兼容旧代码,但现在不需要关闭功能) function closeSettings() { // 不再需要关闭功能,因为现在是页面而不是模态框 // 如果需要,可以切换回对话页面 if (typeof switchPage === 'function') { switchPage('chat'); } } // 点击模态框外部关闭(只保留MCP详情模态框) window.onclick = function(event) { const mcpModal = document.getElementById('mcp-detail-modal'); if (event.target === mcpModal) { closeMCPDetail(); } } // 加载配置 async function loadConfig(loadTools = true) { try { const response = await apiFetch('/api/config'); if (!response.ok) { throw new Error('获取配置失败'); } currentConfig = await response.json(); // 填充OpenAI配置 document.getElementById('openai-api-key').value = currentConfig.openai.api_key || ''; document.getElementById('openai-base-url').value = currentConfig.openai.base_url || ''; document.getElementById('openai-model').value = currentConfig.openai.model || ''; // 填充Agent配置 document.getElementById('agent-max-iterations').value = currentConfig.agent.max_iterations || 30; // 填充知识库配置 const knowledgeEnabledCheckbox = document.getElementById('knowledge-enabled'); if (knowledgeEnabledCheckbox) { knowledgeEnabledCheckbox.checked = currentConfig.knowledge?.enabled !== false; } // 填充知识库详细配置 if (currentConfig.knowledge) { const knowledge = currentConfig.knowledge; // 基本配置 const basePathInput = document.getElementById('knowledge-base-path'); if (basePathInput) { basePathInput.value = knowledge.base_path || 'knowledge_base'; } // 嵌入模型配置 const embeddingProviderSelect = document.getElementById('knowledge-embedding-provider'); if (embeddingProviderSelect) { embeddingProviderSelect.value = knowledge.embedding?.provider || 'openai'; } const embeddingModelInput = document.getElementById('knowledge-embedding-model'); if (embeddingModelInput) { embeddingModelInput.value = knowledge.embedding?.model || ''; } const embeddingBaseUrlInput = document.getElementById('knowledge-embedding-base-url'); if (embeddingBaseUrlInput) { embeddingBaseUrlInput.value = knowledge.embedding?.base_url || ''; } const embeddingApiKeyInput = document.getElementById('knowledge-embedding-api-key'); if (embeddingApiKeyInput) { embeddingApiKeyInput.value = knowledge.embedding?.api_key || ''; } // 检索配置 const retrievalTopKInput = document.getElementById('knowledge-retrieval-top-k'); if (retrievalTopKInput) { retrievalTopKInput.value = knowledge.retrieval?.top_k || 5; } const retrievalThresholdInput = document.getElementById('knowledge-retrieval-similarity-threshold'); if (retrievalThresholdInput) { retrievalThresholdInput.value = knowledge.retrieval?.similarity_threshold || 0.7; } const retrievalWeightInput = document.getElementById('knowledge-retrieval-hybrid-weight'); if (retrievalWeightInput) { const hybridWeight = knowledge.retrieval?.hybrid_weight; // 允许0.0值,只有undefined/null时才使用默认值 retrievalWeightInput.value = (hybridWeight !== undefined && hybridWeight !== null) ? hybridWeight : 0.7; } } // 只有在需要时才加载工具列表(MCP管理页面需要,系统设置页面不需要) if (loadTools) { // 设置每页显示数量(会在分页控件渲染时设置) const savedPageSize = getToolsPageSize(); toolsPagination.pageSize = savedPageSize; // 加载工具列表(使用分页) toolsSearchKeyword = ''; await loadToolsList(1, ''); } } catch (error) { console.error('加载配置失败:', error); alert('加载配置失败: ' + error.message); } } // 工具搜索关键词 let toolsSearchKeyword = ''; // 加载工具列表(分页) async function loadToolsList(page = 1, searchKeyword = '') { const toolsList = document.getElementById('tools-list'); // 显示加载状态 if (toolsList) { // 清空整个容器,包括可能存在的分页控件 toolsList.innerHTML = '