Repository navigation
Onboarding 将 performanceUsage 改写为 compact,导致 composer 状态栏丢失轮/步与总 token 读数 #10339
Replies: 1 comment
|
两处默认值确实冲突,而且同一个控制器里还有第三条分支写成 默认值这一侧: export const DEFAULT_PERFORMANCE_USAGE: PerformanceUsageMode = 'detailed'写入这一侧: usage: development ? 'detailed' : 'compact', developerTools: development,而同一个文件 void this.save({ ...progress, step: 'done', process: 'standard', usage: 'detailed', developerTools: true, completion: 'api-key' }, true)再配合 我要补的一点判断:这个字段是显示偏好(状态栏显示多细),不是引导流程的产物。用户在引导里没有选择过它, 报告里值得强调的还有那个回读校验( |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
环境
0.2.1-rc.2(nightly,win-x64)dsh-v0.2.1-rc.2,commit687f282e8625c6b8d11ff58211a90524be2e4317@deepseek-ai/dsh-client-ui-settings-account@0.2.1-rc.2(随@deepseek-ai/dsh-web-appbundle 安装,非用户显式依赖)现象
composer 状态栏只剩两个读数:
63 tok/s,缺少N 轮 M 步缓存命中 93%,缺少总 token 数预期(
performanceUsage: detailed)应显示N 轮 M 步 · 63 tok/s与总 token · 缓存命中 93%。根因
packages/client/ui-settings-account/src/client/onboarding-state.ts中,DesktopOnboardingController.finish()在引导完成/跳过时,无条件把usage写入 Chat 的performanceUsage:只有
purpose: development分支给detailed,office与skipped一律compact。写入通过settings.mutate()→ConfigEditor.edit()直接落盘到$DSH_HOME/profiles/<name>/cordis.patch.yml。问题在于两侧默认值互相矛盾:
dsh-client-ui-settings-accountusage(schema default)compactdsh-client-ui-settings-accountfreshProgress().usage'compact'dsh-client-ui-chatDEFAULT_PERFORMANCE_USAGE"detailed"即:用户从未做过任何选择,onboarding 一构造/一完成就把默认
detailed降级为compact。影响面
比「走过 onboarding 的用户」更大 —— 所有新建 profile 都会命中,因为
freshProgress()的usage初始值就是'compact'。又因为 tok/s 和缓存命中仍然显示,仅丢失轮/步计数和总 token 数,所以极易被忽略。
另有两个相关的既有讨论,但均为功能建议而非本 bug:
#3431(嫌 dock 统计挤在一行要省略号)、
#1781(建议精简状态栏条目)。
两者都不涉及
performanceUsage被静默改写。复现
office或直接 skip~/.dsh/profiles/<name>/cordis.patch.ymlui-chat段被写入performanceUsage: compact证据
受影响机器上三个历史 patch 备份(
cordis.patch.yml.bak-*)中performanceUsage均为detailed,仅当前文件为compact,证明是 onboarding 写入而非用户修改或版本升级导致。逐层核对(均已验证一致):
另一台机器的实时底栏确认渲染路径无缺陷 ——
performanceUsage: detailed时2 轮 46 步 · 206 tok/s与1.8M tok · 缓存命中 96%均完整显示。结合ActivityPill/UsagePill中if (mode === "compact") return …的直白分支,可确认唯一变量是配置值本身,而非渲染逻辑、版本回归或第三方插件干扰。附带发现(同一文件的其它问题)
以下三条同样来自
onboarding-state.ts,均已在dsh-v0.2.1-rc.2官方源码中确认:retry()会重放陈旧的usage值 ——failedWrite保存的是当时完整的 progress 对象,retry()原样重放,会覆盖用户后续的手工修正。finish()把process隐式耦合到 Chat 的transcriptView——process: office ? 'compact' : reason === 'skipped' ? 'standard' : current.process,该值经chat.mutate([{ op: 'set', path: ['transcriptView'], value: mode }])写入,但 schema 上无任何说明表明二者耦合。derive()的 api-key 自动保存分支硬编码process与developerTools——void this.save({ ...progress, step: 'done', process: 'standard', usage: 'detailed', developerTools: true, completion: 'api-key' }, true),会冲掉用户手工设置。建议修复
任选其一:
finish()与freshProgress()的usage默认值改为'detailed',与 Chat 侧对齐;performanceUsage,交由 Chat 侧默认值生效;建议同时处理附带发现 1(
retry()不应重放已被用户修正的字段)。临时规避
在
~/.dsh/profiles/desktop/cordis.patch.yml中显式固定:step: done可关闭finish()与derive()两条写入路径,usage: detailed保证即使路径意外打开,写回的也是正确值。All reactions