# LambdAgent PaaS 本地管理网页 — 产品需求文档

**文档版本:** 1.0  
**日期:** 2026-05-19  
**面向读者:** 产品 / 开发团队  

---

## 一、背景与目标

### 1.1 背景

LambdAgent PaaS 目前的使用方式以命令行（CLI）和 YAML 文件为主：
- 安装需要执行 `./setup.sh`、配置 `.env` 文件
- 创建智能体需要手写 YAML 配置
- 运行智能体通过 `agentpaas run ag_xxx "输入"` 等命令

这套流程对有编程背景的用户友好，但**非计算机专业的使用者**面临明显门槛：不会用终端、不懂 YAML 格式、不知道如何管理 API Key。

### 1.2 目标

提供一个**本地运行的 Web 管理界面**，让非技术用户能够：
1. **一键完成平台安装与配置**（无需接触终端）
2. **通过表单可视化创建/编辑智能体**（无需编写 YAML）
3. **通过对话框直接使用智能体**（无需命令行）
4. **查看运行历史、费用与系统状态**（透明可观测）

### 1.3 范围

- **包含:** 本地单机部署下的 Web UI（后端接入现有 agentpaas REST API）
- **不包含:** 云端 SaaS、多用户协作、移动端 App

---

## 二、目标用户

| 用户类型 | 描述 | 典型需求 |
|---------|------|---------|
| **领域专家** | 医疗、法律、金融等专业人员，会使用电脑但不懂编程 | 快速创建垂直领域问答智能体、上传知识库 |
| **企业内部用户** | 行政、运营、销售，需要在内网使用 AI 助理 | 开箱即用的对话界面，不需要了解底层 |
| **科研人员** | 有一定技术背景，但希望聚焦业务而非运维 | 可视化配置 + 查看执行轨迹 |
| **学生/课堂使用** | 初学者，跟随教程进行实验 | 安装向导引导 + 简单的智能体 Demo |

---

## 三、用户旅程概览

```
首次使用
  └─→ 安装向导（3步）
        ├─ 环境检测（Python/Docker）
        ├─ 选择 LLM 提供商 + 填写 API Key
        └─ 一键启动服务 → 进入主界面

日常使用
  ├─ 仪表盘：系统状态 + 最近运行
  ├─ 智能体管理：创建 / 编辑 / 删除
  │   └─ 实例管理：一个模板，多个领域实例
  ├─ 对话界面：选择智能体，发消息，看回复
  └─ 历史 & 费用：查看过往运行与 Token 消耗
```

---

## 四、功能模块需求

### 4.1 安装向导（首次启动）

**触发条件:** 本地服务从未配置（无 `~/.agentpaas/config.json` 或服务未启动时打开 UI）

#### 步骤 1 — 环境检测
- 自动检测并显示：Python 版本（≥3.10？）、Docker 是否可用
- 提供两种安装路径选择：**Python 模式** / **Docker 模式**
- 若环境不满足，给出具体修复提示（含安装链接）

#### 步骤 2 — 配置 LLM 提供商
- 卡片式展示支持的提供商：
  - **无需 API Key:** Claude Code（Max Plan）、Ollama 本地
  - **需要 API Key:** 阿里云 DashScope（通义千问）、Anthropic、DeepSeek、OpenAI、智谱、Moonshot
- 每个提供商显示：名称、简介、费用说明
- 选中后弹出 API Key 填写框，有格式校验（如 `sk-` 前缀）
- 填写后自动测试连通性，显示成功/失败

#### 步骤 3 — 启动服务
- 执行 `agentpaas serve` 启动后端（展示进度条 + 日志）
- 成功后跳转到主界面
- 提供"保存配置并跳过测试"的快速选项

---

### 4.2 主仪表盘

**路由:** `/dashboard`  
**对应后端:** `GET /api/v1/status`、`GET /api/v1/metrics`

#### 显示内容
| 区块 | 内容 |
|-----|------|
| 服务状态 | 后端是否在线、版本号 |
| 智能体概览 | 总数、活跃数、本周新增 |
| 今日运行 | 运行次数、成功率、平均耗时 |
| Token 消耗 | 今日/本月输入+输出 Token（折线图） |
| 最近运行 | 最近 5 次运行的智能体名称、输入摘要、状态、时间 |
| 提供商状态 | 已配置的 LLM 提供商连通性指示灯 |

---

### 4.3 智能体管理

**路由:** `/agents`  
**对应后端:** `GET/POST/PUT/DELETE /api/v1/agents`

#### 4.3.1 智能体列表
- 卡片/表格双视图切换
- 每张卡片显示：名称、描述、模型提供商、标签、最近运行时间
- 支持按名称搜索、按标签筛选
- 快捷操作：直接对话、编辑、删除

#### 4.3.2 创建智能体（向导式，替代 YAML）

**"基础设置"标签页**
- 名称（必填）
- 描述
- 标签（多选输入）
- 环境（生产/测试）

**"模型配置"标签页**
- 提供商下拉（仅展示已配置的）
- 模型名称下拉（根据提供商动态加载可选模型）
- Temperature 滑块（0.0 – 1.0）
- 最大 Token 数（数字输入）

