feat: 优化备选模型管理 UI 与策略配置面板#232
Conversation
|
@1186258278 大佬,瞅一眼呗,提升下使用体验 |
|
@friendfish 感谢贡献 🙏 核心改动( 合并前有 1 个小问题需要清理: 需要修改
Review 重点(我会在合并前验证)
清理完 顺便我会在仓库 |
|
@1186258278 更新:已完成所有 Review 要求的改动,请查阅:
此 PR 目前已准备就绪,期待合入。感谢! |
本项目使用 npm / package-lock.json,防止贡献者用 pnpm 或 yarn 安装依赖时误提交 lock 文件(见 PR #232 的 review)。
1186258278
left a comment
There was a problem hiding this comment.
@friendfish 感谢第二轮响应 👍 pnpm-lock 已清理、en.json 也补了两个词条。不过我在 review src/pages/models.js 的时候发现还有几个比较重要的问题需要处理,按优先级列出来:
🔴 P0 - 必须修
1. 新 UI 里大量硬编码中文,非中文用户会看到一屏中文
PR body 里提到"补全了 en.json 缺失的词条",但 diff 里只加了 1 个 key(configure)。而新增的瀑布流编辑器里有 15+ 处硬编码中文。对比一下原代码(已正确 i18n 化)和新代码:
// ❌ 原代码(被替换掉了)——已 i18n
<div class="config-section-title">${t('models.currentConfig')}</div>
<span>${t('models.primaryModelLabel')}</span>
<span>${primary || t('models.notConfigured')}</span>
<span>${t('models.fallbackModels')}</span>
// ❌ 新代码(renderDefaultBar + renderFallbackWaterfall + bindWaterfallActions)
<span>系统主/备模型</span>
<span>${primary || '未配置'}</span>
<span>${fallbacks.length} 个备选</span>
<strong>💡 最佳实践:</strong> 建议备选模型保持在 <strong>2-3 款</strong> 并分布在不同服务商,以平衡可用性与延迟。
<div>当前生效链 (支持拖拽排序)</div>
<button>设为主用</button>
<button title="移除">
<div>尚未选择备选模型</div>
<div>可用候选池 (按服务商分组)</div>
<div>无可用候选模型</div>
<button>加入</button>
<button>取消</button>
<button>保存并应用</button>
toast(`已将 ${full} 设为主模型`, 'success')而且新加的 configure key 在整个 diff 里找不到使用位置,像是孤儿。
修改建议:把这些字符串都抽成 t('models.xxx'),并在 zh-CN.json / en.json 两个文件里都补齐翻译(其他 9 种语言我们后续会批量补)。项目 AGENTS.md 明确要求「新增翻译键时至少补充 zh-CN 和 en」。
大致需要新增的 key(仅供参考):
"systemPrimaryFallback": "系统主/备模型",
"fallbackCount": "{count} 个备选",
"bestPracticeHint": "建议备选模型保持在 2-3 款并分布在不同服务商,以平衡可用性与延迟。",
"activeChainTitle": "当前生效链(支持拖拽排序)",
"candidatePoolTitle": "可用候选池(按服务商分组)",
"setAsPrimary": "设为主用",
"removeFallback": "移除",
"addFallback": "加入",
"noFallbackSelected": "尚未选择备选模型",
"noCandidate": "无可用候选模型",
"promotedPrimary": "已将 {model} 设为主模型",
"saveAndApply": "保存并应用",
"cancelEditor": "取消"2. URL 正则被误改,中文错误提示的链接会抓错
做全角→半角标点批量替换时,误伤了一行正则:
- const detailHtml = detail.replace(/</g, '<').replace(/(https?:\/\/[^\s,,。;))'"&]+)/g, ...)
+ const detailHtml = detail.replace(/</g, '<').replace(/(https?:\/\/[^\s,,。;))'"&]+)/g, ...)这个正则是用来从中文错误消息里提取 URL 的。全角 ,。;) 是合法的 URL 终结符(中文错误后面经常直接跟全角标点,没空格分隔)。改成半角后,像 获取失败,详见 https://docs.example.com/。点此查看... 这样的消息里,URL 会把 。点此查看 也一起抓成链接。
修改建议:这一行完全回退,保留全角 ,。;)。
🟡 P1 - 强烈建议修
3. 大量无关 diff 噪声(全角→半角标点批量替换)
整个文件里有 150+ 行 diff 其实是注释/日志里的全角→半角标点替换,跟瀑布流功能改动完全无关:
- // 非阻塞:先返回 DOM,后台加载数据
+ // 非阻塞:先返回 DOM,后台加载数据
- console.log('[models] 自动修复了服务商 baseUrl,正在保存...')
+ console.log('[models] 自动修复了服务商 baseUrl,正在保存...')
- // 渲染服务商列表(渲染完后直接绑定事件)
+ // 渲染服务商列表(渲染完后直接绑定事件)这种纯格式化变更让 reviewer 很难聚焦真正的逻辑改动,并且是上面第 2 个 bug 的来源。应该是 IDE 的中文标点规范化功能自动干的。
修改建议:把这些不涉及功能的标点变更都回退。功能本身的净代码量大约 300 行左右,其他全是噪声。
4. src-tauri/gen/schemas/linux-schema.json 是生成文件,不应 commit
这个文件(+2606 行)是 tauri build 时在 Linux 平台上自动生成的 schema。仓库 main 分支从未 commit 过它:
$ git log main --oneline -- src-tauri/gen/schemas/linux-schema.json
(无输出)应该是你本地 build 时自动生成、然后连带提交的。
修改建议:
git rm src-tauri/gen/schemas/linux-schema.json
git commit --amend --no-edit
git push -f我这边会在 main 的 .gitignore 里加上 src-tauri/gen/schemas/linux-schema.json 防止以后再误提(其他平台的 schema 历史原因已经 track 了,暂不动)。
5. 保存策略和 PR 描述不一致,改动容易静默丢失
你在 PR 评论里提到:
确认拖拽排序后,通过
doAutoSave逻辑可将数据实时写入openclaw.json
确认"主备互换"功能会触发api.restartGateway()
但我看代码,实际行为并非如此:
// bindWaterfallActions -- 所有操作按钮都只改 state,不保存:
// "设为主用"
btn.onclick = () => {
pushUndo(state)
setPrimary(state, full)
state.config.agents.defaults.model.fallbacks = newFallbacks
renderDefaultBar(page, state)
toast(`已将 ${full} 设为主模型`, 'success')
// ← 没调 autoSave,也没调 restartGateway
}
// "加入 / 移除 / 拖拽" 都是同样的模式,都只改 state只有点"保存并应用"按钮才真正持久化:
container.querySelector('#btn-save-fallback').onclick = async () => {
state.showFallbackEditor = false
await doAutoSave(state) // ← 只有这里调
renderDefaultBar(page, state)
}所以实际行为是:用户必须点"保存并应用"才生效。这跟你描述的"实时写入"不符。风险场景:
- 用户忘点保存直接跳页面 → 改动静默丢失
- 用户点"取消"按钮走
loadConfig()重载 → 改动丢失 - 原 models.js 其他地方都是
autoSave(state)自动保存的,这里的"显式保存"模式是个风格裂痕
修改建议(二选一):
- A. 改成 autoSave 模式(推荐,和原设计一致):每个改动(加入/移除/设为主用/拖拽)之后直接
autoSave(state),去掉"保存并应用"和"取消"按钮(编辑即生效) - B. 保持显式保存:在 state 修改后加"脏标记",在标题栏显示「未保存的改动」,跳页/关页时拦截确认。并把 PR 描述改成"保存按钮写入生效",避免误导后续 reviewer
🟢 P2 - 小事
6. en.json 末尾换行被删掉
-}
+}
\ No newline at end of file修改建议:en.json 末尾加个 \n。
✅ Action Items
- P0: 抽硬编码中文为 i18n key,zh-CN + en 都补齐
- P0: 恢复 URL 正则的全角标点(只改这一行)
- P1: 回退无关的中文标点 diff 噪声(
models.js里只留瀑布流相关的真实代码变更) - P1:
git rm src-tauri/gen/schemas/linux-schema.json - P1: 选择一种保存策略(推荐 autoSave),和描述保持一致
- P2: 补 en.json 末尾换行
希望这些反馈不会让你受挫 🙏 瀑布流折叠 + 候选池分组 + 拖拽排序的方向是真的好,UX 比原版强。但非中文用户是 ClawPanel 用户的重要部分,硬编码中文属于明确的回归,这块必须处理。期待下一轮修改!
上下文: PR #232 的作者本地在 Linux 上 tauri build 后,src-tauri/gen/schemas/ linux-schema.json 被自动生成并带进了 PR(+2606 行)。main 分支从未 commit 过这个文件(git log 无记录)。 问题: - 这个 schema 是 Linux 平台构建时自动生成的,不同 Linux 机器产出可能 不一致,容易引起 PR diff 噪声和合并冲突。 - 历史原因 desktop-schema.json / macOS-schema.json / windows-schema.json 已经被 track 了,暂不动以免其他 maintainer 的工作流受影响。 - 但 Linux schema 在本仓库从未入库,纯属贡献者本地构建副产物,应当忽略。 防护: - 在 main 的 .gitignore 加入 src-tauri/gen/schemas/linux-schema.json - 配合 review 里已经要求 PR #232 作者 git rm 该文件的 action item Refs: PR #232 review comment
- i18n: Extract hardcoded Chinese strings to translation keys - fix(url): Restore full-width punctuation in URL regex - chore: Remove linux-schema.json (build artifact) - chore: Add linux-schema.json to .gitignore - refactor: Unify save strategy to use autoSave consistently - style: Add trailing newline to en.json Closes review items 1-6 from PR qingchencloud#232
- Display fallback chain as colored chips in a dedicated row when collapsed - Add background colors to active chain and candidate pool for visual distinction - Remove redundant Cancel/Save buttons since autoSave is enforced
|
### 第一次提交有问题,多了两次,还烦请大佬review,修改内容总结如下: ✅ 代码审查意见修正
✨ UI 视觉与交互优化
本地已重新构建(生成了 .deb/.rpm/.AppImage)并测试通过,麻烦再次 Review,期待合入,能作贡献,谢谢! |
|
@friendfish 感谢持续打磨这个 PR,上次 review 的 6 条意见你都很认真地处理了 🙏 但在准备合并时我们做了一次 diff 体检,发现这个分支基于的 main 比较旧(大约在 v0.13.3 时代),当前 main 已经到 v0.13.4。直接合并会把以下不属于本 PR 范围的改动回滚: 版本类(关键,必须处理)
代码类(需要 rebase)
这些都是 v0.13.3 → v0.13.4 之间 main 新增或调整的内容。 怎么做麻烦基于最新 main 做一次 rebase: git fetch origin main
git rebase origin/main
# 解决冲突后
git push --force-with-leaserebase 后的 diff 应该只保留你在 你本轮修改的 UI 部分(瀑布流折叠、候选池分组、主备互换、配置残留修复等)我都看过预览截图,质量很高,很期待合进来。只是基线版本的问题让它现在还合不了——再次感谢耐心! |
- i18n: Extract hardcoded Chinese strings to translation keys - fix(url): Restore full-width punctuation in URL regex - chore: Remove linux-schema.json (build artifact) - chore: Add linux-schema.json to .gitignore - refactor: Unify save strategy to use autoSave consistently - style: Add trailing newline to en.json Closes review items 1-6 from PR qingchencloud#232
|
@1186258278 已按要求 rebase 到最新 main(v0.13.4), |
集中发版: 新功能(10) - 心甜Claw 引擎入口(第 3 个引擎模式) - Hermes 22 个 Provider 注册表 + 安装/仪表盘动态加载 - Hermes .env 高级编辑(拒绝触碰托管 Provider 密钥) - Hermes 会话与用量分析增强 - Hermes Dashboard 自动拉起 + Windows POSIX-only 兼容模态 - Hermes Skills 工具集面板 - 官网 Hermes Agent 黑金特色区 + 图文指南 - Boot Manifest 启动页(双语 + 错峰动画) - 官网 Markdown 阅读器图片 lightbox - Hermes Memory 概览卡 改进(9) - Hermes 仪表盘/扩展页全面本地化 - 记忆编辑大尺寸模态 - 日志下载 Web/桌面分流 - 侧边栏导航补全 - 模型备选管理 UI(PR #232) - 模型加载错误 UX 重做(错误卡 + 详情 + 重试) - .page 布局 clamp + .page-narrow - Memory 单列断点提早到 1100px - Web 模式跳过前端热更新检查 修复(12) - Gateway 启动 platforms.api_server.enabled 自修复(含 7 unit test) - Memory 页 overview 卡穿模(旧 flex 列约束 → 自然块流) - Skills 页 hero/toolsets 被压缩(flex-shrink:0) - Web 模式 Skills ReferenceError(补 _readHermesDisabledSkills) - 日志/记忆下载行为分流 - src/pages/models.js 5 处 typo - 删除 56 行 .hm-memory-* 死代码 + line-clamp 标准属性 - Dependabot rustls-webpki / postcss / rand
变更说明
openclaw.json配置文件不同步的问题。此更改已在 Linux 环境下验证通过并生成 .deb 包测试。