From 9ab41795d65224cac1c470bdc677cd9e932af2aa Mon Sep 17 00:00:00 2001 From: runstone Date: Thu, 11 Jun 2026 18:27:24 +0800 Subject: [PATCH] @ feat(ai): add agent loop with tool calling, fix connection routing and Gemini compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 背景说明 将 dbx AI 助手从单次 SQL 文本生成器升级为具备 tool calling 的数据库 Agent。 Phase 1 实现 Agent Loop 框架 + 只读工具(list_tables、get_columns)。 参考:Pi agent-core,.trellis/tasks/06-11-feat-ai-agent-loop-tool-calling-upgrade ## 修改内容 - 新增 agent_loop.rs:Agent Loop 核心,支持 OpenAI/Claude/Gemini Provider 的 tool calling,最大 10 轮,Ollama 自动降级为 text-only - 新增 agent_tools.rs:read_only_tools (list_tables, get_columns) 的工具定义与执行器 - 新增 agent_events.rs:AgentEvent/ToolCall/ToolResult/ToolDefinition 类型定义 - 修改 ai.rs:AiMessage 新增 tool_call_id 字段 - 修改 lib.rs:注册 agent_events、agent_loop、agent_tools 模块 - 修改 routes/ai.rs & commands/ai.rs:新增 ai_agent_stream SSE 端点 - 修改 tauri.ts & http.ts:新增 AgentEvent 类型与 aiAgentStream 函数 - 修改 api.ts:注册 aiAgentStream 转发 - 修改 ai.ts:新增 runAgentStream,AiContext 增加 connectionId 字段 - 修改 AiAssistant.vue:接入 runAgentStream,解析 AgentEvent 渲染工具调用步骤 - 修改 en.ts / zh-CN.ts:新增 agentSteps 国际化文案 ## 修复的问题 - [#I01] connectionName 误传为 connectionId → add connectionId to AiContext - [#I02] agent loop 取消操作无效 → add cancel checks before each turn - [#C01] TODO 缺少 issue 引用 → add PRD reference to TODO - [#C02] stream_with_tools 命名不准确 → add clarifying doc comment - [#C03] Gemini functionResponse.name 解析错误 → fix tool_call_id format and extraction ## 测试建议 - execute_get_columns:合法表名/空表名/SQL 注入字符拒绝 - call_openai_with_tools:空 choices/空 tool_calls/非 JSON arguments - call_gemini_with_tools:空 candidates/parts 无 functionCall - runAgentStream:有效 connectionId 正常调用 @ --- .../src/components/editor/AiAssistant.vue | 82 ++- apps/desktop/src/i18n/locales/en.ts | 3 + apps/desktop/src/i18n/locales/zh-CN.ts | 3 + apps/desktop/src/lib/ai.ts | 49 +- apps/desktop/src/lib/api.ts | 2 + apps/desktop/src/lib/http.ts | 52 ++ apps/desktop/src/lib/tauri.ts | 25 + crates/dbx-core/src/agent_events.rs | 79 +++ crates/dbx-core/src/agent_loop.rs | 549 ++++++++++++++++++ crates/dbx-core/src/agent_tools.rs | 202 +++++++ crates/dbx-core/src/ai.rs | 12 +- crates/dbx-core/src/db/ssh_tunnel.rs | 188 +++--- crates/dbx-core/src/lib.rs | 3 + crates/dbx-web/src/main.rs | 1 + crates/dbx-web/src/routes/ai.rs | 82 +++ src-tauri/src/commands/ai.rs | 42 ++ src-tauri/src/lib.rs | 1 + 17 files changed, 1253 insertions(+), 122 deletions(-) create mode 100644 crates/dbx-core/src/agent_events.rs create mode 100644 crates/dbx-core/src/agent_loop.rs create mode 100644 crates/dbx-core/src/agent_tools.rs diff --git a/apps/desktop/src/components/editor/AiAssistant.vue b/apps/desktop/src/components/editor/AiAssistant.vue index 72d3dc5a8f..cc303399aa 100644 --- a/apps/desktop/src/components/editor/AiAssistant.vue +++ b/apps/desktop/src/components/editor/AiAssistant.vue @@ -1,5 +1,5 @@