Skip to content

Latest commit

 

History

History
825 lines (560 loc) · 52.1 KB

File metadata and controls

825 lines (560 loc) · 52.1 KB

VERSION 1.0.9 — 版本修订记录

版本:1.0.9(未独立发布)
状态:已并入 1.1.0(内容随 1.1.0 发布)
发布时间:—(随 1.1.0 发布,2026-09-05)
文档状态:1.0.9 为 1.0.8 之后的开发周期版本,未在 PyPI 独立发布;其全部迭代明细(迭代 1–25)并入 1.1.0 发布。本文档仅作归档,后续开发请迭代到新的版本文档
目录:页面级行为细则见 docs/prds/;版本路线见 docs/Roadmap.md


1. 版本概述

1.0.9 为 1.0.8(独立精度测试模块 + 性能页增强)发布后的迭代开发版本,目标范围待规划,后续按需求/用户确认补充并在此按时间顺序记录迭代明细。

规划功能见 docs/Roadmap.md 1.0.9 小节。


2. 版本规划目标(用户确认版)

(待规划)


3. 迭代记录(按时间顺序)

迭代 1(2026-09-01 18:47:00):开启 1.0.9 开发

功能概述:

  • 1.0.8 发布完成后开启下一迭代版本:版本号升至 1.0.9.dev0(pyproject.toml / benchscope/__init__.py / web/package.json 三处单一来源同步),新建本文档。
  • 目标范围待规划,后续按时间顺序追加迭代明细。

TODO 状态:

  • 版本 — 升版本号至 1.0.9.dev0(三处统一)
  • 文档 — 新建 VERSION_1_0_9.md;docs/Readme.md 版本表 + docs/Roadmap.md 增 1.0.9
  • 规划 — 1.0.9 目标范围与 TODO 清单(待补充)

迭代 2(2026-09-01 18:56:23):开发模式分环境约定

功能概述:

  • 新增项目级强制约定:沙箱环境启动「沙箱开发模式」,主机环境启动「主机开发模式」;涉及代码更新的任务执行完毕须重启对应环境开发模式。

变更内容:

  1. 约定落地(agents/Memory.md / agents/Readme.md / docs/rules/Development.md):
    • Memory.md 强制约定速查表新增 #11 开发模式分环境 + 新增 §10 开发模式(主机 dev.sh / 沙箱自起 mock+后端的两套启动、数据目录、端口与验证步骤)
    • agents/Readme.md §4.5 新增「开发模式(分环境启动)」约定
    • docs/rules/Development.md §1 头部新增分环境启动强约束
  2. 背景:沙箱为 bwrap --unshare-pid,看不到主进程 PID(无法 stop/kill 主环境服务)、连不上主环境 mock,故沙箱内需自起一套开发环境;两套环境独立数据目录、端口占位互不干扰。

TODO 状态:

  • 约定 — Memory.md #11 + §10(分环境启动、各自步骤、重启规则)
  • 约定 — agents/Readme.md §4.5 同步
  • 规范 — docs/rules/Development.md §1 分环境强约束
  • 迭代记录 — 本文件追加

迭代 3(2026-09-01 19:35:50):Settings/Cache Paths 改版 —— Root Dir 即时生效 + 子目录只读

功能概述:

  • Cache Paths 面板:Data → Root Dir(根目录);改 Root Dir 无需重启服务,以环境变量形式透传子进程;失焦即创建子目录;8 个子目录只读高亮;去掉重启/迁移流程。

变更内容:

  1. 后端 — config.py:
    • update() 的 data_dir 联动改为全部子目录重置为新根下的默认子目录(不再只联动"未自定义"项)
    • 启动与更新时把数据根目录同步到 os.environ['BENCHSCOPE_DATA_DIR'](以环境变量形式使用)
  2. 后端 — benches/runner.py:minimal_env 显式透传 BENCHSCOPE_DATA_DIR 给 bench 子进程(vllm / sglang / bench CLI)
  3. 后端 — server/api_config.py:
    • update_cache_dirs 去掉 requires_restart(改 Root Dir 不再要求重启),移除 state.migration_source
    • get_cache_dirs 子目录项加 readonly: True(data_dir 可编辑);CACHE_DIR_INFO data_dir 命名 Root Dir / 根目录,子目录 desc 更新
  4. 前端 — SettingsView.vue:
    • Cache Paths:Root Dir 失焦(blur)/回车即保存并创建子目录,静默无提醒;8 个子目录只读高亮展示(.dir-value.readonly)
    • 移除"运行中锁定"标签、重启/迁移 Modal、notifyLocked/askMigrate/restartWithMigrate/迁移 WS 逻辑与相关 import/样式

验证(增量):

  • 后端:tests/api/test_config.py 全量 22 项通过,新增 3 项 —— test_cache_dirs_root_readonly_contract(Root Dir 可编辑、子目录 readonly、命名 Root Dir/根目录)、test_update_data_dir_no_restart_and_subdirs_reset(requires_restart=False + 子目录重置新根)、test_config_update_creates_subdirs_and_sync_env(同进程创建子目录 + 环境变量同步)
  • 前端 npm run build 成功;check-i18n OK
  • 实测量:改 Root Dir → requires_restart=false、8 子目录重置为新根、共享磁盘上子目录真实创建

TODO 状态:

  • 后端 — Root Dir 改名 / 子目录重置 / 去重启 / env 注入 + runner 透传
  • 前端 — Root Dir 失焦保存 + 子目录只读高亮 + 去迁移弹窗
  • 测试 — test_config(契约 / 重置 / 创建 / env)+ 构建
  • 文档 — Settings / Architecture / VERSION 同步

迭代 4(2026-09-01 22:30:44):Settings 四类 UI 细化

功能概述:

  • Settings 页四类细节优化:侧边栏字号缩小、Root Dir 变更加确认弹窗、子目录只读改灰字无框、Provider 模型列表化加复制图标。

变更内容:

  1. 前端 — SettingsView.vue
    • 侧边栏字号:.menu-item 14px→13px、.menu-icon 18px→16px,区别于顶部主导航(14px)
    • Cache Paths / Root Dir 变更确认:编辑框后附加小 Save 按钮(.dir-save-btn,不使用失焦/回车自动保存);点击 Save 或按回车时若值有变更,弹出确认弹窗(.dir-confirm-modal)——确定保存新空白路径(原数据不迁移);取消不保存、恢复原路径;新增 confirmSaveDir/doSaveDir/cancelSaveDir 与 dirConfirmOpen/dirConfirmTarget
    • Cache Paths / 子目录:.dir-value.readonly 由浅蓝底+描边改纯灰色文字、无框
    • Providers / 模型:模型由横排 a-tag 改纵向内部列表(.provider-models-list,panel-row column)——一行一个、左对齐、文字 12px、每行带复制图标(.pm-copy,CopyOutlined,点击复制模型名,新增 copyModel)
  2. i18n — en.js / zh.js:新增 rootDirChangeTitle / rootDirChangeContent / copyModel(en/zh 双语,check-i18n 通过)
  3. 测试 — tests/webui/test_ui.py:更新 test_settings_providers_no_activate_with_status(模型标签 .provider-model-tag → 模型列表 .pm-item / .pm-copy);新增 test_settings_root_dir_confirm_cancel(取消恢复原路径)、test_settings_root_dir_confirm_ok_saves(确定保存,结束后恢复原根目录防污染)
  4. 文档:docs/prds/Settings.md §1.2 / §2 / §9 同步更新

