# SDK 快慢通道：源码核查与产品边界

核查基线：`FlowGPT/roleplay-harness@80aef3fa5582d8508ecdd1afa206391940ce9502`。本稿先读了仓库根 `AGENTS.md`，以 SDK 实现、对应测试代码和 docs/sdk 互证；**本次没有运行测试或真实模型，也不据此判断线上部署情况**。应用接线只核对入口边界，Emochi 的具体触发策略由应用专题另述。

## PM 可以直接使用的 8 条结论

1. **“快路负责当前回复、慢路并行做规划”已经有现成 SDK。** 默认快路只是一次模型调用；也能替换成自定义多步骤链路，但“有 Workflow 就自动接入”并未实现，开发者必须写适配器。快、慢是职责名称，不保证哪一支先完成。见 [R1]、[R2]。
2. **SDK 没有“累计 X 轮触发”的 X，也没有自动按 query 复杂度路由。** `FastSlowRuntime.run/stream` 每调用一次，就安排一次慢任务；若产品需要“每 3 轮”“剧情变化时”才分析，触发判断和调度由产品实现。慢模型可以在已注册的工具里自行选择，这是另一层决策。见 [R1]、[R3]。
3. **本轮快慢拿到同一张起始状态快照，慢路看不到本轮刚生成的快回复。** 慢路不是先看完正文再复盘。若确实要复盘本轮正文，应在正文完成后由宿主显式运行独立 `SlowTurnRuntime`，并把正文放入它的输入。见 [R4]、[R5]。
4. **慢路可以调用工具、综合结果，但不会自动生成统一的 `contextPatch` 或 `notes`。** 当前 API 返回 `final`、`toolResults`；业务解释这些结果，选择是否把它们转换为完整的 `state` 文本。候选内容审核、事实与建议区分、Prompt 注入规则都需要明确接线。见 [R6]、[R7]。
5. **“下轮生效”是有条件的。** 慢结果必须成功提交，之后的一轮还必须重新读取状态；下一轮若先开始，仍会读旧状态。本轮快输入冻结后不会热更新，旧正文也不会被后台改写。见 [R4]、[T1]。
6. **慢任务完成、工具成功、状态提交、用户成功收到正文，是四个不同结果。** 快路失败时慢路仍可能提交；慢路 `completed` 也可能同时有 `ok:false` 工具结果或 `stale_write_rejected`。不能只看一个 `completed` 当作业务成功。见 [T2]、[T3]。
7. **有超时、取消与 CAS 接口，但没有持久化任务平台或自动重试去重。** CAS 的跨进程原子性、版本/来源顺序、业务幂等由存储与宿主负责。新用户轮次开始不会自动取消旧慢任务；进程重启也不会续跑其内存 Promise。见 [R8]、[R9]。
8. **这些结论属于 SDK，不能直接当成 Emochi/Sumi 现网调用链。** 仓内应用复用类型、Registry 和任务组件，但没有实例化这三个通用快慢 Runtime；Emochi 的 `AgenticV2TurnCoordinator/Planner`、Story 与 Sumi 走各自应用编排。见 [A1]、[A2]。

## 1. 用户设想的能力，哪些已有

| 设想 | SDK 已有的部分 | 还需产品/接入方实现 |
| --- | --- | --- |
| 无既有 Workflow，就用一个 LLM 节点回复 | `SimpleFastRuntime.complete` 调一次注入的 `model.complete` | 准备模型客户端、角色 Prompt/历史、真实服务连接；底层模型实现可能另有重试 |
| 已有 Workflow，就继续原链路 | `fast` 可注入实现 `FastTurnRuntime` 的对象 | 自己把 Workflow 包装为 `complete`，返回 `AgenticModelTurn`；需要流式时另实现 `stream` |
| 简单问题走快路，复杂问题才调用工具 | 自定义 fast/通用 Agent 足够灵活，慢模型支持 `toolChoice:"auto"` | 没有复杂度评分器、自动分流、自动升级到 Workflow；规则或模型路由需显式实现 |
| 慢路每 X 轮跑一次 | 可独立调用 `SlowTurnRuntime.run`，也可注入外部生命周期 | SDK 无 interval/trigger 配置；组合入口每次都安排慢执行。不能把 `maxSteps=4` 解释成每 4 轮聊天 |
| 慢路读取快路结果，补充下一轮上下文 | 可接收宿主准备的任意文本历史；能返回结果或提交 state | 组合入口没有当前 fast 输出依赖；宿主负责正文后调用、审核、格式化和保存 |
| 自动恢复长时间 Workflow | 独立慢执行是一个可以完整 `await` 的步骤 | 持久化输入、任务 ID、排队、状态查询、重试、幂等和内部检查点都不内置 |

