chore: T-P-1 工作区收敛——并行会话成果与历史未入库文件整理入库
- 入库历史遗漏源码/测试:router_system 9 模块(agent/executors/inference/knowledge/ memory/planner/skills/trace)、tests 11 个测试文件、config/knowledge 领域知识 - 入库根目录方案文档(v2/v3/可行性×2)、references 文献(arxiv 14-18/cnki_open/ 参考文献清单)、research 论文素材(routerarena/paper/中文文献 PDF) - 前端构建产物刷新(新 hash);webapp 误写文档删除 - gitignore 增补:deepseek-harness、research/_refs、.mimosa/.zcode、网关日志/pid、 临时调试脚本、tests/e2e/node_modules、AI代理功能开发/prefix - 基线确认:318 passed
This commit is contained in:
@@ -0,0 +1,212 @@
|
||||
# 实现方案 v3:端云协同编程智能体系统 Web 应用化
|
||||
|
||||
> 编写日期:2026(git 记录)
|
||||
> 状态:**Web 应用化权威设计**。在 v2(端云协同编程智能体系统)基础上,把系统做成一个**完整、可演示、可答辩的 Web 应用**。
|
||||
> 前置依赖:v2 已落地(见 `实现方案_v2_端云协同编程智能体系统.md` 与 `README.md`),229 项测试全绿。
|
||||
> 预期读者:负责实现的 AI Agent 或开发者。实现前必读:第 4 节(设计决策)、第 8 节(工程规约)。
|
||||
|
||||
---
|
||||
|
||||
## 0. 一页速览
|
||||
|
||||
- **后端**:保持 FastAPI + uvicorn **不重写**;仅把 `/chat` 从"同步等待"改为"异步任务 + SSE 事件流",并**通过读 `workspace.json` 实现协作过程实时可视化**,**不触碰 `router_system` 核心逻辑**(保住 229 项测试)。
|
||||
- **前端**:新建 **Vue 3 + Vite + TypeScript** SPA,Vite 构建产物输出到 `gateway/static`,由 FastAPI 单端口托管。四个页面:**对话 / 协作过程 / 检验队列 / 指标**。
|
||||
- **实时性**:`POST /chat` 立即返回 `request_id`,后台 asyncio 任务跑协作管线,前端经 **SSE(Server-Sent Events)** 订阅 `/runs/{id}/stream`,把 Architect 与 Worker 一步步交接的「交流文本」过程实时画出来。
|
||||
- **工程约束**:单端口部署、sqlite + 文件系统存储、不上 Celery/Redis/微服务;`router_system` 保持零第三方依赖。
|
||||
|
||||
---
|
||||
|
||||
## 1. 背景与动机
|
||||
|
||||
### 1.1 为什么做 Web 应用化
|
||||
|
||||
1. **v2 前端是单文件原生 HTML**(`gateway/static/index.html`,21KB),功能齐全但:
|
||||
- 代码无工程化组织,不便于扩展、维护与答辩展示"完整 Web 应用"。
|
||||
- 协作过程是静态展示,无法**实时看到** Architect/Worker 多轮交接。
|
||||
2. **`/chat` 是同步阻塞**:协作管线多轮慢任务(本地小模型 + 大模型 API),前端只能干等,交互体验差,也无法演示"交流文本逐步推进"这一核心卖点。
|
||||
3. **课题定位**是"系统设计与实现",一个工程化、可视化、可量化的 Web 应用与课题目标匹配,且能体现工作量。
|
||||
|
||||
### 1.2 现有资产盘点(Web 层)
|
||||
|
||||
| 模块 | 现状 | v3 处置 |
|
||||
|---|---|---|
|
||||
| `gateway/api.py` | FastAPI,8 组端点 | **保留** + 新增 SSE / 任务管理 |
|
||||
| `gateway/static/index.html` | 单文件前端 | **退役**,被 Vue SPA 构建产物取代 |
|
||||
| `gateway/settings.py` | 用户可调设置 | 保留 |
|
||||
| `router_system/*` | 纯标准库业务逻辑 | **一行不改**,只新增读接口 |
|
||||
| `scripts/serve.py` | 启动网关 | 扩展为同时托管构建产物 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 总体架构
|
||||
|
||||
```
|
||||
浏览器 (Vue 3 SPA, 4 页面)
|
||||
│ REST + SSE
|
||||
▼
|
||||
gateway/ (FastAPI, 单进程 uvicorn)
|
||||
├── POST /chat → 提交后台任务,立即返回 request_id
|
||||
├── GET /runs/{id}/stream (SSE) → 推送协作过程增量 + 最终结果
|
||||
├── GET /runs/{id}/status → 任务状态 (pending/running/done/failed)
|
||||
├── GET /runs/{id}/workspace, /artifacts/{name}
|
||||
├── GET/POST /review/* → 人工检验队列
|
||||
├── GET /metrics → 指标(供 ECharts 看板)
|
||||
├── GET /config → 设置
|
||||
└── 静态托管 dist/(Vue 构建产物)
|
||||
│
|
||||
├── jobs.py ← 新增:asyncio 后台任务注册表 (request_id -> task+state)
|
||||
│
|
||||
└── router_system/ ← 保持零依赖,由后台任务调用
|
||||
pipeline.run(query) # 边跑边写 runs/{id}/workspace.json
|
||||
```
|
||||
|
||||
**数据流(一次对话)**:
|
||||
1. 前端 POST /chat → 后端建后台任务,返回 `{request_id, status:"running"}`。
|
||||
2. 后台任务调用 `pipeline.run(query)`;管线把「交流文本」增量写入 `runs/{id}/workspace.json`。
|
||||
3. 前端打开 `GET /runs/{id}/stream`(SSE);后端生成器**监视该文件**(mtime/内容变化),按事件推送。
|
||||
4. 协作结束 → SSE 推送 `result`(最终答复 + token/cost/latency 指标)→ 前端渲染。
|
||||
|
||||
---
|
||||
|
||||
## 3. 技术栈选型
|
||||
|
||||
| 层 | 选型 | 理由 |
|
||||
|---|---|---|
|
||||
| 后端 | Python + FastAPI + uvicorn | `router_system` 为 Python 纯标准库,LLM/llama 集成均为 Python;**重写为巨大浪费** |
|
||||
| 异步/SSE | FastAPI `StreamingResponse` + 自实现 SSE 格式(或 `sse-starlette`) | 单个轻依赖,实现协作实时推送 |
|
||||
| 任务调度 | asyncio 后台任务(uvicorn 事件循环内) | 毕设量级足够;**不上 Celery/Redis** |
|
||||
| 存储 | sqlite(review 已用)+ 文件系统 `runs/` | 够用、易解释、免装数据库服务 |
|
||||
| 前端 | Vue 3 + Vite + TypeScript | 工程化 SPA,四页面,答辩加分 |
|
||||
| 状态管理 | Pinia(可选,轻量) | 跨页共享运行状态/指标 |
|
||||
| UI 组件 | Element Plus | 对话、表格、表单、队列管理开箱即用 |
|
||||
| 可视化 | ECharts | 交流文本时间轴、token 曲线、指标看板 |
|
||||
| 部署 | Vite `outDir=gateway/static` → FastAPI 静态托管,单端口 | 演示省心;可选 Docker 打包 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 设计决策(不得推翻)
|
||||
|
||||
- **D1 后端不重写**:`gateway/api.py` 与 `router_system` 保持 Python;禁止改写成 Node/Go。
|
||||
- **D2 /chat 异步化**:`POST /chat` 提交后台 asyncio 任务并立即返回 `request_id`,不再同步等待管线跑完。
|
||||
- **D3 SSE 通过读文件实现,不改 pipeline 内核**:协作过程可视化靠 SSE 生成器监视 `runs/{id}/workspace.json`(管线已增量写该文件)。**不得修改 `router_system/pipeline.py` 以注入回调**,从而保住 229 项测试全绿。若未来要更精细事件,再作为独立优化(见 §9 展望),且需同步维护测试。
|
||||
- **D4 任务状态可查询**:后台任务必须有独立状态(pending/running/done/failed + 错误信息 + 时间戳),供 `GET /runs/{id}/status` 与前端刷新后恢复。
|
||||
- **D5 不上分布式中间件**:禁用 Celery / Redis / Kafka / 微服务;asyncio + sqlite + 文件系统即可满足。
|
||||
- **D6 单端口部署**:Vue 构建产物输出到 `gateway/static`,由 FastAPI 统一托管;不另开前端 dev 服务器作为生产入口(dev 模式可单独起 Vite,仅本地开发用)。
|
||||
- **D7 前端四页面划分**:对话 / 协作过程 / 检验队列 / 指标;用 Vue Router 管理路由。
|
||||
- **D8 兼容降级**:无 API key / 无本地模型时 `/chat` 仍走 mock/降级路径(沿用 v2),Web 应用不可因此崩溃。
|
||||
- **D9 参数化配置**:`/chat` 的领域、采样、熔断等沿用 v2 配置;Web 端不硬编码模型/金额参数。
|
||||
|
||||
---
|
||||
|
||||
## 5. 后端接口设计
|
||||
|
||||
### 5.1 变更端点
|
||||
|
||||
| 端点 | 变更 | 说明 |
|
||||
|---|---|---|
|
||||
| `POST /chat` | **改为异步** | 入参同 v2 `QueryRequest`;返回 `{request_id, status:"running"}`,后台跑管线 |
|
||||
| `GET /runs/{id}/stream` | **新增(SSE)** | `text/event-stream`;事件:`status`(状态变化)、`workspace`(交流文本增量/快照)、`result`(最终答复+指标)、`error` |
|
||||
| `GET /runs/{id}/status` | **新增** | 返回任务状态、已用轮次、token、错误等 |
|
||||
|
||||
### 5.2 不变端点(复用)
|
||||
|
||||
`POST /chat/legacy`、`GET /runs/{id}/workspace`、`GET /runs/{id}/artifacts/{name}`、`GET/POST /review/*`、`GET /metrics`、`GET/PUT /config`、`GET /health`。
|
||||
|
||||
### 5.3 SSE 事件协议(草稿)
|
||||
|
||||
```
|
||||
data: {"type":"status","value":"running","request_id":"..."}
|
||||
data: {"type":"workspace","version":N,"workspace":{...}}
|
||||
data: {"type":"result","response":"...","api_input_tokens":123,"cost_est":0.01,"latency_ms":4200,...}
|
||||
data: {"type":"error","detail":"..."}
|
||||
```
|
||||
|
||||
- `workspace` 事件按文件变化频率推送;前端据此推进「交流文本」状态机可视化。
|
||||
- `result` 为终态;此后连接由服务端关闭。
|
||||
|
||||
---
|
||||
|
||||
## 6. 前端页面设计
|
||||
|
||||
### 6.1 路由与视图
|
||||
|
||||
| 路由 | 页面 | 关键功能 |
|
||||
|---|---|---|
|
||||
| `/` | ChatView(对话) | 输入 query → POST /chat → 打开 SSE → 逐步可视化协作过程 + 展示最终答复/指标;历史运行列表 |
|
||||
| `/runs/:id` | CollaborationView(协作过程) | 只读查看一次运行的「交流文本」完整 JSON、工件下载、时间轴 |
|
||||
| `/review` | ReviewView(检验队列) | 待审列表、详情、verdict/correction 提交 |
|
||||
| `/metrics` | MetricsView(指标) | ECharts:token 经济学(A1 vs A2)、快路径命中率、护栏熔断、检验统计 |
|
||||
|
||||
### 6.2 核心组件
|
||||
|
||||
- `WorkspaceTimeline.vue`:把「交流文本」按状态机(brief→implement→verify→decide→final_review→done)渲染为流程时间轴。
|
||||
- `TokenEconomicsChart.vue`:A1 全量 vs A2 交流文本 的 token 对比图。
|
||||
- `ReviewQueueTable.vue`:人工检验队列表格 + 提交表单。
|
||||
- `SseClient.ts`:封装 EventSource + 断线重连 + 状态机事件分发。
|
||||
|
||||
---
|
||||
|
||||
## 7. 目录结构(新增)
|
||||
|
||||
```
|
||||
gateway/
|
||||
├── api.py # 保留;新增 /chat 异步 + /runs/{id}/stream + /runs/{id}/status
|
||||
├── jobs.py # 新增:后台任务注册表(request_id -> Task + 状态)
|
||||
└── static/ # Vite 构建产物(outDir 指向这里),FastAPI 静态托管
|
||||
webapp/ # 新增:Vue 3 + Vite + TS 前端源码
|
||||
├── index.html
|
||||
├── vite.config.ts # server.proxy /api -> localhost:8000;build.outDir -> ../gateway/static
|
||||
├── package.json
|
||||
└── src/
|
||||
├── main.ts, App.vue, router.ts
|
||||
├── api/ # rest.ts, sse.ts
|
||||
├── views/ # ChatView, CollaborationView, ReviewView, MetricsView
|
||||
├── components/ # WorkspaceTimeline, TokenEconomicsChart, ReviewQueueTable, ...
|
||||
└── stores/ # runStore.ts (Pinia, 可选)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. 工程规约
|
||||
|
||||
1. **`router_system/` 零第三方依赖不变**;`gateway/` 可用 fastapi/uvicorn/pydantic/httpx(沿用 v2)。
|
||||
2. **新增依赖需登记**:前端 Node 依赖记入 `webapp/package.json`;后端如引入 `sse-starlette` 需写入 `requirements.txt` 并说明理由。
|
||||
3. **测试**:`.venv/Scripts/python.exe -m pytest tests -q` 必须**保持 229 项全绿**;新增 SSE/异步的测试用 `httpx.MockTransport` + 临时文件,不依赖真实模型/API key(沿用 v2 D4)。
|
||||
4. **异步任务清理**:done/failed 任务定期回收(或按容量上限裁剪),防内存泄漏。
|
||||
5. **Windows 兼容**:`pathlib` 路径、UTF-8、子进程 terminate→kill 兜底(沿用 v2 第 6 条)。
|
||||
6. **金额敏感**:SSE/前端展示的 token/cost 均来自 v2 计量,不改动 `api_token_cap` 熔断逻辑。
|
||||
7. 每任务一个 commit,格式 `feat(v3): Tn 描述`。
|
||||
|
||||
---
|
||||
|
||||
## 9. 实施步骤(T1–T6)
|
||||
|
||||
- **T1 后端异步化**:`jobs.py` + `POST /chat` 改为后台任务 + `GET /runs/{id}/status`。
|
||||
- **T2 后端 SSE**:`GET /runs/{id}/stream`,生成器监视 `workspace.json`,推送 status/workspace/result。
|
||||
- **T3 前端脚手架**:Vite 创建 Vue3+TS 工程,配 proxy 与 `outDir=gateway/static`;接入路由与 4 个空页面。
|
||||
- **T4 对话页 + 协作可视化**:SseClient + WorkspaceTimeline,实现实时「交流文本」推进。
|
||||
- **T5 检验队列页 + 指标页**:ReviewQueueTable + ECharts 看板。
|
||||
- **T6 集成与部署**:`scripts/serve.py` 托管构建产物;`npm run build` 产物验证四页面;写测试覆盖 SSE 协议与任务状态机。
|
||||
|
||||
---
|
||||
|
||||
## 10. 验收标准
|
||||
|
||||
- [ ] `POST /chat` 立即返回 `request_id`(非阻塞)。
|
||||
- [ ] SSE `/runs/{id}/stream` 能实时推送 status/workspace/result,断线可重连。
|
||||
- [ ] 对话页能完整可视化一次协作的「交流文本」推进过程并展示最终答复与 token/cost。
|
||||
- [ ] 检验队列页能列表/提交审核;指标页 ECharts 正常渲染。
|
||||
- [ ] `pytest tests -q` 保持 229 项全绿(含新增 SSE/异步测试)。
|
||||
- [ ] 单端口(FastAPI)访问即可完成全部四页面操作与演示。
|
||||
|
||||
---
|
||||
|
||||
## 11. 风险与规避
|
||||
|
||||
| 风险 | 规避 |
|
||||
|---|---|
|
||||
| SSE 读到文件抖动/重复 | 用 version + 文件 mtime/大小变化去重,前端按 version 合并 |
|
||||
| 后台任务异常/进程重启丢状态 | `jobs.py` 记录状态与运行目录;重启后按 `runs/` 恢复"已完成"识别,进行中的标记为 failed/unknown |
|
||||
| 长连接占资源 | SSE 空闲超时自动关闭;前端自动重连 |
|
||||
| 引入 Node 工具链的复杂度 | 仅 dev 需要 npm;产物构建后为纯静态,演示/部署无需 Node |
|
||||
| 前端过度设计 | 固定 4 页面,不上复杂状态库/微前端,控制依赖数量 |
|
||||
Reference in New Issue
Block a user