验证(增量):

  • 前端 npm run build 成功;check-i18n OK;py_compile test_ui.py 通过
  • (本沙箱缺 pytest/playwright/Chromium,WebUI 测试未在本机执行;API 后端不受前端改动影响,构建产物已在开发环境 8080 验证可达)
  • 沙箱 500 根因与修复:沙箱内 ~/.benchscope(Home 目录)不可写,Root Dir 确认保存触发 save() 写 settings.json 时 PermissionError → 500。已按沙箱开发模式约定将后端以 BENCHSCOPE_DATA_DIR=<workspace>/.dev-data 重启(数据根落在可写工作区内),POST /api/config/dirs 实测返回 200 + 8 子目录重置新根,500 消除。

TODO 状态:

  • 前端 — 侧边栏字号 / Root Dir 确认弹窗 / 子目录灰字 / Provider 模型列表 + 复制
  • i18n — 新增 rootDirChange* / copyModel(en/zh)
  • 测试 — test_ui 更新与新增
  • 文档 — Settings / VERSION 同步

迭代 5(2026-09-01 23:37:30):Bench Engines 卡片边框按来源标色

功能概述:

  • Settings → Bench Engines 每个引擎卡片边框加色:内置引擎蓝色、用户上传自定义引擎紫色。

变更内容:

  1. 后端 — benchs.py:engine_summary 新增 origin 字段(builtin / custom),依 BUILTIN_ENGINE_IDS(随包内置引擎 id 集:benchscope / vllm-0.23 / sglang-0.5.10 / native-hf / mock)判定;上传新增的引擎 id 不在集内 → custom
  2. 前端 — SettingsView.vue:.bench-card 依 eng.origin 附加 .bench-origin-builtin(蓝,--ant-color-primary)/ .bench-origin-custom(紫,--ant-color-purple)边框类
  3. 文档:docs/prds/Settings.md §5.2 同步

验证(增量):

  • py_compile benchs.py 通过;npm run build 成功
  • 实测 GET /api/benchs:现有 5 引擎均返回 origin=builtin(定制引擎经 Upload 导入后为 custom)
  • 前端构建产物已含两条边框规则,dev 后端(重启加载新代码)8080 可达

TODO 状态:

  • 后端 — engine_summary 加 origin(builtin/custom)
  • 前端 — 引擎卡片边框蓝/紫
  • 文档 — Settings / VERSION 同步

迭代 6(2026-09-01 23:45:12):Performance 默认卡片对齐 Accuracy + Provider 模型改回绿色标签

功能概述:

  • Performance 默认页三张介绍卡片样式与 Accuracy 默认页一致,图标补充渐变背景色;
  • Settings → Providers 卡片模型由「一行一个列表」改回「绿色标签框 + 复制小图标」。

变更内容:

  1. 前端 — PerformanceView.vue:feature-card 图标按序号附加 fi-${idx % 4} 渐变底色类(蓝/绿/橙/紫,对齐 Accuracy 的 .fi-0..3);卡片标题/描述样式同步 Accuracy(标题 14px/600、描述次级色 2 行截断)
  2. 前端 — SettingsView.vue:Provider 模型行改回绿色标签框(a-tag color="green" .provider-model-tag,可换行),标签内带复制小图标(.tag-copy,点击复制模型名);移除上一版的 .provider-models-list / .pm-item / .pm-copy 列表样式
  3. 测试 — tests/webui/test_ui.py:test_settings_providers_no_activate_with_status 改回断言 .provider-model-tag / .tag-copy
  4. 文档:docs/prds/Settings.md §2、docs/prds/Performance.md §0.1 同步

验证(增量):

  • npm run build 成功;check-i18n OK;py_compile test_ui.py 通过
  • 实测 dev 8080:Performance 构建产物含 .fi-0..3 渐变类、Settings 构建产物含 .tag-copy 样式,均 HTTP 200 可达

TODO 状态:

  • 前端 — Performance 三卡图标背景色 + 卡片样式对齐 Accuracy
  • 前端 — Provider 模型改回绿色标签 + 复制图标
  • 测试 — test_ui 更新
  • 文档 — Settings / Performance / VERSION 同步

迭代 7(2026-09-02 17:07:47):Sessions 对话采样参数 + Markdown 渲染升级

功能概述:

  • Sessions 顶部性能栏新增对话采样参数 top_k / temperature / top_p(随发送请求携带,覆盖 quality 映射);
  • 前端 Markdown 渲染由自实现解析升级为 marked + DOMPurify(支持 GFM 表格 / 标题 / 引用等,XSS 净化);
  • 配套 UI 细化:输入栏下拉统一样式、发送/停止改圆形图标按钮、会话气泡与侧栏样式优化。

变更内容:

  1. 后端:
    • benchscope/server/api_sessions.py:ChatRequest 新增可选 top_k / temperature / top_p
    • benchscope/session_manager.py:stream_chat 透传三参数到 payload;显式 temperature 优先于 quality 映射(high 0.9 / medium 0.5 / low 0.2),top_k>0 / top_p 非空时写入(扩展字段,缺失/不支持忽略)
  2. 前端 — web/src/views/SessionsView.vue:
    • 顶部性能栏新增三个 a-input-number 采样参数输入(top_k 1–200 / temp 0–2 / top_p 0–1),localStorage 记忆(benchscope_chat_top_k / benchscope_chat_temperature / benchscope_chat_top_p),随发送请求体携带
    • renderMarkdown 改用 marked.parse + DOMPurify.sanitize;代码块经 wrapCodeBlocks 包装(语言标签 + Copy 按钮),Copy 用事件委托 onDocClick(v-html 动态插入,避免内联 onclick 被净化),onBeforeUnmount 移除监听
    • UI:输入栏 Provider/Model/Quality 下拉统一灰色小字样式;发送/停止改圆形小图标按钮(蓝圆白箭头 / 白色方块);会话气泡渐变、侧栏浅色化等
    • 依赖新增:marked ^18 + dompurify ^3.4(web/package.json + package-lock.json)
  3. 测试:tests/api/test_sessions.py 新增 test_chat_with_sampling_params(携带三参数走 SSE 流式并通过 mock)

验证(增量):

  • 后端 tests/api/test_sessions.py 增量运行通过(SSE 对话 + 采样参数;mock 流式约 16KB 回复、逐块 0.015s,单次对话约 45s 完成)
  • 前端 npm run build 成功;check:i18n OK(采样参数名 top_k/temp/top_p 为技术参数,不新增 i18n 键)
  • npm run build 刷新 benchscope/webui 构建产物(含 marked/dompurify)