**"智能体类型"标签页**
- 类型单选：
  - **对话助手**（`ConversationLam`）— 保持完整会话历史
  - **ReAct 智能体**（`Loop`）— 工具调用 + 多步推理
  - **流水线**（`Compose`）— 多智能体串联
  - **多智能体群聊**（`GroupChat`）— 多角色讨论
- 按选择类型展示对应配置项（如 ReAct 的 maxSteps、GroupChat 的角色列表）

**"系统提示词"标签页**
- 富文本编辑器输入 `systemPrompt`
- 内置模板选择（通用助手、文档问答、代码审查、数据分析）
- 字符数实时统计

**"工具与知识库"标签页**（选填）
- MCP 工具：填写服务器 URL，点击"发现工具"自动列出可选工具
- RAG 知识库：上传文档（PDF/TXT/DOCX），自动建索引
- 本地工具：搜索/终止/用户自定义脚本

**"高级设置"标签页**（可收起）
- 执行引擎：递归模式 / CEK Machine（CEK 有成本监控和循环检测）
- 内存策略：无 / 本地滚动窗口（可设大小）
- 沙箱：关闭 / 宽松 / 严格
- 运行时最大并发数

**预览与保存**
- 点击"预览配置"：展示等价的 YAML（面向进阶用户，只读）
- 点击"保存"：调用 `POST /api/v1/agents` 创建
- 支持"保存并立即对话"

#### 4.3.3 编辑智能体（已实现）

**路由:** `/agents/:agentId/edit`  
**对应后端:** `GET /api/v1/agents/{id}`、`PUT /api/v1/agents/{id}`

**入口:** 智能体列表页每张卡片右上角的设置（⚙）按钮

**表单结构（6 个标签页，与从模版导入一致）:**

| 标签页 | 字段 |
|--------|------|
| 基本设置 | 名称、描述、智能体类型、**工作目录（agent_dir）** |
| 模型配置 | 提供商、模型、Temperature、Max Tokens、Base URL |
| 行为配置 | 最大步数、工具超时、思考超时 |
| 记忆 & 运行时 | 记忆开关/大小/TTL、执行引擎、费用上限 |
| 工具列表 | mcp.localTools 可编辑标签列表 |
| 系统提示词 | systemPrompt 多行文本 |

**工作目录（agent_dir）字段说明:**
- 绑定到 `agentexample/` 下的某个智能体目录（如 `agentexample/research67`）
- 绑定后执行时自动创建 `workspace/run_*` 子目录，工具写入的文件保存于此
- 未绑定时不创建 workspace，生成的文件无法通过 UI 下载

**保存行为:**
- 后端自动递增版本号（`current_version + 1`），配置不变时不创建新版本
- `agent_dir` 变更同步写入 `agents` 表（不受版本控制，立即生效）
- 保存成功后跳转到该智能体的对话界面（`/chat/:agentId`），新配置立即生效

#### 4.3.5 从模版导入（已实现）

**路由:** `/agents/import`  
**对应后端:** `GET /api/v1/templates`、`GET /api/v1/templates/{id}`

**背景:** 项目 `agentexample/` 目录下存放着多个预置智能体模版（YAML 配置），用户可以以此为基础快速创建实例，无需从头填写每项配置。

**两步流程:**

**第一步 — 选择模版**
- 后端扫描 `agentexample/` 下各子目录的 `agent-config.yml` / `orchestrator.yml`，返回模版列表
- 前端以 4 列卡片网格展示所有模版
- 每张卡片显示：名称、描述摘要（最多 2 行）、提供商色标（anthropic=紫、dashscope=蓝、openai=绿、ollama=灰）、模型名、工具标签（闪电图标）、记忆标签（数据库图标）
- 选中的卡片高亮（蓝色边框 + 对勾）
- 选中后自动加载模版完整配置（`GET /api/v1/templates/{id}`）

**第二步 — 自定义配置（3 个标签页）**

| 标签页 | 字段 | 来源 |
|--------|------|------|
| 基本设置 | 智能体名称（必填） | 用户输入 |
| 模型配置 | 提供商下拉、模型下拉、Temperature、Max Tokens | 模版预填，可修改 |
| 系统提示词 | systemPrompt 多行文本框 | 模版预填，可修改 |

- 模型配置中，提供商切换时模型列表动态更新（`MODEL_MAP` 内置各提供商可选模型）
- 点击"导入并创建"：以模版配置为基础，合并用户修改，调用 `POST /api/v1/agents` 创建
- 创建成功后自动跳转至该智能体的对话界面 `/chat/{agent_id}`

**后端模版发现规则:**
- 首先查找 `{CWD}/agentexample/`，若不存在则逐级向上查找（最多 6 层）
- 每个子目录若包含 `agent-config.yml` 或 `orchestrator.yml` 则识别为一个模版
- 返回的 summary 字段：`id`（目录名）、`name`、`description`、`type`、`provider`、`model`、`has_tools`、`has_memory`

**入口:** 智能体列表页（`/agents`）右上角"从模版导入"按钮

#### 4.3.4 实例管理（高级功能）
**概念说明提示框:** "一个智能体模板可以为不同领域（如航运、金融）创建独立实例，每个实例有独立知识库，互不干扰。"

