miniai/doc/需求.md

9.0 KiB
Raw Blame History

mini AI 助手软件需求规格说明书

1. 项目概述

本项目旨在构建一个轻量级 桌面 AI 助手它允许用户通过自然语言与一个大语言模型LLM交互并授权该模型执行本地文件系统操作读写、复制、移动、删除、Excel 数据处理、以及任意的 Shell 命令(需用户二次确认)。所有操作均在本地回环网络中进行,不依赖任何外部 Web 服务上传文件,从而规避企业或学校对网页上传的拦截策略。

前端采用 Vue 3 构建用户界面,后端使用 BunJavaScript 运行时)提供 HTTP 服务和 LLM 调用能力。整个项目 纯 JavaScript / TypeScript 实现,不依赖 Python不依赖 C/C++ 原生库,所有第三方依赖均为开源纯 JS 模块。


2. 技术栈

层级 技术选型 说明
前端 Vue 3 + Vite 使用 Composition API组件化开发
Vue Router可选 若需要多页面视图
Pinia可选 状态管理(对话历史、配置等)
Markdown 渲染 markdown-parser-vue@vueuse/head + markedmermaid(支持图表)
表格组件 可用 element-plus 的 Table 或纯 CSS 表格
进度条 自定义组件或 element-plus 的 Progress
HTTP 客户端 axios 或原生 fetch
后端 Bun 1.0+ JavaScript/TypeScript 运行时,内置 HTTP 服务器、文件系统 API、子进程
LLM 调用 使用 OpenAI 兼容 API支持 OpenAI、Groq、本地 Ollama 等)
文件操作 原生 fs / Bun.file / Bun.write
Excel 处理 xlsx (SheetJS) 或 hucre / modern-xlsx(纯 JS无原生依赖
环境变量 dotenv
依赖管理 Bun 内置包管理器 bun install

3. 用户角色

  • 普通用户:通过对话框向 AI 下达指令,审批危险操作。
  • 管理员(可选):配置 LLM 参数API Key、模型、温度、工作目录白名单等。

4. 功能需求

4.1 对话交互

  • FR1:前端提供一个聊天界面,支持用户输入文本,并实时显示 AI 的回复。
  • FR2:支持 Markdown 格式渲染(包括代码块语法高亮、表格、列表、加粗、链接等)。
  • FR3:对话历史保存在前端内存中,可清空或导出。
  • FR4支持流式SSE或非流式响应建议优先实现流式以获得更好体验。

4.2 文件系统操作AI 可调用的工具)

AI 模型将通过函数调用Function Calling请求执行以下操作所有操作需在用户指定的工作目录(默认为项目根目录)内进行,防止越权。

工具名称 功能描述 参数 是否需审批
read_file 读取指定路径文件内容(文本) path
write_file 将内容写入指定文件(覆盖) path, content 否(仅写入文本)
list_directory 列出目录下的文件和子目录 path(可选)
copy_file 复制文件或目录(递归) source, destination 否(但若目标覆盖需提示)
move_file 移动/重命名文件或目录 source, destination
delete_file 删除文件或空目录 path 是(需二次确认)
execute_command 执行任意 Shell 命令 command 是(危险命令需二次确认)
read_excel 读取 Excel 文件,返回 JSON 数据(带行数限制) path, sheet?, limit?
write_excel 将 JSON 数据写入 Excel 文件 path, data (JSON 数组), sheet?

审批机制:当 AI 调用需要审批的工具时,后端不立即执行,而是向前端推送一个“审批请求”消息,包含待执行的命令/操作详情。前端弹窗让用户选择“允许”或“拒绝”,用户确认后,前端再向后端发送批准指令,后端才真正执行并将结果返回给 AI。

4.3 Excel 操作特殊要求

  • 读取时默认最多返回前 200 行数据(可配置),但会告知总行数和列名,让 AI 据此进行数据分析(如求和、筛选)。
  • 支持自动识别日期、数字格式。
  • 写入时支持从 JSON 数组生成 Excel 文件,列名自动取自对象键名。

4.4 文件拷贝进度展示

  • 当 AI 执行 copy_file 操作时,若拷贝大文件/目录,后端通过 WebSocket 或 SSE 向前端推送进度百分比。
  • 前端在聊天消息中嵌入一个进度条组件,实时更新。

4.5 命令执行安全控制

  • 后端在执行命令前会检查命令是否包含危险关键字(如 rm -rf /, dd, shutdown 等),若匹配则自动拒绝并提示用户。
  • 用户可在配置中启用“严格模式”,禁止任何命令执行(此时 execute_command 工具直接返回“禁用”提示)。

