真实测试 · 中间输出 —— 别再「运行中 · Ns」干等
真实测试运行时能看到什么中间进度,为什么有时卡住,最小修法是什么
一句话:后端 SSE + 前端实时渲染器都已存在,WIZ 向导路径已在展示工具活动流;唯独草稿卡「继续测试」按钮仍用非流式调用,只显示 真实测试中 · Ns 计时器,跑几分钟页面无变化。把按钮切到已有的流式通道即可。
1两条真实测试入口 · 中间输出现状(SVG)
路径 A(WIZ 向导)已流式;路径 B(草稿卡按钮)干等 Ns
2后端已经在流哪些中间输出(SSE 事件)
证据:expert-api-server.ts sendCreatorDraftTestEvents(Accept: text/event-stream 即触发)· v1-dto.ts agentEventView · claude-agent-sdk.ts streamSdk
| 事件 | 用户可见内容 | 用途 |
|---|---|---|
session | 全新 SDK 会话已就绪 | 确认真实执行已启动,非假跑 |
activity | 工具调用(加载 Skill / 查 MCP / 写文件 / 子 Agent)+ kind 徽标 | 核心中间进度,知道在干什么 |
status / text | 「正在…」「…完成」状态行 + 增量正文 | 活的输出,不是死等 |
asset(activity kind) | 文件已保存:skills/…/SKILL.md | 产物落地可见 |
risk(activity kind) | 权限已阻止 / 工具超时 / 重试 | 异常即时暴露,不等结束 |
test.completed | 结果 + draft.status=verified | 权威认证信号 |
3最小修法(复用已有件,几行)
后端零改动 —— SSE 端点与事件流齐全。只改前端一处按钮接线
| 步骤 | 改动 | 位置 |
|---|---|---|
| 1 | backend-draft-test 的 await runtime.client.testCreatorDraft() 换成 for await (… of runtime.client.testCreatorDraftStream()) | frontend/src/adapters/browser/workbench-api-adapter.js:1526 |
| 2 | 复用 creatorRuntimeProgress(true) 渲染器(WIZ 已用,指标+活动流+计时+读屏)挂到测试 feed | 同文件 :1649 |
| 3 | 保留 5s 计时器作兜底,事件到达即覆盖 | 同文件 :1536 |
现状代码证据(点击展开)
| 文件 | 事实 |
|---|---|
| expert-api-server.ts:1978 | POST /api/v1/creator/drafts/{id}/test —— Accept 含 text/event-stream 时走 sendCreatorDraftTestEvents,否则一次 JSON |
| expert-api-server.ts:678 | sendCreatorDraftTestEvents 流 agentEventView 逐事件 + test.completed,10s keepalive |
| workbench.ts:241 | runExpertTests 用 Promise.all + invokeExpert —— 非流式路径一次性返回 |
| claude-agent-sdk.ts:835 | streamSdk 生成器每个工具调用 yield activity/status —— 中间输出源 |
| v1-dto.ts:157 | agentEventView 把 session/activity/done/status 序列化给 SSE |
| workbench-api-adapter.js:1526 | backend-draft-test:非流式 await + 真实测试中 · Ns 5s 计时 |
| workbench-api-adapter.js:1802 | WIZ 路径已用 testCreatorDraftStream + progress.update(对比例证) |
| workbench-api-adapter.js:1649 | creatorRuntimeProgress 渲染器:orbit/指标/活动列表/aria-live —— 已可复用 |