--- name: orchestrator-usage description: Orchestrator 层定位、设计决策、与上下层的关系。开发者面向的 opinionated 库,Server 基于它构建。 --- # Orchestrator 层 — 面向开发者的编排库 --- ## 定位 三层自由度递减: - **Session 层**:纯库,完全 DI,零假设 - **Orchestrator 层**:库,但硬编码部分默认行为 - **Server 层**:框架,基于 orchestrator,加传输层 Orchestrator 和 Server 的分界线:**transport 和 coordination 是正交的**。串行队列、fork 路由、engine 生命周期管理跟"用 WS 还是 REST"无关。 --- ## 入口 唯一推荐入口是 `createStelloAgent(config)`,返回 `StelloAgent` 实例。 StelloAgent 隐藏内部组件(orchestrator/factory/runtimeManager),只暴露操作方法。开发者通过 config 声明意图,不需要理解内部装配过程。 --- ## 硬编码的 opinionated 行为 这些行为由 orchestrator 内部固定,开发者不能替换: - **同 session 串行,不同 session 并行** — SessionOrchestrator 的 promise 链队列 - **Engine hooks 合并** — Factory 将用户 hooks 和 Scheduler 闭包合并,同 key 下都触发 - **Runtime ref-counting** — acquire/release 引用计数,归零回收(可配 idleTtlMs 延迟) - **显示拓扑由 SessionTree 直接维护** — fork 默认挂在 source 节点下(engine 用 `options.topologyParentId ?? this.session.id` 兜底)。orchestrator 不做显示拓扑 的路由改写;调用方可通过显式传入 `topologyParentId` 覆盖。 ### 可注入的扩展点 | 注入点 | 说明 | 默认值 | |--------|------|--------| | Scheduler | 调度时机 | 手动触发 | | EngineHookProvider | 开发者自定义 hook | 无 | | SplitGuard | fork 前置校验 | 无限制 | | RuntimeRecyclePolicy | 空闲回收策略 | 立即回收 | --- ## Session 接入的两种方式 1. **直接提供 runtime.resolver** — 开发者自己适配 EngineRuntimeSession 2. **提供 session.sessionResolver + consolidateFn** — StelloAgent 自动适配 @stello-ai/session 方式 2 是 @stello-ai/session 的推荐接入路径。 --- ## 核心设计决策 - **StelloAgent 是门面,不是组装器** — 隐藏内部组件,只暴露操作方法 - **只有一种 config 形状** — 没有 legacy 兼容路径,减少认知负担 - **hooks 是不可变的开发期配置** — 构造时注入,运行期间不可修改 - **Server 承接 StelloAgent** — 通过 attach/detach 管理连接态,通过 turn/stream 转发请求