diff --git a/src/renderer/components/settings-modal.ts b/src/renderer/components/settings-modal.ts index a7b2642..5d043aa 100644 --- a/src/renderer/components/settings-modal.ts +++ b/src/renderer/components/settings-modal.ts @@ -6,7 +6,6 @@ import { state, KEYS } from '../state/state.js'; import { debounce } from '../utils/utils.js'; import { encryptData, decryptData } from '../services/crypto.js'; import { setMemoryEnabled, setEmbeddingModel, getEmbeddingModel, isVectorMemoryEnabled, getMemoryCache } from '../services/memory-manager.js'; -import { setToolEnabled } from '../services/tool-registry.js'; import { logSetting, logInfo, logWarn, logError, logSuccess } from '../services/log-service.js'; import { checkConnection, updateConnectionInfo, updateRunningModels } from './header.js'; import { loadModels } from './model-bar.js'; @@ -103,45 +102,6 @@ export function initSettingsModal(): void { await importSessions(paths[0]); }); - // ── Tool Calling 设置 ── - const toggleToolCalling = document.querySelector('#toggleToolCalling') as HTMLInputElement; - if (toggleToolCalling) { - toggleToolCalling.addEventListener('change', async () => { - const db = state.get(KEYS.DB); - state.set('toolCallingEnabled', toggleToolCalling.checked); - if (db) await db.saveSetting('toolCallingEnabled', toggleToolCalling.checked); - if (toggleToolCalling.checked) { - const modelSupportsTools = state.get('modelSupportsTools', false); - if (!modelSupportsTools) { - showToast('⚠️ 当前模型可能不支持 Tool Calling,建议使用 Qwen3、Llama 3.1+ 等模型', 'warning', 5000); - logWarn('Tool Calling 已开启(模型不支持)'); - } else { - showToast('工具调用已开启', 'info'); - logInfo('Tool Calling 已开启'); - } - } else { - showToast('工具调用已关闭', 'info'); - logInfo('Tool Calling 已关闭'); - } - }); - } - - const toggleRunCommand = document.querySelector('#toggleRunCommand') as HTMLInputElement; - if (toggleRunCommand) { - toggleRunCommand.addEventListener('change', async () => { - const db = state.get(KEYS.DB); - state.set('runCommandEnabled', toggleRunCommand.checked); - if (db) await db.saveSetting('runCommandEnabled', toggleRunCommand.checked); - setToolEnabled('run_command', toggleRunCommand.checked); - if (toggleRunCommand.checked) { - showToast('命令执行已开启(每次执行需确认)', 'info'); - logInfo('命令执行已开启'); - } else { - showToast('命令执行已关闭', 'info'); - logInfo('命令执行已关闭'); - } - }); - } // ── Agent 记忆设置 ── const toggleMemory = document.querySelector('#toggleMemoryEnabled') as HTMLInputElement; diff --git a/src/renderer/components/tools-modal.ts b/src/renderer/components/tools-modal.ts index 5499f9f..9b39d49 100644 --- a/src/renderer/components/tools-modal.ts +++ b/src/renderer/components/tools-modal.ts @@ -1,12 +1,12 @@ /** * ToolsModal - 工具面板模态框 - * 展示所有可用工具的详细信息 + * 展示所有可用工具的详细信息,管理 Tool Calling 开关 */ import { state, KEYS } from '../state/state.js'; import { setToolEnabled } from '../services/tool-registry.js'; import { showToast } from './toast.js'; -import { logInfo } from '../services/log-service.js'; +import { logInfo, logWarn } from '../services/log-service.js'; import type { ChatDB } from '../types.js'; let modalEl: HTMLElement; @@ -21,25 +21,37 @@ export function initToolsModal(): void { if (e.target === modalEl) closeToolsModal(); }); - // 设置中"查看全部工具"按钮 - document.querySelector('#btnOpenToolsFromSettings')?.addEventListener('click', () => { - (document.querySelector('#settingsModal') as HTMLElement).style.display = 'none'; - openToolsModal(); - }); + // Tool Calling 主开关 + const toggleToolCalling = modalEl.querySelector('#toggleToolCalling') as HTMLInputElement; + if (toggleToolCalling) { + toggleToolCalling.addEventListener('change', async () => { + const db = state.get(KEYS.DB); + state.set('toolCallingEnabled', toggleToolCalling.checked); + if (db) await db.saveSetting('toolCallingEnabled', toggleToolCalling.checked); + if (toggleToolCalling.checked) { + const modelSupportsTools = state.get('modelSupportsTools', false); + if (!modelSupportsTools) { + showToast('⚠️ 当前模型可能不支持 Tool Calling,建议使用 Qwen3、Llama 3.1+ 等模型', 'warning', 5000); + logWarn('Tool Calling 已开启(模型不支持)'); + } else { + showToast('工具调用已开启', 'info'); + logInfo('Tool Calling 已开启'); + } + } else { + showToast('工具调用已关闭', 'info'); + logInfo('Tool Calling 已关闭'); + } + }); + } - // run_command 开关(模态框中) - const toggle2 = document.querySelector('#toggleRunCommand2') as HTMLInputElement; + // run_command 开关 + const toggle2 = modalEl.querySelector('#toggleRunCommand2') as HTMLInputElement; if (toggle2) { toggle2.addEventListener('change', async () => { const db = state.get(KEYS.DB); state.set('runCommandEnabled', toggle2.checked); if (db) await db.saveSetting('runCommandEnabled', toggle2.checked); setToolEnabled('run_command', toggle2.checked); - - // 同步设置面板的开关 - const toggle1 = document.querySelector('#toggleRunCommand') as HTMLInputElement; - if (toggle1) toggle1.checked = toggle2.checked; - if (toggle2.checked) { showToast('命令执行已开启(每次执行需确认)', 'info'); logInfo('命令执行已开启'); @@ -52,9 +64,13 @@ export function initToolsModal(): void { } export function openToolsModal(): void { - // 同步 run_command 开关状态 + // 同步开关状态 + const toolCallingEnabled = state.get('toolCallingEnabled', false); + const toggleTC = modalEl.querySelector('#toggleToolCalling') as HTMLInputElement; + if (toggleTC) toggleTC.checked = toolCallingEnabled; + const runCmdEnabled = state.get('runCommandEnabled', true); - const toggle2 = document.querySelector('#toggleRunCommand2') as HTMLInputElement; + const toggle2 = modalEl.querySelector('#toggleRunCommand2') as HTMLInputElement; if (toggle2) toggle2.checked = runCmdEnabled; modalEl.style.display = ''; diff --git a/src/renderer/index.html b/src/renderer/index.html index de68fc0..ea6cc5c 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -266,27 +266,6 @@

无运行中的模型

-
- -

启用后,AI 可以在对话中主动调用本地工具(读写文件、搜索、创建目录等)。需要模型支持 Tool Calling。

-
- -
- 💻 执行命令 - -
-
-

⚠️ 高风险操作会弹出确认对话框。系统关键路径(/etc, /sys, ~/.ssh 等)已自动屏蔽。

-
@@ -392,7 +371,15 @@