# 模型编辑、模型选择与上下文状态 ## 对标依据 2026-10-09 通过 WorkBuddy 5.7.6 的真实渲染页 CDP、DOM、计算样式和安装包资源确认,未使用 computer-use。原始会话及采集资源只保存在用户私有目录。 - 模型入口高 32px,图标 16px、箭头 14px;弹层宽 280px、最大高 368px、圆角 16px、内边距 8px。列表按渠道分组,组标题高 28px,模型行基准高 32px;选中标记、悬停、滚动和键盘操作共用一个列表。 - 上下文入口位于模型入口左侧,点击区域 32px,圆环 16px、线宽 2px。用量面板宽 280px、内边距 16px、圆角 16px,包含百分比、token 用量、占用条与分类图例。 - WorkBuddy 的付费、Max 等专有功能没有对应的 Ygent 功能,不能添加无效入口。模型图标采用随包本地 SVG(Lobe Icons 1.95.1,保留 MIT 许可),按 canonicalId 模型归属匹配;未识别元数据时仅按已知模型名前缀回退,未知模型显示通用图形。模型按钮及列表共用组件,客户端不访问图标 CDN。 ## 已实现 模型编辑恢复输入上下文、输出上限的选项按钮。输入提供 32K/64K/128K/256K,输出提供 8K/16K/32K/64K;精确模型上限作为独立选项,超出模型上限的预设不可选。默认不展示数字输入框,点击“自定义”后才能输入;保留元数据默认值、逐字段覆盖与恢复自动能力。 补充:两组均提供 128K/256K/1M,token 档位使用十进制 K=1000、M=1000000。模型声明在 1000000–1050000 的窗口归入 1M 显示档,但选中与保存采用模型的精确上限(例如 1050000),悬停显示准确 token 数。128000 对应 128K,不再因按 1024 换算而被误判超限。已有精确数字不重算。 自动输出预算直接使用元数据声明的输出上限(例如 gpt-6-luna 为 128000),不再统一限制为 8192 或上下文的一半;保留每字段手动覆盖,仅元数据未声明输出上限时兜底 8192。配置允许输出上限等于上下文上限,实际请求仍校验输入加输出预留是否超限。 对话模型菜单改为单层渠道分组列表,选择真实模型后关闭;支持方向键、Enter、Escape、外部点击关闭和焦点返回。当前模型的原生思考选项及预算仍可设置,配置入口打开模型设置。新建任务和对话复用同一模型组件。 对话输入区增加上下文圆环、悬停说明及点击详情。切换会话会清空旧显示,生成期间及面板打开时每两秒刷新;查询不启动、不切换、不重启 Agent。 ## 用量语义与边界 - OMP 总量:读取已绑定当前会话的 `get_state.data.contextUsage`,标注“内核当前上下文估计”。读取最长等待两秒,操作冲突或失败使用本会话持久化快照。 - 直连:读取实际 SSE 的最近请求输入计数,标注“最近请求的输入用量”。支持 Chat Completions、Responses、Anthropic Messages、Gemini;Anthropic 包含缓存读取与写入输入。 - 不把各轮 token 累加作为上下文占用,不把输出或账单总量当成输入。没有真实计数/窗口时显示“—”,不能用运行时兜底窗口伪装模型实际上限。 - OMP 分类:随包观测扩展读取主 Agent 的实际 `context` 输入与 `before_provider_request` 最终工具声明,通过 OMP 分词器本地计数;不是分类 RPC,也不按内核总量分摊比例。分类与内核当前总量是独立快照,可能不相等。 - 分类包含系统提示词(扣除已识别的技能目录)、工具及子智能体的声明/调用/返回、对话正文、MCP 声明/调用/返回、技能目录及按需读取的正文。只计算当前主 Agent 实际输入中可见的内容,不推断子 Agent 的私有上下文。停用技能或连接器后,仍在输入历史中的调用和返回继续计入原分类。 - 面板显示各类估计 tokens 及其占请求时上下文窗口的比例;悬停可查看精确估计数、快照时间、模型和请求身份。无法识别名称的工具声明列入“未归类”,仅非零时显示;供应商协议封装及未公开的隐藏输入不伪装成已分类内容。 - 精度按真实计数路径标注“模型分词器”、`o200k_base` 或“UTF-8字节估算”。后两者及本地分类都不能当作上游账单实测值;没有请求快照、直连尚无可靠分类来源时继续显示“— / 暂无分类统计”,不以零补齐缺失数据。 - 分类每次实际准备模型请求时替换,不累加;按宿主会话/请求/原生会话文件校验后持久化。取消保留已准备输入,拒绝取消后的迟到帧;重载和总量刷新保留同一分类快照。旧历史不反推分类,更新后的 OMP 进程产生新请求后才会有新统计。 - 快照按会话持久化;直连数值是最近请求观察值,不代表用户编辑历史后已经重新计算;新请求开始清除旧的直连观察值。 ## 验收 2026-10-09:后端 `cargo test --lib --quiet` 69 项通过、1 项忽略,包含各协议输入计数、覆盖而非累加、缓存计数、会话隔离和 OMP 字段解析。`npm run build`、`npm run models:check`、`npm run check:chat` 通过。 原生验收使用隔离数据库与真实 Tauri IPC,脚本 `scripts/model-context-native-check.mjs`;上游仅使用本机受控 SSE 服务,不操作用户正常会话,不替换前端 IPC。Windows WebView2 视口 1335×916、DPR 1:编辑器选项/精确上限/自定义/恢复自动、模型列表位置和方向键焦点、上下文面板/Escape、两轮输入 1250→2750 替换而非累加、跨会话隔离及重载恢复均通过;六档字号下两种面板均宽 280px,无横向截断。模型选择使用真实按钮激活验收,未将 CDP 的 Enter 默认行为计为已通过。 截图和 DOM 证据位于用户私有目录 `C:/Users/Administrator/.ygent/imports/model-composer-20261009/native`。OMP 实际返回的窗口可能是内核可用窗口,不能强制等于模型元数据最大窗口;以实际 `contextUsage.contextWindow` 为准。本次只实测 Windows,未声称 Mac/Linux 通过。 ### OMP 输入分类验收(2026-10-10) 隔离数据库、真实 Tauri IPC / WebView2、OMP 18.6.3;模型上游为本机受控 SSE,技能通过真实安装及按需读取接入,MCP 通过真实 stdio 握手、工具发现及独立宿主授权调用。未替换 IPC、未注入前端分类数据,不把受控上游当成真实供应商计费验收。Windows 视口 1335×916、DPR 1;其他平台未实测。 八项场景通过:无请求时分类未知;技能与 MCP 调用后五类均有真实输入计数;刷新总量不覆盖分类;六档字号下 280px 面板无横向溢出、Escape 关闭并返回焦点;未启动的第二会话查询不创建内核会话文件且不串分类;下一请求替换而非累加并保留历史技能/MCP 输入;运行及取消保留已准备输入;真实 WebView 重载恢复同一快照且不产生新模型请求。DOM、计算字号/行高、边界及滚动尺寸与截图同时采集。 本次分词路径为 UTF-8 字节估算:首次内核总量 8,935,独立分类合计 9,383;停用扩展后的新请求分类合计 8,857,取消回合 8,878,重载后保持不变。分类没有缩放为内核总量,也没有把旧快照累加到新快照。 后端 `cargo test --lib --quiet --manifest-path src-tauri/Cargo.toml`:119 项通过、1 项忽略,覆盖分类和校验、溢出、会话隔离、旧请求/取消身份拒绝;`npm run build` 与 `npm run check:chat` 通过。构建仍有已有的大 chunk 和 `knowledge::context` 未使用警告,未扩展本轮范围处理。 证据:用户私有目录 `C:/Users/Administrator/.ygent/imports/context-categories-native-C7mOTZ`,含 `result.json`、真实上游请求、六档 DOM/计算样式及第 1/6 档截图。隔离进程与本机服务已关闭;临时验收脚本不留在仓库。 ## 本地图标验收 2026-10-09:14 个品牌 SVG 在真实桌面 WebView2 中均完成解码,模型按钮与列表图标为 16×16px,资源均为本地/内联资源。未知归属回退和 GPT 模型名回退已验证;类型检查、构建及 diff 检查通过。截图与 DOM 位于私有目录 `C:/Users/Administrator/.ygent/imports/model-icons-20261009`。