--- date: "2026-06-12" status: active origin: docs/brainstorms/2026-06-12-frontend-productization-requirements.md type: feat --- ## Summary 对 Fischer AgentKit 前端三个核心界面(可视化编排器、监控数据看板、知识库管理)进行产品级重建,补齐后端 API 缺口(终端、设置、工作流执行历史、KB 文档管理),引入 ECharts 图表库,抽取前端 API 公共基类,实现 Ant Design Vue 和 ECharts 按需引入,使整体达到面向外部用户交付的产品化标准。 ## Problem Frame AgentKit 后端能力丰富但前端停留在 70% 完成度的内部工具水平。可视化编排器拖拽放置未完成、并行节点缺失;进化仪表盘用原生 SVG 画折线图无交互无实时推送;知识库上传数据回填有 bug、文档管理不完整。后端存在多个 API 缺口(终端、设置、执行历史、KB 文档管理),前端重建依赖这些 API 补齐。产品化交付需要前后端协同推进,三个模块并行达到可交付水平。 --- ## Requirements Traceability | R-ID | 需求摘要 | 覆盖单元 | |------|----------|----------| | R1 | 拖拽放置功能完整可用 | U1 | | R2 | 并行节点自定义组件 | U1 | | R3 | 条件分支可视化引导 | U1 | | R4 | 撤销/重做支持 | U2 | | R5 | 工作流执行动画 | U3 | | R6 | 工作流执行历史列表 | U4 | | R7 | ECharts 替换原生 SVG | U5 | | R8 | 进化仪表盘实时推送 | U6 | | R9 | 经验时间线筛选修复 | U5 | | R10 | 全局概览页 | U7 | | R11 | 用量统计面板 | U7 | | R12 | 文档上传数据回填修复 | U8 | | R13 | 文档列表与删除 | U9 | | R14 | 信息源同步触发 | U9 | | R15 | 信息源配置更新 | U9 | | R16 | 检索高级选项 | U9 | | R17 | 终端 API 实现 | U10 | | R18 | 设置 API 实现 | U11 | | R19 | 工作流 Skill 真实执行 | U4 | | R20 | 前端 API 公共基类 | U12 | | R21 | Ant Design Vue 按需引入 | U12 | | R22 | ECharts 按需引入 | U12 | --- ## Key Technical Decisions **KTD1. 终端 API 安全策略:白名单 + 用户确认 + 可加入白名单。** 复用 `ShellTool` 的 `_SAFE_COMMAND_PREFIXES` 和 `_is_dangerous()` 检测逻辑。白名单内命令直接执行;非白名单命令通过 WebSocket 推送确认请求,用户确认后执行,确认时可选择将命令加入白名单。白名单存储在服务端内存中(与 ShellTool 一致),不持久化到配置文件。 **KTD2. 工作流执行引擎改造:Skill 阶段接入 SkillRegistry。** 在 `_execute_workflow` 的 skill 类型分支中,通过 `app.state.skill_registry` 查找并执行对应 Skill,将结果写入 `stage_results`。Parallel 阶段使用 `asyncio.gather()` 并行执行子阶段。Condition 阶段增加分支跳过逻辑(不满足条件的下游阶段标记为 skipped)。 **KTD3. ECharts 按需引入策略。** 使用 ECharts 5.x 的 tree-shakable API(`echarts/use` + 手动注册所需图表类型和组件),配合 Vite 的自然 tree-shaking。不引入全量 `echarts` 包。需引入:LineChart、BarChart、PieChart、TooltipComponent、LegendComponent、GridComponent、DataZoomComponent。 **KTD4. 前端 API 层统一:class 风格基类。** 将 6 个 API 文件统一为 class 风格(与现有 `ApiClient`、`WorkflowApiClient`、`EvolutionApiClient` 一致),提取公共 `request()` 方法到 `BaseApiClient`,各模块继承并指定 `baseUrl`。WebSocket 创建逻辑也统一到基类。 **KTD5. 撤销/重做实现:命令模式 + 栈。** 使用命令模式(Command Pattern)封装画布编辑操作(AddNode、DeleteNode、AddEdge、DeleteEdge、UpdateProperty),维护 undo/redo 两个栈。每次操作执行时压入 undo 栈并清空 redo 栈,撤销时从 undo 弹出执行 inverse 并压入 redo,重做反之。 **KTD6. 进化仪表盘 WebSocket 推送激活。** 在 `evolution_dashboard.py` 的 REST 端点中,写操作完成后调用 `_broadcast_event()`。前端在 `EvolutionView` 挂载时建立 WebSocket 连接,按频道订阅(experiences/metrics/pitfalls/optimizations),收到推送后调用对应 store 方法刷新数据。 --- ## High-Level Technical Design ```mermaid flowchart TB subgraph Frontend["前端 (Vue 3 + TypeScript)"] WF[工作流编排器] --> WFStore[WorkflowStore] EV[进化仪表盘] --> EVStore[EvolutionStore] KB[知识库管理] --> KBStore[KnowledgeStore] TM[终端] --> TMStore[TerminalStore] ST[设置] --> STStore[SettingsStore] WFStore --> API[BaseApiClient] EVStore --> API KBStore --> API TMStore --> API STStore --> API API --> HTTP[REST API] API --> WS[WebSocket] end subgraph Backend["后端 (FastAPI)"] HTTP --> WFRoutes[Workflow Routes] HTTP --> EVDRoutes[Evolution Dashboard Routes] HTTP --> KBRoutes[KB Management Routes] HTTP --> TMRoutes[Terminal Routes] HTTP --> STRoutes[Settings Routes] WS --> WFWS[Workflow WS] WS --> EVWS[Evolution WS] WS --> TMWS[Terminal WS] WFRoutes --> WFEngine[Workflow Execution Engine] TMRoutes --> PTY[PTYSession] TMRoutes --> Security[ShellTool 白名单] STRoutes --> Config[Config Hot Reload] WFEngine --> SkillReg[SkillRegistry] end ``` --- ## Implementation Units ### U1. 工作流编排器核心修复 **Goal:** 修复拖拽放置、添加并行节点组件、实现条件分支可视化引导,使编排器基本可用 **Requirements:** R1, R2, R3 **Dependencies:** 无 **Files:** - `src/agentkit/server/frontend/src/components/workflow/FlowCanvas.vue` -- 修复 onDrop,添加节点到画布 - `src/agentkit/server/frontend/src/components/workflow/NodePalette.vue` -- 无需修改(拖拽发起端已正常) - `src/agentkit/server/frontend/src/components/workflow/ParallelNode.vue` -- 新建并行节点自定义组件 - `src/agentkit/server/frontend/src/components/workflow/ConditionNode.vue` -- 修改条件节点,添加"是/否"端口标签 - `src/agentkit/server/frontend/src/stores/workflow.ts` -- addNode 支持 parallel 类型,条件分支端口映射 - `src/agentkit/server/frontend/src/views/WorkflowView.vue` -- 注册 parallel 节点类型,监听 drop 事件 **Approach:** 1. 修复 FlowCanvas.vue 的 `onDrop`:调用 `store.addNode(nodeType, position)` 将节点添加到画布,位置对齐 15px 网格 2. 新建 ParallelNode.vue:绿色主题自定义组件,显示并行图标和最大并行数,包含输入端口和输出端口 3. 在 FlowCanvas.vue 的 `nodeTypes` 中注册 `parallel: ParallelNode` 4. 修改 ConditionNode.vue:两个输出端口分别标注"是"和"否"标签,使用 Handle 组件的 `id` 和 `position` 属性区分 5. 修改 workflowSerializer.ts:序列化时将条件节点的边映射到 `branch_targets`(true/false),反序列化时还原 **Patterns to follow:** 现有 SkillNode.vue、ConditionNode.vue、ApprovalNode.vue 的组件结构 **Test scenarios:** - 拖拽技能节点到画布,节点出现在正确位置且对齐网格 - 拖拽并行节点到画布,渲染为绿色自定义组件 - 拖拽条件节点到画布,"是/否"端口标签可见 - 从条件节点"是"端口连线到目标节点,序列化后 branch_targets 包含 true 分支 - 拖拽到画布外区域,节点不被创建 - 连续拖拽 3 个不同类型节点,位置均正确 **Verification:** 前端 dev server 启动后,在工作流页面可拖拽创建所有 4 种节点,条件节点端口标注正确,序列化/反序列化后属性不丢失 --- ### U2. 工作流撤销/重做 **Goal:** 实现画布编辑操作的撤销/重做功能 **Requirements:** R4 **Dependencies:** U1 **Files:** - `src/agentkit/server/frontend/src/stores/workflow.ts` -- 添加 undo/redo 栈和命令执行逻辑 - `src/agentkit/server/frontend/src/components/workflow/FlowCanvas.vue` -- 注册 Ctrl+Z / Ctrl+Shift+Z 快捷键 - `src/agentkit/server/frontend/src/components/workflow/PropertyPanel.vue` -- 属性修改操作入栈 **Approach:** 1. 定义 Command 接口:`{ execute(), undo() }` 2. 实现 AddNodeCommand、DeleteNodeCommand、AddEdgeCommand、DeleteEdgeCommand、UpdatePropertyCommand 3. WorkflowStore 增加 `undoStack: Command[]` 和 `redoStack: Command[]` 4. 每次操作执行时创建 Command 压入 undoStack,清空 redoStack 5. `undo()` 从 undoStack 弹出执行 `command.undo()`,压入 redoStack 6. `redo()` 从 redoStack 弹出执行 `command.execute()`,压入 undoStack 7. FlowCanvas 注册 `onKeyDown` 监听 Ctrl+Z / Ctrl+Shift+Z **Patterns to follow:** Vue Flow 官方示例中的 undo/redo 实现 **Test scenarios:** - 添加节点后 Ctrl+Z,节点从画布消失 - 删除节点后 Ctrl+Z,节点恢复原位 - 连线后 Ctrl+Z,连线消失 - 修改属性后 Ctrl+Z,属性恢复原值 - 撤销后 Ctrl+Shift+Z,操作重做 - 连续 5 次操作后全部撤销再全部重做,画布状态一致 **Verification:** 在工作流编辑器中执行各种操作后,Ctrl+Z/Ctrl+Shift+Z 可正确撤销/重做 --- ### U3. 工作流执行动画 **Goal:** 工作流执行时画布节点实时显示状态动画 **Requirements:** R5 **Dependencies:** U1 **Files:** - `src/agentkit/server/frontend/src/stores/workflow.ts` -- 接入 WebSocket,更新节点状态 - `src/agentkit/server/frontend/src/components/workflow/FlowCanvas.vue` -- 根据节点状态渲染动画样式 - `src/agentkit/server/frontend/src/components/workflow/SkillNode.vue` -- 添加状态样式(运行中脉冲、完成绿色、失败红色) - `src/agentkit/server/frontend/src/components/workflow/ConditionNode.vue` -- 添加状态样式 - `src/agentkit/server/frontend/src/components/workflow/ApprovalNode.vue` -- 添加等待图标样式 - `src/agentkit/server/frontend/src/components/workflow/ParallelNode.vue` -- 添加状态样式 **Approach:** 1. WorkflowStore 建立 WebSocket 连接(复用 `createWorkflowWebSocket`),订阅执行事件 2. 收到 `stage_started` 事件时,更新对应节点的 `data.status = 'running'` 3. 收到 `stage_completed` 事件时,更新 `data.status = 'completed'` 4. 收到 `stage_failed` 事件时,更新 `data.status = 'failed'` 5. 收到 `approval_required` 事件时,更新 `data.status = 'waiting_approval'` 6. 各节点组件根据 `data.status` 渲染不同样式:running 脉冲动画、completed 绿色勾选、failed 红色错误、waiting_approval 等待图标 7. 替换当前的轮询机制为 WebSocket 推送 **Patterns to follow:** 现有 WorkflowApi 的 `createWorkflowWebSocket` 方法 **Test scenarios:** - 执行工作流后,当前阶段节点显示脉冲动画 - 阶段完成后节点变为绿色勾选 - 阶段失败后节点变为红色错误 - 审批节点暂停时显示等待图标 - 未执行节点保持默认样式 - WebSocket 断开后自动重连 **Verification:** 执行工作流时,画布节点实时反映执行状态,延迟不超过 1 秒 --- ### U4. 工作流执行历史与 Skill 真实执行 **Goal:** 后端新增执行历史 API,工作流 Skill 阶段调用真实 Skill 执行 **Requirements:** R6, R19 **Dependencies:** U3 **Files:** - `src/agentkit/server/routes/workflows.py` -- 新增执行历史端点,改造 skill/parallel 阶段执行逻辑 - `src/agentkit/orchestrator/workflow_schema.py` -- WorkflowStore 增加按 workflow_id 查询执行记录方法 - `src/agentkit/server/frontend/src/api/workflow.ts` -- 新增 listExecutions 方法 - `src/agentkit/server/frontend/src/stores/workflow.ts` -- 加载执行历史 - `src/agentkit/server/frontend/src/views/WorkflowView.vue` -- 执行历史表格展示 - `tests/unit/server/test_workflow_routes.py` -- 新增测试 **Approach:** 1. WorkflowStore 新增 `list_executions(workflow_id)` 方法,从内存存储中过滤 2. 后端新增 `GET /workflows/{workflow_id}/executions` 端点,返回分页执行记录 3. 改造 `_execute_workflow` 中 skill 类型分支:通过 `app.state.skill_registry` 查找 Skill,调用 `skill.execute()` 或通过 AgentPool 分发任务 4. 改造 parallel 类型分支:使用 `asyncio.gather()` 并行执行子阶段 5. 前端新增执行历史面板,展示表格(execution_id、状态、开始/结束时间),支持展开查看阶段结果 **Patterns to follow:** 现有 `test_workflow_routes.py` 的 fixture 和测试组织模式 **Test scenarios:** - GET /workflows/{id}/executions 返回指定工作流的执行记录列表 - Skill 阶段执行返回真实输出而非 dry_run 模拟数据 - Skill 执行失败时阶段状态标记为 failed - Parallel 阶段并行执行子阶段 - 前端执行历史表格正确展示记录 - 空历史时显示空状态提示 **Verification:** 执行包含 skill 阶段的工作流后,执行历史中可查看真实 Skill 输出 --- ### U5. ECharts 图表替换与筛选修复 **Goal:** 用 ECharts 替换原生 SVG 图表,修复经验时间线筛选 bug **Requirements:** R7, R9 **Dependencies:** U12(ECharts 按需引入需先完成) **Files:** - `src/agentkit/server/frontend/src/components/evolution/MetricsChart.vue` -- 用 ECharts 重写 - `src/agentkit/server/frontend/src/views/EvolutionView.vue` -- 修复 onExperienceFilter - `src/agentkit/server/frontend/src/utils/echarts.ts` -- 新建 ECharts 按需引入配置 **Approach:** 1. 新建 `utils/echarts.ts`:按需注册 LineChart、BarChart、PieChart、TooltipComponent、LegendComponent、GridComponent、DataZoomComponent,导出 `use` 函数 2. 重写 MetricsChart.vue:使用 ECharts 折线图,配置 tooltip、legend、dataZoom,自适应容器宽度(ResizeObserver) 3. 修复 EvolutionView.vue 的 `onExperienceFilter`:正确传递 outcome 参数(`store.loadExperiences(outcome || undefined)`),同时修正 `loadExperiences` 的参数语义(从 taskType 改为 outcome) 4. 删除原生 SVG 绘制代码 **Patterns to follow:** ECharts 5.x 按需引入官方文档 **Test scenarios:** - 指标趋势图使用 ECharts 渲染,无原生 SVG 代码残留 - 鼠标悬停数据点显示 tooltip - 点击图例切换显示/隐藏趋势线 - 时间周期切换后图表正确刷新 - 图表自适应容器宽度 - 选择"成功"筛选后仅显示 success 记录 - 选择"失败"筛选后仅显示 failure 记录 **Verification:** 进化仪表盘页面图表交互正常,筛选功能生效 --- ### U6. 进化仪表盘实时 WebSocket 推送 **Goal:** 激活后端 WebSocket 推送,前端接收后自动刷新面板 **Requirements:** R8 **Dependencies:** U5 **Files:** - `src/agentkit/server/routes/evolution_dashboard.py` -- 在写操作后调用 _broadcast_event - `src/agentkit/server/frontend/src/stores/evolution.ts` -- 建立 WebSocket 连接,处理推送事件 - `src/agentkit/server/frontend/src/views/EvolutionView.vue` -- 挂载时连接 WebSocket,卸载时断开 - `tests/unit/server/test_evolution_dashboard.py` -- 新增 WebSocket 推送测试 **Approach:** 1. 后端:在 `POST /evolution/trigger`、经验记录新增、指标更新等写操作完成后调用 `_broadcast_event(connections, event_type, data)` 2. 前端 EvolutionStore:增加 `connectWebSocket()` 和 `disconnectWebSocket()` 方法 3. WebSocket 消息处理:收到 `experience_added` 刷新经验时间线,收到 `metrics_updated` 刷新趋势图,收到 `pitfall_detected` 刷新避坑预警 4. EvolutionView `onMounted` 时调用 `connectWebSocket()`,`onUnmounted` 时调用 `disconnectWebSocket()` 5. 断线重连:最多 3 次,间隔 5 秒 **Patterns to follow:** 现有 workflow WebSocket 连接模式(`createWorkflowWebSocket`) **Test scenarios:** - WebSocket 连接建立后收到 subscribed 确认 - 新经验记录产生后,经验时间线在 2 秒内自动追加 - 指标更新后趋势图自动刷新 - WebSocket 断开后自动重连(最多 3 次) - 页面卸载时 WebSocket 正确断开 **Verification:** 打开进化仪表盘,触发进化操作后页面自动刷新 --- ### U7. 全局概览页与用量统计面板 **Goal:** 新增进化模块首页概览和 LLM 用量统计面板 **Requirements:** R10, R11 **Dependencies:** U5 **Files:** - `src/agentkit/server/frontend/src/views/EvolutionView.vue` -- 重构为带子路由的布局 - `src/agentkit/server/frontend/src/components/evolution/DashboardOverview.vue` -- 新建概览页 - `src/agentkit/server/frontend/src/components/evolution/UsagePanel.vue` -- 新建用量统计面板 - `src/agentkit/server/frontend/src/router/index.ts` -- 添加进化子路由 - `src/agentkit/server/frontend/src/api/evolution.ts` -- 新增用量统计 API 调用 **Approach:** 1. 重构 EvolutionView 为容器布局:左侧导航(概览/经验/指标/避坑/路径优化/用量统计),右侧内容区 2. 新建 DashboardOverview.vue:4 个摘要卡片(总任务数、Agent 活跃数、LLM 用量、质量通过率),数据从 `/metrics` 和 `/health` 端点聚合 3. 新建 UsagePanel.vue:ECharts 折线图展示 Token 用量趋势(按 Provider 分组),摘要卡片展示请求成功率和平均延迟,时间范围选择器 4. 路由:`/evolution` 默认跳转到 `/evolution/overview` **Patterns to follow:** 现有 EvolutionView 的面板布局模式 **Test scenarios:** - 概览页展示 4 个摘要卡片,数据来自后端 API - 每个卡片可点击跳转到对应子面板 - 页面加载时显示 loading 状态 - 数据为空时显示零值 - 用量统计折线图按 Provider 分组显示 - 时间范围切换后图表刷新 - 无数据时显示空状态提示 **Verification:** 访问 /evolution 默认显示概览页,各卡片数据正确,可跳转到子面板 --- ### U8. 知识库上传数据回填修复 **Goal:** 修复文档上传后使用后端返回的真实数据 **Requirements:** R12 **Dependencies:** 无 **Files:** - `src/agentkit/server/frontend/src/components/kb/DocumentUpload.vue` -- 使用后端返回值 - `src/agentkit/server/frontend/src/stores/knowledge.ts` -- uploadDocument 返回后端数据 **Approach:** 1. 修改 `uploadDocument` store 方法:返回后端响应数据(document_id、chunks、status) 2. 修改 DocumentUpload.vue 的 `handleUpload` 回调:使用后端返回的 document_id 和 chunks 替换 `Date.now()` 伪造值 3. 上传失败时不将文档添加到列表,显示错误提示 **Patterns to follow:** 现有上传流程的 FormData + custom-request 模式 **Test scenarios:** - 上传文档后列表显示后端返回的真实 document_id - 分块数显示后端返回的 chunks 值 - 上传多个文档后每个 id 唯一 - 上传失败时文档不出现在列表中 **Verification:** 上传文档后列表数据与后端返回值一致 --- ### U9. 知识库文档管理与检索增强 **Goal:** 补齐后端 KB 文档管理 API,前端实现文档列表/删除、信息源同步/更新、检索高级选项 **Requirements:** R13, R14, R15, R16 **Dependencies:** U8 **Files:** - `src/agentkit/server/routes/kb_management.py` -- 新增文档列表/删除/同步/更新端点,检索支持高级参数 - `src/agentkit/server/frontend/src/api/kb.ts` -- 新增 API 调用方法 - `src/agentkit/server/frontend/src/components/kb/DocumentUpload.vue` -- 文档列表和删除功能 - `src/agentkit/server/frontend/src/components/kb/SourceConfig.vue` -- 同步按钮和编辑功能 - `src/agentkit/server/frontend/src/components/kb/SearchTest.vue` -- 高级选项折叠面板 - `tests/unit/server/test_kb_management.py` -- 新增测试 **Approach:** 1. 后端新增 `GET /kb-management/documents`:返回文档列表(从 `_source_store.list_documents()` 暴露) 2. 后端新增 `DELETE /kb-management/documents/{document_id}`:从存储中删除文档 3. 后端新增 `POST /kb-management/sources/{source_id}/sync`:触发外部源同步(飞书/Confluence),返回同步状态 4. 后端新增 `PUT /kb-management/sources/{source_id}`:更新信息源配置 5. 后端 `POST /kb-management/search` 增加 `source_ids`、`top_k`、`strategy` 参数 6. 前端 DocumentUpload:加载文档列表,删除按钮带确认弹窗 7. 前端 SourceConfig:每行添加"同步"和"编辑"按钮 8. 前端 SearchTest:新增"高级选项"折叠面板(信息源多选、top_k 输入、策略选择) **Patterns to follow:** 现有 kb_management.py 的路由和存储模式 **Test scenarios:** - GET /kb-management/documents 返回文档列表 - DELETE /kb-management/documents/{id} 删除成功后文档不存在 - POST /kb-management/sources/{id}/sync 触发同步并返回状态 - PUT /kb-management/sources/{id} 更新配置后返回新对象 - 检索请求带 source_ids/top_k/strategy 参数时后端正确处理 - 前端文档列表正确展示,删除后列表刷新 - 同步按钮 loading 状态正确 - 高级选项参数随检索请求发送 **Verification:** 知识库页面可完整管理文档和信息源,检索支持高级选项 --- ### U10. 终端 API 实现 **Goal:** 后端新增终端路由模块,对接 PTYSession,前端终端页面可用 **Requirements:** R17 **Dependencies:** 无 **Files:** - `src/agentkit/server/routes/terminal.py` -- 新建终端路由模块 - `src/agentkit/server/app.py` -- 注册终端路由 - `src/agentkit/server/frontend/src/api/terminal.ts` -- 适配新 API - `src/agentkit/server/frontend/src/stores/terminal.ts` -- 对接 WebSocket - `src/agentkit/server/frontend/src/views/TerminalView.vue` -- 集成 xterm.js - `tests/unit/server/test_terminal_routes.py` -- 新建测试 **Approach:** 1. 新建 `routes/terminal.py`,实现 4 个端点: - `POST /terminal/execute`:创建 PTYSession 执行命令,白名单检查,非白名单命令返回需确认状态 - `GET /terminal/sessions`:返回活跃会话列表 - `GET /terminal/sessions/{session_id}/history`:返回命令历史 - `WS /terminal/ws`:实时命令输入/输出流,非白名单命令推送确认请求,用户确认后执行,确认时可选择加入白名单 2. 安全策略:复用 `ShellTool` 的 `_is_dangerous()` 检测逻辑,白名单内命令直接执行,非白名单通过 WebSocket 推送确认请求 3. 白名单管理:服务端内存维护可扩展白名单(用户确认时选择加入的命令),不持久化 4. 前端集成 xterm.js(需新增依赖),通过 WebSocket 连接实现交互式终端 **Patterns to follow:** 现有 `routes/chat.py` 的 WebSocket 端点模式;`tools/shell.py` 的白名单机制 **Test scenarios:** - POST /terminal/execute 执行白名单命令返回输出 - POST /terminal/execute 非白名单命令返回需确认状态 - WebSocket 连接后可交互式执行命令 - 非白名单命令推送确认请求,确认后执行 - 确认时选择加入白名单后,后续相同命令直接执行 - GET /terminal/sessions 返回活跃会话列表 - GET /terminal/sessions/{id}/history 返回命令历史 **Verification:** 前端终端页面可执行命令、查看输出、确认非白名单命令 --- ### U11. 设置 API 实现 **Goal:** 后端新增设置路由模块,前端 Settings 页面可读写配置 **Requirements:** R18 **Dependencies:** 无 **Files:** - `src/agentkit/server/routes/settings.py` -- 新建设置路由模块 - `src/agentkit/server/app.py` -- 注册设置路由 - `src/agentkit/server/frontend/src/api/settings.ts` -- 新建设置 API - `src/agentkit/server/frontend/src/stores/settings.ts` -- 对接 API - `src/agentkit/server/frontend/src/views/SettingsView.vue` -- 对接真实 API - `tests/unit/server/test_settings_routes.py` -- 新建测试 **Approach:** 1. 新建 `routes/settings.py`,实现 4 组端点: - `GET/PUT /settings/llm`:读写 LLM 配置(Provider 列表、默认模型、别名),GET 不暴露 API Key 明文 - `GET/PUT /settings/skills`:读写技能路径配置 - `GET/PUT /settings/kb`:读写知识库连接配置 - `GET/PUT /settings/general`:读写通用设置(日志级别、Server 端口等) 2. PUT 操作触发配置热重载(复用 `_on_config_change` 机制) 3. 前端 SettingsView 对接真实 API,替换当前内存数据 **Patterns to follow:** 现有 `app.py` 的 `_on_config_change` 热重载机制 **Test scenarios:** - GET /settings/llm 返回 LLM 配置,API Key 被脱敏 - PUT /settings/llm 更新配置后触发热重载 - GET/PUT /settings/skills 读写技能路径 - GET/PUT /settings/kb 读写知识库配置 - GET/PUT /settings/general 读写通用设置 - 前端 Settings 页面可展示和修改配置 - 配置修改后无需重启服务即生效 **Verification:** 前端 Settings 页面可读写所有配置项,修改后立即生效 --- ### U12. 前端基础设施改进 **Goal:** 抽取 API 公共基类,实现 Ant Design Vue 和 ECharts 按需引入 **Requirements:** R20, R21, R22 **Dependencies:** 无(应最先实施,其他单元依赖其产出) **Files:** - `src/agentkit/server/frontend/src/api/base.ts` -- 新建 API 基类 - `src/agentkit/server/frontend/src/api/client.ts` -- 继承基类 - `src/agentkit/server/frontend/src/api/workflow.ts` -- 继承基类 - `src/agentkit/server/frontend/src/api/evolution.ts` -- 继承基类 - `src/agentkit/server/frontend/src/api/kb.ts` -- 重构为 class 风格继承基类 - `src/agentkit/server/frontend/src/api/terminal.ts` -- 重构为 class 风格继承基类 - `src/agentkit/server/frontend/src/api/skills.ts` -- 重构为 class 风格继承基类 - `src/agentkit/server/frontend/vite.config.ts` -- 添加 unplugin 插件 - `src/agentkit/server/frontend/package.json` -- 新增依赖 - `src/agentkit/server/frontend/src/main.ts` -- 移除 app.use(Antd) **Approach:** 1. 新建 `api/base.ts`:`BaseApiClient` 类,包含 `request(method, path, options)` 方法(统一 baseURL、超时、错误处理、响应拦截)和 `createWebSocket(path)` 方法 2. 6 个 API 文件重构为继承 `BaseApiClient`,指定各自的 `baseUrl` 3. 安装 `unplugin-vue-components` 和 `unplugin-auto-import`,配置 Vite 插件实现 Ant Design Vue 按需引入 4. `main.ts` 移除 `app.use(Antd)` 全量注册 5. 安装 `echarts`,按需引入配置(在 U5 的 `utils/echarts.ts` 中完成) **Patterns to follow:** 现有 `ApiClient`、`WorkflowApiClient`、`EvolutionApiClient` 的 class 风格 **Test scenarios:** - BaseApiClient 的 request 方法统一处理错误和响应 - 6 个 API 模块均使用基类,无独立 request 函数 - 现有页面渲染和交互行为不变(回归验证) - 构建无报错、无运行时组件缺失警告 - ant-design-vue 打包体积较全量引入减少 40% 以上 **Verification:** `npm run build` 成功,所有现有页面功能正常 --- ## Scope Boundaries **In scope:** 22 条需求(R1-R22),涵盖可视化编排器、监控数据看板、知识库管理、后端 API 补齐、技术改进 **Deferred to follow-up work:** - 暗色模式——需设计系统层面改造 - 角色视图切换——通过信息架构区分,不做独立视图 - Computer Use 页面——功能独立 - CI/CD 流水线——独立于前端重建 - 前端单元测试和 E2E 测试——后续专项 - xterm.js 终端模拟器集成——U10 实现后端 API 和 WebSocket,前端终端交互式体验可后续增强 --- ## Open Questions **Deferred to implementation:** - 全局概览页(R10)数据聚合方式:从现有多个端点聚合还是新增专用概览端点——实现时根据性能需求决定 - 工作流执行动画(R5)节点状态样式方案:在现有组件上叠加状态层还是创建带状态变体——实现时根据组件复杂度决定 - 工作流 Skill 真实执行(R19)的变量传递机制:上游 stage_results 如何传递给下游 Skill inputs——实现时根据 Skill 接口设计 --- ## Risks & Dependencies | 风险 | 影响 | 缓解措施 | |------|------|----------| | ECharts 按需引入配置复杂,可能遗漏组件导致运行时错误 | 图表渲染失败 | 先全量引入验证功能,再逐步切换为按需引入 | | 工作流执行引擎改造影响现有 approval/condition 逻辑 | 现有功能回归 | 改造时保持现有分支不变,仅修改 skill/parallel 分支,增加集成测试 | | 终端 API 安全策略绕过风险 | 安全漏洞 | 复用 ShellTool 成熟的白名单机制,链式操作符一律视为危险 | | 前端 API 层重构导致现有调用行为变化 | 页面功能回归 | 逐模块迁移,每个模块迁移后回归验证 | | 后端 KB 文档管理当前为纯内存存储,重启丢失 | 数据丢失 | 本次不解决持久化问题,但在 API 文档中标注此限制 | --- ## System-Wide Impact - **前端构建流程变化**:新增 unplugin 插件和 ECharts 依赖,`npm install` 和 `npm run build` 行为变化 - **后端路由注册变化**:新增 terminal 和 settings 两个路由模块,`app.py` 需更新 - **前端 API 层架构变化**:6 个 API 文件重构为 class 继承模式,所有 store 的 API 调用方式变化 - **工作流执行引擎行为变化**:Skill 阶段从 dry-run 变为真实执行,可能影响执行时间和错误处理 --- ## Sources & Research - 需求文档:`docs/brainstorms/2026-06-12-frontend-productization-requirements.md` - 前端构建配置:`src/agentkit/server/frontend/vite.config.ts`、`package.json` - 工作流编辑器:`src/agentkit/server/frontend/src/components/workflow/FlowCanvas.vue`(拖拽断裂点在第 96-110 行) - 进化仪表盘:`src/agentkit/server/frontend/src/components/evolution/MetricsChart.vue`(原生 SVG 实现) - 筛选 bug:`src/agentkit/server/frontend/src/views/EvolutionView.vue`(第 55-57 行) - 后端工作流执行:`src/agentkit/server/routes/workflows.py`(skill/parallel dry-run 在第 378-387 行) - 后端进化推送:`src/agentkit/server/routes/evolution_dashboard.py`(`_broadcast_event` 未被调用) - 后端 KB 管理:`src/agentkit/server/routes/kb_management.py`(文档列表/删除/同步端点缺失) - PTYSession:`src/agentkit/tools/pty_session.py` - ShellTool 白名单:`src/agentkit/tools/shell.py`(`_SAFE_COMMAND_PREFIXES` 和 `_is_dangerous()`) - 配置热重载:`src/agentkit/server/app.py`(`_on_config_change` 第 242-336 行) - 现有测试模式:`tests/unit/server/test_workflow_routes.py`、`test_evolution_dashboard.py`、`test_kb_management.py`