Skip to content

runtime: 建立跨 Subagent、Workflow 与 Background Terminal 的总资源准入合同 #159

Description

@tt-a1i

一句话结论

OpenPI 的三类后台能力各自都有严谨的并发上限和并发预留,但它们互相看不见。一个 Session 可以同时占用 Direct Subagent、多个 Workflow run 和 Background Terminal 的全部局部额度。

建议研究 package-wide admission leases:各 owner 继续拥有自己的 lifecycle 和局部策略,共享层只负责总资源事实、排队/拒绝、释放和可观测性。不要把三种能力合并成一个 orchestration runtime。

固定证据

对比固定在:

  • OpenPI main@2a69d3f32994da4123f1312b7fa84ef3d6119be1
  • OMP main@151dc754e8cd9314721aa6c78a168a205a4b0e4c

OMP 当前提供了一个有用但不完整的参照:

  • process/session 的 AsyncJobManager 统一登记 bash | task | eval,并带 owner identity、query/cancel、delivery 和总 running-job limit:job model, admission check
  • task 另有 Session-scoped semaphore、request budget、wall-clock 和 recursion gate:task limits
  • queued task job 不占 manager running slot,直到调用方 markRunning();这说明 OMP 也不是完整的统一资源 governor,不能原样复制:queued boundary, mark running

OpenPI 当前:

  • Direct Subagent 有两个独立 pool:普通 child 最多 4 个,by-the-way 最多 2 个;spawn 前同步 reserve,避免并发越限:pool admission, atomic reservation
  • Background Terminal 独立最多 8 个,同样同步 reserve:terminal admission
  • 每个 Workflow run 自己创建 semaphore,默认并发 8、最多 64;默认总 Agent call 128、最多 1024:run-local controller, configured limits
  • 当前没有一个共享 admission owner 能回答“整个 OpenPI Session 正在使用多少 child model slots、process slots、memory/disk budget”。

为什么值得讨论

局部上限都正确,不代表组合后安全。典型风险包括:

  • 两个并行 Workflow 各自使用 8 个 child,同时还有 4 个 Direct Subagent;
  • 8 个 Background Terminal 全量写 spill log,同时 Workflow/child 写 artifacts;
  • provider 并发、文件描述符、内存、worktree 和磁盘在多个 owner 间叠加;
  • 某个能力排满资源后,其他更高优先级的交互式请求没有保留槽位;
  • operator 只能看到各自列表,无法解释“为什么整套 Agent 变慢/被 429”。

这属于 runtime invariant,不应交给 prompt 提醒模型“少开一点”。

OpenPI 应保留的优势

  • Subagent、Workflow、Background Terminal 仍各自拥有状态机、取消、清理和 artifacts;
  • 不引入 OMP 式全局 Agent OS 或统一 job lifecycle;
  • 模型仍决定 decomposition 和 fan-out;runtime 只接受、排队或拒绝;
  • 普通回合保持 zero-resident,admission 不需要模型工具;
  • setup 仍只有 /openpi-setup 一个入口。

建议的最小机制

先从 lease 接口研究,不预设全局 scheduler:

acquire({
  owner,
  kind: "model-session" | "process" | "worktree" | "artifact-bytes",
  units,
  signal,
}): Promise<Lease>

需要进一步决定:

  • 是排队还是立即 fail closed;
  • interactive Direct Subagent、Workflow child、terminal 的公平性/优先级;
  • Session scope、process scope与 provider scope的边界;
  • owner 丢失、abort、exception、resume 后如何回收 lease;
  • live configuration 缩小时,已持有 lease 怎么处理;
  • 是否需要 weighted units,而不只是任务数。

非目标

  • 不把三套 manager 合并;
  • 不让 admission 决定模型策略;
  • 不根据任务关键词硬编码优先级;
  • 不用一个“最大并发数”假装覆盖内存、磁盘和 provider rate limit;
  • 不默认提高现有上限;
  • 不依赖 prompt 释放资源。

完成条件

  • 盘点三类能力所有可同时持有的 model/process/worktree/artifact 资源
  • 定义 lease identity、owner、scope、acquire、release、abort 与 owner-lost 语义
  • 并发 acquire 不可越过总上限,异常/取消路径不可泄漏 lease
  • 多 Workflow run 与 Direct Subagent/Terminal 组合测试覆盖真实叠加
  • operator 能读取总使用量、排队量和阻塞原因,模型不需要常驻新工具
  • 局部上限继续生效,并明确它们与全局上限的优先关系
  • 用压力场景验证 provider 429、内存、FD、磁盘和交互延迟是否改善
  • 若单一 weighted governor 无法准确表达资源,拆成正交 leases 而不是强行统一

与现有 Issue 的关系

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions