Files
ycode/docs/自定义模型与多协议接入-2026-10-18.md
T

95 lines
14 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.
# 自定义模型与多协议接入(2026-10-18)
## 实施结果
本轮完成用户提出的五项模型设置调整。按用户定制需求实现,未查看或采集 WorkBuddy,不新增原版等价或全状态 1:1 验收结论。保留当前工作区的设置性能、附件、上下文用量和沙盒并行修改,未重启用户正在使用的 YCode。
| 需求 | 当前行为 |
| --- | --- |
| 供应商仅自定义 | 添加、编辑和列表统一显示“自定义”;已有配置和密钥继续可用。原供应商资源仍供其他界面的模型图标使用。 |
| 多协议 | 自动协商、OpenAI 兼容、Anthropic、Gemini;OpenAI 内含 Chat Completions 和 Responses 两种 API。正式对话和备用 HTTP 网关均按协议构造请求。 |
| 仅填写域名 | 自动补全 HTTPS,localhost/127.0.0.1/IPv6 回环默认 HTTP;保留完整地址兼容,协商常用版本路径和根路径。原来未声明协议的配置保持旧 OpenAI 路由。 |
| 获取模型 | 按当前地址、协议和新填/已有 Key 请求模型列表,支持分页、去重、单选、搜索和手动输入。Gemini 排除不支持生成内容的模型。空列表、没有列表 API 时仍可手动配置。 |
| 模型元数据 | 内置完整 models.dev 快照,按精确 ID、供应商前缀及明确的 canonical ID 匹配,填入能力、思考、总上下文和输出;输入预算动态扣除输出,原始上限继续用于校验。用户手动配置在编辑和重新打开后保留;未知 ID 不猜测能力。 |
新连接在保存前发送一次简短生成探测,表单已说明该行为。模型列表成功只能证明列表 API 可用,不能代替生成协议验证;正式路由保存验证结果。获取列表不会覆盖原来已验证的 Responses 等生成路由。迟到的列表、元数据或测试响应不能覆盖后续编辑。
## 最新总上下文语义订正
用户确认第一项是总“上下文”,第二项是“输出”;输入预算和压缩阈值动态计算,见[总上下文预算与压缩阈值](上下文预算与压缩阈值-2026-10-18.md)。500K/128K现为500,000总窗口、128,000输出、372,000输入预算,压缩阈值372,000;上一轮628,000的相加逻辑已修正。已接真实OMP独立配置,安装内核读取阈值正确。完整构建、预算13项、原生14项、模型能力22项、旧配置迁移/冷加载及真实隔离应用104项通过,未重启用户窗口。
## 本日后续界面调整
- 对话、项目和定时任务中的“配置自定义模型”统一打开模型列表;只有明确的添加操作打开添加表单。
- “更新元数据”移动到“设置 → 关于”,显示来源及快照日期,调用既有真实更新服务并反馈成功或失败。模型列表不再显示更新入口。
- 移除“此接口无需 API Key”开关和相关提示。新建时 Key 为空即按免密接口处理;编辑已有密钥时只显示圆点占位,未编辑则保留,清空后可改为免密。
- 模型名称使用可编辑搜索下拉框,同一个输入框支持筛选、键盘单选及手填;下拉框与整个输入框左边缘和宽度对齐。修复浮层定位与入场动效冲突,以及获取列表后过早打开的竞态。
- 移除“已匹配 models.dev…”及最低参考价格等说明。最新表单仅保留“上下文”和“输出”两项,输入预算动态计算;后台继续匹配元数据、选择价格档并校验原始上限。
- OpenAI 兼容的新协商默认优先 Responses,成功后不再探测 Chat;Responses 不受支持时继续尝试 Chat。自动协商中的 OpenAI 候选也采用该顺序,明确填写 `/chat/completions` 的地址仍优先 Chat。重新测试已有 OpenAI 配置时也按新顺序探测,并保留协商出的自定义根路径;普通对话继续使用保存的接口或更新的成功探测结果,未声明新协议的旧模型仍沿用原兼容逻辑。
最终 `npm run build` 通过。最新真实隔离应用验证 **78 项通过、0 renderer 错误**,报告 `.tmp/custom-model-settings-EeOtQT/report.json`;四种协议的正式调用、空 Key、保留/清空已有密钥、搜索/手填、浮层宽度/位置/稳定态可见性、移除文案和字段、关于页实际更新服务均覆盖。关于与帮助布局 21 项通过(`.tmp/about-help-settings-Hk3bkH/report.json`),设置生命周期 26 项通过、0 renderer 错误(`.tmp/settings-performance-JpGssO/report.json`)。已查看最新浅色参数表单、深色展开列表及关于页截图。
本次界面调整后未强制重启用户正在运行的 YCode,重新启动后加载最新构建。本轮未采集 WorkBuddy,不新增原版逐像素验收结论。下方验证表保留本日原功能实现时的基线。
Responses 优先调整后的完整构建通过(`.tmp/responses-priority-build.log`)。模型注册回归验证两种接口都支持时只请求 Responses、仅 Chat 时回退、显式 Chat 地址、旧 Chat 自定义根路径重新测试、历史协议及原有加密/持久化/错误处理(`.tmp/responses-priority-registry.log`);原生多协议回归 14 项通过(`.tmp/responses-priority-protocols.log`),真实隔离应用 78 项通过、0 renderer 错误(`.tmp/custom-model-settings-EciOBY/report.json`)。未调用用户实际 API 或重启用户当前窗口。
## 500K快捷项首轮实现(历史,已由上方订正)
- 输入新增 **500K = 500,000 tokens**,输出新增 **128K = 128,000 tokens**。新项使用明确标签与精确值,避免按 1024 生成 131,072 而超出模型目录的 128,000 输出上限;原有快捷项数值保持兼容。
- 元数据同时保留模型原始输入/输出/总上下文上限及完整价格档。自动匹配仍优先低价档;手动输入超出该窗口时,总上下文同步为足以容纳输入和输出预算的值。以 GPT-6.1 Sol 为例,选择这两项后保存 **500,000 输入 / 128,000 输出 / 628,000 总上下文**,参考价格切换至对应长上下文档。
- 前端与主进程使用同一预算解析。目录不支持的快捷项禁用,手填超出单项或总上限时阻止保存;已保存值不会被失败操作覆盖。缩小大预算后可恢复自动低价档与窗口。
- 编辑已有配置时更新原始元数据,但保留手动输入、输出与能力。保存、重新打开及新的主进程加载均保留预算;新回合的 OMP profile、真实请求输出预算和上下文统计使用同一配置。
本轮完整构建通过(`.tmp/model-budget-build.log`)。元数据与预算 12 项通过(`.tmp/model-budget-metadata.log`),模型注册/冷加载/无效写入保护通过(`.tmp/model-budget-registry.log`),上下文用量回归通过(`.tmp/model-budget-context.log`),原生 HTTP 多协议 14 项通过(`.tmp/model-budget-native.log`)。真实隔离生产应用 **99 项通过、0 renderer 错误**,报告 `.tmp/custom-model-settings-D1Jj9H/report.json`;实际读取 OMP profile 确认 `contextWindow: 628000`、`maxTokens: 128000`,受控 Responses 请求确认 `max_output_tokens: 128000`,统计分母为 628,000。已查看 `custom-editor-500k-128k-light.png`,两列新增选项完整显示且选中样式正常。
验收使用短提示和本地受控上游,验证配置、参数与统计链路;没有发送 500K 内容到用户实际收费服务,不能据此断言供应商实际限额。本轮未重启用户当前窗口、未采集 WorkBuddy,重启加载最新构建后可选择新项。
## 元数据快照与价格选择
- 来源:[models.dev API](https://models.dev/api.json)、[公开仓库](https://github.com/anomalyco/models.dev)。数据和 MIT 许可证保存在 `resources/model-metadata/`,包含打包资源。
- 获取时间:北京时间 **2026-10-18 06:29:14**(UTC `2026-10-17T22:29:14.523Z`)。
- 数量:232 个供应商,9,041 个模型,5,796,868 字节。
- SHA-256:`5980b554323ea4f118b06b960dde1eeb193f5bfa4722d6127fb3966d77195a1c`。
- 获取时仓库 revision:`8deeec23540f4c0e2c473be7f08130366e662c78`。记录的是获取时仓库状态,不将其当作 API JSON 与该提交的一一构建映射。
- “设置 → 关于”的“更新元数据”会校验并原子缓存新快照;更新失败保留可用数据。启动时在有效缓存与随包快照中选较新的版本,避免旧缓存覆盖新安装包。
- 维护命令:`npm run models:sync-metadata`。
同一模型优先采用其原供应商元数据,不为更低的代理报价切换供应商。上下文阶梯的 `tier.size` 按下限处理;默认上下文不越过所选低价档的上界。例如 GPT-5.4 默认为 272,000 总上下文和 128,000 输出上限,输入预算派生为 144,000,参考输入/输出价格为每百万 token $2.5/$15。
若某档输入更便宜、输出更贵,另一档相反,则不存在与 token 比例无关的“最便宜档”。此时默认最小上下文档,并在内部元数据中保存选择依据。所有价格均为目录参考值,不能保证自定义服务实际收费;页面已按用户要求移除这些说明。
预算型思考模型使用已验证的 `minimal`(极低)档作为可行默认时,对应原生预算为 1,024 tokens;只有开关、没有离散强度的模型采用自动强度。选择器与请求共用强度解析,禁止把旧模型不支持的强度传入新模型,也不会关闭目录声明为必须开启的思考模式。
## 正式调用、鉴权与持久化
- 主进程保存协议、协商路径、能力、限制和元数据来源。密钥继续使用已有的安全存储,预加载和界面只返回脱敏信息;编辑时未触碰密钥框则保留,明确清空则按免密保存。
- OMP 原生 Anthropic 自定义域名默认会附加 Bearer。现在通过受支持的环境变量请求头配置发送原生 `x-api-key`,同时关闭自动 Bearer;密钥不会写入 YAML 或命令行。
- Gemini 使用 `x-goog-api-key` 和 `generateContent` / SSE `streamGenerateContent`,不要求用户拼接查询字符串。
- OMP 的免密 Gemini 分支会附加 `N/A` 占位 Key,因此这种配置明确走原生 HTTP 网关。真实生产应用已验证免密 Gemini 成功对话且没有鉴权头。
- 同源路径协商不跟随跨源重定向携带凭证。模型列表和生成探测均有时间与响应大小上限。
- 备用网关处理原生图片、工具、思考、usage 与同一工具循环中的签名;截断、输出上限和流错误不会被当作可执行的完整工具调用。
- 总上下文进入原生 profile 和用量分母;原生 Gemini 请求也接入已有的系统/工具/消息分类观测。
## 验证
最终完整 `npm run build` 通过,含原生沙盒编译、Node/Web 类型检查和 Electron 构建。当前任务相关文件的 `git -c core.whitespace=cr-at-eol diff --check -- <files>` 通过;全工作区仍有并行 `src/main/sessions.ts` 的末尾空行提示,未为此修改他人文件。
| 验证 | 结果与证据 |
| --- | --- |
| 实际 UI → preload/IPC → 正式内核/HTTP → 受控上游 | **72 项通过,0 renderer 错误**,`.tmp/custom-model-settings-vu41wD/report.json`。覆盖四种 API 获取列表、自动参数、严格鉴权、保存及正式对话;核对实际请求强度和上下文分类;覆盖免密 Gemini、旧密钥查询、手动覆盖、空/无列表、过期响应以及浅色/深色布局。 |
| 真实 OMP 原生协议 | `npm run test:custom-models`:14 项通过,`.tmp/custom-model-core-final.log`。Anthropic API Key/免密、Gemini API Key 实际回合通过;免密 Gemini 明确使用备用通道。 |
| 原生 HTTP 网关 | `npm run test:custom-model-native`:14 项通过,`.tmp/custom-model-native-final.log`。分页、签名/工具续接、用量、错误与截断、免密、现代 OpenAI 输出预算和 Gemini 原生强度参数。 |
| 元数据服务 | `npm run test:model-metadata`:7 项通过,`.tmp/model-metadata-final.log`。新旧缓存、校验失败回退、更新落盘/失败保留、canonical 匹配、交叉价格和强度解析。 |
| 既有模型档案 | `scripts/model-registry-regression.ts` 通过,`.tmp/model-registry-final.log`。迁移、加密 CRUD、并发写入、选择/重载、空密钥及探测失败脱敏。 |
| 既有 Responses 网关 | `scripts/gateway-responses-regression.ts` 30 项通过,`.tmp/custom-model-responses-final.log`。旧 Chat 路由和参数保持兼容。 |
| 既有原生模型能力 | 22 项通过,`.tmp/model-capabilities-gYrRP5/report.json`。 |
| 设置性能与生命周期 | 26 项通过,`.tmp/settings-performance-OujUBI/report.json`。默认通用内容首开 283ms、重开 25~53ms;当前轮并行测试环境,不将其作为用户机器固定耗时。 |
| 对话与持久化 | `test:omp`、`test:chat`、`test:persistence`、`test:conversation-ipc`、`test:conversation`、`test:context-usage` 通过。旧测试替身补齐强度设置契约,并断言非思考模型确实在 prompt 前关闭思考。 |
| 定时任务兼容 | `test:automations` 19 组通过;允许保存新增的 auto/minimal 强度。 |
截图位于 `.tmp/custom-model-settings-vu41wD/`:浅色/深色表单、能力与上下文、400px 模型列表。已实际查看最新构建的高级参数和深色模型列表截图,确认可滚动到高级参数、完整显示模型 ID、主题与输入排版正常。
验收使用隔离 userData、构建快照、真实 Electron 和已安装 OMP,只请求本地受控模型服务。未调用用户内网 API 或收费云端模型;自定义服务的非标准路径需手动填写完整地址,任意厂商私有参数、备用网关跨回合签名历史和生产云端全状态仍需针对对应服务验收,不能由本轮协议契约测试推断全部等价。
本轮含 main/preload 修改。保存草稿后完整退出并重新启动 YCode,才会加载全部改动;没有强制关闭当前用户窗口。