














最近deepseek发布了harness,试用了一下结合deepseek-4-flash,用它尝试写一个php的现代版phpmyadmin,因为也是一个比较重要且有一点复杂度的应用
试了下除了数据展示有点问题,修了一轮就完成了,整体表现还是不错的
然后看了下它主打的是万物都是插件
这个概念还是比较复杂的,尝试让gpt老师帮我讲解下
DeepSeek Harness 就像一个“由很多小员工临时组成的公司”。
没有一个超级总经理包办所有事情:
你对 DeepSeek Harness 说:
帮我读取 package.json,看看项目用了哪些依赖。
系统内部大致发生了这些事:
1 | 你输入问题 |
关键点是:
上面每一个步骤都可以由不同插件负责。
比如你可以:
普通软件的结构经常是:
1 | 固定核心程序 |
核心程序是老板,插件只能填几个预留位置。
DeepSeek Harness 更像:
1 | 极小的组装平台 |
连“核心 Agent 怎么循环运行”本身也是插件。
所以它不是:
一个 Agent,加上一些插件。
而是:
很多插件组合起来以后,才形成一个 Agent。
假设你写了一个天气工具插件。
它不能一启动就直接工作,因为它要先找到“工具管理器”。
所以它会声明:
1 | 我需要:tools 服务 |
代码里大概是:
1 | export const inject = ['tools'] |
意思就是:
只有工具管理器存在时,才启动我。
系统启动时可能出现这种情况:
1 | 天气插件:我需要 tools |
如果工具管理器后来被替换:
1 | 旧工具管理器卸载 |
这就是 DeepSeek Harness 很特别的地方:
插件依赖不是只在启动时检查一次,而是一直被系统关注。
ctx 到底是什么插件启动时会拿到一个 ctx:
1 | export function apply(ctx) { |
你可以把 ctx 理解成“公司总机”。
插件不知道其他插件住在哪里,只需要问总机:
1 | ctx.tools |
比如天气插件说:
1 | ctx.tools.register(weatherTool) |
意思就是:
总机,请把我的天气能力登记到工具管理器里。
这样天气插件不需要自己找到 Agent Loop,也不需要直接修改模型提示词。工具管理器会负责把天气工具告诉模型。
这是整个系统最值得理解的设计。
假设天气插件启动后做了三件事:
1 | 1. 注册 weather 工具 |
如果只是粗暴地删除插件代码,可能留下:
1 | 创建 weather 工具 |
1 | 停止定时器 |
1 | 完整清理旧天气插件 |
effect。现在再引入 Fiber 就很容易了。
Fiber 可以理解成:
某个插件这一次运行的“工作档案”。
里面记录着:
1 | 等待条件 |
1 | PENDING |
有些插件提供能力,比如文件系统。
另一些插件不提供新能力,只想在某个流程中插一脚。
例如权限插件想在执行 Bash 前检查命令:
1 | 模型请求执行 rm ... |
这个过程很像高速公路收费站:
1 | 请求 |
每一站都可以:
1 | next() |
next(),就表示到此为止。waterfall。本质上就是一条可插拔的中间件链。这里最容易被名词绕晕。
真正执行工作的代码。
一个 Bundle 可能一次带来很多插件,例如:
1 | Web Bundle |
Profile 是公司组织方案
比如:
1 | web Profile |
而:
1 | headless Profile |
因此:
1 | dsh --profile web |
可以理解成:
按照 Web 这套组织方案,把对应部门和员工全部组装起来。
执行:
1 | dsh plugin --profile web add some-plugin |
大致等于:
1 | 1. 用 pnpm 下载 npm 包 |
大概是这么个逻辑
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。