- 在智能体详情页新增"实例"子页
- 展示该模板下的所有实例列表（对应 `instance_dir`）
- 新建实例：选择模板、填写实例名、选择知识库目录
- 每个实例可以独立发起对话

---

### 4.4 对话界面

**路由:** `/chat/:agentId`（或 `/chat/:agentId/instance/:instanceId`）  
**对应后端:** `POST /api/v1/agents/{agent_id}/run`（流式）

#### 布局
```
┌─────────────────────────────────────────┐
│  [智能体名称]  [模型]  [会话设置]         │  顶部栏
├──────┬──────────────────────────────────┤
│ 历史 │                                  │
│ 会话 │         消息区域                  │
│ 侧边 │   (用户消息 / 智能体回复气泡)      │
│      │                                  │
│      ├──────────────────────────────────┤
│      │  [文本输入框]    [发送]  [停止]   │  输入区
└──────┴──────────────────────────────────┘
```

#### 功能点
- **流式输出:** 后端 SSE 流逐字显示回复（`/run` 流式模式）
- **思考步骤展示:** ReAct 智能体的工具调用过程折叠展示（点击展开）
- **停止生成:** 用户可随时终止
- **会话持久化:** 当前浏览器标签页内保持多轮对话历史（ConversationLam 模式下自动携带历史）
- **新建会话 / 清空历史**
- **输入建议:** 为每个智能体配置 3–5 条示例问题，首次打开展示
- **文件上传:** 可上传文件作为 RAG 输入（若智能体启用了 RAG）
- **复制回复 / 点赞点踩**（记录到 trace）

---

### 4.5 运行历史

**路由:** `/runs`  
**对应后端:** `GET /api/v1/agents/{agent_id}/runs`、`GET /api/v1/traces/{run_id}`

#### 列表页
- 筛选：按智能体、按时间范围、按状态（成功/失败/超时）
- 列：运行 ID、智能体名称、输入摘要、状态、耗时、Token 消耗、时间
- 分页

#### 详情页（Trace 查看器）
- 输入 / 输出完整文本展示
- **执行轨迹树:** 以时间线 + 树形结构展示 Beta-reduction 步骤
  - 每个节点：构造名（Lam/Loop/Tool 等）、耗时、Token 数
  - 工具调用节点：展示调用参数和返回值
  - CEK 引擎：展示每步成本累积
- 成本明细：输入 Token × 单价 + 输出 Token × 单价
- 一键"以相同输入重新运行"

---

### 4.6 提供商与 API Key 管理

**路由:** `/settings/providers`  
**对应后端:** `agentpaas provider` 相关 CLI（封装为 API）

- 已配置提供商卡片：名称、状态灯（可用/不可用）、已配置模型列表
- 添加提供商：选择类型 → 填写 API Key → 测试连通性 → 保存
- 支持 Ollama 特殊配置（本地地址、已下载模型列表）
- Claude Code Max Plan 一键启用（无 Key，检测本地 Claude Code 安装）
- API Key 显示为脱敏格式（`sk-xxx...xxx`），支持显示/隐藏切换
- 删除提供商（有确认弹窗，提示受影响的智能体数量）

---

### 4.7 费用与用量监控

**路由:** `/settings/usage`  
**对应后端:** `GET /api/v1/billing/usage`、`GET /api/v1/metrics`

- 时间范围选择（今日 / 本周 / 本月 / 自定义）
- 折线图：Token 消耗趋势（分输入/输出）
- 柱状图：各智能体用量占比
- 明细表：按时间、智能体、提供商分组
- 费用估算：Token 数 × 各提供商单价（内置价格表，可手动修改）
- 用量预警：设置 Token 上限，超过时在界面显示警告

---

### 4.8 系统设置

**路由:** `/settings`

| 设置项 | 说明 |
|-------|------|
| 服务端口 | 修改本地 API 服务端口（默认 8000） |
| 主题 | 亮色 / 暗色 |
| 语言 | 中文 / English |
| 数据目录 | 本地数据库 & 工作区存储路径 |
| 导出配置 | 将所有智能体配置导出为 ZIP（含 YAML） |
| 导入配置 | 从 ZIP 批量导入智能体 |
| 备份与恢复 | 手动备份 `agentpaas.db` |
| 日志查看 | 内嵌展示最近 500 行服务日志（支持过滤） |

---

### 4.9 对话持久化与历史恢复（已实现）

**路由:** `/chat/:agentId`  
**对应后端:** `GET /api/v1/agents/{agent_id}/runs`

**背景:** 流式对话端点 `/run/stream` 原先不写数据库，刷新页面后对话历史丢失。

**修复方案:**
- 在 `/run/stream` 执行前 `INSERT INTO runs`（状态 `running`）
- 执行成功后 `UPDATE` 写入 `output`、`steps`、`workspace_path`、Token 用量
- 执行失败后 `UPDATE` 写入 `error` 和 `status=failed`
- 前端 Chat 页面通过 `GET /agents/{id}/runs` 在首次加载时还原历史对话气泡
- 每次 `done` 事件后调用 `queryClient.invalidateQueries(['runs', agentId])` 保持缓存新鲜

