Skip to content

fix(models): unify model defaults, availability and localized settings - #3987

Merged
zqchris merged 22 commits into
makecindy:mainfrom
zqchris:settings-model-page-redesign
Sep 6, 2026
Merged

fix(models): unify model defaults, availability and localized settings#3987
zqchris merged 22 commits into
makecindy:mainfrom
zqchris:settings-model-page-redesign

Conversation

@zqchris

@zqchris zqchris commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

模型目录、选择偏好和当前可用性原先混在一起:未连接时模型仍像已启用、批量显示会打开兼容 Harness,Gateway 的协议提示也会把 Pi 下的 Gemini 带到 Responses。本次统一从目录标准、实际路由、用户偏好到界面状态的处理,并让模型设置与选择组件共享名称、简介、价格和兼容提示。

变更类型

  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护

范围

  • 关联 Issue / 需求:用户连续验收模型管理与选择器后的完整修正;基于已合入的选择器更新与 Server 模型目录契约继续完善。
  • 本 PR 包含:统一模型原生协议、默认思考意图与授权状态;精简默认模型;紧凑 Harness 选择和详情配置;额度缓存;五语名称与简介;缺字段和新模型兼容回归。
  • 明确不包含:不修改或部署 cindy-server,不更新第三方 Harness 版本,不重做现有思考深度滑块,不改计费结算规则。
  • 用户可见变化:新用户优先使用 Gateway;GPT 默认 Astra/Sol/Terra/Luna,Claude 保留最新 Fable/Opus/Sonnet/Haiku;其它厂商精简选择并保留 DS4 视觉变体、混元 4。所有可调模型默认优先中,按实际支持档位适配,手动偏好优先。
  • 是否存在 breaking change:无。目录 V1/V2/V3 均可消费;新增展示字段可缺省;没有价格、简介或原生协议不会删除可用模型。缺默认思考深度按已声明档位补齐,显式无思考保留;不绕过真实授权、路由和非法参数检查。

UI 变化

  • 设置页按厂商/用途整理,搜索和筛选不写模型偏好;启用操作不再全开兼容 Harness。未连接的对话模型与没有实际执行凭证的图片模型均按各自状态呈现。
  • 配置面板保留能力、准确窗口、报价与模型 ID;整数 K 便于编辑,未修改时保留原始精度。明确 Codex 内置常规 272K,不能把模型标称 1M 当成已自动开启。
  • 小配置窗口所有 Harness 可见,使用设置页同款彩色图标与简短兼容模式提示;选中背景覆盖整行,价格保留。五语简介只作用途参考,不限制模型调用。
  • 引用的设计规范:docs/design-rules/DESIGN.md §2 Color Palette & Roles(Light/Dark 语义颜色)、§3 Typography Rules、§4 Inputs & Forms / Select & Dropdown / Dialog & Modal、§5 Spacing System(紧凑列表与详情布局)。复用既有 UI primitives 和语义 token,未硬编码单一主题。
  • macOS 隔离 CN 沙盒已检查模型列表、配置弹层及切换语言后的简介;本地截图留在 /Users/chris/Documents/ChrisData/Project/Cindy模型多语言简介.png。截图为本地验收证据,未上传到公开仓库;本轮没有再次启动客户端。

怎么验证的

自动验证

pnpm test:unit:related
pnpm --filter desktop run typecheck
pnpm --filter mobile run --if-present typecheck
pnpm --filter @cindy/maker-core run --if-present typecheck
pnpm --filter @cindy/model-providers run --if-present typecheck
pnpm check:i18n
pnpm check:i18n-glossary
pnpm check:design-inventory
git diff --check
结果:合入最新 main 后全部通过;相关测试调度因涉及依赖声明自动运行全仓单测。maker-core / model-providers 无独立 typecheck script,--if-present 正常跳过;Desktop 和 Mobile 类型检查均通过。

补充回归包括:Server V1/V2/V3 缺字段、Gateway 新型号/未知厂商、Google 原生 API、OpenRouter/OpenCode 等自定义模型的默认值缺失、授权断开/重连、无凭证图片、批量启用、账号隔离、窗口异步返回和五语描述。选择器相关 208 项定向测试通过。

改动范围额外 ESLint 扫描报 28 项问题;对每个错误的规则、消息和源码行与主干共同基线逐项比较,28 项均已存在,新增 0 项。没有删除或弱化测试来避开失败;修正了随本地化变化过时的展示断言,并清理一个测试 fake timer 泄漏。

手工验证

核对本地维护表、实际下发目录及服务端目录更新契约;既有价格、最大输出和上下文原值保留,协议新增值按模型及路由区分。UI 本地化不会更改原始 ID、协议或推理请求参数。新未知型号保留可见和可配置,未知简介不强行回退为上游英文。

