Skip to content

[Feature] 区分 AI Assistant 的 Ask / Agent 动作与执行语义 #2145

Description

@lc6464

数据库类型和版本

通用

当前痛点

AI Assistant 目前提供 Ask / Agent 两种模式,但两种模式展示的是同一组 SQL 动作,例如“生成 SQL”“解释 SQL”“优化 SQL”“修复 SQL”“转换 SQL”“生成样例数据”。

这会让 Agent 模式的产品语义不够清晰:

  • Ask 模式更符合“只生成或处理 SQL 文本”的预期。
  • Agent 模式的核心预期是使用工具读取 schema、执行只读查询,并基于真实结果回答。
  • 用户在 Agent 模式下看到“生成 SQL”时,容易以为 Agent 也只是返回 SQL 文本。
  • 用户表达“查一下 / 统计一下 / 看结果”时,Agent 可能自动调用 execute_query,但 UI 没有把“生成查询 / 风险检查 / 执行查询 / 总结结果”的过程讲清楚,容易造成“突然执行了 SQL 然后结束”的感觉。

后端已经有一定保护:SQL-producing action 会提示 Agent 只有在原始请求明确要求真实数据 / 结果时才执行查询。但 UI 仍把 Ask 风格动作原样暴露在 Agent 模式中,导致“Agent 到底是在生成 SQL,还是在执行任务”的心智混淆。

期望方案

根据当前模式展示不同的动作集合、默认动作和提示文案,让 Ask / Agent 的职责边界更明确。

期望行为:

  • Ask 模式保留当前 SQL 生成类动作:
    • 生成 SQL
    • 解释 SQL
    • 优化 SQL
    • 修复 SQL
    • 转换 SQL
    • 生成样例数据
  • Agent 模式改为任务型动作,强调“使用工具完成任务并给出结论”,例如:
    • 查询数据
    • 分析结果
    • 检查 SQL
    • 执行并解释
    • 查看表结构
  • Agent 模式下不应默认展示“生成 SQL”作为首要动作;如果仍保留,应改成“生成但不执行”等更明确的文案。
  • 用户切换到 Agent 模式后,默认 action 应更贴近数据查询 / 分析,而不是 generate
  • 当 Agent 需要执行 SQL 时,步骤区应明确展示“生成查询 / 风险检查 / 执行查询 / 总结结果”等过程,降低自动执行带来的不确定感。
  • 当用户只想要 SQL 文本时,应引导使用 Ask 模式,或在 Agent 模式下明确标注该动作不会自动执行。

建议验收:

  • Ask 模式下仍能按现有方式生成 / 解释 / 优化 / 修复 / 转换 SQL,并生成样例数据。
  • Agent 模式默认动作不是“生成 SQL”,而是更符合执行任务语义的查询或分析类动作。
  • Agent 模式下用户请求“统计今天订单数”时,会清晰展示查询执行步骤,并基于真实结果回答。
  • Agent 模式下用户请求“帮我生成 SQL”时,不会意外执行查询,或 UI 明确提示应使用 Ask / “生成但不执行”。
  • 模式切换后,输入框 placeholder、动作菜单、步骤展示和最终回答语义保持一致。

优先级(是否紧急)

🟠 P1 重要 · 尽快处理

补充信息

相关现状:

  • 前端 apps/desktop/src/components/editor/AiAssistant.vueassistantMode 支持 ask / agent,但 actionButtons 是同一组动作。
  • 前端 apps/desktop/src/lib/ai.ts 会把 modeaction 写入 AiTaskContract,并一起传给 aiAgentStream
  • 后端 crates/dbx-core/src/agent_loop.rs 中 Ask / Agent 都走 run_agent_loop,区别在于工具集:
    • Ask 使用 agent_tools::read_only_tools(),主要是 list_tables / get_columns
    • Agent 使用 agent_tools::all_tools(),包含 execute_query / get_sample_data / explain_query 等。
  • 后端 task contract 已经区分 SQL-producing action:generate / optimize / fix / convert / sampleData 要求最终输出 fenced SQL,并提示 Agent 只有在用户明确要求真实数据 / 结果时才执行查询。
  • apps/desktop/src/lib/aiAgentPlan.ts 里已有旧的前端 fallback 计划概念,包括 generate_sql / risk_check / execute_sql,可作为 Agent 步骤展示语义的参考。
  • apps/desktop/src/lib/aiSkills.ts 目前的 skill 定义全部围绕 SQL 生成类动作组织,Agent 专属任务型动作可能需要新增单独的 action / skill 定义,而不是复用 Ask 的 generate

可能的实现方向:

  • 将 action 定义拆成 Ask action 和 Agent action,前端根据 assistantMode 展示不同菜单。
  • 保留底层 AiTaskContract.action 的兼容性,但新增 Agent 专属 action,例如 queryanalyzeinspect
  • 调整 buildModePromptLines() / buildActionPromptLines(),避免 Agent 模式下同时出现“必须执行数据查询”和“只生成 SQL”的冲突提示。
  • Agent 模式默认 action 从 generate 改为查询 / 分析类动作。
  • 对“生成 SQL”这类 Ask-only action,如果用户在 Agent 模式下选择,可自动切回 Ask,或展示明确的“不执行”提示。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Status
    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions