统一智能体资源选择与个人 Skill 运行范围
状态:implemented 类型:feature Owner:backend/package/yuxi/agents/context.py
问题
资源配置曾用 null 表达全部,子智能体还用空数组表达全部,保存、展示与运行无法一致地区分动态全部、禁用和固定选择。预加载 Skill 另有禁止 all 的例外。个人 Skill 与共享 Skill 共用 Agent 选择范围时,空列表会隐藏个人 Skill,安装工具还须修改 Agent 配置。
决策
实现方案
Context 的资源字段统一声明 Literal["all"] | list[str],空数组表示不选择。工具、知识库和共享 Skill 默认 all,子智能体默认 ["general-purpose"],MCP 与预加载 Skill 默认空数组;全部字段都支持显式 all。创建时省略字段使用默认值,局部更新时省略字段保留已有值。repository 校验写入形状和授权并保留已有不可见引用;运行准备时才按执行用户展开 all。前端保留独立的全部模式,手动勾满仍保存固定数组;没有候选项也没有历史固定选择的分组隐藏,但不改写保存值。CLI 区分全部与禁用。子智能体中间件只使用已解析的允许列表,空列表不注册工具。
Context 字段类型和 metadata.kind 拥有资源声明;运行准备、repository 和 service 读取实际后端 schema,前端读取派生的 supports_all 与默认值。MCP 和预加载 Skill 复用资源选择校验与展开规则。预加载候选项只来自已选且授权的共享和内置 Skill;其依赖闭包及文件读取由 Skill runtime 负责,显式 all 保留动态意图。
Agent 配置中的 skills 只选择共享和内置 Skill。Context 选项与保存权限使用共享 Skill 查询;Skill runtime 合并已选共享 Skill 与当前用户全部个人 Skill,同名时个人版本生效,再展开授权依赖。主 Agent 和子 Agent 共用此入口。个人 Skill 安装只写个人目录,不读取或修改 Agent 配置。个人 Skill 的描述与路径进入每个新 Run 的可用范围,正文按需读取;已有共享预加载项被同名个人版本覆盖时读取个人正文,其他个人 Skill 不被预加载选择器自动选中。
storage-migrator 在一个事务内把 business schema 升至 9 并转换旧 Agent 配置。旧工具、知识库、Skill 和子智能体的 null,以及子智能体的旧空数组转为 all;旧 MCP 和预加载的 null 转为空数组。省略字段与固定列表保留原样,版本 gate 阻止新协议空数组被重复转换。SQL 显式转换 JSONB,兼容当前 JSON 列和历史 JSONB 列。
替代方案
保留 null 会延续缺省与全部的歧义;mode/items 对象对当前三态没有额外价值;保存时展开 all 无法覆盖后续新增资源。预加载保持数组专用类型会留下额外校验和界面例外;取消预加载不能满足首轮读取完整说明的需求。在配置或安装工具中追加个人 Skill 会重复运行范围规则,并依赖 Agent 所有权;把全部个人正文强制放入提示词会增加每轮上下文成本。迁移数据与版本分开提交会留下重试窗口,因此采用同一事务。
后果
省略子智能体配置时只启用通用任务;通用任务不可见时得到空列表。"all" 跟随执行用户当前可见资源,固定数组保留显式引用;skills=[] 只关闭共享选择,个人 Skill 仍可用。每个新 Run 读取当前个人目录,已准备的 Context 保留快照。显式全部预加载可能增加首轮输入和依赖工具;默认仍为空。共享授权、个人目录隔离、Skill 依赖和 Run 调度分别由既有边界执行。
新写入拒绝 null。升级时先停止旧 API 与 worker 写入并运行迁移器;回退须恢复升级前数据库备份。前端隐藏空资源分组不改变已保存的 all 或空数组;出现候选项后分组重新显示,已有不可见固定选择保留提示和清理入口。
验证
- Context、repository 与 Skill runtime 单测覆盖动态全部、显式空列表、隐藏引用、个人 Skill 与共享选择分离、同名覆盖、用户目录隔离、预加载范围和非法值拒绝。负向案例恢复旧选项查询和旧运行合并规则后分别失败。
- 真实 PostgreSQL integration 回读 JSON/JSONB 迁移与版本,验证版本写入失败整体回滚、重复执行保留新空数组。真实 HTTP integration 保存并回读选择意图,拒绝非法形状和个人 Skill 配置引用后数据库原值保持不变。
- Chatbot 中间件装配单测验证空子智能体列表不注册工具;安装测试回读个人文件并证明不依赖 Agent 配置数据库访问。Web unit 与浏览器验证全部模式、固定勾选、空分组响应式显示及保存值不变;CLI 测试区分全部与禁用。完整命令与环境边界见交付 PR。
- 旧能力不存在:预加载数组专用类型、拒绝 all 的 guard、资源字段外部名单、前端默认全选名单,以及安装时修改 Agent 配置的入口均已删除。重新引入条件:有当前协议无法表达的真实用户约束或个人 Skill 需要显式管理的产品要求。
- Not run:完整 worker/模型 E2E;个人 Skill E2E 已定义最终输出、文件和 Run manifest 回读断言,运行仍需模型与 worker 环境。