移动端与远程可用性

  • 已一并适配手机新建任务与已有任务的模型选择:目录确认没有可用供应商或返回空表时,不再回退到旧 capabilities 模型;刷新期间禁止这条回退,失效的旧模型配置窗口自动收回。旧被控端未提供目录时仍保留兼容入口。
  • 远程桌面解析被控端目录时,缺 defaultEffort 按其已声明档位补默认,不再丢弃可用模型;显式 null 保留,非法类型仍过滤。
  • device-link:沿用 maker:provider:changed 的既有 invoke/push 白名单和 topic;目录更新、停用、授权变化由被控端广播,控制端按设备/代次驱逐缓存。投影测试确认 connected、媒体就绪、原生 API、默认值透传且凭证/endpoint 不外泄。
  • SSH:执行与凭证仍由远端 daemon/原有远程通道持有,本次仅调整控制端选择及目录解析,不读取远端 workdir 为本机文件,不改远程 Harness 授权。
  • 恢复故障半径:本次只刷新单设备的目录缓存;不改 link/relay 的重试、超时或 teardown,不重建共享连接,不扩大到其它控制端。已有缓存代次与设备隔离测试继续通过。
  • 本轮定向回归:Mobile 97 项、Desktop 47 项通过,包含新建前 fresh 授权检查、provider 分组、缓存失效和控制端投影;两端 typecheck 通过。Mobile 仅 JS/TS 改动,不改原生配置、依赖或 fingerprint 输入。

未执行的验证

没有逐个使用真实付费账号调用全部供应商和全部模型;本次提交前未重新启动沙盒验证 main 进程的所有变更,相关路径使用自动化回归。Light/Dark 均实现语义样式,本轮最后一次简介检查为 Dark,未重新进行完整 Light 实机目检。没有进行服务端部署或 Mobile 原生构建。

风险

风险分类

  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 其他:默认模型策略与上下文参数适配

影响与回滚

  • 影响范围:Desktop 模型设置/选择以及共享模型目录、三 Harness 的窗口/思考参数适配。新用户默认变更;已有明确手动偏好保留。账号代次隔离防止旧请求覆盖新账号。媒体可用性来自实际执行配置,不从 ChatGPT 对话授权推断。
  • 本地/线上更新:客户端以 V3 声明请求目录,同时保留 V1/V2 读取及缺失本地标准的补全;运行路由、权限和价格继续使用对应来源,不将所有 Gateway 提示当作模型原生语言。Server 目录仍需按其既有流程热更,本 PR 不代表线上目录已部署。
  • 回滚 / 降级方式:可回退本 PR 客户端;新增偏好和可选元数据不改变已有授权文件或数据库 schema。旧目录仍可用,未识别展示字段省略,不能据此杜撰模型能力。没有真实能力/路由时保留已有校验,不能仅凭一个名称推导可执行参数。
  • 存量插件影响:无。本 PR 相对 main 不改插件批准状态、安装布局、manifest 或权限规则。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s
  • UI 改动已注明引用的设计规范章节
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

改动后界面证据(2026-09-06,1ba48b09)

独立 HTML 已用无头浏览器检查 Harness 整行选中、主题切换和 390px 宽度无横向溢出,并目检了宽屏 Dark / 窄屏 Light 截图;仅验证证据页,不替代应用实机验收。

以下是可保存为 .html 直接打开的自包含静态复现,覆盖紧凑配置浮层、兼容模式提示、设置页 Harness 排版与断连状态。按当前组件结构和中文文案整理,SVG 来自项目图标;示例数据不代表实时价格/授权。不是实机截图或完整 React 渲染:复杂思考滑杆保持产品实现不动,在证据页用禁用原生滑杆代示;tooltip 用 title,部分详情行省略。可切换 Light/Dark 检查布局,不将其视为应用双主题实机验收。

对应 ModelConfigFlyout.tsxModelHarnessPicker.tsxModelCompatibilityNotice.tsxModelAdvancedDrawer.tsx;遵循 DESIGN.md 的信息克制、语义色和双主题要求。没有因 review 改动定稿、路由或模型参数。

