单项目深读

deepseek-harness:一切皆插件的 TypeScript Agent 框架

DeepSeek Harness 把工具调用与 prompt 编排拆成可插拔模块,用 TypeScript 组装 CLI 助手,MIT 许可,已获 25 万星标。

|INS-0017

一个 agent 框架最容易死的地方,不是模型不够强,而是每接一个新系统就要动一次内核。DeepSeek Harness 的赌注是:把内核做没,只留插件。

它由 DeepSeek AI 开源,TypeScript 编写,MIT 许可,仓库 deepseek-ai/deepseek-harness 目前 252213 星标、30337 fork、0 个 open issue。README 第一句就把架构讲完了——everything-is-a-plugin,底层跑在 Cordis 上,那套设计范式写在论文《A Programming Paradigm for Spatiotemporal Composability》里。

这句话值得拆开看,因为它是整个项目所有取舍的来源。

内核被压缩到只剩「插件容器」

大多数 agent 框架的组织方式是分层的:模型层、工具层、记忆层、编排层,每层有固定的接口和固定的位置。加一个能力,等于在某一层里插一个实现。这种结构上手快,但边界一旦定死,跨层的需求就得改框架本身。

dsh 反过来。工具调用、prompt 编排这些通常被当作「框架内置能力」的东西,在它这里都是插件。框架本身不预设 agent 应该长什么样,它只负责三件事:

  • 加载插件:发现、装配、启动;
  • 管理生命周期:插件的注册与卸载,这是 Cordis 那套「时空可组合性」要解决的问题——插件可以被动态加入,也可以被移除,而不是启动时一次性写死;
  • 提供宿主:把装配好的 agent 跑起来,对外暴露成 Web UI 或 CLI。

按 README 能确认的组件,可以归纳成这样的分层:

层组成职责
宿主层dsh web 命令、Web UI(默认 http://127.0.0.1:3080)启动服务、打开浏览器、承载交互界面
装配层Cordis 运行时插件的注册、组合、生命周期管理
能力层工具调用插件、prompt 编排插件、以及社区 dsh-plugin 主题下的第三方插件每一项 agent 能力,独立成插件
接入层用插件封装的现有内部 API把已有系统接进 agent,不改内核

请求的流转路径因此很直:用户在 Web UI 里发起一次任务 → 宿主层把请求交给装配好的 agent → agent 的 prompt 编排由插件决定 → 需要调工具时,调的是某个工具插件 → 工具插件再去打内部 API。任何一环想换实现,换的是插件,不是框架。

这套设计的直接后果是:接入内部系统不需要 fork 框架。README 里点明的最典型用法就是这个——用插件封装现有 API,快速搭出可用的 CLI 助手。你写的是插件,框架不动。

跑起来只要一行

安装 Node.js 之后:

sh
npx @deepseek-ai/dsh web

这条命令默认在 http://127.0.0.1:3080 起 Web UI 并在默认浏览器打开。两个细节 README 写得很明确:通过 SSH 启动时只打印 host URL,因为本地转发地址归 SSH 客户端或编辑器管;加 --no-open 则只起服务、不开浏览器。

想从源码跑:

sh
git clone https://github.com/deepseek-ai/deepseek-harness.git cd deepseek-harness pnpm install pnpm run build pnpm dsh web

pnpm run build 准备构建产物,pnpm dsh web 直接用这些产物,不会重新构建。开发时另有 pnpm run dev:web,在同一个终端里完成构建、服务和客户端 bundle 的热重建;make help 会列出 Web 与 Desktop 对应的 Make 目标。

值得注意的是 npx 那条路径——不需要 clone、不需要 pnpm、不需要 build,一个命令起一个本地 agent 宿主。这是「按需组装」这个理念在分发层面的体现:先用起来,再决定要不要写插件。

插件生态的入口是一个 GitHub topic

dsh 没有另建插件市场。README 给的约定是:给你的插件仓库打上 `dsh-plugin` 主题,方便被发现。仓库自身的 topics 也是 ai-agents, cordis, dsh, dsh-plugin——dsh-plugin 和 cordis 并列,说明插件与运行时在这个项目里是同等重要的一等概念。

反馈走 GitHub Discussions,社区在 Discord。这些都是常规配置,但配合 0 个 open issue 这个数字看,维护节奏是「讨论区消化问题,issue 区保持干净」,而不是靠 issue 数量堆活跃度。

它和同主题项目差在哪

把几个同主题项目摆在一起,定位差异比功能列表更清楚:

项目语言约星标核心定位扩展方式
deepseek-harnessTypeScript252213一切皆插件的 agent 宿主插件(dsh-plugin)
browser-usePython117662让模型直接操控浏览器面向网页任务的专用框架
TradingAgentsPython110665多 Agent 协作做金融交易决策角色拆分 + prompt 驱动
reaTypeScript108195多 agent 逆向分析闭源程序面向安全分析的 agent 编排
graphifyPython125581把代码库转成可查询知识图谱/graphify skill 接入现有 CLI
JavaGuideJavaScript158947后端知识体系与面试指南文档,非框架

差别不在能力多少,在边界画在哪。

browser-use、TradingAgents、rea 都是「为某类任务预设好 agent 结构」——浏览器操控、交易决策、二进制逆向,各自有一套固定的角色与流程。这类框架的价值在于开箱即用,代价是换一个任务域就要换一个框架。

graphify 走的是另一条路:它不提供 agent 宿主,而是作为一个 skill 挂进 Claude Code、Cursor 这类已有 CLI,给 agent 补上「读懂项目全貌」这一块。它是能力补充,不是宿主。

dsh 选的是最靠底的那一层:它不预设你的 agent 干什么,只提供装配机制和宿主。文档整理、表格分析、写代码、定时任务——官网首页列出的这四类用法,在 dsh 里是四个插件组合出来的结果,不是四个内置功能。这让它更像一个运行时,而不是一个成品 agent。

JavaGuide 严格说不构成对照,它是知识文档而非框架,放在这里只是说明这个赛道里「高星」的含义并不统一:有的是框架被大量使用,有的是资料被大量收藏。

一个必须说清楚的边界

dsh 目前是 developer preview,README 用全大写强调:THERE WILL BE COMPATIBILITY-BREAKING CHANGES. 这不是免责声明式的客套,它直接决定了使用策略——现在写的插件,未来可能要跟着改。

README 还要求运行前先读 safety notice(SAFETY.md)。一个能调用工具、能接内部 API、能执行定时任务的 agent 宿主,权限边界就是它的风险边界,这一点在本地跑 Web UI 时尤其要注意。

仓库创建于 2026-08-13,最近推送 2026-10-17,两个多月里长到 25 万星。这个速度本身就说明「TypeScript + 插件化 agent 宿主」这个组合踩中了需求:前端和 Node 生态的开发者需要一个能用自己熟悉的语言写 agent 的容器,而不是去 Python 生态里找。

上手路径

如果你要评估它,顺序大概是:

  1. npx @deepseek-ai/dsh web 起一个本地实例,看 Web UI 里 agent 的实际交互形态;
  2. 读 architecture 文档 和 development guide,理解 Cordis 的插件模型;
  3. 挑一个内部 API,写第一个插件,验证「不改内核接系统」这件事在你这里成不成立;
  4. 如果要做二次开发,pnpm run dev:web 起开发模式,按 AGENTS.md 的约定来。

「一切皆插件」不是一句口号,它是一个明确的责任划分:框架只保证装配和运行,能力边界交给插件作者。这个选择让 dsh 在 developer preview 阶段就敢让外部写插件,也让它的稳定性承诺只落在很小的一块内核上。要不要押注它,取决于你信不信「内核越小,活得越久」这条规律。