fix(models): unify model defaults, availability and localized settings - #3987
Conversation
设置 → 模型这一页原先看不到价格,而模型选择器早就有价格档串了;可配置项也散: 推理强度只能在开会话时改,上下文上限根本没有入口。四家供应商里只有 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>
|
| 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
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>
|
命中 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 设计规范 |
|
已按这条建议在 PR description 的「改动后界面证据(2026-09-06,1ba48b09)」补上完整、自包含的 覆盖紧凑配置浮层、常驻 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>
|
已解决合并冲突并同步最新主干。主干统一用量卡保留,套餐名称格式化接入本 PR 已有的共享函数,让设置页与用量卡一致;两家套餐分别解析,缺失/非法套餐字段不影响配额窗口展示。旧源码位置断言已随主干迁移到行为测试。 本轮未删改已定稿的模型设置/选择界面、默认思考深度、默认模型、协议与 Harness 规则,移动端和远程可用性处理保留。随后主干新增的 Work Louder 改动只重叠五语文件中的键盘设置分组,已逐键核对,模型文案未被覆盖。 验证:两次合入后的 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
本轮冲突已解决。唯一冲突位于 保留主干已合入的首页告知卡移除、首页推荐任务和定时失败任务已读修复;没有恢复被用户撤掉的首页方框。核对自动合并的上下文 IPC、媒体接入,以及五语模型设置/选择分组,原 PR 的模型默认值、Harness、协议和跨端可用性处理均保留。 验证:全仓 |
|
已检查 Windows unit tests (1/2) 的完整 job 日志(job 101435012546)。失败为 9 项
当前 PR 相对已合入主干 本轮未修改模型功能、参数、测试超时或测试范围。已尝试重跑失败 job,但 GitHub 返回 HTTP 403: |
|
工作流已结束,补做上一轮被 GitHub 阻止的重跑:已执行 此次汇总失败没有新增失败分片:Windows (2/2) 已通过,汇总红灯来自之前 Windows (1/2) 的 9 项超时。此前本机相关 84 项定向回归通过;现在用相同提交重跑失败任务验证 Windows,未修改功能、模型参数或测试超时。重跑结果待 CI 完成后由现有跟进通知,本条不是通过结论。没有对应可 Resolve 的 review thread。 |
MagicLizi
left a comment
There was a problem hiding this comment.
独立审查未通过(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%),随后自定义供应商块又把initialCustomContextWindow(resolveExplicitCustomContextWindow,95%)spread 到同一组键上。后写覆盖先写,用户来源 Codex 且contextWindowExplicit时,高级设置里的上下文上限会被静默丢掉。用量侧capContextWindow仍走activeTurnContextLimit(约 3265 行),thread 窗口与 usage/compact 会分叉。ModelAdvancedDrawer.tsx:232对source === '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>
|
已修复这条 P1。 采用上限语义:有效窗口 = min(用户存储上限, 自定义供应商显式窗口)。没有用户上限时使用供应商显式窗口;两者都没有时保持原有 Codex 默认行为。用户存储值仍保留,未修改模型目录或用户偏好。
新增参数化用例覆盖以上组合、运行中清除设置保持当前轮次窗口、下一轮释放并恢复线程后恢复供应商窗口。用例同时注入不同的目录窗口和上游用量上报值,验证它们不会覆盖实际线程窗口。定向 47 项通过;maker-core 全包、手机及其它共享包单测、桌面/手机 typecheck 通过。 已同步主干 d36a78d,保留手机弱网恢复、模型可用性投影及冷会话来源恢复。未增删已定稿 UI、默认模型或思考深度。本条是 review summary,没有可 Resolve 的 inline thread。 提交: |
|
已按原授权合并,合并提交为 此前 Codex 用户上下文上限被覆盖的问题已修复,线程配置与用量使用同一有效窗口。用户定稿的模型默认、兼容模式提示及设置/选择器行为均保留;这轮合并没有新增或删减功能。 |
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>
这次改了什么
摘要
模型目录、选择偏好和当前可用性原先混在一起:未连接时模型仍像已启用、批量显示会打开兼容 Harness,Gateway 的协议提示也会把 Pi 下的 Gemini 带到 Responses。本次统一从目录标准、实际路由、用户偏好到界面状态的处理,并让模型设置与选择组件共享名称、简介、价格和兼容提示。
变更类型
fix缺陷修复refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
UI 变化
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,未硬编码单一主题。/Users/chris/Documents/ChrisData/Project/Cindy模型多语言简介.png。截图为本地验收证据,未上传到公开仓库;本轮没有再次启动客户端。怎么验证的
自动验证
补充回归包括:Server V1/V2/V3 缺字段、Gateway 新型号/未知厂商、Google 原生 API、OpenRouter/OpenCode 等自定义模型的默认值缺失、授权断开/重连、无凭证图片、批量启用、账号隔离、窗口异步返回和五语描述。选择器相关 208 项定向测试通过。
改动范围额外 ESLint 扫描报 28 项问题;对每个错误的规则、消息和源码行与主干共同基线逐项比较,28 项均已存在,新增 0 项。没有删除或弱化测试来避开失败;修正了随本地化变化过时的展示断言,并清理一个测试 fake timer 泄漏。
手工验证
核对本地维护表、实际下发目录及服务端目录更新契约;既有价格、最大输出和上下文原值保留,协议新增值按模型及路由区分。UI 本地化不会更改原始 ID、协议或推理请求参数。新未知型号保留可见和可配置,未知简介不强行回退为上游英文。
移动端与远程可用性
defaultEffort按其已声明档位补默认,不再丢弃可用模型;显式 null 保留,非法类型仍过滤。maker:provider:changed的既有 invoke/push 白名单和 topic;目录更新、停用、授权变化由被控端广播,控制端按设备/代次驱逐缓存。投影测试确认 connected、媒体就绪、原生 API、默认值透传且凭证/endpoint 不外泄。未执行的验证
没有逐个使用真实付费账号调用全部供应商和全部模型;本次提交前未重新启动沙盒验证 main 进程的所有变更,相关路径使用自动化回归。Light/Dark 均实现语义样式,本轮最后一次简介检查为 Dark,未重新进行完整 Light 实机目检。没有进行服务端部署或 Mobile 原生构建。
风险
风险分类
影响与回滚
提交前检查
git commit -s)改动后界面证据(2026-09-06,1ba48b09)
独立 HTML 已用无头浏览器检查 Harness 整行选中、主题切换和 390px 宽度无横向溢出,并目检了宽屏 Dark / 窄屏 Light 截图;仅验证证据页,不替代应用实机验收。
以下是可保存为
.html直接打开的自包含静态复现,覆盖紧凑配置浮层、兼容模式提示、设置页 Harness 排版与断连状态。按当前组件结构和中文文案整理,SVG 来自项目图标;示例数据不代表实时价格/授权。不是实机截图或完整 React 渲染:复杂思考滑杆保持产品实现不动,在证据页用禁用原生滑杆代示;tooltip 用 title,部分详情行省略。可切换 Light/Dark 检查布局,不将其视为应用双主题实机验收。对应
ModelConfigFlyout.tsx、ModelHarnessPicker.tsx、ModelCompatibilityNotice.tsx、ModelAdvancedDrawer.tsx;遵循 DESIGN.md 的信息克制、语义色和双主题要求。没有因 review 改动定稿、路由或模型参数。主干冲突解决(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。