<!doctype html><html lang="zh-CN"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Cindy 模型配置 · 界面证据</title><style>
:root{color-scheme:dark;--bg:#171717;--card:#202020;--text:#d4d4d4;--muted:#929292;--line:#343434;--hover:#2b2b2b;--switch:#eeeeee;--knob:#202020;--warning:#e88728;--blue:#3981f7}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:13px/1.5 Inter,system-ui,sans-serif;padding:24px}body.light{color-scheme:light;--bg:#f8f8f6;--card:#fff;--text:#262626;--muted:#737373;--line:#e5e5e5;--hover:#f0f0ee;--switch:#4b4b4b;--knob:#fff;--warning:#ad5a00}button,input{font:inherit;color:inherit}button{cursor:pointer;background:none;border:0}button:focus-visible{outline:2px solid var(--blue)}header{max-width:1000px;margin:0 auto 24px}header p{color:var(--muted)}header button{border:1px solid var(--line);border-radius:9999px;padding:6px 14px}main{max-width:1000px;margin:auto;display:flex;flex-wrap:wrap;align-items:flex-start;gap:24px}.card{background:var(--card);border:1px solid var(--line);border-radius:12px}.flyout{width:264px;padding:14px}.title{font-size:14px;font-weight:600;display:flex;justify-content:space-between}.meta{font-size:12px;color:var(--muted);padding:3px 0 10px;border-bottom:1px solid var(--line)}.slider{display:flex;align-items:center;gap:12px;padding-top:14px}.slider input{width:100%;accent-color:var(--blue)}.harnesses{padding-top:8px}.harness{position:relative;display:flex;align-items:center;gap:4px;min-height:28px;padding-right:4px;border-radius:4px}.harness.selected,.harness:hover{background:var(--hover)}.choice{display:flex;align-items:center;gap:6px;flex:1;min-width:0;min-height:28px;padding:0 4px;text-align:left;font-size:12px}.icon{width:14px;height:14px;flex:none}.choice .icon{width:12px;height:12px}.cc{color:#d97757}.codex{color:#7a9dff}.pi{color:#a78bfa}.check{width:12px;font-size:12px}.compat{font-size:11px;white-space:nowrap;color:var(--muted)}.alert{color:var(--warning);padding:0;width:20px;height:20px}.price,.footer{margin-top:10px;padding-top:9px;border-top:1px solid var(--line);font-size:12px;color:var(--muted)}.footer{display:flex;justify-content:space-between}.dialog{width:680px;max-width:100%}.dialoghead{padding:18px 20px;border-bottom:1px solid var(--line)}.dialoghead p{margin:4px 0 0;color:var(--muted)}.columns{display:grid;grid-template-columns:1fr 1fr;gap:24px;padding:20px}.columns>div+div{border-left:1px solid var(--line);padding-left:24px}h2{font-size:12px;font-weight:500;color:var(--muted);margin:0 0 10px}.setting{display:flex;gap:10px;align-items:center;padding:8px 0;border-bottom:1px solid var(--line);min-height:34px}.setting>.icon{align-self:flex-start;margin-top:3px}.setting p{font-size:11px;line-height:16px;margin:2px 0 0;color:var(--muted)}.grow{flex:1;min-width:0}.switch{width:36px;height:20px;flex:none;border-radius:9999px;background:var(--hover);padding:2px}.switch:before{content:'';display:block;width:16px;height:16px;border-radius:50%;background:var(--muted)}.switch[aria-checked=true]{background:var(--switch)}.switch[aria-checked=true]:before{background:var(--knob);transform:translateX(16px)}small{font-size:10px;color:var(--muted);background:var(--hover);border-radius:9999px;padding:2px 6px}.field{display:flex;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:1px solid var(--line);font-size:12px}.field span:first-child{color:var(--muted)}.section{margin-top:22px}.efforts{border:1px solid var(--line);border-radius:9999px;padding:3px;display:flex}.efforts span{flex:1;text-align:center;font-size:12px;padding:3px}.efforts .current{background:var(--hover);border-radius:9999px}.help{font-size:11px;color:var(--muted);margin:8px 0}.dialogfoot{border-top:1px solid var(--line);padding:12px 20px}.dialogfoot button{width:100%;border:1px solid var(--line);border-radius:9999px;height:32px}.offline{padding:16px;width:100%}.offline p{color:var(--muted);margin:4px 0 12px}.offline .field{opacity:.5;align-items:center}.offline button{cursor:default}.offline code{font-size:12px}.hint{max-width:1000px;margin:20px auto;color:var(--muted);font-size:12px}@media(max-width:760px){.columns{grid-template-columns:1fr}.columns>div+div{border-left:0;border-top:1px solid var(--line);padding:18px 0 0}body{padding:16px}}
</style><header><h1 style="font-size:18px">模型配置 · 改动后静态复现</h1><p>根据 1ba48b09 的组件结构与文案整理。示例数据用于展示布局,不代表实时价格、账号权限或网络调用结果;不是实机截图。主题按钮仅切换本页预览。</p><button id="theme">切换浅色 / 深色</button></header><main>
<section class="card flyout"><div class="title">Gemini 3.8 Flash <span></span></div><div class="meta">Cindy AI · 1M 上下文</div><div class="slider"><input aria-label="思考深度示意(原复杂滑杆未在静态页重建)" type="range" min="0" max="2" value="1" disabled></div><div class="harnesses"><div class="harness selected"><button class="choice" aria-pressed="true"><svg class="icon pi" viewBox="0 0 24 24" aria-hidden="true"><path d="M3.6 6.6h16.8M8.4 6.6v11.8M15.6 6.6v9.6c0 1.5.9 2.2 2.4 2.2" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"/></svg>Pi</button><span class="check"></span></div><div class="harness "><button class="choice" aria-pressed="false"><svg class="icon cc" viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" fill-rule="evenodd" d="M20.998 10.949H24v3.102h-3v3.028h-1.487V20H18v-2.921h-1.487V20H15v-2.921H9V20H7.488v-2.921H6V20H4.487v-2.921H3V14.05H0v-3.1h3V5h17.998zM6 10.949h1.488V8.102H6zm10.51 0H18V8.102h-1.49z"/></svg>Claude Code</button><span class="check"></span></div><div class="harness "><button class="choice" aria-pressed="false"><svg class="icon codex" viewBox="0 0 24 24" aria-hidden="true"><path d="M9.064 3.344a4.6 4.6 0 0 1 2.285-.312q1.5.173 2.673 1.275.016.015.037.021a.1.1 0 0 0 .043 0 4.55 4.55 0 0 1 3.046.275l.047.022.116.057a4.58 4.58 0 0 1 2.188 2.399q.313.765.315 1.595a4.2 4.2 0 0 1-.134 1.223.12.12 0 0 0 .03.115q.89.91 1.183 2.17.433 2.138-.887 3.854l-.136.166a4.55 4.55 0 0 1-2.201 1.388.12.12 0 0 0-.081.076c-.191.551-.383 1.023-.74 1.494-.9 1.187-2.222 1.846-3.711 1.838q-1.78-.009-3.157-1.302a.11.11 0 0 0-.105-.024c-.388.125-.78.143-1.204.138a4.44 4.44 0 0 1-1.945-.466 4.54 4.54 0 0 1-1.61-1.335c-.152-.202-.303-.392-.414-.617a6 6 0 0 1-.37-.961 4.6 4.6 0 0 1-.014-2.298.1.1 0 0 0 .006-.056.1.1 0 0 0-.027-.048 4.5 4.5 0 0 1-1.034-1.651 3.9 3.9 0 0 1-.251-1.192 5.2 5.2 0 0 1 .141-1.6Q3.659 7.92 5.086 6.97q.318-.212.601-.33a6 6 0 0 1 .646-.227.1.1 0 0 0 .065-.066 4.5 4.5 0 0 1 .829-1.615 4.54 4.54 0 0 1 1.837-1.388z" fill="none" stroke="currentColor" stroke-width="2"/><path fill="currentColor" d="M12.546 13.909a.637.637 0 0 0 0 1.272h3.636a.637.637 0 1 0 0-1.272zM8.462 9.23a.637.637 0 0 0-1.106.631l1.272 2.224-1.266 2.136a.636.636 0 1 0 1.095.649l1.454-2.455a.64.64 0 0 0 .005-.64z"/></svg>Codex</button><span class="compat">兼容模式 <button class="alert" aria-label="兼容模式说明" title="兼容模式可能出现运行不稳定或功能异常,建议有经验的用户使用。"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M12 8v4M12 16h.01"/></svg></button></span><span class="check"></span></div></div><div class="price">每百万 token<br>输入 $0.52 · 输出 $2.63 · 缓存读取 $0.05</div><div class="footer">已自定义 <span>恢复推荐</span></div></section>
<section class="card dialog"><div class="dialoghead"><div class="title">GPT-5.6-Terra <span>×</span></div><p>OpenAI</p></div><div class="columns"><div><h2>引擎支持</h2><div class="field"><span>原生协议</span><span>Responses</span></div><div class="setting"><svg class="icon codex" viewBox="0 0 24 24" aria-hidden="true"><path d="M9.064 3.344a4.6 4.6 0 0 1 2.285-.312q1.5.173 2.673 1.275.016.015.037.021a.1.1 0 0 0 .043 0 4.55 4.55 0 0 1 3.046.275l.047.022.116.057a4.58 4.58 0 0 1 2.188 2.399q.313.765.315 1.595a4.2 4.2 0 0 1-.134 1.223.12.12 0 0 0 .03.115q.89.91 1.183 2.17.433 2.138-.887 3.854l-.136.166a4.55 4.55 0 0 1-2.201 1.388.12.12 0 0 0-.081.076c-.191.551-.383 1.023-.74 1.494-.9 1.187-2.222 1.846-3.711 1.838q-1.78-.009-3.157-1.302a.11.11 0 0 0-.105-.024c-.388.125-.78.143-1.204.138a4.44 4.44 0 0 1-1.945-.466 4.54 4.54 0 0 1-1.61-1.335c-.152-.202-.303-.392-.414-.617a6 6 0 0 1-.37-.961 4.6 4.6 0 0 1-.014-2.298.1.1 0 0 0 .006-.056.1.1 0 0 0-.027-.048 4.5 4.5 0 0 1-1.034-1.651 3.9 3.9 0 0 1-.251-1.192 5.2 5.2 0 0 1 .141-1.6Q3.659 7.92 5.086 6.97q.318-.212.601-.33a6 6 0 0 1 .646-.227.1.1 0 0 0 .065-.066 4.5 4.5 0 0 1 .829-1.615 4.54 4.54 0 0 1 1.837-1.388z" fill="none" stroke="currentColor" stroke-width="2"/><path fill="currentColor" d="M12.546 13.909a.637.637 0 0 0 0 1.272h3.636a.637.637 0 1 0 0-1.272zM8.462 9.23a.637.637 0 0 0-1.106.631l1.272 2.224-1.266 2.136a.636.636 0 1 0 1.095.649l1.454-2.455a.64.64 0 0 0 .005-.64z"/></svg><div class="grow"><div>Codex <small>推荐</small></div><p>Responses · 原生支持</p></div><button class="switch" role="switch" aria-label="Codex" aria-checked="true"></button></div><div class="setting"><svg class="icon cc" viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" fill-rule="evenodd" d="M20.998 10.949H24v3.102h-3v3.028h-1.487V20H18v-2.921h-1.487V20H15v-2.921H9V20H7.488v-2.921H6V20H4.487v-2.921H3V14.05H0v-3.1h3V5h17.998zM6 10.949h1.488V8.102H6zm10.51 0H18V8.102h-1.49z"/></svg><div class="grow"><div>Claude Code </div><p>Messages · <span class="compat">兼容模式 <button class="alert" aria-label="兼容模式说明" title="兼容模式可能出现运行不稳定或功能异常,建议有经验的用户使用。"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M12 8v4M12 16h.01"/></svg></button></span></p></div><button class="switch" role="switch" aria-label="Claude Code" aria-checked="false"></button></div><div class="setting"><svg class="icon pi" viewBox="0 0 24 24" aria-hidden="true"><path d="M3.6 6.6h16.8M8.4 6.6v11.8M15.6 6.6v9.6c0 1.5.9 2.2 2.4 2.2" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"/></svg><div class="grow"><div>Pi </div><p>Responses · 原生支持</p></div><button class="switch" role="switch" aria-label="Pi" aria-checked="true"></button></div><div class="section"><h2>默认推理强度</h2><div class="efforts"><span></span><span class="current"></span><span></span></div></div><div class="section"><h2>上下文上限</h2><div class="help">Codex 默认 272K 上下文</div><p class="help">更大窗口需单独调整 Codex 配置,不建议日常使用。</p></div></div><div><h2>能力</h2><div class="field"><span>图片输入</span><span>✓ 支持</span></div><div class="field"><span>输入类型</span><span>文字 · 图片</span></div><div class="field"><span>输出类型</span><span>文字</span></div><div class="section"><h2>报价</h2><p class="help">示例:订阅用量,参考价格不等于实际扣款。</p></div><div class="section"><h2>标识</h2><div class="field"><span>模型 ID</span><code>gpt-5.6-terra</code></div><div class="field"><span>厂商</span><span>OpenAI</span></div></div></div></div><div class="dialogfoot"><button disabled>停用此模型</button></div></section>
<section class="card offline"><div>模型 <span style="color:var(--muted)">已选 0 个</span></div><p>连接后可用,已选模型会保留。</p><div class="field"><span>GPT-6 Astra</span><button class="switch" role="switch" aria-label="GPT-6 Astra 不可用" aria-checked="false" disabled></button></div><div class="field"><span>GPT-5.6-Sol</span><button class="switch" role="switch" aria-label="GPT-5.6-Sol 不可用" aria-checked="false" disabled></button></div></section></main>
<p class="hint">复核重点:小浮层整行选中含右侧勾选;候选 Harness 常驻、无额外推荐标题;Codex 兼容标记;设置页统一彩色图标、两行对齐、普通实心开关;连接失效时计数和开关一致。此页仅做结构复现:滑杆用禁用的原生控件代示,提示使用 title,字体回退和部分价格/规格行不代表完整产品渲染。</p><script>document.getElementById('theme').onclick=()=>document.body.classList.toggle('light');document.querySelectorAll('.harness .choice').forEach(b=>b.onclick=()=>{document.querySelectorAll('.harness').forEach(r=>{r.classList.remove('selected');r.querySelector('.choice').setAttribute('aria-pressed','false');r.querySelector('.check').textContent=''});b.parentElement.classList.add('selected');b.setAttribute('aria-pressed','true');b.parentElement.querySelector('.check').textContent='✓'});</script></html>

主干冲突解决(2026-09-06,bff9d989)

合入 416b2b793。保留主干统一用量卡,将本 PR 的套餐名称共享格式化接入新投影层,设置页与用量卡保持一致;保留大小写归一及非字符串字段容错。旧组件路径的断言随主干迁移为真实投影/组件行为测试,追加 4 项一致性与容错用例。模型默认值、协议和已定稿配置 UI 未作删改;手机目录就绪与可用性变动处理保留。

验证:pnpm test:unit:related(自动全仓)通过、Desktop/Mobile typecheck 通过、定向 72 项通过、五语/术语检查和本次文件 ESLint 通过、DCO 通过。没有重启 dev 或做新的实机验收。

最终同步主干 df05fdafc 后提交为 ab0f10118:新增主干改动仅与本 PR 的 Work Louder 五语分组重叠,模型文案未覆盖;再次完成全仓单测、Desktop 类型、i18n 与术语检查,均通过。

后续主干同步(f41b0892d)

合入47dacc613:唯一冲突为UI台账自动生成区,按最终源码重新生成,人工记录不变。保留主干移除首页告知卡、首页推荐任务和定时失败任务已读修复,未删改本PR模型定稿与参数。最终全仓单测(Desktop201.4s、Mobile16.3s、maker-core202.7s)、Desktop类型、五语/术语、34项台账和DCO检查通过。没有重新启动dev。

设置 → 模型这一页原先看不到价格,而模型选择器早就有价格档串了;可配置项也散:
推理强度只能在开会话时改,上下文上限根本没有入口。四家供应商里只有 xAI 显示订阅余量。

列表行改成「厂标 · 模型名 + 价格档 + 折扣 · 高级设置 · 开关」:
- 档串与折扣胶囊复用模型选择器的实现(抽到 components/new-chat/priceTierMarks.tsx),
  报价派生也抽成共享纯函数(lib/modelPricePresentation.ts)——两处显示的必须是同一个价。
- 上下文窗口列移进抽屉。列表那种紧凑位置的 1M / 128K 缩写在真实数据里是歧义的
  (1,000,000 / 1,048,576 / 1,050,000 都印成 1M),抽屉里给准确 token 数。
- 顶部类型筛选只在该来源真存在多类时渲染,只有一类时整条不出。

新增 ModelAdvancedDrawer:标识 / 规格 / 能力 / 报价四段只读事实,
默认推理强度 / 上下文上限 / 引擎支持三段可配置。原行尾「⋯」菜单的三项
(自定义报价、停用此模型、删除本机模型)全部搬进抽屉,一项能力都没减。
引擎开关初值走「用户 override → 该引擎默认 → 模型级默认」三段链,与
active-catalog 的 `ov.defaultEnabled ?? gm.defaultEnabled` 同口径。

上下文上限是本轮唯一新增存储且唯一改运行时行为的部分:新建
model-context-limit-store(复用 override-settings-file 的 override 契约),
经 maker-host 的 resolveVerifiedContextWindow 注入,把窗口收敛成
min(上游窗口, 用户上限)。窗口是自动压缩比例的分母,调小它等于让压缩按用户设的
长度提前触发,阈值百分比不动。没有 override 时逐位返回原值,单测锁死这条。

Anthropic / OpenAI 补上订阅余量模块,与 xAI 共用一个 SubscriptionUsageModule
(套餐名 → 一个大数字 → 小灰补充 → 右侧链接;不画边框、不画进度条)。
四家的 hook 本来都在,此前只有 xAI 接到了供应商详情页。

顺带修一处真实缺陷:useModelPricing 的 readPricing / subscribePricing 直接解引用
preload 面,缺方法时**同步抛出**,发生在 .then 链建立之前,已有的 .catch 抓不到;
订阅那处一抛连卸载清理都不会注册。改为防御性取值后降级为「没有报价」。

两处 formatPlanType 副本(QuotaHoverCard 的 Claude / TodaySpendChip 的 Codex)
抽到 lib/subscriptionPlanLabel.ts,避免设置页再抄第三份。

验证:pnpm test:unit:related 全绿(含新增 15 项 store 单测)、
desktop typecheck、check:i18n、check:i18n-glossary、typographyDiscipline 守卫。
未验证:两种主题的实机目检(抽屉滑入过渡、档串与真实模型名的对齐、四家用量真实数据)。

Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Keep compatibility engines opt-in and move detailed controls into the model drawer. Preserve upstream context maxima separately from recommended and local values, and pass explicit limits into Claude Code, Codex, and Pi native configuration.

Guard owner-scoped edits, preserve default-following resets, use route capability metadata, and cover the editor and runtime contracts with regression tests.

Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
…le routes

Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
…notices

Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
…tions

Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
@zqchris
zqchris marked this pull request as ready for review September 5, 2026 15:45
@zqchris
zqchris requested a review from a team as a code owner September 5, 2026 15:45
@greptile-apps

greptile-apps Bot commented Sep 5, 2026

Copy link
Copy Markdown

Greptile Summary

此 PR 统一了模型目录、协议元数据、默认推理强度、实际可用性和用户可见性偏好的处理,并扩展了模型设置及选择器展示。

  • 引入 Model Registry V3 原生协议声明及兼容模式投影。
  • 按真实凭证、路由和媒体执行注册表计算 Provider 与模型可用性。
  • 增加按账号隔离的单模型上下文上限设置,并接入 Claude Code、Codex 和 Pi。
  • 精简新用户默认模型,同时保留用户显式显示/隐藏偏好。
  • 统一设置页与选择器中的模型名称、简介、价格、Harness 和协议展示。
  • 补充五种语言文本及目录、路由、权限、上下文和 UI 回归测试。

Confidence Score: 5/5

未发现由本 PR 引入的具体、可操作的阻塞问题,当前改动看起来可以合并。

模型协议、可用性、默认选择、账号隔离设置及三种 Harness 的运行时接入均有一致的边界处理和针对性回归覆盖;调查到的候选风险未形成可达的错误行为。

Important Files Changed

Filename Overview
apps/desktop/src/main/maker-host/active-catalog.ts 统一 Gateway、订阅 Provider 的模型默认值、原生协议、兼容 Harness 和默认可见性投影。
packages/model-providers/src/modelRegistry.ts 增加 Registry V3 原生协议解析,支持精确条目、最长前缀规则、退役和显式未知语义。
apps/desktop/src/main/maker-host/model-context-limit-store.ts 新增按账号、引擎、Provider 和模型隔离的上下文上限持久化。
packages/maker-core/src/agents/codex/index.ts 将上下文上限应用于 Codex 线程配置,并在设置变化时安全释放和恢复线程。
packages/maker-core/src/agents/pi/index.ts 将统一协议、思考档位和上下文上限写入 Pi 的运行时模型配置。
apps/desktop/src/renderer/components/settings/UnifiedModelList.tsx 重构模型管理列表、分组、筛选、批量偏好和高级设置入口。
apps/desktop/src/renderer/components/settings/ModelAdvancedDrawer.tsx 新增模型详情、价格、能力、协议、Harness 和上下文上限配置界面。
packages/model-providers/catalog/model-registry.json 升级至 V3 并补充模型原生协议、默认推理强度及精简默认启用策略。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[Server / Bundled Model Registry] --> B[Active Catalog]
  C[实时 Gateway 与 Provider 发现] --> B
  D[凭证与执行注册表] --> E[实际可用性]
  B --> F[Harness 路由与协议投影]
  E --> F
  G[用户显示偏好] --> H[设置页与模型选择器]
  F --> H
  I[按账号隔离的上下文上限] --> J[Claude Code / Codex / Pi]
  F --> J
Loading

Reviews (1): Last reviewed commit: "chore(ui): remove unused model drawer an..." | Re-trigger Greptile

…ollers

Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
@MagicLizi MagicLizi added touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) labels Sep 6, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/desktop/src/renderer/components/new-chat/ModelCompatibilityNotice.tsx / apps/desktop/src/renderer/components/new-chat/ModelConfigFlyout.tsx / apps/desktop/src/renderer/components/new-chat/ModelHarnessPicker.tsx 等)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范

