OmO / senpi-task 的 Agent 感知解析与持久化:从 resolveAgent 到任务记录回读的完整实现拆解
OmO / senpi-task 的 Agent 感知解析与持久化从 resolveAgent 到任务记录回读的完整实现拆解【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent本篇技术指南聚焦 oh-my-openagentOmO仓库中senpi-task包的 Agent 解析链路以.omo/evidence/omo-senpi-adapter/20260719-curated-agents/task-4.md的验证记录为骨架深入resolveAgent的模型解析优先级、内置回退链、工具规则过滤、persona 组装以及解析结果经parseTaskRecord持久化回读的完整闭环。读完本文你将掌握 Agent 定义如何被解析成可执行的任务记录、resolved_model.source: agent在解析与持久化两侧的校验方式以及如何用测试与变异验证守住这条链路。一、Task 4 验证了什么一条从解析到回读的闭环2026-07-19 的 curated-agents 任务分九个子任务落地。Task 4agent-aware resolution and persistence验证的是整个 Agent 解析与持久化链路的核心覆盖以下行为面resolveAgent的回退解析fallback resolution直接模型优先级direct model precedence即model字段优先于models列表有序模型备选ordered model alternatives即models[]数组的先后顺序即尝试顺序禁用与未知 Agentdisabled and unknown agents的报错形态注册表不可用unavailable registries时的降级返回显式模型 persona 解析explicit-model persona resolution即配置了modelOverride时直接携带 persona 返回工具规则过滤tool-rule filtering即tools/disallowedTools派生 allowlist 与 denylistresolved_model.source: agent这一来源标记在解析产物中的正确落位。同时验证了持久化侧一个全新的RecordStore实例能够通过parseTaskRecord从磁盘重新读取 agent 来源的任务记录未知目标渲染unknown-target rendering会同时携带活跃的 Agent 名册与类别名册curated 名称会被 team-member 校验拒绝。从源码结构看这一任务还完成了职责抽取注册表解析被抽到独立的 agent-model-registry.ts使 resolve-agent.ts 保持在 176 行的克制体量——解析逻辑与注册表解析逻辑从此各司其职。二、resolveAgent解析入口与三种返回形态resolveAgent定义在 resolve-agent.ts签名接收四个参数请求的 Agent 名、Agent 定义表、模型注册表端口可为空、以及可选的ResolveAgentOptions含modelOverride与omoConfig。解析结果是一个可判别联合discriminated unionResolvedAgentResult解析成功携带agent、model形如provider/modelId、persona 字段、运行时模型链requested_model/fallback_models/resolved_model与availableAgents名册AgentNotFoundResultAgent 不存在或disable: true返回not_found与活跃名册AgentModelUnavailableResult注册表缺失或没有任何候选模型可用返回model_unavailable、attemptedModel与活跃名册。三种形态都附带availableAgents按名称排序的未禁用 Agent 列表这正是 Task 4 所验证的未知目标渲染同时携带活跃名册的产物来源——渲染层拿到not_found结果时可以直接展示当前可用的 Agent 名单。解析主流程的优先级resolve-agent.ts 的执行顺序值得逐一拆解名册过滤先过滤disable true的定义得到活跃 Agent 排序名册目标定义缺失或被禁用则直接返回not_foundmodelOverride 短路若调用方显式传入modelOverride直接返回resolved模型即该覆盖值并携带完整 persona这就是显式模型 persona 解析这为上层调用提供了一条绕过整个注册表解析的快速通道注册表缺失降级registry undefined时无法做任何解析此时尽力推算一个attemptedModel依次尝试definition.model、models[0]、类别默认模型、内置回退链头返回model_unavailable直接候选解析由 agent-model-entry.ts 的agentModelCandidates将model与有序的models[]合并为候选序列model永远排在最前这正是直接模型优先级的实现基础逐个经findExactAgentModel精确查找并要求命中结果同时出现在可用模型集中类别解析若定义带categories走 resolve-agent-categories.ts 的resolveAgentCategoryModel第一个能解析成功的类别即提供模型内置回退链若以上都未命中且可用模型集可解析调用delegate-core的resolveModelForDelegateTask在AGENT_FALLBACK_CHAINS上做回退选择。注意 Task 4 明确记录了一个边界No category lookup occurs insideresolveAgent——类别解析由第 5 步单独调用完成resolveAgent自身不内嵌类别查找planner 兼容性属于 Task 7 的范畴。从代码看确实如此类别解析被隔离在独立的resolveAgentCategoryModel函数中保持单一职责。三、注册表解析抽取agent-model-registry.tsTask 4 的关键重构是注册表解析抽取。文件 agent-model-registry.ts 承担三类职责findExactAgentModel把候选字符串如openai/gpt-5.6-luna-fast按provider/modelId拆分再与注册表find结果比对。拆分要求/存在且首尾均非空注册表对象必须同时提供字符串型的自有数据属性provider与id且与期望值一致才返回。parseAvailableAgentModels把registry.getAvailable()的数组规整为provider/modelId排序列表非数组返回undefined。resolveAgent中这一解析结果被用作凭据门——注释明确说明注册表的find从完整目录作答即使本机没有该模型的凭据也能命中因此每个候选都必须同时出现在凭据过滤后的可用集里否则子进程会在第一次调用时失败。把models[]与内置回退链的候选都门禁在可用集上才能让回退真正接管。安全性设计parseRegistryModel会拒绝任何带有密钥类字段名的模型对象——SECRET_LIKE_MODEL_FIELD_NAMES集合覆盖accesstoken、apikey、auth、authorization、bearertoken、clientsecret、password、privatekey、privatetoken、secret、secretkey、token等名称匹配时先剔除所有非字母数字字符再小写归一。这一边界镜像自category/resolver.ts的注册表解析保证 Agent 解析与类别解析遵循相同的安全约束避免模型对象中的敏感字段被当作合法模型数据泄入任务记录。// agent-model-registry.ts 的核心形态略去注释后的骨架 export function findExactAgentModel(candidate, registry) { const expected parseModel(candidate) // provider/modelId 拆分 return expected undefined ? undefined : parseRegistryModel(registry.find(expected.provider, expected.modelId), expected) } export function parseAvailableAgentModels(models) { if (!Array.isArray(models)) return undefined return models .map((model) parseRegistryModel(model)) .filter((model) model ! undefined) .map((model) ${model.provider}/${model.modelId}) .sort() }四、内置回退链与工具规则过滤内置回退链builtin/fallback-chains.ts 中的AGENT_FALLBACK_CHAINS为 curated Agent 提供手抄镜像的回退链。链以 Agent 名为键当前包含explore8 级、librarian8 级、plan-consultant3 级、plan-reviewer6 级。每个 rung 声明一组有序 provider 与模型可带variant例如 explore 链头是openai-codex/gpt-5.6-luna-fast (variant: low)随后依次是 deepseek、qwen、minimax、claude、nano 等备选。两个值得注意的 senpi-only 差异源码注释明确记载每个claude-*rung 都由claude-sdk-oauth打头——senpi 的 Claude 订阅通道优先级高于计量制的opencode通道任何 rung 都不列出openai计量 API-key 通道只保留openai-codex。而 ulw 评审类 Agent 刻意不在此表中——它们通过定义上的categories字段解析模型这正好呼应了 Task 4 中类别查找不属于 resolveAgent的边界划分。回退链的防漂移手段是独立字面量表测试见 fallback-chains.test.ts测试文件显式禁止导入oh-my-opencode/model-core对每个链的 provider 列表、模型、variant、数组位置做逐字转录断言。Task 1 的变异验证证明仅改链长无法检测到的条目漂移会被字面量表测试抓出。工具规则过滤agent-tool-policy.ts 的agentToolPolicy是persona、计划、任务记录与内核工具授权读取同一派生结果的唯一事实源。规则是只有字面模式不含空格、不含*才算工具面规则glob 或带空格命令规则属于按次调用的权限规则。派生逻辑为toolAllowlist 字面规则中allow: true的模式列表toolRuleDenylist 字面规则中allow: false的模式列表toolDenylistdisallowedTools与toolRuleDenylist的并集。纯拒绝式定义会得到空 allowlist——这是最严格的形态且绝不能解读为无策略。Task 4 的测试矩阵中包含 tool-rule filtering 用例如 resolve-agent.test.ts 验证disallowedTools以toolDenylist随 persona 传递、未配置时不得强制注入 denylist。persona 组装agentPersona随后把agentType、prompt作为instructions、工具策略、executionMode仅接受in-process/process、allowedSubagents、maxDepth合并进结果——这正是 Task 2/3 所验证的 curated 只读 bash 替代机制赖以生效的通道。五、持久化回读parseTaskRecord 与 source: agent解析结果不仅要被运行时消费还要落盘。Task 4 验证了一个关键场景全新的RecordStore实例通过parseTaskRecord从磁盘重读 agent 来源的记录。record-parse.ts 的parseTaskRecord从 JSON 记录中读取status、updated_at、agent_type、tool_allow、tool_deny、resolved_model等字段并强制team_role若存在则必须为member——这正是 Task 4 中curated 名称被 team-member 校验拒绝的落点之一解析层直接拒绝非法团队角色且解析失败即抛错而非静默降级。resolved_model的解析在 record-blocks-parse.ts 的readResolvedModel中完成其中readResolvedModelSource只接受三个合法来源值switch (source) { case category: case explicit: case agent: return source default: throw new Error(resolved_model.source must be ${RESOLVED_MODEL_SOURCES.join( or )}) }agent是 Agent 解析路径独有的来源标记。在解析侧resolve-agent.ts 的resolvedAgent助手构造resolved_model时固定写入source: agent并携带provider、model_id、displayprovider/modelId以及可选的variant/reasoning_effort/reasoning三元组reasoning取reasoningEffort ?? variant。变异验证是最有说服力的证据Task 4 明确记录临时把记录解析器中的case agent分支删掉fresh-store 的磁盘回读往返测试立即失败恢复后整套测试重新变绿。这证明source: agent不是装饰性字段——持久化回读真正依赖它来正确重建 Agent 来源的模型记录。该边界同时被parseOptionalResolvedModel/parseOptionalResolvedModelArray对应requested_model/fallback_models复用解析出的运行时模型链得以无损还原。六、测试证据与验证纪律Task 4 的验证结果记录在案聚焦运行resolve-agent.test.ts得到7 通过 / 0 失败完整包门禁覆盖了 record-store、task execution 与 member-validator 用例变异验证case agent删除 → 回读往返失败恢复 → 全绿。从当前仓库看resolve-agent.test.ts 的测试矩阵与 Task 4 的描述一一对应disallowedTools随 persona 传递、直接模型优先级model胜于models、禁用 Agent 被隐藏为not_found、未知 Agent 返回排序名册、注册表无匹配时返回model_unavailable而不抛异常等。测试中catalogRegistry特意复刻了线上 senpi 注册表形态——find从完整目录作答、getAvailable只返回本机有凭据的模型——使凭据门行为得到真实形态的覆盖。这些测试跨越了 Task 4 主张的六个消费边界模型model、persona、工具策略tool-policy、持久化persistence、错误上报error-reporting、团队资格team-eligibility这正是为什么足够的判据。七、边界与后续任务Task 4 明确声明了两个省略项resolveAgent内部不进行类别查找planner 兼容性保留给 Task 7同时从 Task 1–3 的边界可见运行时安装激活、只读 bash 替代等由 Task 9 的 live child 与 Task 2/3 的在进程装配测试分别兜底。理解这条边界才能在阅读 resolve-agent.ts 时把直接解析与类别路由两条模型通道正确分开。附阅读路径速览解析入口与三种返回形态resolve-agent.ts注册表解析抽取与密钥字段防护agent-model-registry.ts候选模型合并与调优默认值agent-model-entry.ts内置回退链与防漂移字面量表fallback-chains.ts、fallback-chains.test.ts工具规则单一事实源agent-tool-policy.ts持久化解析与source枚举校验record-parse.ts、record-blocks-parse.ts聚焦测试矩阵resolve-agent.test.ts验证记录原文task-4.md【免费下载链接】oh-my-openagentOmO: Just type mass ulw keyword with your prompt. Now you are the master of graph engineering.项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-openagent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