4.6 多轮对话与上下文记忆

  • AI 能记住对话历史(默认保留最近 20 条),并在需要时主动调用工具。
  • 用户可手动清空上下文。

5. 非功能需求

5.1 性能

  • 页面首次加载时间 ≤ 2 秒(开发环境)。
  • 大文件(>100MB读取或写入时采用流式处理避免内存溢出。

5.2 安全

  • 所有文件操作路径限制在 process.cwd() 及其子目录下(可通过环境变量 WORKSPACE 修改)。
  • 禁止访问系统敏感目录(如 /etc, C:\Windows 等)。
  • 传输层:前后端通信使用 HTTP仅在本地监听 127.0.0.1,默认不对外暴露端口。

5.3 可用性

  • 界面风格简洁,采用深色/浅色主题(可切换)。
  • 消息气泡区分用户和 AIAI 消息支持 Markdown 渲染。
  • 错误信息明确提示,并建议用户如何修改指令。

5.4 可扩展性

  • 工具函数采用插件化设计,新增工具只需添加定义和执行函数。
  • 支持更换 LLM 提供商(只需修改环境变量 BASE_URLAPI_KEY)。

5.5 兼容性

  • 前端运行于现代浏览器Chrome 90+, Edge 90+, Firefox 88+)。
  • 后端仅要求 Bun 1.0+,支持 Windows / macOS / Linux。

6. 界面设计概要Vue 组件划分)

  • App.vue:整体布局,包含头部标题和聊天容器。
  • MessageList.vue:消息列表,遍历消息数组,根据角色渲染不同样式。
  • MessageBubble.vue:单条消息,支持 Markdown 渲染和特殊类型(如审批请求、进度条)。
  • InputArea.vue:输入框 + 发送按钮,支持 Enter 发送。
  • ApprovalDialog.vue:审批弹窗,显示命令详情并提供允许/拒绝按钮。
  • ProgressBar.vue:进度条组件,接收百分比值。
  • SettingsDrawer.vue(可选):配置 API 密钥、模型参数等。

7. API 接口设计(前后端通信)

所有接口采用 JSON 格式。

7.1 发送消息(含工具调用)

  • Endpoint: POST /api/chat
  • Request Body:
{
  "messages": [ // 对话历史,至少包含用户最新一条
    { "role": "user", "content": "读取 data.xlsx 并告诉我销售额" }
  ]
}
  • Response(分三种情况):
    1. 直接回复(无工具调用):
{ "type": "done", "message": "销售额为 12345 元" }
  1. 需要审批
{
  "type": "approval_required",
  "tool_call_id": "call_abc",
  "command": "rm -rf temp",
  "assistant_message": "我想删除 temp 文件夹,请批准"
}
  1. 工具执行结果(已自动完成并返回最终回复):
{ "type": "done", "message": "已成功写入 Excel 文件" }

7.2 批准操作

  • Endpoint: POST /api/approve
  • Request Body:
{
  "tool_call_id": "call_abc",
  "approved": true
}
  • Response: 执行结果(同上面“工具执行结果”格式)

7.3 进度推送WebSocket 或 SSE

  • 若使用 WebSocket路径 /ws,后端在拷贝大文件时推送 { "progress": 45 }

8. 部署与运行

  • 开发环境:bun run dev(同时启动后端和前端,可分别用 vitebun 热更新)。
  • 生产环境:bun run build 打包前端,后端使用 bun server.js 运行,并静态托管前端构建产物。
  • 用户仅需执行 bun install 安装依赖,无需全局安装任何程序。

9. 未来扩展(可选)

  • 支持多 Agent 协作(多个角色)。
  • 支持语音输入/输出。
  • 支持插件市场,用户可自定义工具。

10. 附录:开源库推荐(符合“纯 JS无 C 依赖”)

功能 推荐库 理由
Excel 读写 xlsx (SheetJS 社区版) 最成熟,纯 JS支持 xlsx/xls/csv
modern-xlsx 基于 Rust+WASM但无需本地编译通过 npm 提供 WASM 文件,也算纯 JS 使用
进度条(前端) element-plus 或自定义 UI 组件库自带的进度条
Markdown 渲染 marked + highlight.js 轻量且高度可定制
表格组件 element-plus Table 或 ag-grid-community 前者轻量,后者功能丰富
文件操作(后端) 使用 Bun 内置 API 无需额外库