@zqchris

zqchris commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

已按这条建议在 PR description 的「改动后界面证据(2026-09-06,1ba48b09)」补上完整、自包含的 html 代码块,可保存为 HTML 直接打开。

覆盖紧凑配置浮层、常驻 Harness 选项与整行选中、兼容模式说明、价格区、设置页彩色图标/两行对齐,以及断连后的计数与灰态。支持 Light/Dark 切换;已检查证据页的切换与选择交互、390px 无横向溢出,并目检两种主题。

该材料明确标注为按当前组件整理的静态复现,示例数据不代表实时权限/报价,复杂滑杆、tooltip 与部分详情行有注明的简化;不是应用实机截图,不替代原 PR 中如实列出的验证边界。本轮没有修改用户定稿、产品代码或模型参数。

原意见属于普通 issue comment,没有可 Resolve 的 review thread;以本条回复及 description 补证闭环。

Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
@zqchris

zqchris commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

已解决合并冲突并同步最新主干。主干统一用量卡保留,套餐名称格式化接入本 PR 已有的共享函数,让设置页与用量卡一致;两家套餐分别解析,缺失/非法套餐字段不影响配额窗口展示。旧源码位置断言已随主干迁移到行为测试。

本轮未删改已定稿的模型设置/选择界面、默认思考深度、默认模型、协议与 Harness 规则,移动端和远程可用性处理保留。随后主干新增的 Work Louder 改动只重叠五语文件中的键盘设置分组,已逐键核对,模型文案未被覆盖。