**数据流:** 用户发消息 → SSE 流式推送 → done 事件 → DB 更新 → 下次打开自动还原

---

### 4.10 工作区文件浏览与下载

**路由:** `/chat/:agentId`（工作区面板内嵌于对话界面）  
**对应后端:** `GET /api/v1/agents/{agent_id}/runs/{run_id}/workspace`、`GET /api/v1/agents/{agent_id}/runs/{run_id}/workspace/{file_path}`

**背景:** 智能体（尤其是 research67、data67、pptagent67）执行后会在 `workspace/run_*/` 目录生成文件，但原先没有任何界面可以查看或下载这些文件。

**功能点:**

后端（`agents.py` 新增）:
- `GET /{agent_id}/runs/{run_id}/workspace` — 递归列出 workspace 目录下所有文件，返回 `[{name, path(相对路径), size, modified}]`
- `GET /{agent_id}/runs/{run_id}/workspace/{file_path:path}` — 下载指定文件，含路径穿越防护（`os.path.realpath` 校验必须在 workspace 目录内）

前端（Chat 页面）:
- 智能体回复气泡下方，若该次运行有 workspace 文件，显示"📁 工作区文件（N 个）"折叠面板
- 展开后列出文件名、大小；点击文件名触发带鉴权的 fetch + Blob 下载

**安全:** 只允许下载已认证 tenant 所拥有 run 的 workspace 文件；服务端校验路径在 workspace 目录内。

---

### 4.11 智能体记忆管理界面

**路由:** `/chat/:agentId`（记忆面板内嵌于对话界面右侧）  
**对应后端:** `GET /api/v1/agents/{agent_id}/memory`、`DELETE /api/v1/agents/{agent_id}/memory/{key}`

**背景:** 智能体通过 `MemoryStore/MemoryRecall` 工具写入 `~/.lambdagent/memory.db`，但没有界面可以查看或管理。用户无法知道智能体"记住了什么"，也无法清除错误记忆。

**功能点:**

后端（`agents.py` 新增）:
- `GET /{agent_id}/memory` — 列出该智能体的所有有效记忆（`source = agent_id`，过滤过期条目），返回 `key`、`content`、`tier`（working/episodic/semantic）、`tags`、`created_at`
- `DELETE /{agent_id}/memory/{key}` — 删除指定记忆条目

前端（Chat 页面）:
- 对话页头部新增"🧠 记忆"按钮
- 点击后在右侧展开记忆面板（宽度约 320px，覆盖消息区域右侧）
- 每条记忆显示：Tier 标签（semantic=蓝/episodic=黄/working=灰）、内容摘要（最多 3 行）、标签 chips、创建时间
- 点击删除图标删除该条记忆，乐观更新列表
- 若无记忆，显示空状态提示

---

### 4.12 知识体管理

**路由:** `/knowledge`、`/knowledge/:kbId`  
**对应后端:** `GET/POST/PUT/DELETE /api/v1/knowledge`（新增）  
**关联脚本:** `agentexample/qaagent67lambda/scripts/`（app.py、build_index.py、wiki_compile.py、search_unified.py、graph_engine.py 等）

#### 背景

现有 QA 智能体（qaagent67lambda、qaagent67、qaagent67lite）已有完整的离线处理流水线：
- `extract_pdfs.py` / `extract_docs.py` — 批量提取 PDF / DOCX 为纯文本
- `build_index.py` / `build_vector_index.py` — 构建 BM25 / 向量检索索引
- `wiki_compile.py` — LLM 逐文档理解 → 生成 sources/、entities/、topics/ 三级 Wiki 页面
- `graph_engine.py` — 从 Wiki relations.json 构建实体关系图谱（BFS N跳遍历）
- `search_unified.py` — LambdaRAG v3 四路检索融合（BM25 + 向量 + 图谱 + Wiki）

这些脚本的路径（`/home/67/knowledge/maritime/`）目前通过 `instance.yml` 配置，但**缺乏 Web 管理界面**。本需求将其封装为可通过 Web UI 配置和触发的「知识体」。

---

#### 4.12.0 参考实现分析（现有服务器部署）

> 以下分析基于对 `http://qa.lambdagent.cn:8080`（海事法规）和 `http://qa.lambdagent.cn:8084`（投标文件）两个在线服务的调研，以及对本地源码的全面阅读（2026-05-27）。

**服务器代码位置（`qa.lambdagent.cn`）：**

| 文件 | 说明 |
|------|------|
| `/home/67/qademo/app.py` | 主应用（本地源：`agentexample/qaagent67lambda/scripts/app.py`） |
| `/home/67/qademo/deploy_domain.sh` | 一键部署新领域的 shell 脚本 |
| `/home/67/qademo/instance.yml.template` | 新领域配置模板 |
| `/home/67/knowledge/maritime/` | 海事 KB（8080）：1326 文档，BM25+向量+图谱+Wiki |
| `/home/67/knowledge/clean/` | 投标 KB（8084）：49 文档，1527 chunks |
| `/home/67/knowledge/{domain}/instance.yml` | 各领域配置覆盖层 |