TODO 状态:

  • 后端 — ChatRequest + stream_chat 透传采样参数
  • 前端 — 采样参数输入 + 持久化 + 随请求携带
  • 前端 — Markdown 渲染升级(marked + DOMPurify + 代码块 Copy 事件委托)
  • 测试 — test_chat_with_sampling_params
  • 文档 — Sessions / Software / VERSION 同步

迭代 8(2026-09-02 18:16:21):Sessions 侧栏与会话项体验细化

功能概述:

  • Sessions 侧栏会话项升级:每项显示标题 + 修改时间,末尾新增三点菜单(重命名 / 删除);新建按钮图标改为加号;
  • 会话项前置小图标在该会话通讯中切换为三个点滚动动画(表示正在沟通);
  • 代码块统一黑底白字、绿色高亮样式。

变更内容:

  1. 后端 — 会话重命名 API:
    • benchscope/session_manager.py:新增 SessionManager.update_title(更新标题 + 刷新 updated_at + 持久化)
    • benchscope/server/api_sessions.py:新增 RenameRequest 与 PATCH /api/sessions/{session_id}/title(未知会话 404,返回 {ok, session})
  2. 前端 — web/src/views/SessionsView.vue:
    • 新建会话按钮图标 SmileOutlined → PlusOutlined(加号)
    • 会话项布局改为:前置小图标 + session-main(标题 session-name + 修改时间 session-time,formatModTime 格式化)+ 末尾三点 MoreOutlined(a-dropdown → 重命名 / 删除菜单)
    • 重命名弹框 a-modal(renameOpen/renameValue/renaming/renameTargetId,confirmRename 调 api.renameSession 后刷新列表)
    • 通讯动画:新增 streamingId(sendMessage 置为当前会话、finally 清空);会话项图标 streamingId === s.session_id 时渲染 .session-typing 三个点并 @keyframes sessionDotRoll 起伏滚动
    • 代码块样式改黑底白字绿高亮:.code-block 背景 #0d1117、正文 #e6edf3、语言标签 / Copy hover 用绿 #3fb950、.inline-code 黑底绿字
    • 移除旧的 hover CloseOutlined 删除图标(删除改入三点菜单)
  3. 前端 API — web/src/api/index.js:新增 renameSession(id, title)
  4. i18n — en.js / zh.js:新增 sessionRename / sessionRenamePlaceholder(双语,check-i18n 通过)
  5. 测试:
    • tests/api/test_sessions.py:新增 test_rename_session(创建 → 重命名 → 列表读取新标题 → 未知会话 404)
    • tests/webui/test_ui.py:新增 test_sessions_rename_modal(三点菜单 → 重命名弹框 → 保存后列表标题更新)

验证(增量):

  • 后端 tests/api/test_sessions.py 增量运行(含新 rename 用例,SSE 对话用例因 mock 默认 16KB 回复、逐块 0.015s 较慢)
  • 实测 PATCH /api/sessions/{id}/title:返回新标题 + 刷新 updated_at;未知会话 404
  • 前端 npm run build 成功;check:i18n OK;py_compile test_ui.py 通过
  • (本沙箱缺 playwright/Chromium,WebUI 测试未本机执行;API 后端不受前端改动影响)

TODO 状态:

  • 后端 — update_title + PATCH title API
  • 前端 — 加号按钮 / 会话项时间 + 三点菜单(重命名 / 删除)/ 通讯三点滚动 / 代码黑底绿字
  • i18n — sessionRename*(en/zh)
  • 测试 — test_rename_session + test_sessions_rename_modal
  • 文档 — Sessions / VERSION 同步

迭代 9(2026-09-02 19:00:36):Sessions 会话日志落盘 + 清空居中弹窗 + 采样参数右对齐

