3步从零跑通DeepSeek Harness第一个插件:把“万物皆插件“变成亲手写下的代码 📅 发布时间:2026/8/21 15:04:06 👁 浏览次数: 3步从零跑通DeepSeek Harness第一个插件把万物皆插件变成亲手写下的代码【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness你有没有遇到过这样的场景想给AI助手加一个自定义功能却发现要么改动框架源码、要么打补丁改一处崩三处DeepSeek Harness简称 dsh正是为解决这个痛点而生的开源智能体框架——它的核心理念只有一句话Everything is a Plugin万物皆插件。模型适配器是插件、工具是插件、文件访问是插件连驱动整个智能体的 agent loop 本身也是一个插件。换句话说这个框架没有需要打补丁的特权内核你要做的不是改别人代码而是把自己的插件挂载到它旁边。这篇文章不会带你按克隆—安装—启动的流水账走一遍而是用概念先行的方式先把万物皆插件这个设计讲透再让你亲手写一个最小插件验证它。读完你不仅跑得通还会理解每一步到底在做什么。为什么 DeepSeek Harness 要把一切都做成插件传统框架和智能体框架最大的区别在于扩展点长在哪里。大多数工具给你留了几个固定的钩子hook你想加功能只能在钩子里塞代码而 DeepSeek Harness 走的是另一条路框架本身是一棵由插件组成的树。在 dsh 里运行中的每个能力都挂在同一个共享上下文ctx上工具在ctx.tools、模型路由在ctx.llm、会话日志在ctx.sessions。插件通过ctx注册自己而所有注册都是可逆的副作用——插件卸载时框架会自动撤销它注册的一切不需要你手动清理。这意味着你可以放心地叠加、替换、热卸载任何一块能力而不用担心污染全局。这个设计带来的直接好处是扩展 dsh 的方式只有一种——写插件。你不需要阅读源码找该改哪里只需要知道该挂载哪个 ctx。接下来我们就用 3 步走完安装框架 → 配置模型 → 挂载第一个插件的最小闭环。第1步安装 DeepSeek Harness 并启动 Web 界面先确保机器上有 Node.js 22 或更高版本然后克隆仓库并安装依赖。这里推荐 pnpm用corepack enable开启它因为它对 monorepo 的支持最稳git clone https://gitcode.com/gh_mirrors/de/deepseek-harness cd deepseek-harness corepack enable pnpm install这条命令会一次性装好所有子包包括 Web UI、CLI、各类核心能力包。装完后启动 Web 界面pnpm dsh web编译完成后浏览器会自动打开http://127.0.0.1:3080——这就是 dsh 的主界面。如果它没有自动弹出手动访问这个地址即可。小提示启动时所在的目录会被当作默认文件系统位置后续选择工作区时会用到建议在一个干净的目录里启动。第2步配置模型服务让智能体通电新装的框架还没有模型可用。打开界面左侧的设置 → 模型你会看到 DeepSeek 官方模型的卡片在 API key 输入框填入你的密钥点击Apply保存。密钥写入后是只读的界面只会显示脱敏后的引用不会回显明文密钥本身存放在$DSH_HOME/.credentials.yaml里设置项只保留对它的引用。配置保存后立即生效不需要重启服务器。如果你用的是公司网关、自建服务或者官方目录里没有的模型可以点击Add a custom provider填一个全小写的 Provider ID、Base URL例如https://gateway.example/v1、API 协议一般选openai-completions和密钥即可。Provider ID 是永久的标识符请求、会话和凭据都靠它定位所以起名要慎重——改名的正确姿势是新增一个、删除旧的。注意手填的模型默认按纯文本处理。如果模型支持图片输入需要在$DSH_HOME/settings.yaml里给它加上input: [text, image]否则发送图片会被拒绝。配置完模型后在界面里添加并选中一个工作区比如刚才启动 dsh 的目录会话输入框才会可用。到这一步你已经有了一个能对话、能读文件、能跑命令的完整智能体。但它还是出厂状态——接下来才是重头戏。第3步挂载你的第一个插件亲眼看到万物皆插件现在来做最激动人心的事写一个什么都不依赖框架内部的插件然后让它被 dsh 加载。整个过程只有两个文件。3.1 创建插件目录和入口文件mkdir -p scratch-plugin/src创建scratch-plugin/src/my-plugin.ts写入下面这段代码import type { Context } from deepseek-ai/cordis export const name hello-plugin export function apply(ctx: Context) { console.log([hello-plugin] 我的第一个DeepSeek Harness插件加载成功) }这段代码做了三件事name给插件起名apply是插件的入口函数框架加载时会调用它ctx是共享上下文插件靠它注册能力。就这么简单——一个导出apply的模块就是一个插件这是万物皆插件的最小形态。3.2 用 cordis.yml 把插件插进应用创建scratch-plugin/cordis.yml内容如下把/absolute/path/to/deepseek-harness替换成你实际的仓库绝对路径可以用pwd查看- insert: - id: hello name: /absolute/path/to/deepseek-harness/scratch-plugin/src/my-plugin.ts这个文件叫patch 覆盖层它不修改任何框架配置只负责在启动时插入一个条目。插件路径必须是绝对路径因为 loader 解析模块时不会改动 profile 目录。3.3 带着插件启动看它被加载pnpm dsh web --patch ./scratch-plugin/cordis.yml启动日志里会出现[hello-plugin] 我的第一个DeepSeek Harness插件加载成功看到这一行你就完成了 dsh 的完整加载链路配置树组装 → 插件挂载 → apply 执行。整个过程没有改动一行框架源码——这就是万物皆插件给你的第一个实实在在的回报。进阶给插件加生命周期管理体验自动清理上面的例子只是打了一行日志。真实插件往往要开定时器、监听事件、注册工具。如果每次都要手动清理代码很快会变得脆弱。dsh 的解法是ctx.effect()——它告诉框架这个资源怎么卸载插件卸载时框架自动帮你善后import type { Context } from deepseek-ai/cordis export const name hello-plugin export function apply(ctx: Context) { ctx.effect(() { const timer setInterval(() { console.log([hello-plugin] 插件运行中...) }, 5000) // 返回清理函数插件卸载时框架会自动调用 return () clearInterval(timer) }) }通过ctx注册的任何东西——事件监听、定时器、工具 schema——都不需要你手动 removeListener 或 clearInterval框架会按声明顺序自动撤销。这就是前文说的可逆副作用插件来去自如系统永远干净。再进一步让模型能调用你写的工具插件只打日志还不够过瘾。下一步可以注册一个真正的工具让模型在对话中调用它。把my-plugin.ts替换成import type { Context } from deepseek-ai/cordis import { defineTool } from deepseek-ai/dsh-tools export const name greet-tool export const inject [tools] export function apply(ctx: Context) { ctx.tools.register(defineTool({ name: greet, description: Greet someone by name., parameters: { name: { type: string, required: true, description: The name to greet }, }, output: { schema: { type: string }, render: (_args, value) [{ type: text, text: value }], }, async execute(args) { return Hello, ${args.name}! }, })) }这里新增了两个概念inject: [tools]声明我需要工具注册表就绪后才启动依赖声明而不是手动编排顺序defineTool则把parameters转成模型可理解的 schema并校验execute收到的参数。重启后用这个 patch 启动然后在对话里输入Use the greet tool to greet Ada.模型会调用greet并收到Hello, Ada!这个工具结果——从能跑到能被模型使用你只写了 30 行代码。常见问题排查启动报错说找不到插件模块检查cordis.yml里的路径是否为绝对路径并确认my-plugin.ts文件名拼写一致。页面打不开确认pnpm dsh web进程还在运行且端口 3080 未被占用通过 SSH 启动时只打印宿主机 URL需要自己处理端口转发。模型一直报错先回设置页确认密钥已保存Apply 按钮生效自定义提供商的 Base URL 记得带/v1前缀。插件改动没生效patch 加载的是静态配置改动源码后需要重启pnpm dsh web。下一步去哪想让插件接受用户配置比如把问候语做成可配置项看插件配置指南想系统了解五种插件形态与生命周期读Cordis 入门和架构文档想在不申请 API 密钥的前提下动手实践框架机制Cordis 教程每一章都是一个可运行的例子在临时目录里就能跑。写插件的乐趣在于你不再是框架的下游用户而是和模型适配器、工具流水线、agent loop 平起平坐的同层开发者。DeepSeek Harness 把这扇门打开得很彻底——你只需要记住一句话万物皆插件而下一个插件可以由你来写。【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考