运行方式：每个领域独立 Docker 容器（`maritime-qa`、`clean-qa` 等），`deploy_domain.sh {domain}` 一键启动。

**架构优势（Web UI 需保留并集成）：**

| 优势 | 实现位置 | 说明 |
|------|---------|------|
| **LambdaRAG 四路检索融合** | `search_unified.py` | 意图分类（6类：fact/process/person/compare/temporal/data）→ 实体提取 → BM25+向量+图谱+Wiki 并行检索 → RRF 融合 → 槽位填充 → 富文本上下文 |
| **意图自适应权重** | `config.py` weight_profiles | 按检测到的意图类型自动切换融合权重（如 temporal 查询 BM25 权重=1.0，compare 查询向量权重=0.8） |
| **Corrective RAG** | `search_unified.py` P1-1 | 检索质量评分不足时自动改写查询并重试，减少无关结果 |
| **实体关系图谱** | `graph_engine.py` | 从 wiki/relations.json 构建邻接表，BFS N跳遍历扩展实体上下文 |
| **三层 Wiki 体系** | `wiki_compile.py` | sources/（逐文档摘要）/ entities/（命名实体）/ topics/（主题聚合）/ analyses/（即席编译） |
| **A/B 对比面板** | `app.py` HTML | 5 种检索策略同屏对比（Lite / LambdaRAG / Wiki Only / BM25 Baseline / Direct LLM） |
| **Wiki/RAG 浏览器** | `/wiki`、`/rag` 路由 | 内置知识库内容检视页，可浏览 wiki 页面和搜索原始 chunks |
| **反馈日志** | `feedback/query_log.jsonl` | 自动记录每次检索的意图、实体、策略，以及 missing_queries 检索盲区 |
| **实例配置体系** | `instance.yml` + `config.py` | 无需改代码即可通过 YAML 新增领域（路径/模型/权重/UI文案全部可配） |

**现有实现的缺口（Web UI 需弥补）：**

| # | 缺口 | 问题描述 | 对应 UI 需求 |
|---|------|---------|-------------|
| G1 | 无文件摄入 UI | 建库需 SSH 上传文件 + CLI 运行脚本 | 4.12.1 目录浏览器 + 一键加入 |
| G2 | 无索引健康监控 | 不知索引是否最新、有多少文档失败 | 4.12.2 状态指示器 + 失败文件列表 |
| G3 | Wiki 编译无可视化 | `wiki_compile.py` 进度只有终端日志 | 4.12.3 实时进度 + 断点续传控制 |
| G4 | Wiki 内部检索质量差 | 用字符频率（`sum(1 for c in q_chars ...)`）代替 BM25/向量匹配 | 4.12.2 补充：wiki 搜索改用 BM25 全文检索 |
| G5 | 5路并行浪费算力 | 每次查询触发 5 个完整 LLM 调用，即使用户只看 2 个面板 | 4.12.4 搜索测试：懒加载/按需触发各模式 |
| G6 | 无流式输出 | 答案完整生成后才推送（2s 轮询），体验延迟高 | 4.12.4 搜索测试：接入 SSE 流式输出 |
| G7 | 对话历史是 JSON 文件 | 无搜索、无用户隔离、重启丢失、线程写入竞争 | 4.12.4 历史：写入 agentpaas.db |
| G8 | 无检索权重可视化调优 | instance.yml 手写权重，无法实时观测效果 | 4.12.4 新增：权重滑块 + 实时效果对比 |
| G9 | 无增量文档更新 | 新增文档需全量重建索引（BM25 重扫全库）| 4.12.2 增量更新 Job |
| G10 | 无评测集成 | `generate_questions.py`/`analyze_results.py` 存在但未接入 UI | Phase 4 评估面板 |
| G11 | Analyses 目录无管理 | 即席编译的 wiki analyses/ 无限积累，无去重/归档 | 4.12.3 Wiki 目录 → analyses 管理子面板 |
| G12 | 领域创建需手工 | 新领域需 SSH + 编辑 instance.yml + 运行脚本 | 4.12.1 新建知识体向导（GUI 版 deploy_domain.sh） |

---

#### 4.12.1 知识体列表页（`/knowledge`）

**布局：** 卡片网格，每张卡片代表一个知识体。

每张卡片显示：
| 字段 | 说明 |
|------|------|
| 名称 | 用户自定义，如"航运规范"、"法律合同" |
| 根目录 | 本地文件夹路径（如 `/data/maritime`） |
| 文档数量 | 已加入的文件数 |
| 索引状态 | 未索引 / BM25 已就绪 / 向量已就绪 / Wiki 已生成 |
| 最近更新 | 上次构建时间 |

操作：
- **新建知识体**（右上角按钮）→ 弹窗填写名称 + 根目录路径
- **进入详情**（点击卡片）
- **删除**（卡片菜单）

---

#### 4.12.2 知识体详情页（`/knowledge/:kbId`）

详情页分为四个子标签：**文件管理 / 索引构建 / Wiki 目录 / 搜索测试**

---

##### 标签 1 — 文件管理