LifeOS Cortex 本地记忆检索 CLI 深度解析:8 个命令、隐私边界与证据门控一文讲透

LifeOS Cortex 本地记忆检索 CLI 深度解析:8 个命令、隐私边界与证据门控一文讲透

LifeOS Cortex 本地记忆检索 CLI 深度解析:8 个命令、隐私边界与证据门控一文讲透 【免费下载链接】LifeOS ⛰️ LifeOS — The universal AI Harness designed to move you from Current to Ideal state in both life and work. 项目地址: https://gitcode.com/G…

2026/9/20 1:51:33 阅读更多 →
PolarDB+OpenClaw:企业级AI Agent生产运维治理PaaS

PolarDB+OpenClaw:企业级AI Agent生产运维治理PaaS

PolarDB Agent Express 这个名字最早是我在一个做数据平台的群里看到的,第一反应是"又一个带 Agent 后缀的营销词"。后来把控制台从头点了一遍,又拿本地自己搭的 OpenClaw 版本对着比了一轮,判断变了:它想解决的并不是&…

2026/9/20 1:50:33 阅读更多 →
IsaacLab rsl-rl 安装报错快速修复:pip install 报“找不到匹配版本“的 3 条解决路径

IsaacLab rsl-rl 安装报错快速修复:pip install 报“找不到匹配版本“的 3 条解决路径

