Files
ycode/docs/assessment-task-models-2026-10-15.md

113 lines
18 KiB
Markdown
Raw Permalink 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.
# 新建任务与自定义模型评估(2026-10-15)
本次只评估,不修改生产代码。用户要求新建任务交互和自定义模型添加体验对标 WorkBuddy,不使用 WorkBuddy 服务端模型。结论:可继续源码级对齐客户端,但目前两个模块均存在状态与数据能力缺口,工作量显著超过 CSS 调整;不能以已有会话导入、输入框外观或单一网关设置代表完成。评估中已追加获取模型设置主体 JS/CSS,表单源码缺失这一阻碍已解除。
## 证据范围
本子任务仅分析保存的 REA 导出和主上下文追加采集的 REA 证据;没有绕过 REA 连接原版 CDP、执行原版 evaluate、直接读取安装文件或使用旧 `wb-*` 工具。主上下文已新增模型列表运行时画面;静态分支不等于动态已验证,尚无这两个模块的双端像素验收。
- WorkBuddy 5.8.2;安装包 SHA-256 `035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918`。
- JS:`.tmp/rea-runtime-scripts.json`,Evidence `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`。以下锚点为 `items[].source.artifact.text` 的 JavaScript 字符偏移(不是字节或行号)。
- CSS:`.tmp/rea-css-recovered/manifest.json`,Evidence `ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94`。仅说明当时已加载样式的范围,不覆盖全部 lazy 页面。
- 模型设置主体:`.tmp/rea-assessment-model-source.json`,Evidence `ev_25f013c9fd2ad66153046eec06e94fb6128bfacc1e87e57aa90db6bc419075ec`,REA 对相同 ASAR 根摘要选择性导出两个成员。
- 模型列表画面:`.tmp/rea-assessment-models/frame-000.png`(900×680),Evidence `ev_40da6df0424193923bae64a8ccb6fca97ea67813d7de671986d4d7e154b848c1`;REA 原生点击进入模型设置并等待,不运行模型请求。画面显示自定义模型卡片、两个已有模型、添加/编辑/测试/删除入口。本次没有读取或展示真实密钥。
| 原版文件 | SHA-256 | 相关函数/锚点 |
| --- | --- | --- |
| `home-CC-czDJL.js` | `121d5a07acccb09e48f20f3a94f9fac8b10770e4a82bca1916d2cccd333f8d14` | `useCreateHomeTask` 43266–51436;`useHomeInputSendHandler` 81136–85362;`useHomeInputProviders` 74819–80388;`useBuddyHomeInputPersistence` 13205–14363 |
| `contexts-BMeWSUHk.js` | `5f35b7489b107e21ef452c8ee88a95265756f6fc444841eef869228bbc44768b` | `buildDefaultModelFormValue` 4036703–4037412;`resolveLocalCustomModelSettingsConfig` 4033903–4034815;`useModelSelector` 4097539–4112154;`useCustomModelEntry` 4115869–4116529;`saveNewTaskModel` 4088062、`loadNewTaskModel` 4088234 |
| `workbuddy-provider-DkH2YFYM.js` | `b588e875c469978f216beec86bdf4b6c33a31c0266f9bf996881b8dbf37b5dc7` | `getLocalCustomModels`、`saveLocalCustomModel`、`deleteLocalCustomModel`、`testLocalCustomModel`、`checkLocalCustomModels`,567600–568800 附近 |
| `home-D6iylhBV.css` | `bb1aa03bc4ac4e18072461e7b493ab5cd6aeab3deb5b77e059dc075b55a720d5` | `.wb-home-route`、`.wb-home-page`、首页输入/推荐/页脚等 |
| `home-CyzXSQsx.css` | `0661cfef3bf9372f4d3ebad7de35b8c023178c3aae6d4e1b61d7f9a841197f60` | 同一固定 CSS 集中的另一首页样式 |
| `ModelsSettingsPanel-Dn7mp8BK.js` | `739ab43ee521d8ef6e5b5b7731bb4e71b51454b2865f44a1228d7fcc2700149c` | 52007 B;`ModelsSettingsPanel` 22133–51116;校验/构造 payload 回调 `J` 27210–29304;保存 `Y` 29305–29739;提交 `Ke` 29740–30143;测试 `qe` 30144–30810;删除 `Je` 31340–31710 |
| `ModelsSettingsPanel-FfiX-Du7.css` | `cd80b01d04589227a3c2db5dbe67b6c83b019bef18d3dba68ae5486448651018` | 18989 B;完整模型设置列表、编辑覆盖层、字段网格、测试反馈、删除弹窗样式 |
先前固定导出未包含模型设置 lazy chunk;主上下文随后经 REA 选择性补齐以上 JS/CSS。本报告已据新增正文修订字段、校验、覆盖确认、连接测试和删除流程。实际请求层的协议映射/能力处理与所有动态失败状态仍需进一步核对,不再把“拿不到表单源码”列为阻碍。
## 当前 YCode 真实能力及缺口
| 能力 | 当前状态与源码 | 与已知原版的差距 |
| --- | --- | --- |
| 新建入口 | `Sidebar.tsx:159` 调用 `newSession`;`stores/chat.ts:67` 调用真实 IPC 创建并切换;`main/ipc.ts:299` 实际存储 | 原版首页 `useCreateHomeTask` 在首条提交才调用 `conversations.create`,同时带任务配置。YCode 点击即产生持久空会话;首页又用 `messages.length === 0` 判定,缺独立新任务草稿/创建阶段 |
| 首页内容 | `ChatPane.tsx:151` 渲染标题、三场景、胶囊和推荐;数据来自 `mock.ts` | 当前场景点击直接写固定提示词;原版具有场景配置、模板选择、输入草稿同步、推荐/选择状态,不是同一状态机。历史“实测”注释不能充当本次 REA 验证 |
| 首次发送 | 输入框通过真实 `send`/IPC/内核运行;附件、资源、权限、语音已有宿主接入 | 创建 payload 没有 model/cwd/interaction mode/scene 的任务快照;原版创建携带这些字段,提交前还检查工作区、模型能力和创建并发 |
| 草稿 | `ChatPane.tsx:32` 组件内按 session ID 保存文本/附件/资源 | 组件内状态没有持久首页草稿;原版 `useBuddyHomeInputPersistence` 有作用域与 500 ms 持久化等分支。重启、导航和场景切换具体行为需实测确认 |
| 工作目录 | 全局目录真实可选、落盘;首页按钮打开设置 | 原版首页提供任务目标/cwd/worktree 的输入 provider、有效性检查及本地目录记忆。YCode `SessionMeta` 无 cwd;当前目录全局变更影响后续会话执行,不能模拟每任务绑定 |
| 模型按钮 | `ChatPane.tsx:126` 只打开设置;展示 OMP 首模型或网关名 | 没有原版模型下拉、分组、当前项、搜索/编辑入口、思考设置、上下文选择。新任务模型偏好与每会话选择未贯通 |
| 模型设置 | `SettingsDialog.tsx:180` 是单一旧网关的 baseUrl/model/key/temperature 表单,配置真实保存,密钥不回传渲染器 | 没有多模型列表、provider 分组、添加/编辑/删除/连接测试/能力设置;OMP 可用时该表单对实际对话不生效。这是功能断点,不能只换表单外观 |
| 模型持久化 | `main/config.ts:15` 一个 `StoredConfig`;`updateConfig` 真正保存并 safeStorage 加密 key | 当前不是自定义模型注册表,缺稳定模型 ID、多记录与选择引用、导入旧配置迁移,以及按模型维护密钥的接口 |
| 模型运行时 | `main/omp.ts:154` 读取 profile 首个 provider/model;构造器支持 modelOverride;`main/ipc.ts:126` 创建内核时未传 override | 首模型解析/显示不等于选择生效。必须打通 UI 选择→任务记录→实际 OMP 请求/内核模型→重启恢复。已有实例仅按 cwd 判定复用,需要评估模型切换时的行为 |
账号、云端模型、企业策略、收费/推荐请求属于原版存在的额外分支。本次用户已排除原版服务端模型;自定义 provider 配置可采用明确的本地数据来源,不能因此保留“选中模型实际仍跑固定 OMP 首模型”的断点。无需取得 WorkBuddy 服务端才能完成自定义模型客户端交互与用户自己的上游调用。
## 原版静态实现已明确的行为
新任务 `useCreateHomeTask` 有创建锁、空内容拒绝、creating/worktreePreparing 状态,创建配置包含标题、cwd、welcomeMode、mode、model、expert、permission、promptContentBlocks 等;成功后导航新会话,并清理对应草稿/准备上下文。`useHomeInputSendHandler` 会先筛掉 failed blocks,检查本地工作目录可用性,处理 before-send 拒绝和创建错误,失败路径可回滚已准备状态。这里只列可从源码确认的分支,不代表所有分支都需要同时实现云端依赖。
自定义模型 `buildDefaultModelFormValue` 明确返回:providerId、modelId、endpoint、apiKey、supportsToolCall、supportsImages、supportsReasoning、onlyReasoning、canDisableThinking、defaultEffort、supportedEfforts、useCustomProtocol、maxInputTokens、maxOutputTokens。provider 配置还明确区分 authMode(apiKey/none)、endpointMode(readonly/editable)、modelInputMode(select/selectOrInput/input)、advancedConfigMode、savePolicy 和能力默认值。
原版 selector 把 configurable/custom 标签或 `custom-local:` ID 识别为自定义模型;自定义入口支持设置 `models/new`、`models/edit/<id>`。新任务偏好保存 id/isThinking/reasoningEffort/contextWindow,并按用户/应用作用域读取。模型调用适配器有真正 list/save/delete/test/check 接口,说明“添加一个输入框”无法覆盖其生命周期。
## 补齐表单后的确切约束
以下来自新增 REA 模型主体正文,已经能直接指导实现;动态表现仍需同输入验收。
| 项目 | 原版规则与源码锚点 |
| --- | --- |
| 打开/关闭/编辑 | 新建回调 `K` 24640–24819 重置表单/测试错误/密码可见性;编辑 `q` 25093–26214 回填模型、endpoint、apiKey、能力和 reasoning/token 字段;Escape 关闭编辑覆盖层。切换 provider 重新采用该 provider 默认值并清除当前编辑对象 |
| provider | 按配置分组;provider 总数大于 6 显示搜索。readonly endpoint 隐藏输入并用 provider tooltip 显示;editable 显示地址输入与即时 error 状态 |
| 校验顺序 | `J`:选择 provider → trim 后 modelId 必填 → endpoint 必填 → editable endpoint 必须是 URL 且为 http/https → authMode=apiKey 时 key 必填且字符合法;失败 toast 后终止,没有新增记录 |
| API Key | `sanitizeApiKeyInput` 19991–20052 删除全部 Unicode 空白;允许字符为 `^[\x21-\x7E]+$`(ASCII 可打印非空格)。表单密码/文本切换;实时字符错误和测试错误共用反馈区。authMode=none 隐藏输入且保存 payload 的 apiKey 为 undefined。编辑会回填已有 key,不能把 YCode 旧表单“留空保持”当成原版行为 |
| 模型输入 | 当 provider.modelInputMode=selectOrInput 且有候选时用模型下拉,候选数大于 6 显示搜索;当前非候选值会加入选项。其余分支使用文本输入。模型选择可更新能力与 reasoning 默认值 |
| 重复 ID | `Ke` 29740–30143 检查与当前编辑对象不同的同 ID 记录;出现覆盖确认,确认后才保存。不是直接拒绝或静默覆盖 |
| 保存 | `Y` 调用 `adapter.saveLocalCustomModel({model,previousId,visible:true})`;成功更新列表/文件路径,发出 `agent-ui:custom-models-updated`,关闭编辑。失败普通 toast 并可继续编辑;企业策略拒绝分支会关闭编辑 |
| 能力/协议 | provider.showCapabilitiesInForm 控制工具、图片、推理、自定义协议开关;支持推理后才显示仅推理、允许关闭思考、默认 effort、支持 effort 复选组。关闭推理会清除其附加状态;保存 reasoning 空对象时为 undefined。useCustomProtocol 是保存的布尔字段,其真实请求协议效果尚未由本表单证明 |
| provider 自动策略 | savePolicy=autoFromModel 时以模型选项自动产生能力/推理默认值;手动能力分支保留表单选择。不能所有 provider 都用同一组默认 checkbox |
| 高级区域 | advancedConfigMode 非 hidden 时出现标题与内容;该 JSX 没有折叠展开按钮。需纠正把它预设为可折叠区域的推断 |
| tokens | 输入为 number/min=0/step=1;空字符串保存为 undefined,非空由 `parseInt(...,10)` 且 finite 判定。该函数没有正数、安全整数、上下文上限或输入输出大小关系校验,不能凭 UI min 属性声称服务层已有约束。输入快捷值 32768/65536/131072/262144(32/64/128/256K),输出 8192/16384/32768/65536(8/16/32/64K) |
| 表单连接测试 | `qe` 30144–30810 复用上述 `J` 校验,只调用 `testLocalCustomModel(model)`,不调用保存;testing 中取消/保存按钮 disabled,测试按钮在 saving 或 testing 时 disabled。成功 toast;失败按 errorCode 映射到本地化反馈,无匹配用 defaultError;异常也落默认错误 |
| 列表连接测试 | `X` 30811–31339 同时仅允许一个已有模型测试;失败给行标记,成功移除。编辑该失败项也移除失败标记;不是保存配置失败状态 |
| 删除 | 点击显示含模型名的确认弹窗,遮罩/取消可关闭;`Je` 31340–31710 调用 `wb.models.deleteCustom(id)` 后 `wb.models.customs()` 刷新,再发 `agent-ui:custom-model-deleted` 并关闭。失败 toast,弹窗保留。表单层没有证明删除选中运行模型后的内核行为 |
表单 runtime bridge 是 `adapter-context` 提供的 adapter(保存/测试/读取),删除走 `wb-singleton` 的 models facade。已有 `workbuddy-provider` 将 save/test/list 交给 daemonClient 对应方法;当前证据仅证明客户端调用,不证明 daemon 内部 OpenAI/Responses/其他协议构造。YCode 无需调用这些原版服务,但自己的接口必须覆盖这些生命周期状态,并把选择实接用户上游/OMP。
## 建议采集与验收矩阵
每行应同时留原版 REA 截图/布局/交互证据和 YCode 相同输入证据;光暗主题、相同窗口和字号是对比条件。危险或联网状态可先用隔离用户上游和本地测试 fixture 验证 YCode,不改原版真实密钥或发送真实消耗请求。
| 组 | 必采/必验状态 | YCode 行为判据 |
| --- | --- | --- |
| 首页进入 | 从已有任务点新建;重复点击;初次启动无任务 | 首次发送前是否创建记录按原版实测定稿;不会不断堆积空会话;既有运行不会被误停止 |
| 首页草稿 | 输入后导航返回;场景切换;切回;重启恢复;附件选取未完成时切走 | 与原版相同保留/清理范围;不会把 A 的附件/草稿挂到 B |
| 首页布局 | 三场景及各展开子项;推荐有/无;窄窗口;长中文路径/长模型名;空输入和多行输入 | 原版组件结构、尺寸、字体、间距、滚动区域、图标及焦点表现逐状态对照 |
| 创建 | 空/纯文本/附件;Enter/Shift+Enter/IME;快速重复提交;创建中;创建失败重试 | 一次操作一次创建;失败保留可重试输入;错误、禁用、loading 与原版一致 |
| 任务配置 | 本地 cwd 选取/取消/不存在;mode/permission 选择;有/无模型 | 首轮真实使用提交时配置快照;与其他任务隔离,重启仍可还原 |
| 模型入口 | 下拉关闭/打开;零个/一个/多个自定义模型;选中/悬停/键盘;进入新建/编辑 | 选择项与实际使用的 provider/model 一致;新任务和已有任务选择范围明确 |
| 添加表单 | 默认 provider;custom provider;auth none/apiKey;模型选择/手填;高级显示/隐藏;推理条件字段 | 按原版字段条件和默认值显示,不把服务端模型写死为本地假项 |
| 校验 | 必填空白;重复 ID 覆盖/取消;非法 URL;key 空白/非法字符;输入/输出 token 边界;能力组合;取消未保存 | 按已知校验顺序和数据结果验证;未声明的 token 服务层约束单独采证,不用自造规则代替原版 |
| 编辑/删除 | 编辑已配置 key;清空 key 后提交;切换密码显示/遮罩;删除确认/取消;删除选中模型 | 编辑与密钥处理按原版可见行为设计并保护采集数据;引用被删除时行为待实测定稿,错误不静默 |
| 连接测试 | 未填/就绪/测试中/成功/鉴权失败/超时/不可达/重复点击 | 测试走选定用户上游;状态可取消/重试,输入与执行目标一致,不误保存 |
| 持久与运行 | 新增重启;编辑后重启;首轮/后续轮选择;运行中切换;回退内核 | UI、持久 ID、OMP/native provider 请求均一致;重建/切换不丢已有上下文 |
原版下一轮采集至少需要:首页本地目标(不会真实发送)、场景切换、目录 picker、模型 selector,以及设置新建/provider 切换/高级条件/删除确认。模型列表已有单状态画面,模型主体 JS/CSS 已补齐;后续采集聚焦各状态,而非继续停留在获取这两份正文。编辑、校验与网络失败可优先用隔离模型数据/假上游回归 YCode。账号/企业限制分支不等于用户范围内的自定义 API 能力,不能从代码里看到分支就要求用户接入原版后端。
## 实施依赖和拆分建议
以下是模块依赖,整体架构和排期由主上下文决策。
1. ModelsSettingsPanel 源码/CSS 已固定;补齐可复现首页/模型各状态画面、所用 selector 控件/弹窗依赖与运行时协议证据。
2. 明确新任务草稿与已创建会话的边界,任务的 model/cwd/mode 绑定及旧会话迁移策略。此项同时影响空间和右侧栏,应由主上下文统筹。
3. 自定义模型本地 CRUD、密钥和连接测试 IPC;模型 UI 与原版 selector/设置布局并行实现需要共享稳定数据契约。
4. 将选择接入 OMP;说明运行中的切换时机/内核复用规则,验证多轮及重启。不能把旧网关表单改名后作为模型添加完成。
5. 恢复首页输入 provider、场景与创建状态,再做完整状态回归和逐画面像素/动效对比。
可明确拆为“证据补全、任务草稿/配置、模型数据与 IPC、模型设置与 picker、OMP 选择贯通、首页交互、双端验收”七个有独立产出的工作包;其中数据契约和内核接入是实质依赖。当前证据不足以给精确工时或可信百分比。
## 本次检查结果及限制
- 修改文件:仅本文。
- 检查方式:读取 YCode 源码;对保存 REA JSON 的目标 source 做关键词检索和 Babel AST 函数边界检查;使用 Node crypto 计算上述选中正文 SHA-256,与固定 manifest 中 CSS 身份对应。
- 没有修改生产代码,未运行构建或测试;本次不是功能验收。
- 已分析主上下文新增的原版模型列表运行时画面和表单完整 lazy JS/CSS;表单字段/校验/覆盖确认/测试与删除客户端流程已明确。网络请求协议、服务层 token 约束、删除选中模型行为、运行中模型切换、首页重复点击/重启细节仍待采证据。
- OMP 自定义协议与原版 useCustomProtocol 等效性需单独确认;用户自己的上游可替代服务来源,但不可声称所有协议/能力组合已经等价。