**目录浏览器：**
- 以树形/列表展示根目录下的所有文件（递归）
- 支持的格式：PDF、TXT、DOCX、MD、HTML、CSV
- 每个文件显示：文件名、大小、修改时间、**加入状态**（已加入 ✅ / 未加入）
- 全选 / 按格式批量选择（如"全选 PDF"）

**文件操作：**
- **加入知识体** — 将选中文件登记到知识体（写入后端 DB，暂不解析）
- **移除** — 从知识体中取消登记（不删除原始文件）
- **一键加入全部** — 将根目录下所有支持格式的文件批量加入

**文件解析流程（加入时触发）：**
1. PDF 文件 → 调用 `extract_pdfs.py` 逻辑提取纯文本，存入 `processed/` 子目录
2. TXT/MD/DOCX/HTML → 直接读取文本，存入 `processed/`
3. 解析进度以进度条实时展示（SSE 流）

---

##### 标签 2 — 索引构建

展示三种索引的构建状态与操作：

| 索引类型 | 说明 | 对应脚本 |
|---------|------|---------|
| **BM25 关键词索引** | 轻量、无需 GPU，适合精确关键词检索 | `build_index.py` |
| **向量语义索引** | 需要嵌入模型，支持语义搜索 | `build_vector_index.py` |
| **图谱索引** | 实体-关系图，支持关联推理 | `graph_engine.py` |

每种索引的操作面板：
- **状态指示器**：未构建 / 构建中（带进度）/ 已就绪（文档数、构建时间）
- **构建** 按钮 — 触发后台 Job，SSE 实时推送进度日志
- **重建** 按钮（已就绪时显示）— 全量重新构建
- **增量更新** — 只处理新加入的文件

构建日志：
- 展示最近一次构建的实时/历史日志（`INFO: 处理 128/1326 ...`）
- 错误文件高亮显示（带原始报错）

---

##### 标签 3 — Wiki 目录

**Wiki 是什么：** 由 LLM 逐文档阅读后自动生成的结构化知识页面，分四层（`wiki_compile.py` 输出）：
- `sources/` — 每个原始文档的摘要页（1文档 = 1 页）
- `entities/` — 抽取出的实体（人名、公司、术语、地名等）及其关系
- `topics/` — 主题聚合页（将多篇文档的相关内容汇总）
- `analyses/` — 即席编译生成的临时知识页（查询时按需生成，参见现有 `wiki_answer()` 逻辑）

**Wiki 构建面板：**

配置项：
| 配置 | 说明 |
|------|------|
| LLM 提供商 | 选择用于 Wiki 编译的模型（建议 32B+ 或 Claude） |
| 编译模式 | 增量（仅处理未编译文档）/ 全量重建 |
| 并发数 | 同时处理的文档数（1–8） |
| 断点续传 | 默认开启，中断后从 `.compile_progress.json` 继续（`wiki_compile.py` 内置支持） |

操作：
- **开始编译** — 触发后台 Job，对应 `wiki_compile.py` 逻辑
- **暂停 / 恢复** — 利用 `wiki_compile.py` 的 `.compile_progress.json` 断点机制
- 进度条：`已完成 / 总文档数`，预计剩余时间

**Wiki 内容浏览器：**
- 左侧树：`index.md` / `sources/` / `entities/` / `topics/`（显示每类页面数量统计）
- 右侧：Markdown 渲染预览
- **搜索框（修复 G4）**：对 wiki 页面内容进行 BM25 全文检索（不再使用字符频率匹配），结果按相关度排序
- 每个页面显示"来源文档"反向链接

**Analyses 管理子面板（修复 G11）：**
- 列出 `analyses/` 下所有即席编译页，显示：文件名（来源查询）、大小、创建时间
- 操作：**归档**（移入 topics/）、**删除**、**批量清理**（删除 30天前的条目）
- 显示"去重提示"：内容相似度 >80% 的 analyses 页高亮，建议合并

---

##### 标签 4 — 搜索测试

提供交互式搜索界面，用于验证知识体质量（参考现有 `app.py` 的 A/B 对比面板，弥补其 G5/G6/G8 缺口）：

**搜索配置：**
- 检索策略：下拉单选（BM25 / 向量语义 / 混合 Rerank / Wiki 全文 / **LambdaRAG 四路融合**）
  - 选择 LambdaRAG 时，显示**意图分类结果**（检测到的 query type）和每路检索命中数
- Top-K 结果数（1–20）
- 相关性阈值滑块

**A/B 对比模式（参考现有 demo，修复 G5）：**
- 切换"对比模式"：页面分为左右两列，各自独立选择检索策略
- **按需加载**：只触发用户选中面板的检索，不后台并行运行所有 5 路（修复 G5 算力浪费）
- 结果并排展示，便于直观对比不同策略的答案质量

**检索权重可视化调优（修复 G8）：**
- LambdaRAG 模式下展开"权重配置"折叠面板：
  - 4 个滑块：BM25 / 向量 / 图谱 / Wiki（各 0.0–1.0）
  - 预设方案快速切换：按意图类型（fact / compare / temporal 等）加载推荐权重
  - 修改权重后实时重新排序当前结果（前端 RRF 重算，无需再次检索）
- "保存为默认"：将当前权重写入知识体配置（更新 instance.yml 等效配置）

