🐳 第四章 从Skill、Tool到Hook
📄 一句话概括

一个插件包能同时挂出好几个入口:包名/包名/tools/包名/host/包名/list-agents/包名/startup——Tool 是一组在不同位置各挂一件的东西,不是一个函数。

📝 本节和前面几节的关系

4.1.1 提过【一件能力拆成四个包】,这一节把这件事推到应用层:一个工具也可以横跨好几个入口。

一、配置里出现了带斜杠的名字

真实配置里有这样的写法:

同一个包,可以挂出好几个入口,各自是个独立的注册项。

二、为什么会这样

因为一个【工具】通常要同时满足三类角色(1.3 讲过):定义、提供方、使用方。

一个函数只有一个签名,撑不起这三件事;而一个包可以分别导出:给模型看的接口、宿主侧的实现、启动时注册的钩子。

把这些入口拆成独立的注册项,也就能独立停用、独立替换——这正是【皆插件】想换来的自由度。

三、实测规模

61 条子层注册项说明:能力不是平铺的,是分组的、嵌套的。4.4 讲管线时,这些分组就是关卡的落点。

四、这个视角改变了什么

五、动手 Demo:一个包,多个入口

把多入口写法和实测规模摆出来:

entries = [
    ("包名", "主入口"),
    ("包名/tools", "给模型用的那一组工具"),
    ("包名/host", "宿主侧的那一半"),
    ("包名/list-agents", "某一个具体工具"),
    ("包名/startup", "启动流程里的一步"),
]
for a, b in entries:
    print("  %-18s %s" % (a, b))
print()
print("  顶层插件行   183")
print("  子层插件行    61")

实跑输出:

--------------------------------------------------------------------
一个包,多个入口
--------------------------------------------------------------------
  配置里出现了这样的写法:

        - id: cordis-inspect-providers
          name: '@deepseek-ai/dsh-tool-cordis/host'
        - id: web-startup
          name: '@deepseek-ai/dsh-web-app/startup'
        - id: tool-subagent-list-agents
          name: '@deepseek-ai/dsh-tool-subagent-control/list-agents'

  同一个包,可以挂出好几个入口:

  入口形式             干什么
  ------------------------------------------
  包名                 主入口
  包名/tools           给模型用的那一组工具
  包名/host            宿主侧的那一半
  包名/list-agents     某一个具体工具
  包名/startup         启动流程里的一步
  ------------------------------------------

  实测规模:

    顶层插件行            183
    子层插件行             61      <- 挂在分组或包下面的
    去重后的包名          183      <- 与顶层行数恰好相同,纯属巧合

  所以【一个 Tool】这句话本身就不准确——
  同一个包能同时是工具、是宿主服务、是启动步骤。

看到带斜杠的名字不要当成【路径写错了】——那是同一个包的另一个入口。 61 条子层注册项是分组与嵌套的证据;能力是长在树上的,不是摊在桌面上的。 【Tool 不止是函数】落到实操上就是:写一个工具要写好几端。

30 秒实验

  1. 在配置树里搜带 / 的 name,把出现的入口形式列一遍。
  2. 挑一个你熟悉的工具(比如读文件),想象它的模型侧与宿主侧分别要做什么。
  3. 解释:为什么把入口拆成独立注册项,就能【独立停用、独立替换】?

常见误区

  1. 错误:一个 Tool 就是一个函数,一次注册。——纠正:一个包可以挂出多个入口(tools/host/子工具/startup)。
  2. 错误:名字里带斜杠说明是路径。——纠正:那是同一个包的另一个注册入口。
  3. 错误:子层注册项是重复的,去掉也不影响。——纠正:61 条子层项各有各的角色,去掉就是那一端没了。
自测三问(点开对答案) 1. 一个包能挂出哪些入口形式? —— 包名(主入口)、/tools、/host、/某具体工具、/startup——**各自是独立注册项**。 2. 为什么工具不能看成一个函数? —— 因为一个函数撑不起**定义/提供方/使用方**三个角色;一个包可以分别导出这几端。 3. 顶层 183、子层 61 这两个数字说明什么? —— **能力不是平铺的**:有分组、有嵌套,这些子层就是后面管线的落点。

相关笔记