miniai/doc/需求.md

192 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 可用性
- 界面风格简洁,采用深色/浅色主题(可切换)。
- 消息气泡区分用户和 AIAI 消息支持 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 | 无需额外库 |