**流式问答测试（修复 G6）：**
- 输入问题 → 点击"问答测试" → SSE 流式展示 LLM 答案（逐字输出，无需等待完整生成）
- 答案下方展示引用的 chunks 列表（来源文件 + 相关度分数）

**搜索结果展示：**
每条 chunk 结果显示：
- 文档来源（文件名 + 页码/段落）
- 相关度分数 + 所属检索路径（BM25/向量/图谱/Wiki 哪路命中）
- 匹配片段，关键词高亮
- 展开查看原文按钮

**历史记录（修复 G7）：**
- 搜索历史写入 `agentpaas.db`，按知识体隔离，支持搜索和导出
- 显示最近 100 条（带意图类型、检索耗时、命中文档数）

**与智能体联动：**
- "在智能体中测试"按钮 — 将当前知识体绑定到选定的 QA 智能体，跳转至对话界面

---

#### 4.12.3 智能体 ↔ 知识体绑定

在智能体编辑页（4.3.3）的"工具与知识库"标签页中：
- 新增"知识体"下拉选择框，列出所有已建索引的知识体
- 选中后自动填充 `mcp.localTools` 中的 `KBSearch`、`KBCreate`、`KBAdd` 工具
- 并将知识体路径写入智能体配置（`kb_dir` 字段）

---

#### 4.12.4 后端 API（新增）

| 方法 | 路径 | 说明 |
|------|------|------|
| `GET` | `/api/v1/knowledge` | 列出所有知识体（含索引状态摘要） |
| `POST` | `/api/v1/knowledge` | 创建知识体（name, root_dir） |
| `PUT` | `/api/v1/knowledge/:kbId` | 更新知识体配置（含检索权重） |
| `DELETE` | `/api/v1/knowledge/:kbId` | 删除知识体 |
| `GET` | `/api/v1/knowledge/:kbId/files` | 列出根目录文件树（含加入状态） |
| `POST` | `/api/v1/knowledge/:kbId/files` | 加入文件（触发文本提取） |
| `DELETE` | `/api/v1/knowledge/:kbId/files/:fileId` | 从知识体移除文件（不删原文） |
| `POST` | `/api/v1/knowledge/:kbId/index` | 触发索引构建 Job（type: bm25/vector/graph，mode: full/incremental） |
| `POST` | `/api/v1/knowledge/:kbId/wiki` | 触发 Wiki 编译 Job（mode: incremental/rebuild） |
| `PUT` | `/api/v1/knowledge/:kbId/wiki/pause` | 暂停/恢复 Wiki 编译（写 `.compile_progress.json` 停止标志） |
| `GET` | `/api/v1/knowledge/:kbId/wiki/tree` | 获取 Wiki 文件树（sources/entities/topics/analyses 分组） |
| `GET` | `/api/v1/knowledge/:kbId/wiki/:path` | 获取单个 Wiki 页面内容（Markdown） |
| `DELETE` | `/api/v1/knowledge/:kbId/wiki/analyses/:name` | 删除 analyses/ 下指定即席编译页 |
| `POST` | `/api/v1/knowledge/:kbId/search` | 在线搜索测试（返回 chunks + 意图分类 + 各路命中数） |
| `GET` | `/api/v1/knowledge/:kbId/search/stream` | **SSE 流式**问答测试（LLM 逐字输出，修复 G6） |
| `GET` | `/api/v1/knowledge/:kbId/jobs` | 查询 Job 状态（索引/Wiki 构建进度 + 失败文件列表） |
| `GET` | `/api/v1/knowledge/:kbId/feedback` | 获取反馈日志（query_log + missing_queries，修复 G10 前期准备） |

Job 进度通过 SSE（`/api/v1/jobs/{job_id}/stream`）实时推送，格式：`data: {"progress": 128, "total": 1326, "current_file": "xxx.pdf", "errors": []}`。

---

#### 4.12.5 QA 智能体脚本整合说明

`agentexample/qaagent67lambda/scripts/` 中各脚本的对应关系：

| 脚本 | 对应 UI 功能 | 整合方式 |
|------|------------|---------|
| `extract_docs.py` | 文件管理 → 加入知识体（PDF/DOCX/HTML） | 封装为 `kb_service.extract_file(path)` |
| `build_index.py` | 索引构建 → BM25（全量/增量） | 封装为 `kb_service.build_bm25(kb_id, mode)` |
| `build_vector_index.py` | 索引构建 → 向量（bge-m3） | 封装为 `kb_service.build_vector(kb_id, mode)` |
| `graph_engine.py` | 索引构建 → 图谱（entity relation graph） | 封装为 `kb_service.build_graph(kb_id)` |
| `wiki_compile.py` | Wiki 目录 → 编译（断点续传） | 封装为 `kb_service.compile_wiki(kb_id, cfg)` |
| `search_unified.py` | 搜索测试 → LambdaRAG 四路融合 | 封装为 `kb_service.search_lambda(kb_id, query, weights)` |
| `search_engine.py` | 搜索测试 → BM25 Baseline | 被 `search_unified` 调用，也可独立调用 |
| `search_engine_v2.py` | 搜索测试 → 向量语义 | 被 `search_unified` 调用 |
| `config.py` | 知识体配置读取 | 适配器：Web UI 传入 `kb_id`，`config.py` 从 DB 加载路径 |
| `rebuild_index.py` | 索引构建 → 全量重建 | 封装为 `kb_service.rebuild(kb_id)` |
| `generate_questions.py` | Phase 4：自动生成测试问题集 | `kb_service.generate_eval_set(kb_id)` |
| `analyze_results.py` | Phase 4：评估检索质量报告 | `kb_service.analyze_quality(kb_id, eval_set)` |

