官方DeepSeek 开发者预览页的标题就是 Everything is a plugin。同一页写明:每一项能力都是可替换、可重组的插件,范围包括 models、tools、skills、sessions、sandboxes、storage、loops、scheduling 和 UI。〔1〕
官方GitHub 仓库把这句话重复了一遍,并指向 Cordis,以及论文 A Programming Paradigm for Spatiotemporal Composability。〔2〕〔3〕
官方中文架构文档写得更硬:产品的每一部分都是插件,包括模型适配器、工具注册表、会话日志,以及 agent loop 本身;不存在需要打补丁的特权内核;扩展方式是把插件挂到旁边;各项注册都是副作用,会在插件卸载时撤销。〔4〕
Cordis 入门文档把同一件事拆成可操作的规则:插件用 inject 声明依赖,等所需服务出现后再激活;提示词片段、工具 schema、适配器和监听器通过 ctx.effect() / ctx.on() 注册,以便重载和拆除时按顺序撤回。〔5〕
所以这里的 Plugin,不是“给现成 Agent 再挂一个工具”。它可以是 Agent 自己怎么转圈。
日常说的“插件”多半指 MCP 服务器,或 Claude / Cursor 一类产品里的 Skill。它们都能扩展能力,但位置和运行机制不同。
| 对照项 | MCP / Skill | DSH 的 Plugin |
|---|---|---|
| 通常待在哪 | Agent 外侧:对外接工具、资源,或写入一段固定流程 | 整棵运行树里:模型、工具、会话、UI,以及默认 agent-loop |
| 能不能换核心循环 | 一般不能。MCP 和 Skill 默认假定 loop 已经在那儿 | 可以。core/agent-loop 是实现 Agent 接口的默认驱动,和其他包一样从配置替换 |
| 依赖怎么声明 | MCP 靠服务器握手和客户端配置;Skill 多半靠描述文本被模型挑选 | 插件用 inject 声明所需服务,服务不在就不激活 |
| 卸掉之后 | 常要改配置、重启进程;已注入的提示词、工具列表和监听不一定被运行时成对撤掉 | 官方写明:注册是可逆副作用,卸载时撤销 |
MCP / Skill 一侧按常见产品机制归纳;DSH 一侧依据〔1〕〔4〕〔5〕。
MCP 是模型和外部工具、资源之间的协议。Skill 通常是一份流程说明,有时带脚本。两者都在扩大 Agent 能碰到的世界,但默认不改 Agent 自己怎么一步步转。
架构表把 core/agent-loop 写成默认驱动,键是 ctx.agentLoop。旁边还有 ctx.agents、ctx.tools、ctx.sessions、ctx.llm。换其中一个提供方,整条能力缝会跟着走。〔4〕
oh-story-dsh 的架构说明从反面印证了这层分工:它明确把 Agent loop、模型、凭据、沙箱、权限审批留给 DSH,自己只贡献创作 Skills、Roles 和三栏工作台。〔8〕 换句话说,社区插件可以换交互和工作流,核心循环仍是可替换的官方缝,而不是焊死的黑盒。
论文Cordis 论文把动态组合收成两个正交条件:时间可组合(temporal composability)是卸掉一个组件时,能把它造成的副作用完整撤回去;空间可组合(spatial composability)是组件能声明彼此依赖,并由运行时跟着这些依赖做激活和停用。〔3〕
论文的实现层也写得很具体:可逆 effect、响应式 coeffect、声明式组件加载器、配置对账,以及热替换。〔3〕 这和官方那句“注册会在卸载时撤销”对得上,不是事后比喻。
对照现有扩展方式,差别主要在机制,不在口号:
触及核心,再加上卸得干净,才会让“自己改自己”在工程上便宜。论文摘要开篇就把问题域写成:从插件系统到 self-evolving agent harnesses,都需要动态组合。〔3〕
官方Creator 模式提供了一截已经能看见的路径:检查当前运行时,在内存里试验 Cordis 插件,再把它们组合成新的 mode。〔1〕
官方预览页列出四种运行模式:Standard(完整编码 Agent)、Code(用模型生成的代码编排多轮工具调用)、Minimal(只留 shell 和文件编辑,用于评测)、Creator(检查运行时、内存中试验插件、组合成新 mode)。〔1〕
可观察当前 Web 产品里还有插件市场:能力按类展示、发现和安装。标准模式降低使用门槛,创造模式打开组合空间。两种模式共用同一个 Harness。
官方还写了开发者可以在配置里选择、替换或扩展任何能力,而不改 DSH 源码。〔1〕〔4〕 生产单位因此可以缩小:不一定交付一个完整 Agent,也可以只交付一个专业组件。
可观察oh-story-dsh 是社区做的 Cordis 插件,不是官方产品。仓库说明:DSH 继续管理 Agent、会话、模型、权限和 Chat;插件提供创作 Skills、专业 Roles、项目协议和三栏工作台。〔7〕〔8〕
| 表面 | 谁负责 |
|---|---|
| Workspace、Session、持久历史 | DeepSeek Harness |
| Agent loop、模型、凭据 | DeepSeek Harness |
| Preset、沙箱、工具、权限审批 | DeepSeek Harness |
| Chat、Trajectory、Todo、Composer | DSH 会话 UI |
| 13 个小说 Skills、7 个 Roles | oh-story-dsh 钉死的 Oh Story 资源 |
| 短剧工作流和项目协议 | oh-story-dsh 钉死的 Drama Skills |
| 创作文件树、编辑器、文件跟随 | 插件的 Browser 贡献 |
上表直接摘自项目 Architecture 的 Ownership 表。〔8〕
它没有 fork DSH,也没有重写 agent-loop。Browser 入口走两个官方扩展位:shell.overlay 放下三栏工作台,tool.call.toolview 放下 Role 调用视图;官方 Chat 仍占第三列。〔8〕 安装方式是往 web profile 里加一个插件包。〔7〕
和 Flowise、Dify 一类“通用编排器上再挂小说节点”不同:这里交付的是一个小说 / 短剧工作台。用户面对的是创作文件、Roles 和分集文档,不是一个大而全助手外加几个写作按钮。
推断下面三句不是官方结论,是从第一部分的机制和第二部分的用法推出来的。
过去常见的是:中心化能力入口,再往上叠加服务。这里看见的是:服务自己成为载体。
推断Agent 更可能长成贴近用户工作流、可替换、可回滚的分布式形态,而不是再做一个更大的万能助手。这个判断依赖两个前提继续成立:核心模块保持可替换,卸载继续保持可逆。任一前提被收回,推断都要重写。
inject 声明依赖;registrations are reversible effects。