🐳 第七章 从Tool Call到Agent Runtime
📄 一句话概括

实测配置里 4 个 provider 用的是同一个包名 @deepseek-ai/dsh-tool-subagent——spawn/fork/codex/claude-code;换实现连包都不用换。

📝 本节和前面几节的关系

PTC 讲完,第二个大件是 Subagent。先看它最漂亮的一点:一种能力,四份实现。

一、实测四行配置

四条 name 一模一样——差别全在 config 里。

二、7.3.1 那句话的另一种形态

7.3.1 说【能力是一个 id,实现是一个包】;这里更进一步:连包都共用,实现落在字段上。

也就是说,可替换性有两种露法:换包,或者换同一个包里的配置。

三、两处细节很有意思

四、动手验证

实验 B 已经把 provider 从 spawn 换到 fork:实质改 1 行、0 警告。

接口名 subagent 一个字没动——用它的模型与调用方都不必知道换了实现。

五、动手 Demo:同一种 Subagent 能力,四份实现

一个包名,四份 config:

impls = [("spawn", "subagent", "continuable", True),
         ("fork", "subagent_fork", "continuable", True),
         ("codex", "subagent_codex", "one-shot", False),
         ("claude-code", "subagent_claude_code", "one-shot", False)]
for p, t, b, on in impls:
    print("  %-12s %-20s %-12s %s" % (p, t, b, "启用" if on else "停用"))

实跑输出:

--------------------------------------------------------------------
同一种 Subagent 能力,四份实现
--------------------------------------------------------------------
  实测:配置里 4 个 provider 用的是**同一个包名**——
  `@deepseek-ai/dsh-tool-subagent`,差别全在 config 里:

  provider        工具名                   后台模式        默认状态
  ------------------------------------------------------------------
  spawn           subagent                 continuable     启用
  fork            subagent_fork            continuable     启用
  codex           subagent_codex           one-shot        停用
  claude-code     subagent_claude_code     one-shot        停用
  ------------------------------------------------------------------

  同一个包、四份配置——**能力不变,实现可换**。
  这比【四个包】更能说明问题:换实现连包都不用换。

同一个包、四份配置——能力不变,实现可换。 这比【四个包】更能说明问题:换实现连包都不用换。 同一份 fork 实现被两处配成不同行为——预设就是组合清单。

30 秒实验

  1. 在配置树里找出这四条,核对包名是不是同一个。
  2. 对比 fork 在顶层与预设内部的 backgroundMode 差异。
  3. 想想 one-shot 与 continuable 各适合什么活。

常见误区

  1. 错误:四种 provider 是四个插件。——纠正:同一个包——差别全在 config 里。
  2. 错误:换实现要装新插件。——纠正:改一个字段就行——实验 B 实测实质只改 1 行。
  3. 错误:同一份实现的配置到处一样。——纠正:同一份 fork 有 continuable 与 one-shot 两种配法——组合不同,行为不同。
自测三问(点开对答案) 1. 四个 subagent provider 用几个包? —— **一个**:`@deepseek-ai/dsh-tool-subagent`——差别在 config。 2. fork 在顶层与预设内部有什么不同? —— 顶层是 `one-shot`,标准预设内部是 `continuable`——**组合决定行为**。 3. 换实现实测改了几行? —— **实质 1 行**(provider 由 spawn 改 fork),接口名不动。

相关笔记