功能概述:

  • Sessions 对话记录落盘为日志文件到 logs_dir/sessions/<id>.log(此前只在 sessions/*.json 缓存,日志目录无文件);
  • 「清空会话」由 popconfirm 改为页面居中确认弹窗;
  • 顶部采样参数 top_k / temperature / top_p:宽度足够时右对齐,宽度不足时换行。

变更内容:

  1. 后端 — session_manager.py(会话日志落盘):
    • 新增 SessionManager.persist_log(session):把会话以可读 transcript 写到 logs_dir/sessions/<id>.log(标题 / ID / 模型 / Provider / 创建 / 更新时间 + 逐条 [时间戳] role + [thinking] + 正文)
    • 在 create_session、add_message、update_perf、update_title 处调用 persist_log
    • delete_session 同步删除对应 .log;clear_all 清空 logs_dir/sessions/*.log
  2. 前端 — web/src/views/SessionsView.vue:
    • 清空居中弹窗:clear-all 按钮改为 @click="clearOpen = true" 打开居中 a-modal(centered、ok-danger,内容含 WarningOutlined 警告图标 + clearConfirm 文案),去掉原 a-popconfirm;clearAllSessions 成功后关闭弹窗
    • 采样参数布局:.chat-header 改 display:flex; flex-wrap:wrap; align-items:center;.perf-bar flex:1 1 auto;.chat-params margin-left:auto; justify-content:flex-end —— 宽度足够参数右对齐同排,宽度不足换行仍靠右
    • 新增 clearOpen ref;新增 i18n 键 clear
    • 弹窗/菜单类为 teleport 到 body 的样式用 :global()(.clear-modal-content / .clear-warn-icon / .menu-icon / .menu-danger)
  3. i18n — en.js / zh.js:新增 clear(Clear / 清空,双语,check-i18n 通过)

验证(增量):

  • 前置单测(同一进程、同命名空间):create_session → add_message → persist_log 生成 logs/sessions/<id>.log;update_title 刷新;delete_session 删除日志,均符合预期
  • 沙箱后端实际 HTTP 走查(创建会话/重命名/删除):日志随会话增删同步
  • 前端 npm run build 成功;check:i18n OK
  • 后端 tests/api/test_sessions.py 增量运行(含 rename 用例;SSE 对话用例因 mock 16KB 回复较慢)

TODO 状态:

  • 后端 — persist_log + delete/clear 同步日志
  • 前端 — 清空居中弹窗 / 采样参数右对齐换行
  • i18n — clear(en/zh)
  • 验证 — 日志落盘单测 + 构建 + 会话 API 测试
  • 文档 — Sessions / VERSION 同步

迭代 10(2026-09-02 19:35:41):Sessions 代码块语法高亮(highlight.js + 主题)

功能概述:

  • 对话区 Markdown 代码块由「纯黑底」升级为 highlight.js 语法着色 + 暗色主题,按语言高亮关键字 / 字符串 / 注释等。

变更内容:

  1. 依赖 — web/package.json + package-lock.json:新增 highlight.js ^11.12.0
  2. 前端 — web/src/views/SessionsView.vue:
    • 按需引入 highlight.js/lib/core 并注册常用语言(javascript / typescript / python / json / bash / xml / css / sql / java / c / cpp / go / rust / yaml / markdown / plaintext)+ 引入暗色主题 highlight.js/styles/atom-one-dark.css
    • 自定义 marked.Renderer().code(marked v18 现为单 token 参数 {text, lang, escaped}):highlightCode(code, lang) 按语言高亮,未识别自动 highlightAuto,失败回退 escapePlain;输出 <pre><code class="language-x hljs">…</code></pre>
    • wrapCodeBlocks 正则改为 <pre><code([^>]*)>…,从开标签提取 language-(\w+) 作语言标签(兼容 language-x hljs 与仅 hljs)
    • CSS:.code-block pre code.hljs 去掉主题自带底色/内边距、沿用黑底 #0d1117,保留语法配色;SessionsView 分块含主题 CSS
    • 高亮 span class="hljs-*" 经 DOMPurify.sanitize 保留(默认允许 span/class)
  3. 文档:docs/rules/Software.md §3 前端依赖 + docs/prds/Sessions.md §2 代码高亮小节

验证(增量):

  • node 端到端模拟(marked + hljs + wrapCodeBlocks):python/js 代码块输出 hljs-keyword / hljs-string / hljs-number span 且语言标签正确,无语言代码块降级为 code,行内代码不受影响,< 等正常转义
  • 构建产物:SessionsView-*.js 分块体积约 177kB(含 hljs core + 语言 + 主题),SessionsView-*.css 含 .hljs-* 主题规则
  • 前端 npm run build 成功;check:i18n OK(无新增 i18n 键)
  • host 8080 已服务最新构建(最新 index-*.js + SessionsView-*.js 分块 HTTP 200)

TODO 状态:

  • 依赖 — highlight.js 引入 + 注册常用语言 + 暗色主题
  • 前端 — marked 自定义 code renderer 高亮 + wrapCodeBlocks 适配 + CSS 主题覆盖
  • 验证 — node 端到端 + 构建
  • 文档 — Software / Sessions / VERSION 同步

迭代 11(2026-09-02 22:49:28):Sessions 代码块黑底 + 行号 + 字体优化

功能概述:

  • 代码块改用纯黑背景,增加行号侧栏,并整体优化代码等宽字体(字号/行高/缩进)。

变更内容:

  1. 前端 — web/src/views/SessionsView.vue:
    • 行号:wrapCodeBlocks 新增 .code-body(flex:左侧 .code-gutter + 右侧 <pre>);按 hljs 高亮输出中换行数(1:1 保留源码换行)统计总行数,为每行生成 <span>n</span> 行号;横向滚动仅作用于代码区,行号侧栏固定
    • 纯黑背景:.code-block 背景 #0a0a0a、header #151515、gutter #0d0d0d + 右侧分隔线 #262626;行号置灰 #555
    • 字体优化:代码统一 JetBrains Mono / Fira Code / SF Mono / SFMono-Regular / Cascadia Code / Consolas / Liberty Mono / monospace(无则回退系统等宽),font-size 13px、line-height 1.6、tab-size 4、font-variant-ligatures:none;.code-lang / .copy-btn 同步小字号加字距;行内 .inline-code 同一字体栈
  2. 文档:docs/prds/Sessions.md §2 代码样式/语法高亮小节同步(黑底、行号、字体)

验证(增量):

  • node 端到端:3 行 python 块 → .code-gutter 生成 <span>1</span><span>2</span><span>3</span>,code-body 结构 + hljs 高亮 span 均保留
  • 构建产物 SessionsView-*.css 含 code-gutter / code-body / #0a0a0a / JetBrains Mono 规则
  • 前端 npm run build 成功;check:i18n OK;host 8080 已服务最新构建

TODO 状态:

  • 前端 — 行号侧栏 + 纯黑底 + 代码字体优化
  • 验证 — node 端到端 + 构建 + host 8080
  • 文档 — Sessions / VERSION 同步

迭代 12(2026-09-02 23:29:03):Sessions 代码块行号逐行对齐 + 弱化 Header

功能概述:

  • 修复「行号不在每行」:从「独立行号侧栏」改为每行一个 flex 行(行号 + 代码),保证行号与代码严格逐行对齐(多行字符串跨行 span 亦正确)。
  • 弱化「Copy 按钮 / 语言提示突兀」:Header 极简、语言标签置灰小字、Copy 默认隐藏仅悬停显示。

变更内容:

  1. 前端 — web/src/views/SessionsView.vue:
    • 新增 splitCodeLines(html):把 hljs 高亮 HTML 按 \n 拆行,遇跨行 span 在本行末 </span> 闭合、下一行重开,保证每行标签闭合且高亮不丢
    • mdRenderer.code 直接在 renderer 内生成完整 .code-block(不再经 wrapCodeBlocks):按行输出 <div class="code-line"><span class="code-ln">N</span><span class="code-lc">…高亮…</span></div>;wrapCodeBlocks 移除、renderMarkdown 不再二次包装
    • onDocClick 复制改为拼接各 .code-lc 的 textContent(浏览器自动解码实体,含多行 span),不包含行号
    • CSS:.code-line flex 行(.code-ln 定宽 44px 右对齐置灰 / .code-lc white-space:pre);.code-body overflow-x:auto横向滚动;Header 极简(官方背景#0e0e0e、code-lang置灰#6b6b6b 小字、.copy-btn opacity:0悬停.code-block:hover` 显示)
  2. 文档:docs/prds/Sessions.md §2 代码样式/语法高亮小节同步

验证(增量):

  • node 端到端:6 行 python(含 """ 多行字符串跨行高亮 span)→ 生成 6 行 .code-line,每行行号+代码齐全、跨行 span 闭合/重开;拼接 .code-lc textContent 还原 === 源码
  • 构建产物 SessionsView-*.css 含 code-line / code-ln / code-lc / copy-btn 规则;npm run build 成功;check:i18n OK
  • host 8080 已服务最新构建

TODO 状态:

  • 前端 — splitCodeLines 逐行结构 + renderer 内生成 + onDocClick 改拼接 + CSS 逐行 flex / Header 弱化
  • 验证 — node 端到端(含多行 span)+ 构建 + host 8080
  • 文档 — Sessions / VERSION 同步

迭代 13(2026-09-02 23:43:48):Sessions 代码块去行号 + 更小更紧凑字体

功能概述:

  • 对话代码块移除行号,只展示代码;代码字体调比正文更小、更紧凑。

变更内容:

  1. 前端 — web/src/views/SessionsView.vue:
    • 移除 splitCodeLines 与逐行 .code-line 结构;mdRenderer.code 简化为直接输出 <div class="code-block"><header><pre><code>高亮 HTML</code></pre></div>(无行号)
    • onDocClick 复制改回读取 <pre> 的 textContent
    • CSS:删除 .code-line/.code-ln/.code-lc/.code-lines/.code-body 规则;.code-block pre/code 代码字体定为 12.5px / line-height 1.4 / tab-size 4(正文为 14px/1.75,代码更小更紧凑),代码区 padding 8px 14px
  2. 文档:docs/prds/Sessions.md §2 代码样式/语法高亮小节同步(无行号、紧凑小号字体)

验证(增量):

  • node 端到端:python 块输出简洁 <pre><code>(含 hljs span、无行号、无 code-line 结构),行内代码不受影响
  • 构建产物 SessionsView-*.css 含 .code-block / 12.5px / line-height:1.4,不含 code-line/code-ln/code-gutter
  • npm run build 成功;check:i18n OK;host 8080 已服务最新构建

TODO 状态:

  • 前端 — 去行号 + renderer 简化 + onDocClick 改回 pre + 紧凑字体 CSS
  • 验证 — node + 构建 + host 8080
  • 文档 — Sessions / VERSION 同步

迭代 14(2026-09-04 18:50:00):Performance 第二行双面板 + Console→Logs(Phase-1)

功能概述:

  • 第一行 Console 面板改名 Logs:日志行高亮(命令/错误/警告/成功/区块着色)+ 字体减小(10px)。
  • 第二行由单张「Realtime Data」card 改为双面板:Profile Progress(1/3) + Real-Time Metrics(2/3)(后者承载原 MetricsTable + 本地阈值)。
  • Phase-1:用现有数据(完成行/进度/currentPos/elapsed)实现布局与进度、指标网格;真实逐请求实时流规划在 Phase-2。

变更内容(前端 — web/src/views/PerformanceView.vue + i18n):

  1. Logs:标题 t('terminal')→t('logs');新增 logLineClass(line) 按内容返回 CSS 类(.log-cmd/.log-error/.log-warn/.log-ok/.log-head),.terminal-box 字体 11px→10px
  2. 第二行双面板(.row-2):
    • Profile Progress(.profile-panel 1/3):状态卡片(profiling/error/completed 三态着色 + Error 图标)、双进度条(Profiling 请求完成度 reqPct、Records case 处理度 recPct)、6 卡关键指标(Progress/Errors/Request Rate/Processing Rate/Elapsed/ETA,均 profileMetrics computed,Phase-1 按完成行/elapsed 估算,fmtSec 格式化)
    • Real-Time Metrics(.rtm-panel 2/3):header 右侧 case-请求数(rtCaseText)+ 原 TPOT/Output 本地阈值控件 + 原 MetricsTable
    • 两面板 header 右侧灰色 .rt-case-text
  3. i18n en/zh:新增 logs / profileProgress / realTimeMetrics / profCurrentStatus / profProfiling / profError / profCompleted / profRecords / profProgress / profErrors / profReqRate / profProcRate / profElapsed / profEta / reqCountSuffix
  4. 文档:docs/prds/Performance.md §1.5(Console→Logs)+ 新增 §1.6(第二行双面板,含 Phase-1/Phase-2 说明)

验证(增量):

  • npm run build 成功;check:i18n OK
  • host 8080 服务最新构建:PerformanceView-*.js 含 profileProgress/realTimeMetrics/prof-status-card/prof-metrics/rt-case-text/logLineClass,PerformanceView-*.css 含 row-2/prof-status-card/prof-metrics/rt-case-text/log-error 规则
  • 沙箱 dev 后端 8080 可达(v1.0.9-dev)

TODO 状态:

  • Logs 改名 + 高亮 + 小字
  • 第二行双面板布局 + Profile Progress(状态/双进度/指标网格)+ Real-Time Metrics(MetricsTable + header)
  • i18n 新键 + 构建 + dev 8080 验证
  • 文档 — Performance / VERSION 同步
  • Phase-2(规划)— 后端实时逐请求指标流 + 趋势图/sparkline/实时 req/s

迭代 15(2026-09-04 22:30:00):Performance 第二行两面板重做 —— Realtime Data 独立整行 + Profile Progress / Real-Time Metrics(antd 版)

功能概述:

  • 布局厘清:原始「Realtime Data」面板(所有请求行表格 MetricsTable,含 Best/BestPerf、本地面板阈值、列设置、导出)保持不变,平移到独立整行(.realtime-data-card,位于第二行与统计图行之间);第二行为两个“单个请求”面板 Profile Progress(1/3)+ Real-Time Metrics(2/3)。
  • Profile Progress / Real-Time Metrics 重做:由终端绿风格改为 antd 对齐(卡片样式、antd 色板),指标内容保持一致。
  • 韧性问题修复:rtCaseText 内 const t = theTask.value 遮蔽 i18n t,运行中任务(有 currentPos)触发 TypeError: t is not a function 导致 Performance 视图空白 → 局部变量改名 tk。

变更内容(前端 — web/src/views/PerformanceView.vue):

  1. Realtime Data 独立整行:原 MetricsTable + TPOT/Output 本地阈值控件从 Real-Time Metrics 面板移出,置于独立 .realtime-data-card 整行(标题 t('realtimeData'))。
  2. Profile Progress(左 1/3):状态卡片(.pp-status 三态:profiling 蓝 / error 红+Error 图标 / completed 绿)、双进度条(.pp-bar-row Profiling=reqPct、Records=recPct)、每个指标一行(.pp-metrics):Progress / Errors(errorsHaveErr 有错标红)/ Request Rate / Processing Rate / Elapsed(fmtClock Mm Ss)/ ETA(完成显示 0s)。
  3. Real-Time Metrics(右 2/3):
    • 单表 + 单表头(.rtm-grid.rtm-head):Metric | avg | min | max | p99 | p90 | p50 | std,Metric 列右对齐
    • 固定 11 行(LIVE_METRIC_DEFS):TTFT(ms) / TTST(ms) / TPOT(ms)(近似 (ReqLatency−TTFT)/max(OSL−1,1))/ Req Latency(ms) / ITL(ms) / Output TPS/User(=output_tps/并发)/ OSL(tokens) / ISL(tokens) / Output TPS / Req-sec / Requests
    • 默认值 N/A 灰色(.rtm-empty),有值绿色高亮(.rtm-cv);移除异常红/! 告警条件样式(不再阈值变色)
    • 表格行 flex:1 拉伸填满面板;Real-Time 高度与 Profile 保持等高(profilePanelRef/measureProfileRow 测量 → rtmCardStyle 赋高,ResizeObserver + 任务状态变化重测)
    • 移除:单位换算开关(Unit ms/tok↔s/k)、复制快照小图标按钮、copySnapshot 函数、CopyOutlined 导入
  4. Logs 高亮收窄:错误正则去掉宽泛 fail(避免 Failed requests: 汇总行误标红),改为 error|exception|traceback|失败|FAILED。
  5. i18n en/zh:新增 liveGroupLatency/liveGroupThroughput/liveGroupLength/liveCopySnapshot/liveCopied/liveSamples(部分后续弃用,保留无副作用)。
  6. 文档:docs/prds/Performance.md §1.5/§1.6 同步(第二行 antd 版、等高、单表右对齐、N/A 绿值)。

验证(增量):

  • npm run build 成功;check:i18n OK;dev 8080 / mock 8001 均 UP(v1.0.9-dev)
  • 运行中任务 Performance 页不再抛 TypeError: t is not a function(视图正常渲染)

TODO 状态:

  • Realtime Data 独立整行(保持不变)
  • Profile Progress(antd:状态/双进度/每指标一行/ETA 补齐)
  • Real-Time Metrics(单表单表头右对齐 + TPOT/Output TPS-User 派生 + N/A 灰/有值绿 + 等高/填满)
  • 移除单位开关 / 复制按钮 / 异常告警条件样式
  • rtCaseText 变量遮蔽修复(运行中页面空白)
  • 文档 — Performance / VERSION 同步
  • Phase-2(规划)— 后端实时逐请求指标流 + 趋势图/实时 req/s

迭代 16(2026-09-04 22:55:00):Real-Time Metrics 指标直算 + 单元格状态着色 + header 完整显示

功能概述:

  • Real-Time Metrics 表格每个指标全量统计(7 列)直算:TPOT 与 Output TPS/User 由后端逐请求分布下发(不再前端近似/仅 avg),min/max/p99/p90/p50/std 均真实可算。
  • 单元格状态着色:可计算未出值→灰色横线 -;有值→蓝色;不可计算→灰黑 N/A。
  • 表格内容垂直居中、header 右侧 case-请求数完整显示(不再截断);高亮改为蓝色;Perf/Cases 保持 antd 配色。

变更内容:

  1. 后端 benchscope/benches/builtin_bench.py _live_stats:
    • 新增逐请求分布:TPOT((end−first_token)×1000/max(completion−1,1))、OutputTPSPerUser(completion/(end−start))→ stat_of 全量统计
    • stats.metrics 新增 TPOT / OutputTPSPerUser 两键
  2. 前端 web/src/views/PerformanceView.vue:
    • LIVE_METRIC_DEFS:TPOT、Output TPS/User 改为 src 分布行(读取 metrics.TPOT / metrics.OutputTPSPerUser),去掉前端近似与单值 N/A 特殊分支
    • 单元格改为带类型(numCell/dashCell/naCell → cols 数组),模板按类型渲染;CSS .rtm-fill(蓝)#1677ff / .rtm-dash(灰横线)#bfbfbf / .rtm-na(灰黑)#595959
    • .rtm-grid 增加 align-items:center 垂直居中;.rt-case-text 去截断完整显示
  3. 文档:docs/prds/Performance.md §1.6(Real-Time Metrics 指标表 + 每指标计算方式 + 单元格类型着色);本文件迭代记录

验证(增量):

  • builtin_bench.py 语法 OK;npm run build 成功;check:i18n OK;dev 8080 / mock 8001 UP
  • 运行任务后 task_live 快照 metrics 含 TPOT / OutputTPSPerUser,前端两行显示全部统计而非 N/A

TODO 状态:

  • 后端直算 TPOT / Output TPS/User 全量统计
  • 前端映射为完整分布行 + 单元格状态着色(灰横线 / N/A / 蓝)
  • 表格垂直居中 + header 完整显示 + 蓝色高亮 + Perf/Cases antd
  • 文档 — Performance / VERSION 同步
  • Phase-2(规划)— 后端实时逐请求指标流 + 趋势图/实时 req/s

迭代 17(2026-09-05 01:10:00):Performance 单个请求回看 + 按请求实时快照持久化 + Datas/Perfs 详情弹窗

功能概述:

  • Performance:每个请求(case×concurrency)的 Profile Progress / Real-Time Metrics 均被缓存;任务完成后点击 Cases 中的请求数颜色块可查看该请求的两个面板,默认显示最后一个已完成请求的数据。
  • 抽出可复用 LivePanels 组件(snapshot + live 两 prop),由单个请求快照渲染两个面板。
  • Datas/Perfs:Perf Datas 表格末尾加固定「详情」列,点击弹窗展示该请求的 Profile Progress / Real-Time Metrics。
  • 后端持久化:内置引擎每个请求结束落盘实时快照到 run_dir/live/<reqKey>.json,新增 GET /api/logs/runs/{run_id}/live 读取。

变更内容:

  1. 前端 web/src/components/LivePanels.vue(新增):从 snapshot.stats 渲染 Profile Progress + Real-Time Metrics(把原 PerformanceView 第二行逻辑抽离),内部含等高测量;同组件复用于 Performance 第二行与 Datas/Perfs 弹窗。
  2. 前端 PerformanceView.vue:第二行改用 <LivePanels :snapshot="activeLiveSnapshot" :live="isLiveRunning" />;新增 selectedReqKey/selectReq/isReqSelected;Cases 请求数标签可点击(.req-tag/.req-selected);activeLiveSnapshot 依次优先:选中请求 → 执行中 currentPos → 最后一个已完成请求。
  3. 前端 store/test.js:新增 liveReq[taskId][reqKey] 逐请求缓存(reqKeyOf(label, case_id, concurrency) 与后端口径一致),task_live 每帧更新;删除任务时清理;导出 reqKeyOf。
  4. 后端 task_manager.py:内置引擎分支捕获每请求最终快照 → _save_request_live 写 run_dir/live/<key>.json(_request_live_key)。
  5. 后端 api_logs.py:新增 GET /runs/{run_id}/live 返回按请求快照列表。
  6. Datas/Perfs:MetricsTable 新增 showDetail/detail 事件 + 最后固定列;RunDataPanel 透传并 re-emit;DatasPerfsView 调用 api.getRunLive、openDetail 匹配快照弹出 Modal 展示 <LivePanels>(无快照回退行指标构造最小 Profile 快照)。
  7. i18n en/zh:新增 perfDetail / reqViewHint。
  8. 文档:docs/prds/Performance.md §1.6(LivePanels 复用、单个请求回看、Datas 详情弹窗、持久化);本文件迭代记录。

验证(增量):

  • npm run build 成功;check:i18n OK;后端语法 OK;dev 8080 / mock 8001 UP
  • 端到端:内置引擎小任务运行完成 → run_dir/live/*.json 落盘(含 TTFT 全分布),GET /runs/{run_id}/live 返回该快照
  • /api/logs/runs/{run_id}/live 端点对旧运行返回空数组(不报错)

TODO 状态:

  • LivePanels 组件(snapshot 驱动,复用于 Performance / Datas 弹窗)
  • Performance 逐请求缓存 + Cases 点击回看 + 默认末请求
  • 后端按请求持久化实时快照 + /runs/{id}/live 端点
  • Datas/Perfs 详情固定列 + 弹窗(Profile Progress + Real-Time Metrics)
  • i18n + 文档同步
  • Phase-2(规划)— 趋势图/sparkline/实时 req/s 增强

迭代 18(2026-09-05 01:35:00):单请求快照拓展到原生引擎 + 引擎导入逻辑优化

功能概述:

  • 单请求快照拓展到原生引擎:vLLM/SGLang 无逐请求实时流,现于每个并发点结束时用解析指标构造每请求快照并落盘;Datas/Perfs 详情弹窗与 Performance 点击回看同样可用。
  • 优化引擎创建/导入逻辑(Settings → Bench Engines Upload Engine):写文件改为原子写;上传包合并前先做包内自检。

变更内容:

  1. 后端 task_manager.py:
    • _record_row:非内置引擎时用 _snapshot_from_row(row) 构造每请求快照并 _save_request_live 落盘 run_dir/live/<key>.json
    • 新增模块级 _snapshot_from_row:由解析 metrics 构造快照(TTFT/TPOT/ITL/ReqLatency 的 avg(=mean)/p50(=median)/p99、Output TPS/Req-sec/OSL/ISL 的 avg;min/max/p90/std 置 None)
  2. 前端 PerformanceView.vue:新增 loadPersistedLive(taskId) 用 api.getRunLive 加载已落盘快照并入 test.liveReq(原生引擎回看);任务切换/加载及任务变为 done/stopped/error 时调用。
  3. 后端 benchs.py(引擎导入优化):
    • 新增 _atomic_write(path, text)(临时文件 + os.replace),save_benchs_yaml_text 与 import_engine_package 写 benchs.yaml/bench-params.yaml 均原子化
    • import_engine_package 合并前包内自检:id 必填且包内唯一、kind ∈ {builtin,vllm,sglang,native,mock}
  4. 前端 api/index.js:新增 getRunLive。
  5. 文档:docs/prds/Performance.md §1.6(原生引擎快照构造 + 引擎导入优化);本文件迭代记录。

验证(增量):

  • npm run build、check:i18n、后端语法 OK;dev 8080 / mock 8001 UP
  • _snapshot_from_row 单测:合成原生行 → 快照 total/errors/t、TTFT avg/p99/p50、OSL/ISL avg 均正确
  • GET /api/benchs 列表正常(原子写/自检不破坏现有引擎)
  • 内置引擎端到端落盘不受影响(_save_request_live 路径未变)

TODO 状态:

  • 原生引擎每请求快照构造 + 落盘(_snapshot_from_row)
  • Performance 完成后/切换加载持久化快照(原生回看)
  • Datas/Perfs 原生详情(读取同一 live/ 目录)
  • 引擎导入:原子写 + 包内自检
  • i18n / 文档同步
  • Phase-2(规划)— 趋势图/sparkline/实时 req/s 增强

迭代 19(2026-09-05 13:40:00):原生引擎运行中随并发点更新 Profile Progress / Real-Time Metrics

功能概述:

  • 原生引擎(vLLM/SGLang)无逐请求实时流,之前第二行面板在运行中不更新;现每个并发点完成时广播 task_live(用解析指标构造的快照),面板随各并发点完成而逐步更新,并同步落盘供历史回看。

变更内容:

  1. task_manager.py _record_row:原生引擎分支在持久化每请求快照后额外广播 task_live(_snapshot_from_row(row) 构造快照)→ store liveReq/activeLiveSnapshot 随即更新,第二行展示该并发点 Profile Progress / Real-Time Metrics(状态 Profiling)。

验证(增量):

  • 原生 mock 任务(concurrency [1,2])运行完成 → /runs/{id}/live 返回 2 个按并发点快照(1、2),运行中面板随点完成更新
  • build/语法/i18n OK;dev 8080 / mock 8001 UP

TODO 状态:

  • 原生运行中按并发点广播 task_live(面板随请求完成更新)
  • 文档同步
  • Phase-2(规划)— 趋势图/sparkline/逐请求连续实时流

迭代 20(2026-09-05 13:55:00):原生引擎单个并发点内“连续滚动”(Phase-2 尽力实现)

功能概述:

  • 原生引擎(vLLM/SGLang)无逐请求流的数据源,但可让面板在单个高并发点内部连续滚动:执行时每秒广播 task_live(Elapsed 实时滚动、进度实时解析、状态 Profiling);mock/FAKE 原生通过增量进度行实现点内进度连续递增,真实引擎无逐请求量则点内仅 Elapsed/状态滚动。

变更内容:

  1. task_manager.py 原生分支:runner.run 前起 1s 广播线程(_ticker),点内持续广播 task_live(t=Elapsed、completed=解析进度、status Profiling);_stream 包装解析增量进度行;点结束 join 停止。
  2. 新增模块级 _parse_native_done:解析 benchscope-live-done k/N 增量进度行。
  3. mocks/bench_outputs.py:新增 _done_lines(num_prompts),在 vLLM/SGLang 仿真输出中插入逐请求完成行(benchscope-live-done k/N,N 大时按步长采样)。
  4. benches/runner.py _run_fake:改为在模拟耗时过程中逐行流式输出(每行小步 sleep,总时长不变、可被 kill 中断)→ 增量进度行被实时解析、面板点内滚动。

说明/边界:

  • mock/FAKE 原生:点内进度随 k/N 连续递增;但 mock 点完成很快(≤0.6s),实际可见滚动有限;真实高并发长点(>1s)Elapsed/状态每秒滚动。
  • 真实安装的 vLLM/SGLang CLI 无可解析逐请求进度行:点内仅 Elapsed/状态滚动,进度点结束上满(数据源固有限制)。

验证(增量):

  • WS 抓取原生 mock 任务 task_live:点完成广播 completed=1/8 与完成快照;_run_fake 逐行流式、进度解析正常
  • 后端语法 / build OK;dev 8080 / mock 8001 UP

TODO 状态:

  • 原生点内 1s task_live 广播(Elapsed/状态滚动)
  • mock 增量进度行 + 逐行流式(点内进度连续)
  • 文档同步
  • Phase-2(规划)— 趋势图/sparkline/真实引擎逐请求流

迭代 21(2026-09-05 14:10:00):第三方引擎指标可得性盘点(可得→值,不可得→N/A)

功能概述:

  • 明确第三方(原生)引擎每个指标哪些能拿到、哪些不能;_snapshot_from_row 统一按“可得填数值 / 不可得填 None”输出,前端据此渲染:数值=蓝、null=灰黑 N/A、缺失=灰横线。

变更内容:

  1. task_manager.py _snapshot_from_row:重写为固定 11 指标输出(含 TTST、OutputTPSPerUser 全 None);可得字段填数值(TTFT/TPOT/ITL/ReqLatency 的 avg/p50/p99、Output TPS/ReqSec/OSL/ISL 的 avg),不可得字段(min/max/p90/std)填 None。
  2. web/src/components/LivePanels.vue numCell:null → N/A(不可得),undefined/缺失 → 灰横线(尚未出值),数值 → 蓝。

第三方引擎可得性(最终口径):

  • TTFT/TPOT/ITL/Req Latency:avg(=mean)、p50(=median)、p99 可得;min/max/p90/std 不可得(N/A)
  • Output TPS、Req/sec:仅 avg 可得;其余 N/A
  • OSL、ISL:仅 avg(=总量/请求数) 可得;其余 N/A
  • TTST、Output TPS/User:整体不可得 → 全 N/A

验证(增量):

  • 原生 mock 运行后快照:TTFT {avg:70.0,p50:68.9,p99:93.3,min/max/p90/std:null}、Output TPS {avg:47.0,其余 null}、TTST 与 OutputTPSPerUser 全 null
  • build / 语法 / i18n OK;dev 8080 / mock 8001 UP

TODO 状态:

  • _snapshot_from_row 可得/不可得显式化
  • 前端 null→N/A、缺失→灰横线
  • 文档:可得性盘点表 + 迭代记录
  • Phase-2(规划)— 趋势图/sparkline/真实引擎逐请求流

迭代 22(2026-09-05 15:41:11):临时隐藏部分面板 / 入口(敬请期待)

功能概述:

  • 未完成功能以「敬请期待」占位,前端统一使用新增 i18n 键 comingSoon(zh=敬请期待 / en=Coming soon)。

变更内容:

  1. DashboardView.vue:暂时移除 Eval Records 面板(可自 git 历史恢复)。
  2. AccuracyView.vue:「创建精度任务」不再跳转 /accuracy/create,改为弹出「敬请期待」提示弹窗(goCreate → 打开模态)。
  3. DatasView.vue:副导航**隐藏 Evals**,仅保留 Perfs / Analysis。
  4. router/index.js:/datas/evals 重定向到 /datas/perfs(隐藏后不可直接访问)。
  5. DatasAnalysisView.vue:Analysis 页改为「敬请期待」占位(a-result 大标题 + analysisPlanned 副标题)。
  6. SettingsView.vue:Settings/Models 厂商头部隐藏 Homepage 链接(仅占位注释,未删数据字段)。

验证(增量):

  • check-i18n OK(新增 comingSoon 键 zh/en 一致)
  • npm run build OK;dev 8080 / mock 8001 UP

TODO 状态:

  • Dashboard 隐藏 Eval Records
  • Accuracy 创建精度任务 → 敬请期待弹窗
  • Datas 隐藏 Evals + Analysis 敬请期待 + evals 路由重定向
  • Settings/Models 隐藏 Homepage
  • i18n comingSoon 键 + 构建验证

迭代 23(2026-09-05 15:57:28):Dashboard Overview 精简 + Envs/Network 补全

功能概述:

  • Overview 统计只保留 Total Perfs / Total Acc,移除未实现的占位与状态项。
  • Envs info 的 Network 面板补全每个主联网口的 UUID(MAC) / IP / 子网 / 掩码。

变更内容:

  1. web/src/views/DashboardView.vue:
    • Overview 移除 Max Perf Records (RUN ID) / Max Acc Records (RUN ID) / Running Tasks / Test Env Status 四个统计格,仅保留 Total Perfs Records 与 Total Acc Records。
    • Network 面板改为按网口渲染 iface 标题 + UUID / IP / 子网 / 掩码 四行(新增 .net-block / .net-iface 样式);未联网口回退 —。
  2. benchscope/env_info.py _network_interfaces():每个网口新增 mac(即用户口径的 UUID,主联网口 MAC)、mask(子网掩码)、subnet(子网地址)字段:
    • Linux:ip -o -4 addr show 取 IP/CIDR 前缀 → _cidr_to_netmask 算掩码、_net_addr 算子网;ip -o link show 解析 MAC。
    • macOS:ifconfig 解析 ether(MAC) 与 inet ... netmask 0xffffff00 → _hex_netmask_to_str 转点分十进制掩码,再算子网。
    • 使用标准库 ipaddress / re,无新增依赖。
  3. web/src/i18n/zh.js、en.js:新增 netUuid / netIp / netSubnet / netMask 键。

验证(增量):

  • py_compile benchscope/env_info.py OK;本机 macOS 采集输出 en0 → mac:78:4f:43:8c:66:2b, ip:192.168.71.29, subnet:192.168.71.0, mask:255.255.255.0。
  • check-i18n OK;npm run build OK。
  • 重启 dev 后 GET /api/dashboard/env 返回含 mac/subnet/mask 的网口数据;dev 8080 / mock 8001 UP。

TODO 状态:

  • Overview 移除 4 个统计格(仅保留 Total Perfs / Total Acc)
  • Network 补全 UUID(MAC) / IP / 子网 / 掩码(前后端)
  • i18n 键 + 构建 + dev 重启验证

迭代 24(2026-09-05 16:04:25):Dashboard Overview 重构为 7 个子面板

功能概述:

  • Overview 面板由「Total Perfs / Total Acc」扩展为 7 个子面板:Performance、Accuracy、Sessions、Skills(内置)、Models、Datasets、以及占整行的 Providers(内含 Provider 数量 + Provider Models 两个小格)。
  • 布局:Providers 整行 1 个,其余 6 个每行 2 个。

变更内容:

  1. web/src/views/DashboardView.vue:
    • Overview 模板:6 个 stat-box(Performance=stats.total_runs、Accuracy=stats.total_acc_runs、Sessions=sessionCount、Skills=skillCount 带 (内置) 标记、Models=modelDownloadCount、Datasets=datasetDownloadCount)+ 整行 .prov-box(Provider 数量 / Provider Models)。
    • 新增计数 ref 与 loadOverviewCounts():并行拉取 /api/sessions、/api/skills、/api/config/providers;Provider Models 对各 Provider 并行 testConnection 求和模型数。Models / Datasets 下载数暂未实现,默认 0。
    • 新增 .prov-box / .prov-col 样式。
  2. web/src/i18n/zh.js、en.js:新增 perfCount / accCount / builtin / providerCount / providerModelCount 键。

数据口径:

  • Performance = Performance 记录数(stats.total_runs);Accuracy = 精度记录数(stats.total_acc_runs)
  • Sessions = 会话数量(sessions.length);Skills(内置) = 技能数量(skills.length)
  • Models / Datasets = 下载数(暂未实现 → 0)
  • Providers = Provider 数量(providers.length);Provider Models = 各 Provider 探测模型数之和(testConnection)

验证(增量):

  • check-i18n OK;npm run build OK。
  • 运行后端各端点返回符合预期:/api/sessions、/api/skills、/api/config/providers、/api/dashboard/stats。
  • 纯前端改动,dev 8080 无需重启即可加载新构建。

TODO 状态:

  • Overview 重构为 7 子面板(Providers 占整行)
  • 接入 Sessions / Skills / Providers 实时计数
  • Models / Datasets 下载数占位(默认 0)
  • i18n 键 + 构建验证

迭代 25(2026-09-05 16:09:32):Envs info 面板 antd 文字样式 + 字号缩小 + Net UUID→MAC

功能概述:

  • Envs info 面板文字改用 antd Typography 样式,整体字号缩小。
  • Network 面板下的 UUID 标签改为 MAC。

变更内容:

  1. web/src/views/DashboardView.vue:
    • Envs info 各 env-row-item 的标签 <span> 改用 <a-typography-text type="secondary">(antd secondary 文字样式),值保留 <b>。
    • 字号缩小:.env-box-title 13px→12px、.env-row-item 12px→11px、.net-iface 12px→11px;.env-row-item :deep(.ant-typography) 强制 11px / 行高 1.5。
  2. web/src/i18n/zh.js、en.js:netUuid 值由 UUID 改为 MAC(键名保留 netUuid 以最小改动)。

验证(增量):

  • check-i18n OK;npm run build OK。
  • 纯前端改动,dev 8080 无需重启。

TODO 状态:

  • Envs info 使用 antd 文字样式
  • 整体文字减小
  • Network 下 UUID 标签改为 MAC

4. TODO 清单

(1.0.9 待办,按规划补充后逐项勾选)


5. 相关文档

  • 页面级功能与约束:docs/prds/(Performance / Performance-Create / Dashboard / Accuracy / Sessions / Settings / Datas / TopBar)
  • 架构 / 方案 / 设计 / 开发规范:docs/rules/(Architecture / Software / Design / Development / BenchEngine / BenchCore / BenchUpstream / AccuracyEngine)
  • 版本路线:docs/Roadmap.md