**路径动态化（弥补硬编码缺口）：** 现有脚本通过 `config.py` 的 `Config` 类统一读取路径，Web UI 后端只需在调用前设置 `INSTANCE_CONFIG` 环境变量（或直接传参），即可让所有脚本使用 DB 中记录的知识体路径，无需修改脚本本身。

---

## 五、非功能需求

### 5.1 本地化部署
- UI 作为静态前端，跟随 `agentpaas serve` 一起启动（内嵌到 FastAPI 的 `/` 路由）
- 无需单独安装 Node.js 运行时（构建产物打包为静态文件）
- 访问地址：`http://localhost:8000`

### 5.2 响应性能
- 页面首次加载 < 2s（本地服务）
- 对话流式输出首字节 < 500ms

### 5.3 浏览器兼容
- Chrome 100+、Edge 100+、Safari 16+（本地使用场景无需兼容旧版）

### 5.4 无障碍
- 关键操作有键盘快捷键（Ctrl+Enter 发送，Esc 停止生成）
- 错误信息使用中文友好提示，避免暴露技术栈错误

### 5.5 安全
- 本地服务默认只监听 `127.0.0.1`（不对外网暴露）
- API Key 不写入前端状态，通过后端 `~/.agentpaas/providers.json` 存储
- 提供"局域网共享模式"选项（需用户主动启用，显示风险提示）

---

## 六、技术方案建议

| 层 | 建议 | 理由 |
|----|-----|------|
| **前端框架** | React 18 + Vite | 生态成熟，打包为静态 HTML/JS/CSS |
| **UI 组件库** | shadcn/ui + Tailwind | 无运行时依赖，bundle 小，支持暗色模式 |
| **状态管理** | Zustand | 轻量，适合中小型应用 |
| **流式输出** | EventSource（SSE） | 接入现有 agentpaas 流式 API |
| **图表** | Recharts | React 原生，bundle 合理 |
| **后端静态服务** | FastAPI `StaticFiles` 挂载 `dist/` 目录 | 零新增依赖，一个端口服务全部内容 |
| **构建集成** | `pyproject.toml` 脚本，`pip install` 时触发前端构建 | 对 Python 用户透明，一行安装 |

### 目录结构（建议）

```
lambdagentpaas/
├── agentpaas/
│   ├── api/
│   │   └── app.py        ← 挂载 /ui 静态文件 + /api 路由
│   └── ...
├── webui/                ← 前端源码
│   ├── src/
│   │   ├── pages/        ← dashboard, agents, chat, runs, settings
│   │   ├── components/   ← AgentCard, ChatBubble, TraceTree 等
│   │   └── api/          ← 封装 fetch 调用 agentpaas REST API
│   ├── package.json
│   └── vite.config.ts
└── webui-dist/           ← 构建产物（git ignore，pip install 时生成）
```

---

## 七、分阶段交付计划

### Phase 1 — MVP（可用核心）
1. 安装向导（环境检测 + 提供商配置 + 启动）
2. 智能体列表 + 简单创建表单（对话助手类型）
3. 对话界面（流式输出）
4. 提供商管理页

**交付标准:** 非技术用户能从零完成"安装 → 创建助手 → 对话"全流程，无需接触终端

### Phase 2 — 完整功能
5. 完整的智能体类型支持（ReAct、流水线、群聊）
6. 工具与知识库配置（RAG 上传）
7. 运行历史 + Trace 查看器
8. 费用与用量监控

### Phase 3 — 进阶体验
9. 实例管理（一个模板多个域）
10. 配置导入/导出
11. 版本历史 + 回滚
12. 暗色模式 + 多语言

### Phase 4 — 知识体管理
13. 知识体列表 + 创建（设置根目录、文件加入）
14. BM25 / 向量索引构建（整合 qaagent67 脚本）
15. Wiki 目录编译（整合 wiki_compile.py）
16. 搜索测试界面 + 智能体绑定
17. QA 脚本硬编码路径修复，统一由 kb_dir 配置驱动

---

## 八、开放问题（待决策）

| 问题 | 选项 | 建议 |
|-----|------|------|
| 对话历史存储在哪里？ | 浏览器 localStorage / agentpaas.db | 存 DB，跨标签可查 |
| 是否支持多用户本地使用？ | 单用户 / 简单密码保护 | Phase 1 单用户，后续加密码锁 |
| YAML 预览是否可编辑？ | 只读 / 可编辑 | Phase 1 只读，防止格式错误困扰新手 |
| 前端构建是否内嵌发布包？ | 每次 pip install 构建 / 预构建产物提交 | 提交预构建产物，简化安装流程 |