实现依据：默认与自定义 fast 的判断只看 `options.fast` 是否具有 `complete`，并不检查是否存在 Workflow；`FastTurnRuntime` 只要求 `complete`，`stream` 可选。[packages/sdk/src/runtime.ts:11–71](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L11-L71)；[packages/sdk/src/runtime-shared.ts:35–45](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L35-L45)。独立通用 `Agent` 是 `prepare → new PiAgent → prompt → result`，也没有复杂度路由或产品状态读写。[packages/sdk/src/agent.ts:9–37](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/agent.ts#L9-L37)

“快路单次模型”只描述默认封装本身。自定义快路完全可以先调用一个判断模型，再调用 Writer；SDK 不添加这些步骤、不限制其内部调用次数，也不会自动把慢路的预算套在它上面。自定义内部模型/工具追踪亦由接入者补充。[docs/sdk/examples/07-fast-slow.md:43–53](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/docs/sdk/examples/07-fast-slow.md#L43-L53)；[packages/sdk/LANGFUSE.md:123–125](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/LANGFUSE.md#L123-L125)

## 2. `FastSlowRuntime.run` 的真实逐步顺序

以“用户输入：查看信封；已存状态：信封未打开”为例：

1. 宿主组装 `FastSlowTurnContext`，调用 `await runtime.run({context, signal?})`。SDK 不负责从聊天数据库提取历史，也不自动统计轮次。
2. 创建本轮取消控制器，合并本轮、运行时 shutdown 和调用方 signal。然后 **先等待一次 `slow.state.get`**。这个读取阶段使用 slow 的 `timeoutMs` 单独计时；读取失败/超时会让 `run` 本身 reject，快、慢模型都还没启动。[packages/sdk/src/runtime.ts:87–112](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L87-L112)；[test/fast-slow-runtime.test.ts:344–364](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L344-L364)
3. `prepareFastSlowContext` 对“宿主输入 + 状态快照”做 `structuredClone`，再深度冻结。生成默认模型消息，构造 custom fast 所需 `messages`。快路、慢路工具拿到的是同一个已冻结的 `state` 对象；后台之后写入数据库不会改变它。[packages/sdk/src/runtime.ts:113–116](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L113-L116)；[packages/sdk/src/runtime-shared.ts:125–152](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L125-L152)；[test/fast-slow-runtime.test.ts:197–225](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L197-L225)
4. 创建供宿主等待的 `slow` Promise，并无条件调用 `background.schedule("fast_slow_runtime", requestId, timeoutMs, ...)`。默认 runner 用 `Promise.resolve().then(() => task(signal))` 排入本进程任务，没有轮次判断、去重键或持久队列。[packages/sdk/src/runtime.ts:117–137](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L117-L137)；[packages/sdk/src/tasks.ts:23–74](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/tasks.ts#L23-L74)
5. `start()` 返回后，普通 `run()` 立即调用 fast 的 `complete`，把已经启动的 Promise 放在 `turn.fast` 中返回。`await turn.fast` 是等待既有执行，不是另一次启动。源码先安排慢任务再启动 fast；慢路可以先进入模型，也可以先完成，前台只是不用等待慢路。[packages/sdk/src/runtime.ts:60–62](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L60-L62)；[docs/sdk/fast-slow.md:49–53](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/docs/sdk/fast-slow.md#L49-L53)
6. 宿主得到 `{snapshot, fast, slow, cancel}`，通常先等 fast 并把正文发给用户。SDK 没有替宿主发送 HTTP 响应、保存 assistant 消息或确认产品收到了正文。慢路同时进行工具循环，最后可选提交。[packages/sdk/src/runtime-shared.ts:111–116](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L111-L116)；[packages/sdk/src/slow-runtime.ts:64–138](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L64-L138)
7. 下一次再次调用组合入口时，会重新 `state.get`。若上次 slow 已提交，读到新的 state；若上次还在跑，读到旧 state。**不是按 `sourceTurn+1` 自动投递，也不是把本轮内存输入打补丁。** [test/fast-slow-runtime.test.ts:228–273](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L228-L273)

`stream()` 的前半段相同：先读快照、安排慢任务，再取得 fast 的 AsyncIterable。实际分块输出靠宿主遍历；默认实现是 async generator，消费时才等待 complete，结束后只 yield 一个完整文本块。custom stream 可能自行安排提前 I/O，SDK 不保证它的内部启动时刻。未提供 `stream` 时回退为完整 `complete` 一块输出。提前停止遍历会收尾 iterator，但**不会自动 `turn.cancel()` 取消另一支 slow**。[packages/sdk/src/runtime.ts:35–37](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L35-L37)；[packages/sdk/src/runtime.ts:65–71](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L65-L71)；[packages/sdk/src/runtime.ts:153–171](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L153-L171)

## 3. 快与慢究竟看到什么

### 宿主提供的结构化输入

`FastSlowTurnContext` 必填 `requestId`、`sourceTurn`、`sourceMessageId`、`language`、`input`、`history`；可选 `historyRevision`、`useNativeLanguage`、`trace`。没有专门的 `character`、`userId`、`conversationId`、`scenarioId` 或“本轮正文”字段。`sourceTurn` 是调用方传来的来源编号，SDK 不自动加一、不据此触发任务。[packages/sdk/src/runtime-shared.ts:15–29](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L15-L29)

快照包含 `found`、`revision`、`sourceTurn`、可选来源消息/历史版本、文本 `state`、`toolsCalled`、`ledger`。注意 `context.sourceTurn` 表示正在处理哪轮，`context.state.sourceTurn` 表示这份旧状态来自哪轮，可以不同。[packages/sdk/src/contracts.ts:96–105](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/contracts.ts#L96-L105)

自定义 fast 收到上述完整 context、state 和已组好的 `messages`。慢工具收到完整 context、解析后的参数、已收集的前序 `dependencyResults`、受慢路预算约束的 `model`、`signal`。它们能读取 ledger 等结构数据，但**默认快慢模型请求并不会把整个 snapshot JSON 自动塞进 Prompt**。[packages/sdk/src/runtime-shared.ts:31–38](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L31-L38)；[packages/sdk/src/contracts.ts:222–237](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/contracts.ts#L222-L237)；[packages/sdk/src/slow-runtime.ts:105–115](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L105-L115)

### 默认模型可见的消息

| 默认 fast | 慢协调模型的第一步 |
| --- | --- |
| `system: [State snapshot revision N, source turn T] + state文本` | 先加 `system: slow.prompt` |
| 宿主传来的 history，保持其角色和顺序 | 然后同一份状态 system 消息 |
| `user: 当前 input` | 同一份 history，最后当前 user input |

构造位置：[packages/sdk/src/runtime-shared.ts:132–144](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L132-L144)；[packages/sdk/src/slow-runtime.ts:64–70](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L64-L70)。模型请求还携带 `requestId`、配置 ID、language、可选语言策略与 trace；这些传输元数据不会由此代码自动变成模型可见正文。fast 可传 `parametersPatch`；慢入口本身没有同名配置项，更多参数由注入模型解释。[packages/sdk/src/runtime.ts:16–29](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L16-L29)；[packages/sdk/src/slow-runtime.ts:82–95](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L82-L95)

**所以“同一份上下文”不等于两支完整 Prompt 相同**：慢路多一份规划指令，工具回包又会逐步追加；自定义 fast 则可完全自定输入处理。角色设定若需要影响默认 fast，宿主必须放进 history 的 system 消息、state 文本，或通过自己的模型/fast 适配接入，SDK 不替你加载角色库。

慢路不读取 `turn.fast`，冻结 context 也不会自动补入刚生成的 assistant 文本。如果要求“读完本轮回复再总结”，可由宿主等待 fast、保存/确认正文后，再准备一份包含该正文的 context，调用独立 Slow。这是一种**可用 SDK 实现的业务编排**，不是当前 FastSlow 的内置行为。[docs/sdk/examples/07-fast-slow.md:49–53](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/docs/sdk/examples/07-fast-slow.md#L49-L53)

## 4. 慢模型与工具循环怎样运作

慢执行构造时，开发者显式传 `model`、`modelConfigId`、`prompt`、`capabilities`，可选 limits、prepareCommit 等。未提供工具时目录是空列表。SDK 创建 Registry 并开启参数校验，工具 schema 不合法或名称重复会在构造时失败。[packages/sdk/src/slow-runtime.ts:32–41](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L32-L41)；[packages/sdk/src/registry.ts:38–64](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/registry.ts#L38-L64)

执行过程是：

1. 调慢协调模型，给它所有已注册工具定义，设置 `toolChoice:"auto"`、`parallelToolCalls:true`。模型可直接返回文本，也可要求调用工具；“auto”只是注册工具内的选择，不是快/慢或 Workflow 路由。[packages/sdk/src/slow-runtime.ts:78–98](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L78-L98)
2. 若要求调工具，**整批先检查**工具名、非空且本批唯一的调用 ID、累计工具数、并行工具数和所有参数 schema，合法后才开始任何一个工具。超限直接失败，不排队拆批。[packages/sdk/src/slow-runtime.ts:100–103](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L100-L103)；[packages/sdk/src/slow-runtime.ts:186–195](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L186-L195)
3. 同批工具并行执行；每个都拿起始 context，以及先前已完成批次收集的结果。不能让同批 B 假设已拿到同批 A 的结果；有依赖应让模型下一步再调用 B。当前同批不是数据库事务，某个工具失败不撤销其他已发生操作。[packages/sdk/src/slow-runtime.ts:105–126](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L105-L126)；[packages/sdk/src/model-agent.ts:55–75](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/model-agent.ts#L55-L75)
4. 把 assistant 的 tool_calls 和工具返回的**完整 JSON**加入消息，再调协调模型。工具结果中的 `ok`、`result`、`candidateState`、`error` 等会进入其工具消息，而不只是 `result` 文本。[packages/sdk/src/model-agent.ts:90–111](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/model-agent.ts#L90-L111)
5. 某次模型返回不含 toolCalls 的最终结果后结束循环，再进入可选 prepareCommit。若返回 `ok:false`，可作为信息交回模型继续修正；若工具直接 throw，当前 legacy 适配器立即使慢执行失败，并取消同批等待。[packages/sdk/src/model-agent.ts:18–40](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/model-agent.ts#L18-L40)；[packages/sdk/src/model-agent.ts:122–125](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/model-agent.ts#L122-L125)；[test/slow-turn-runtime.test.ts:150–179](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/slow-turn-runtime.test.ts#L150-L179)

`advisory:true` 只是元数据，不是只读沙箱。慢运行时没有用它禁止写入；禁用 `prepareCommit` 也不会禁止工具自身访问外部写 API。[packages/sdk/src/contracts.ts:251–254](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/contracts.ts#L251-L254)；[packages/sdk/src/registry.ts:70–76](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/registry.ts#L70-L76)；[docs/sdk/fast-slow.md:88–92](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/docs/sdk/fast-slow.md#L88-L92)

### 默认值不是用户轮数

| 参数 | 默认 | 精确含义 |
| --- | --- | --- |
| `maxSteps` | 4 | 本次慢循环最多进行 4 次协调模型步骤，最终无需工具的收尾回答也算一次 |
| `maxToolCalls` | 8 | 本次慢执行累计最多 8 次工具调用 |
| `maxParallelTools` | 4 | 模型一次要求的工具调用数最多 4；超限拒绝整批 |
| `timeoutMs` | 180000 | 慢执行总计时上限；组合入口读快照和后台 runner 也各自使用此时长，并非整个用户回合共享的单一 180 秒 |
| `maxTotalTokens` / `maxCostUsd` | 无默认上限 | 配置后按注入模型报告的 usage/cost 累计检查 |
| fast `timeoutMs` | 未设置 | SimpleFast 需另外配置；慢超时不自动成为 fast 截止时间 |

依据：[packages/sdk/src/runtime-shared.ts:118–123](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L118-L123)；[packages/sdk/src/model-agent.ts:100–106](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/model-agent.ts#L100-L106)；[packages/sdk/src/slow-runtime.ts:246–280](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L246-L280)；[packages/sdk/src/runtime.ts:16–31](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L16-L31)。

maxSteps 管协调循环，不包含工具内部再发起的专家模型调用；后者若走 `invocation.model`，会计入 `modelCalls` 和 token/cost。`modelCalls` 计的是尝试次数，甚至包含预算已封锁之后的尝试，不能总当作真正网络请求数。费用不是先精确预扣；本次已启动的请求及并发请求可能把总量推过预算，检查后拒绝继续。[packages/sdk/src/slow-runtime.ts:246–280](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L246-L280)；[test/fast-slow-runtime.test.ts:707–774](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L707-L774)

信封示例 07 的主流程：快模型 1 次；慢协调器第 1 次选 `analyze_plot` 与 `judge_npc`；两专家各调 1 次模型；慢协调器第 2 次综合建议。**总计 5 次模型请求，慢路 modelCalls=4，但协调步数只有 2。** 示例的 `maxSteps:3` 不是每 3 轮聊天触发。随后还有单独的旧任务和流式演示调用，不能混入这个主流程计数。[examples/sdk/07-fast-slow.ts:18–60](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/examples/sdk/07-fast-slow.ts#L18-L60)；[examples/sdk/07-fast-slow.ts:65–85](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/examples/sdk/07-fast-slow.ts#L65-L85)

## 5. `contextPatch`、notes、状态候选与审核：具体谁做

SDK 当前没有名为 `contextPatch` 或 `notes` 的统一协议；此次检索 `packages/sdk/src` 没有这些字段。公开结构提供的是：

- `SlowTurnResult.final`：最终 `AgenticModelTurn`，其正文为字符串 `content`。
- `toolResults`：每个 Capability 的结果，可有 `result` 文本、`candidateState` 文本、error 等。
- `prepareCommit(final, results, context)`：**宿主提供的函数**，可返回 `{state:string, toolsCalled?, ledgerEntries?}`，或 `undefined`。

类型依据：[packages/sdk/src/runtime-shared.ts:56–94](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L56-L94)；[packages/sdk/src/contracts.ts:230–237](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/contracts.ts#L230-L237)。这里的 `state` 是一份待写文本，不是 patch 操作列表；SDK 不解析 notes JSON、不自动把 `candidateState` 合并成 state、不强制验证“建议不能冒充事实”、不自带另一次审核模型。

业务可选择两条清晰路径：

1. **自动提交路径**：提供 prepareCommit，在里面解析/验证/接受输出并给出 state。SDK 在慢执行尾部立即 CAS，不等快路正文是否被产品接受。示例 07 最简单地把 `final.content` 直接作为内部规划 state。[packages/sdk/src/slow-runtime.ts:128–131](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L128-L131)；[examples/sdk/07-fast-slow.ts:59–60](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/examples/sdk/07-fast-slow.ts#L59-L60)
2. **产品后验接受路径**：不提供 prepareCommit，只拿 final/toolResults；业务审核通过后自己调用存储或单独提交步骤。示例 08 的 `analyzeStep/commitStep` 与 `advice` 是示例自建函数/字段，不是 SDK API；去重 Map 也只用于演示。[examples/sdk/08-workflow-step.ts:24–58](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/examples/sdk/08-workflow-step.ts#L24-L58)

没有 prepareCommit，或回调返回 undefined，`stateOutcome=retained`，不会发生 SDK 的状态 CAS；不能由此推断所有工具都没写数据。运行时没有专门 `candidate` 顶层字段供后续审批；需要持久审批任务，应由宿主定义结果格式并保存。[packages/sdk/src/slow-runtime.ts:148–157](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L148-L157)；[docs/sdk/fast-slow.md:104–116](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/docs/sdk/fast-slow.md#L104-L116)

## 6. revision CAS、晚到、失败和取消

提交携带：本轮起始 `state.revision` 作为 `expectedRevision`，当前 `sourceTurn/sourceMessageId`，可选 `historyRevision`，完整候选 state，以及工具名/ledgerEntries。回调未指定工具名则用本次已收集工具名；未指定 ledgerEntries 则为空。[packages/sdk/src/slow-runtime.ts:158–172](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L158-L172)

存储必须在**一个原子操作**中校验 revision 和 source-turn 顺序，并在写入前尊重 abort。SDK 只调用 `compareAndSet` 接口，不提供数据库事务实现，也不自行比较当前持久化状态。`historyRevision` 在这里被传给存储，没有由运行时实现通用历史冲突算法。[packages/sdk/src/contracts.ts:107–142](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/contracts.ts#L107-L142)

| 情况 | SDK 的行为 | 对产品的含义 |
| --- | --- | --- |
| v3 开始分析，CAS 时仍为 v3 且来源顺序可接受 | 存储成功写入，返回新 revision；`committed` | 之后重新读取者可获得新 state；当前冻结快照不变 |
| v3 任务晚到，但存储已是 v4 | 存储抛 typed conflict；slow 仍 `completed`，状态为 `stale_write_rejected` | 不自动覆盖、不合并、不重新规划或重试 |
| 新一轮开始了，但尚未有任何新 state 提交 | SDK 不自动取消旧任务，也不检查“现在第几轮” | 旧任务未必过期；是否拒绝需宿主/存储增加相应接受规则 |
| 快路生成失败，慢路正常且有 prepareCommit | 慢路可以照常提交 | 若要求“正文成功交付才准写规划”，必须显式关联产品接受结果 |
| 慢模型/工具/prepareCommit 失败或超时 | 返回 failed/cancelled/timed_out，通常保留状态结果 | 该返回值不保证此前外部副作用不存在 |

冲突处理是识别 `AgenticStateConflictError` 或 `code:"agentic_state_conflict"`；冲突后的 `stateVersionAfter` 仍报告本轮起始 revision，并不重新读取真实最新版本。需要最新状态须重新 get。[packages/sdk/src/contracts.ts:117–131](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/contracts.ts#L117-L131)；[packages/sdk/src/slow-runtime.ts:167–181](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L167-L181)

取消层面：`turn.cancel()` 发出本轮 signal，影响快慢两支；shutdown 发出本运行时的全局取消并等待自己追踪的后台任务，共享 runner 上其他任务不被它关掉。`drain(timeout)` 只是有界等待，超时返回不代表所有任务都完成，也不取消。runtime.tasks 追踪的是后台 slow handle，并不是一个包含所有 fast 网络操作的持久任务目录。[packages/sdk/src/runtime.ts:74–84](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L74-L84)；[packages/sdk/src/runtime.ts:133–143](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L133-L143)；[packages/sdk/src/runtime.ts:176–185](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L176-L185)；[test/fast-slow-runtime.test.ts:500–533](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L500-L533)

`startAbortable` 会停止等待不响应取消的 Promise；模型返回之后、准备提交后和 CAS 后都有 abort 检查。但取消不是撤销交易：底层若无视 signal，已经开始的外部写入可能继续；CAS 发出后丢响应也可能已成功。SDK 返回 `retained` 不是对数据库的再次核验，业务需要查询或幂等提交。[packages/sdk/src/runtime-shared.ts:159–183](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L159-L183)；[packages/sdk/src/slow-runtime.ts:149–173](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L149-L173)；[packages/sdk/src/slow-runtime.ts:198–215](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L198-L215)

## 7. 独立执行、组合执行、外部 Workflow 的区别

| 项目 | `SimpleFastRuntime` 独立使用 | `SlowTurnRuntime` 独立使用 | `FastSlowRuntime` 组合 |
| --- | --- | --- | --- |
| 读状态 | 不读，宿主供给 | 不读，宿主供给已准备快照 | 调用 slow.state.get 一次 |
| 运行内容 | 一次模型请求 | 完整慢工具循环 | 自定义/默认 fast + 同一个 SlowTurnRuntime |
| 后台调度 | 无 | 无，直接 await | 进程内 BackgroundTaskRunner |
| 输入冻结 | 调用方负责，方法不自行复制 | 调用方先 prepare，run 不复制 | 入口自动 prepare |
| 状态依赖 | 无 | 不提交时无 store；提交只需 CAS | 类型要求 get + CAS；未配置 prepareCommit 时不调用 CAS |
| 生命周期 | 宿主 signal/可选 fast 超时 | 单次慢超时+宿主 signal，无 drain/shutdown | turn.cancel、drain、shutdown |

独立 Slow 的构造期检查：配置了 prepareCommit，却没有 `state.compareAndSet`，直接抛错；即便该回调将返回 undefined，也必须满足这个装配条件。[packages/sdk/src/slow-runtime.ts:9–15](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L9-L15)；[packages/sdk/src/slow-runtime.ts:32–61](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L32-L61)；[test/slow-turn-runtime.test.ts:128–147](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/slow-turn-runtime.test.ts#L128-L147)

真正持久 Workflow 应保存可序列化的任务输入及配置版本，在步骤中重新建立模型客户端、工具、连接、signal，然后 **await 整个 `SlowTurnRuntime.run`**。还要读取 status/toolResults/final，按平台需要把失败返回值转成异常。不能只把 `FastSlowRuntime.run` 的“启动后台工作”放进步骤就结束，指望它的 Promise 自动跟着平台持久化。即使采用独立 Slow，SDK 也未把每次内部模型/工具操作做成持久检查点，步骤重试可能从分析开头重跑。[docs/sdk/examples/08-workflow-step.md:7–18](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/docs/sdk/examples/08-workflow-step.md#L7-L18)；[docs/sdk/examples/08-workflow-step.md:26–42](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/docs/sdk/examples/08-workflow-step.md#L26-L42)

## 8. 工具注册和真实 API 到底由谁负责

| 层 | SDK/工具包提供 | 产品/接入方负责 |
| --- | --- | --- |
| 工具定义 | `AgenticCapability`、Registry、JSON Schema 检查 | 选哪些工具放进 capabilities；定义业务参数及 execute |
| 选择执行 | 慢模型 function call → Registry → execute | Prompt、允许开放的工具集合；不会安装包就自动注册全部工具 |
| 专家模型 | 工具可调用 invocation.model，共享慢预算 | 实际模型 Provider/API、modelConfigId 解析、密钥、模型权限 |
| 检索/记忆/生图 | 可复用 Core Tools 的能力工厂与接口 | 适配 context、Prompt、用户/会话作用域、存储/生图后端、凭证、审批/接受逻辑 |
| 外部副作用 | signal 与结构化结果机制 | 远端 API 的幂等、原子提交、费用/资产/审核结果核对 |
| 服务入口 | npm SDK 是库 | HTTP/RPC handler、请求鉴权、任务状态查询、响应/消息持久化 |

工具真正执行的入口就是宿主传入的 `capability.execute(invocation)`。Registry 不会根据工具名寻找远端 URL；本轮工具 `definition` 与执行函数都来自已注册对象。[packages/sdk/src/contracts.ts:251–254](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/contracts.ts#L251-L254)；[packages/sdk/src/registry.ts:66–94](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/registry.ts#L66-L94)

Core Tools 混用的测试十分直观：开发者显式创建 `judge_npc`，包装为 Capability，在 execute 中补入 `prompt`、scenario/user/conversation/character 等业务上下文；另一个 custom 工具一起注册。测试慢路 modelCalls=3，分别是两次协调器和一次专家。**“工具可安装”不等于“模型已经有权且能调用该 API”。** [test/fast-slow-core-tools.test.ts:6–64](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-core-tools.test.ts#L6-L64)；[docs/sdk/integration.md:25–29](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/docs/sdk/integration.md#L25-L29)

## 9. SDK 能力与仓内应用接线的证据边界

本次检索 apps、adapters、compat，没有找到 `new FastSlowRuntime`、`new SlowTurnRuntime`、`new SimpleFastRuntime` 或 `FastTurnRuntime` 的应用接线。它们的可运行接线证据主要是 SDK 示例和测试。不能把示例 07 的每次调度策略、模型调用数或默认 limits 直接套在 Emochi/Sumi。

应用入口的正面证据：dispatch 检查 sumiV1 后直接转 `executeSumiRequest`；Story 配置优先选 StoryScenarioAxonAdapter；普通 agenticV2 装配自己的 Registry、AgenticV2Planner、AgenticV2TurnCoordinator，并用应用 Adapter/RoleplayRuntime 包装，再交 TurnHarness。[adapters/agent-router/dispatch.ts:747–749](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/adapters/agent-router/dispatch.ts#L747-L749)；[adapters/agent-router/dispatch.ts:1124–1173](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/adapters/agent-router/dispatch.ts#L1124-L1173)。SDK 文档也明示这些应用类不是 npm 通用入口的别名。[docs/sdk/runtime.md:53–57](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/docs/sdk/runtime.md#L53-L57)

因此，要回答用户“我们现在实际产品 X=多少”，必须去相应应用和 Scenario 配置查；SDK 部分的准确答复是：**不存在 X；组合入口每次调用都安排慢执行，而独立入口何时调用完全由宿主决定。**

## 10. 核查索引：实现与相关测试

以下均为本次阅读测试源码得到的证据，非本次测试运行结果。

- **[R1] 默认/自定义快路、组合启动：** [packages/sdk/src/runtime.ts:11–71](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L11-L71)；[packages/sdk/src/runtime.ts:87–144](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L87-L144)。
- **[R2] 可替换的 fast 接口：** [packages/sdk/src/runtime-shared.ts:31–45](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L31-L45)；自定义流测试 [test/fast-slow-runtime.test.ts:275–298](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L275-L298)；独立快输入测试 [test/fast-slow-runtime.test.ts:300–320](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L300-L320)。
- **[R3] 每次调度与工具 auto：** [packages/sdk/src/runtime.ts:126–132](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L126-L132)；[packages/sdk/src/slow-runtime.ts:78–98](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L78-L98)。
- **[R4] 同一快照与消息投影：** [packages/sdk/src/runtime-shared.ts:125–144](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L125-L144)；[packages/sdk/src/slow-runtime.ts:64–70](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L64-L70)。
- **[R5] 独立慢输入/冻结/序列化：** [packages/sdk/src/slow-runtime.ts:44–61](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L44-L61)；[test/slow-turn-runtime.test.ts:30–77](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/slow-turn-runtime.test.ts#L30-L77)。
- **[R6] 返回值与候选类型：** [packages/sdk/src/runtime-shared.ts:56–94](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime-shared.ts#L56-L94)；[packages/sdk/src/contracts.ts:230–237](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/contracts.ts#L230-L237)。
- **[R7] 可选 prepare/CAS：** [packages/sdk/src/slow-runtime.ts:141–183](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/slow-runtime.ts#L141-L183)。
- **[R8] 原子存储责任：** [packages/sdk/src/contracts.ts:133–142](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/contracts.ts#L133-L142)；示例内存存储 [examples/sdk/support/runtime.ts:13–28](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/examples/sdk/support/runtime.ts#L13-L28)。
- **[R9] 进程内任务生命周期：** [packages/sdk/src/tasks.ts:15–92](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/tasks.ts#L15-L92)；[packages/sdk/src/runtime.ts:74–84](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/packages/sdk/src/runtime.ts#L74-L84)。
- **[T1] 提交后下一轮才读取新 state：** [test/fast-slow-runtime.test.ts:228–273](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L228-L273)；慢阻塞不影响 fast [test/fast-slow-runtime.test.ts:367–379](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L367-L379)。
- **[T2] 前台失败不等于后台失败/不提交：** [test/fast-slow-runtime.test.ts:149–174](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L149-L174)。
- **[T3] completed 可以冲突或工具 ok:false：** [test/slow-turn-runtime.test.ts:128–179](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/slow-turn-runtime.test.ts#L128-L179)。
- **[T4] 超时/取消不等待失去响应的模型、工具、prepare：** [test/slow-turn-runtime.test.ts:97–125](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/slow-turn-runtime.test.ts#L97-L125)；[test/fast-slow-runtime.test.ts:393–463](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L393-L463)。
- **[T5] 并行兄弟失败、整批先校验：** [test/fast-slow-runtime.test.ts:3–39](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L3-L39)；[test/slow-turn-runtime.test.ts:182–190](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/slow-turn-runtime.test.ts#L182-L190)；[test/fast-slow-runtime.test.ts:536–601](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L536-L601)。
- **[T6] 单独 fast 超时与初始读取超时：** [test/fast-slow-runtime.test.ts:323–364](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L323-L364)。
- **[T7] 同一 slow 实例并发预算隔离：** [test/slow-turn-runtime.test.ts:80–94](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/slow-turn-runtime.test.ts#L80-L94)；工具共享模型预算 [test/fast-slow-runtime.test.ts:662–774](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/test/fast-slow-runtime.test.ts#L662-L774)。
- **[A1] Sumi 独立分支：** [adapters/agent-router/dispatch.ts:747–749](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/adapters/agent-router/dispatch.ts#L747-L749)。
- **[A2] Story/Agentic V2 应用装配：** [adapters/agent-router/dispatch.ts:1124–1173](https://github.com/FlowGPT/roleplay-harness/blob/80aef3fa5582d8508ecdd1afa206391940ce9502/adapters/agent-router/dispatch.ts#L1124-L1173)。


[返回 PM 导读](rp-business-guide.html) · [导读文本版](rp-business-guide.md)