IsaacLab rsl-rl 安装报错快速修复:pip install 报"找不到匹配版本"的 3 条解决路径 【免费下载链接】IsaacLab Unified framework for robot learning with multi-physics/renderer support 项目地址: https://gitcode.com/GitHub_Trending/is/IsaacLa…

2026/9/20 1:50:33 阅读更多 →

最新新闻

QQ空间历史说说导出:用GetQzonehistory三步把说说、配图、评论存成本地表

QQ空间历史说说导出:用GetQzonehistory三步把说说、配图、评论存成本地表

QQ空间历史说说导出:用GetQzonehistory三步把说说、配图、评论存成本地表 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 准备换手机重装QQ前,我意识到QQ空间从没…

2026/9/20 5:27:32 阅读更多 →
攀爬机器人文献复现:从PDF综述到可验证模块的工程落地

攀爬机器人文献复现:从PDF综述到可验证模块的工程落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 5:27:32 阅读更多 →
AI论文写作工具全攻略:从文献管理到格式规范

AI论文写作工具全攻略:从文献管理到格式规范

1. 论文写作工具革命:当传统参考文献管理遇上AI去年指导学弟修改毕业论文时,他的参考文献部分突然全部变成乱码,距离查重只剩3天。这种崩溃场景每个写过论文的人都经历过——从格式调整到文献排序,手工操作不仅耗时耗力&#xff0…

2026/9/20 5:27:32 阅读更多 →
Java生产级日期与并发工具设计实战

Java生产级日期与并发工具设计实战

1. 这不是“工具类合集”,而是一套Java工程师的日常生存装备包你有没有过这种经历:凌晨两点改完线上Bug,发现又要写一个格式化日期的工具方法——明明三个月前在另一个项目里写过几乎一模一样的代码;又或者,在做订单超…

2026/9/20 5:27:32 阅读更多 →
免费窗口布局工具 FancyZones:3 分钟让窗口自动归位

免费窗口布局工具 FancyZones:3 分钟让窗口自动归位

免费窗口布局工具 FancyZones:3 分钟让窗口自动归位 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.com/GitHub_Trending/po/PowerToys …

2026/9/20 5:27:32 阅读更多 →
文学创作中的环境描写与心理刻画技法

文学创作中的环境描写与心理刻画技法

1. 文学创作中的环境描写技法解析雨夜独行者的场景描写堪称环境描写的经典范例。这种通过外部环境映射人物内心的创作手法,在文学创作中被称为"客观对应物"理论——即用具体可感的物象来表现抽象的情感状态。路灯在湿漉漉的街道上摇曳的描写,不…

2026/9/20 5:26:32 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →