192 lines
9.0 KiB
Markdown
192 lines
9.0 KiB
Markdown
# mini AI 助手软件需求规格说明书
|
||
|
||
## 1. 项目概述
|
||
本项目旨在构建一个轻量级 **桌面 AI 助手**,它允许用户通过自然语言与一个大语言模型(LLM)交互,并授权该模型执行本地文件系统操作(读写、复制、移动、删除)、Excel 数据处理、以及任意的 Shell 命令(需用户二次确认)。所有操作均在本地回环网络中进行,不依赖任何外部 Web 服务上传文件,从而规避企业或学校对网页上传的拦截策略。
|
||
|
||
前端采用 **Vue 3** 构建用户界面,后端使用 **Bun**(JavaScript 运行时)提供 HTTP 服务和 LLM 调用能力。整个项目 **纯 JavaScript / TypeScript** 实现,不依赖 Python,不依赖 C/C++ 原生库,所有第三方依赖均为开源纯 JS 模块。
|
||
|
||
---
|
||
|
||
## 2. 技术栈
|
||
|
||
| 层级 | 技术选型 | 说明 |
|
||
| :--- | :--- | :--- |
|
||
| **前端** | Vue 3 + Vite | 使用 Composition API,组件化开发 |
|
||
| | Vue Router(可选) | 若需要多页面视图 |
|
||
| | Pinia(可选) | 状态管理(对话历史、配置等) |
|
||
| | Markdown 渲染 | `markdown-parser-vue` 或 `@vueuse/head` + `marked` 或 `mermaid`(支持图表) |
|
||
| | 表格组件 | 可用 `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 可用性
|
||
- 界面风格简洁,采用深色/浅色主题(可切换)。
|
||
- 消息气泡区分用户和 AI,AI 消息支持 Markdown 渲染。
|
||
- 错误信息明确提示,并建议用户如何修改指令。
|
||
|
||
### 5.4 可扩展性
|
||
- 工具函数采用插件化设计,新增工具只需添加定义和执行函数。
|
||
- 支持更换 LLM 提供商(只需修改环境变量 `BASE_URL` 和 `API_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**:
|
||
```json
|
||
{
|
||
"messages": [ // 对话历史,至少包含用户最新一条
|
||
{ "role": "user", "content": "读取 data.xlsx 并告诉我销售额" }
|
||
]
|
||
}
|
||
```
|
||
- **Response**(分三种情况):
|
||
1. **直接回复**(无工具调用):
|
||
```json
|
||
{ "type": "done", "message": "销售额为 12345 元" }
|
||
```
|
||
2. **需要审批**:
|
||
```json
|
||
{
|
||
"type": "approval_required",
|
||
"tool_call_id": "call_abc",
|
||
"command": "rm -rf temp",
|
||
"assistant_message": "我想删除 temp 文件夹,请批准"
|
||
}
|
||
```
|
||
3. **工具执行结果**(已自动完成并返回最终回复):
|
||
```json
|
||
{ "type": "done", "message": "已成功写入 Excel 文件" }
|
||
```
|
||
|
||
### 7.2 批准操作
|
||
- **Endpoint**: `POST /api/approve`
|
||
- **Request Body**:
|
||
```json
|
||
{
|
||
"tool_call_id": "call_abc",
|
||
"approved": true
|
||
}
|
||
```
|
||
- **Response**: 执行结果(同上面“工具执行结果”格式)
|
||
|
||
### 7.3 进度推送(WebSocket 或 SSE)
|
||
- 若使用 WebSocket,路径 `/ws`,后端在拷贝大文件时推送 `{ "progress": 45 }`。
|
||
|
||
---
|
||
|
||
## 8. 部署与运行
|
||
|
||
- 开发环境:`bun run dev`(同时启动后端和前端,可分别用 `vite` 和 `bun` 热更新)。
|
||
- 生产环境:`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 | 无需额外库 |
|