📄 一句话概括
一个插件包能同时挂出好几个入口:包名/包名/tools/包名/host/包名/list-agents/包名/startup——Tool 是一组在不同位置各挂一件的东西,不是一个函数。
📝 本节和前面几节的关系
4.1.1 提过【一件能力拆成四个包】,这一节把这件事推到应用层:一个工具也可以横跨好几个入口。
一、配置里出现了带斜杠的名字
真实配置里有这样的写法:
@deepseek-ai/dsh-tool-cordis——主入口。@deepseek-ai/dsh-tool-cordis/host——宿主侧的那一半。@deepseek-ai/dsh-tool-subagent-control/list-agents——某一个具体工具。@deepseek-ai/dsh-web-app/startup——启动流程里的一步。
同一个包,可以挂出好几个入口,各自是个独立的注册项。
二、为什么会这样
因为一个【工具】通常要同时满足三类角色(1.3 讲过):定义、提供方、使用方。
一个函数只有一个签名,撑不起这三件事;而一个包可以分别导出:给模型看的接口、宿主侧的实现、启动时注册的钩子。
把这些入口拆成独立的注册项,也就能独立停用、独立替换——这正是【皆插件】想换来的自由度。
三、实测规模
- 顶层插件行 183 条。
- 子层插件行(挂在分组或包下面的)61 条。
- 去重后的包名 183 个——与顶层行数恰好相同,纯属巧合。
61 条子层注册项说明:能力不是平铺的,是分组的、嵌套的。4.4 讲管线时,这些分组就是关卡的落点。
四、这个视角改变了什么
- 写工具时:别只想【一个函数要什么参数】,要想【模型看什么、宿主干什么、启动时注册什么】。
- 排查问题时:一个工具有问题,先分清是哪一端坏了——模型侧、宿主侧,还是注册没成功。
- 停用能力时:可以只停一端(4.1.2 的实验就是只停了本体那端)。
五、动手 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 秒实验
- 在配置树里搜带
/的 name,把出现的入口形式列一遍。 - 挑一个你熟悉的工具(比如读文件),想象它的模型侧与宿主侧分别要做什么。
- 解释:为什么把入口拆成独立注册项,就能【独立停用、独立替换】?
常见误区
- 错误:一个 Tool 就是一个函数,一次注册。——纠正:一个包可以挂出多个入口(tools/host/子工具/startup)。
- 错误:名字里带斜杠说明是路径。——纠正:那是同一个包的另一个注册入口。
- 错误:子层注册项是重复的,去掉也不影响。——纠正:61 条子层项各有各的角色,去掉就是那一端没了。
自测三问(点开对答案)
1. 一个包能挂出哪些入口形式? —— 包名(主入口)、/tools、/host、/某具体工具、/startup——**各自是独立注册项**。 2. 为什么工具不能看成一个函数? —— 因为一个函数撑不起**定义/提供方/使用方**三个角色;一个包可以分别导出这几端。 3. 顶层 183、子层 61 这两个数字说明什么? —— **能力不是平铺的**:有分组、有嵌套,这些子层就是后面管线的落点。- ☐ 下一节(4.3 第三层:用 Hook 改变执行规则)
相关笔记
- 为什么这不只是【多加几个 Tool】 —— 三角色就是这里说的【横跨几端】
- Skill 路径与默认启用方式 —— 一件能力拆四包的先例
- 作用域的意义:动态组合必须有边界 —— 每端挂在哪,同样要有边界
- 🐳 DeepSeek Harness · 索引