Files
ycode/docs/model-select-assessment-2026-10-16.md
T

85 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 自定义模型 Select 恢复评估(2026-10-16)
可以恢复为原组件结构与状态行为,当前阻碍不是拿不到源码。本次只做原版REA取证和只读评估,没有修改ModelSettingsPanel/Select生产代码。
## 固定来源
- WorkBuddy5.8.2、ASAR SHA `035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918`。
- ModelsSettingsPanel JS/CSS:REA `ev_25f013c9fd2ad66153046eec06e94fb6128bfacc1e87e57aa90db6bc419075ec`,`.tmp/rea-assessment-model-source.json`。JS SHA `739ab43ee521d8ef6e5b5b7731bb4e71b51454b2865f44a1228d7fcc2700149c`,CSS SHA `cd80b01d04589227a3c2db5dbe67b6c83b019bef18d3dba68ae5486448651018`。
- 共享Select/Popover/SVG:REA `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`,`.tmp/rea-runtime-scripts.json` 的 `src-DPDj7_qD.js`,SHA `747e41d215375e1214c366213aea7e077d85421923029c61cbb6e9562be58de0`。
- 共享CSS:REA `ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94`,`src-Bh3YZ35H.css`,SHA `88dbdc1cd3f59d0e8b75824512a465a2be714bc7af481d790fe3a9484f85e01a`。
- 当前原provider dropdown:REA `ev_7f4bada062e5643e7866e0dbe8a35f2ab5903421c94b5084ab710dbe77b3ab19`,`.tmp/rea-model-select-provider-static-20261016/`。
- 当前原model dropdown:REA `ev_a6b221d6a364c9f2db118a9dde18b9a3bc4a7c051663a6a0ccafb99c33c76237`,`.tmp/rea-model-select-model-static-20261016/`。
原版本次仅从首页模型菜单进入设置、打开provider/model dropdown,随后取消未保存编辑并关闭设置窗,没有保存/连接测试/发送消息。原设置窗900×680。关闭设置窗导致REA最终capture返回`protocol_error`;随后REA discovery仅剩main target,证明设置窗已关闭。main仍在首页。关闭过程诊断保存在 `.tmp/model-select-audit/settings-close-result.json`。
首次进入设置后编辑器已经自动打开;第一次probe试图点击背后的add按钮被REA遮挡校验拒绝,没有产生修改。有效provider证据来自随后只点已打开编辑器的provider按钮。
## 与当前adapter的具体差异
当前适配器位于 `ModelSettingsPanel.tsx` 的local `Choice`/`Select` 段,样式为 `model-settings.css` 中 `model-ui-*`。字段CRUD和密钥生命周期不是本评估替换范围。
| 项目 | 原版实现 | 当前adapter差异 |
| --- | --- | --- |
| Trigger DOM | `wb-select--medium/--full-width/--open/--empty/--disabled/--invalid`,value/placeholder区分,caret/loading/clear专用class | 只有`wb-select`、value和下箭头,缺状态class及原caret class/旋转;placeholder也复用provider提示 |
| provider数据 | options为嵌套group对象;label为含原vendor图标的ReactNode;searchText为中文+英文displayName | Choice仅label/value/group字符串;没有provider图标/双语searchText,分组只按相邻字符串插标题 |
| 搜索结构 | `wb-select__search > wb-input-wrapper--small --filled`,14px搜索SVG、allowClear、原input/prefix/suffix结构 | 独立带边框`model-ui-search`,缺搜索图标与清除按钮;provider也使用模型专用placeholder,原provider为“搜索” |
| 分组DOM | `li.wb-select__group[role=presentation] > group-label + ul.group-list[role=group]` | div包裹group标题和button,原group CSS无法完整命中 |
| Option DOM | `li.wb-select__option[role=option][tabIndex]`,OptionLabel,选中加两个状态class,原绿色check class/SVG | button节点,缺`__option-label`与完整selected class;generic check没有`__option-check`。自建`font:inherit`还覆盖源选中weight600 |
| model输入语义 | 候选存在时用普通WBSelect;已有非候选modelId注入Qe首项;无候选时用文本Input | `editable`让query无匹配时新增可选项并Enter选用。原WBSelect没有allowCreate分支,不能将`selectOrInput`名称直接解释成下拉搜索可创建 |
| Search条件 | provider数>6;model原候选数Z>6 | 当前`searchable || editable`会让<=6模型的下拉也出现搜索;应按调用条件恢复 |
| 定位 | 原Popover offset8,inline absolute;Floating UI offset/flip/shift/size/autoUpdate,按clipping ancestors与8px padding约束 | body fixed portal,offset4,只在打开时读rect;只按window剩余高度,缺ancestor裁剪、flip、自动更新 |
| 展开/退出 | expand preset、原placement class、150ms退出保留,初次activation next tick防误选 | 直接mount/unmount,缺expand DOM状态/退出、activation guard |
| 键盘/焦点 | 搜索时manageFocus和initialFocus;option原Enter/Space;触发器由原Popover绑定 | 当前自建上下箭头active/clamp与Enter选中;不能未经证据宣称与原焦点/键盘等价 |
| 溢出与tooltip | 字符串option用ResizeObserver检测ellipsis后显示原Tooltip | 没有检测/tooltip;当前文字/图标布局也不相同 |
源代码的模型创建/保存/上游测试可以继续使用YCode现有真实宿主;无需调用WorkBuddy服务端模型。
## 原版当前几何
| 元素 | provider dropdown | model dropdown |
| --- | --- | --- |
| trigger | `[154,136,592,32]` | `[154,304,592,32]` |
| popover | `[154,176,592,306]` | `[154,344,592,216]` |
| panel | `[163,177,574,304]` | `[163,345,574,214]` |
| search区 | `[163,177,574,48]` | `[163,345,574,48]` |
| filled search input wrapper | `[163,185,574,32]` | `[163,353,574,32]` |
| list | `[163,225,580,256]` | `[163,393,580,166]` |
| option | 高32、相邻y步进34、radius8 | 高32、相邻y步进34、radius8 |
原editor-body `[130,104,640,464]`,底边568;model popover底边560,正好留下原8px clipping padding。当前只看window高度的portal会进入footer区域。Provider selected项背景rgb247、check16px绿色;原provider option同时渲染16px vendor图标。上述是同一900×680原状态,不混入YCode较早截图的测量。
## 恢复边界建议
建议一个独立、有界的实现任务:
1. 新增 `SourceSelect.tsx`、`source-select-recovered.css`、`source-select.css`、`SourceSelectIcons.tsx` 和恢复脚本。承接ReactNode label、searchText、OptionGroup、source条件class、搜索Input、选中check、empty/disabled、源键盘/焦点行为。共用在provider/model/effort三个callsite。
2. 恢复私有 `SourceSelectPopover`(可单文件内)与其定位/焦点/activation/exit依赖,保留原inline策略和clipping。原PopoverLayer使用Floating UI;当前仓库没有`@floating-ui/react`。依赖选择、版本与新增package范围由主上下文决定;不要直接执行完整原共享bundle的初始化。应恢复有限纯组件/辅助函数,并用原900×680截图验收。
3. 新增 `SourceProviderIcon.tsx`、必要真实vendor资源;将provider label/render与列表row icon映射恢复。当前catalog已带icon字段,无需主进程/存储修改。原Tencent/OpenRouter/Ollama三张PNG已是REA脚本内data URI,可从固定导出解码,无须新取原安装包;其余是可提取的纯SVG。
4. 只接 `ModelSettingsPanel.tsx` 的imports、local Choice/Select段、三个Select调用与provider label/row icon;`model-settings.css`只移除对应`model-ui-select/search/options/group/active`覆盖。不改CRUD、测试、密钥、保存策略、main/preload/store。主上下文正在新增的`createRequest`路由hook与begin后effect保持不动。
共享源码可直接恢复的范围已经固定:
| 定义 | offset | 源长度 |
| --- | ---: | ---: |
| isOptionGroup / flattenOptions / defaultFilter | 836748 / 836806 / 836915 | 58 / 109 / 214 |
| OptionLabel / OptionStringLabel | 837129 / 837295 | 166 / 459 |
| Select | 837754 | 5860 |
| usePopoverActivation | 759107 | 1589 |
| PopoverLayer | 761887 | 4211 |
| useExitTransition / Popover | 766474 / 766808 | 334 / 1027 |
原CSS可恢复Select69条、Popover24条、Input107条,另模型CSS的Select2条/provider3条,必须保留media父条件与token闭包;无需凭截图另写一套尺寸。
原vendor内嵌PNG:Tencent `Kkt` offset4016979、1190B、SHA `5fd576ec40a7682780b2ef3b83f51cf2de41b960cc351c9a40edf951c8a797dd`;OpenRouter `Wkt` offset4014335、1945B、SHA `f66f19c8b7c99bb9f37c0239b6575cd01803112050161c0ba5275928f2db0194`;Ollama `Hkt` offset4011891、1797B、SHA `8f38edfb007d7b74f03d2ad7a57c023daa678031795ad11836df593970764a0b`,均来自固定contexts脚本。
## 数据与仍需证据的状态
本次原runtime provider16项/4组、默认Tencent Token Plan model15项;当前静态catalog domestic13项/4组、该provider模型8项。它是数据差异。原 `useLocalCustomModelSettingsConfig` offset4066587通过adapter.getProductConfiguration获取customModelSettingsUrl,允许显式local override/fallback URL,再fetchWithCache载入配置。当前静态catalog不是这个实时配置的完整快照;不能填造ID或假造WorkBuddy云端模型服务。可保留YCode自己的静态provider库并明确数据来源,同时让组件按源客户端规则分组/过滤/展示。
入口另有已证实差异:原 `useCustomModelEntry` offset4115869,在footerAction=`openSettingsAndCreate`时调用 `openSettings('models','new')`。原首页“配置自定义模型”直接打开添加overlay;当前旧入口只打开设置列表。已交主上下文修正路由,不由Select子任务覆盖。
尚需原版状态证据:搜索输入/清空/no-result、<=6模型无搜索、当前非候选modelId、切换provider、popover flip/滚动/窄窗、暗色和退出动效。当前REA probe schema没有任意文本输入action,故未对原输入查询;搜索过滤规则已有源码,任意文字行为实测需先由REA补明确输入能力,不能直接CDP输入替代。未保存/测试/发消息是本次取证范围,不构成自定义模型后续功能缩减。
可复现评估:`node scripts/audit-model-select-reference.mjs`。结果 `.tmp/model-select-audit/report.json`、shared-select-readable.js、models-provider-readable.js、own-select-readable.tsx与有限CSS正文,源SHA校验通过。原生provider/model截图与全部layout保留;当前阶段未进行新Select实现、YCode dropdown像素对比或完整1:1通过声明。