源码导读
OpenCode orchestrator 源码导读:固定父模型与显式委派
Jev 给用户回合分类,策略保持配置中的父模型,并可建议调用专家工具。这个边界很关键:升级提示不等于子任务已经执行,保留父模型也不等于已测得缓存节省。
1. Hook 看到的是有限文本,不是整个仓库
插件入口读取配置并建立 hook。chat.message 跳过内部子会话和已关闭自动路由的会话;不在管理范围内的固定模型保持原样。对受管理模型,它提取非 synthetic 的用户文本,默认最多 16 KiB,并检查模型目录及可用档位。
askJev 发送请求文本、当前父模型档位、上下文 token 数和可用档位。一个 Choice 选 fast/balanced/strong/long,三个 Score 分别记录任务、推理和工具复杂度。路由状态里只有上下文 token 数,没有父会话全文或源文件。只有附件或没有可用文本时,会跳过这条路由。
2. Stay、escalate、release 取决于已有状态
默认置信度阈值是 0.3;达到阈值的 strong/long 判断会建议升级。没有活跃强子代理时,Jev 缺失、标签无效或低置信度都让父模型继续;已有强子代理时,明确简单则释放,明确困难则继续升级,Jev 不可用或不确定也释放。显式模型覆盖和并行意图规则优先于这些分支。
Hook 把受管理请求设为配置中的固定父模型,再附加升级提示。父模型必须实际调用 jev_escalate;如果没调用,后续回合会记录漏掉提示。用户显式指定模型是可以修改父模型的出口。release 调用 clearStrongStreak,清除本地子代理跟踪和并发占位,并没有删除或中止服务器上的会话。
3. 子代理实际收到了什么、返回什么
jev_escalate 选择可用的 strong 模型,再新建或恢复子会话。第一次委派最多读取 200 条父会话消息,在默认 200,000 字节预算内格式化,超出时先移除旧消息。附件只留下名称,工具输出截到 400 字符,synthetic 或 ignored 文本被排除。它是筛选后的对话文本,不是完整仓库快照。
恢复强子代理时,按上次委派记录的消息数提取增量。工具发送任务,等待 idle(默认子任务超时 300 秒),再返回最后一条助手文本及 child/model/context 元数据。并行子代理使用 fast 档,不可用时退到父模型档,默认最多三个并发。采用前应检查长会话的上下文完整性及增量行为。
4. 错误出口与版本声明
Jev 默认配置为 SDK 超时 1,500 ms、重试一次、3,000 ms 发出中止信号。缺少凭证、调用异常或 model_tier 答案格式错误会返回 null,再进入前述依赖状态的分支。模型目录失败或没有可用固定父模型时,当前请求保持原样。创建子会话、发送任务或等待失败会返回工具错误文本,不能当作专家已完成的答案。
该提交声明包版本 0.2.1、Node ≥22、SDK ^0.6.0、开发依赖 plugin 1.18.31,以及可选 peer 范围 ≥1.0.0。这些声明不证明范围内所有宿主都兼容。askJev 没有在请求中固定 Jev 模型,也没有在结果中保留实际服务模型字段。验证版本相关主张时,应记录解析后的依赖锁文件、宿主版本与实际 API 模型。
采用这种模式前,要测什么
有价值的本地检查是用 mock 返回“困难且高置信度”“简单且高置信度”“低置信度”和 null,再分别搭配有、无活跃强子代理。另行验证父模型是否遵从提示、子代理是否拿到必要上下文,以及委派失败后能否恢复。缓存读取 token、总 token、质量和完成任务成本,需要在宿主中做对照;保留模型本身不能证明省钱。
2026-11-02 核对 README;2026-11-03 新增这份固定提交的源码导读。本站未在 OpenCode 中运行插件,未为本次核对调用 Jev,也未复现缓存或成本收益。值得迁移的是:类型化判断驱动明确的状态机,并让委派过程可观察。