验证:两次合入后的 pnpm test:unit:related 全仓门禁、Desktop/Mobile typecheck、相关 72 项测试、i18n/glossary、本次修改文件 ESLint、DCO 与 diff 检查均通过。未重启 dev。本条是合并冲突通知,没有对应可 Resolve 的 review thread。

@MagicLizi MagicLizi added the status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) label Sep 6, 2026
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
@zqchris

zqchris commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

本轮冲突已解决。唯一冲突位于 design-inventory.md 的自动生成区,已用 pnpm design:inventory 根据合并后的实际源码重新生成,34 个 surface 校验通过,人工记录未改。

保留主干已合入的首页告知卡移除、首页推荐任务和定时失败任务已读修复;没有恢复被用户撤掉的首页方框。核对自动合并的上下文 IPC、媒体接入,以及五语模型设置/选择分组,原 PR 的模型默认值、Harness、协议和跨端可用性处理均保留。

验证:全仓 pnpm test:unit:related、Desktop typecheck、五语/术语检查、UI 台账生成检查、diff 与 DCO 检查通过。未启动 dev。本次为合并冲突通知,没有对应可 Resolve 的 review thread。

@zqchris

zqchris commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

已检查 Windows unit tests (1/2) 的完整 job 日志(job 101435012546)。失败为 9 项 Test timed out in 5000ms

  • lizi-im:outboundFile.test.ts 中 7 项文件发送/文件身份用例。
  • lizi-mcps:computerMcpServer.test.ts 的 replay summary 用例,以及 contactsTools.test.ts 的主路径用例各 1 项。

当前 PR 相对已合入主干 47dacc613packages/lizi-impackages/lizi-mcpsscripts/test-workspaces.mjs 无改动;lockfile 唯一差异为 maker-core 新增本地 model-providers workspace 链接,没有替换上述包的外部依赖版本。本机 macOS 定向复跑相关 3 个文件,84 项全部通过;这不替代 Windows 实跑,也不足以宣称 Windows 问题已修复。

本轮未修改模型功能、参数、测试超时或测试范围。已尝试重跑失败 job,但 GitHub 返回 HTTP 403:The workflow run containing this job is already running(另一 Windows 分片仍未结束)。重跑尚未成功提交,需要工作流结束后再重试;后续继续由已有自动跟进接收状态变化。目前保留 CI 未通过状态,不将其当成已修复。该 CI 事件没有对应可 Resolve 的 review thread。

@zqchris

zqchris commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

工作流已结束,补做上一轮被 GitHub 阻止的重跑:已执行 gh run rerun 34014181558 --failed,并回读确认 attempt 2 为 in_progress,提交仍为 f41b0892

此次汇总失败没有新增失败分片:Windows (2/2) 已通过,汇总红灯来自之前 Windows (1/2) 的 9 项超时。此前本机相关 84 项定向回归通过;现在用相同提交重跑失败任务验证 Windows,未修改功能、模型参数或测试超时。重跑结果待 CI 完成后由现有跟进通知,本条不是通过结论。没有对应可 Resolve 的 review thread。

@MagicLizi MagicLizi removed the status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) label Sep 6, 2026

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

独立审查未通过(P1×1)。当前 head f41b0892d62d105beb80223f5ade69f61c4feed5 不能合。

  • [P1] packages/maker-core/src/agents/codex/index.ts:5502 — currentThreadWorkspaceConfig 先把 resolveModelContextLimit 写成 model_context_window / model_auto_compact_token_limit(90%),随后自定义供应商块又把 initialCustomContextWindowresolveExplicitCustomContextWindow,95%)spread 到同一组键上。后写覆盖先写,用户来源 Codex 且 contextWindowExplicit 时,高级设置里的上下文上限会被静默丢掉。用量侧 capContextWindow 仍走 activeTurnContextLimit(约 3265 行),thread 窗口与 usage/compact 会分叉。ModelAdvancedDrawer.tsx:232source === 'user' 会把 Codex 写进 relatedTargets。请在写入 thread config 前把用户上限与显式自定义窗口合成一个值(用户覆盖应胜出,或与显式窗口取 min),并让 capContextWindow 用同一结果。补 Codex 单测:user provider、显式 200k 窗口、存储上限 100k(以及 500k);断言 thread config 与 usage cap 都遵循选定策略,而不是被覆盖的显式窗口。

Resolve the provider window and user cap once for native thread configuration and turn-owned usage. Preserve provider defaults after resetting the cap. Include current main so mobile recovery and cold-session provider fixes remain intact.

Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
@zqchris

zqchris commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

已修复这条 P1。currentThreadWorkspaceConfig 现在只写一次上下文参数;线程配置和当前轮次的用量窗口共用 effectiveThreadContextWindow

采用上限语义:有效窗口 = min(用户存储上限, 自定义供应商显式窗口)。没有用户上限时使用供应商显式窗口;两者都没有时保持原有 Codex 默认行为。用户存储值仍保留,未修改模型目录或用户偏好。

供应商显式窗口 用户上限 线程窗口 / 用量窗口 自动压缩阈值
200K 100K 100K 90K
200K 500K 200K 180K
200K 未设置或清除后 200K 190K(保留原有 95%)

新增参数化用例覆盖以上组合、运行中清除设置保持当前轮次窗口、下一轮释放并恢复线程后恢复供应商窗口。用例同时注入不同的目录窗口和上游用量上报值,验证它们不会覆盖实际线程窗口。定向 47 项通过;maker-core 全包、手机及其它共享包单测、桌面/手机 typecheck 通过。

已同步主干 d36a78d,保留手机弱网恢复、模型可用性投影及冷会话来源恢复。未增删已定稿 UI、默认模型或思考深度。本条是 review summary,没有可 Resolve 的 inline thread。

提交:06879b776b1a78048648e6ffc87ada26cbf8bdd8。Desktop高并行运行出现间歇失败后,保持同一套完整用例和超时阈值、仅将本次并行数降为2,最终2347个文件、32039项测试通过(10项既有skip)。全部验证完成后推送;Windows等线上CI由新提交继续复验。

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

独立审查通过(当前 head 06879b7):先前 Codex 上下文窗口覆盖用户上限的 P1 已用 min(用户 cap, 供应商窗口) 落地。默认模型按账号 catalog 精简,不可用模型不可选。没有 P0/P1。

@zqchris
zqchris merged commit 5fc5881 into makecindy:main Sep 6, 2026
11 checks passed
@zqchris

zqchris commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

已按原授权合并,合并提交为 5fc5881101753aba47922d089f3b3246e9b9ffce。合并前核对的是 06879b776:Linux、Windows 四个单测分片及其余 CI 全部成功,当前提交复审为 APPROVED,没有未关闭的讨论。

此前 Codex 用户上下文上限被覆盖的问题已修复,线程配置与用量使用同一有效窗口。用户定稿的模型默认、兼容模式提示及设置/选择器行为均保留;这轮合并没有新增或删减功能。

yuchenlin added a commit to yuchenlin/cindy that referenced this pull request Sep 6, 2026
makecindy#3987 added Record<AgentKind> color/label/mark tables that omit the fourth harness. Desktop typecheck fails verify-checks.

Signed-off-by: Bill Yuchen Lin <10104354+yuchenlin@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants