【AI大模型】-DeepSeek Harness 深度解析
DeepSeek Harness 深度解析:从"一切皆插件"到企业级 Agent 调度层

2026 年 8 月 13 日深夜,DeepSeek 两小时三连击:V4 Pro 正式版转正、API 涨价预告,然后是一个让整个开发者社区炸锅的项目——DeepSeek Harness。这个项目开源首日 GitHub Star 破 3 万、登顶 Hacker News,创下史上最快破 2 万 Star 的纪录,一周内突破 16 万 Star。
它不是新模型,不是聊天界面,而是一套把"模型 + 工具 + 工作区 + 权限 + 会话记忆 + 任务循环"串起来的 Agent 运行时。官方给的公式很直白:Model + Harness = Agent。
本文将从痛点出发,带你彻底搞懂 DeepSeek Harness 是什么、为什么用、怎么演进、怎么在企业项目中落地,并附上可直接运行的代码。
引言:你是否也遇到了这些痛点
文章目录
场景一:AI 只会"说"不会"做"。 你用大模型写了一段代码,它告诉你"请打开终端执行 npm install",然后呢?然后你自己打开终端、自己敲命令、自己看报错、自己回去问它。模型像一个只会动嘴的顾问,所有脏活累活还是你自己干。
场景二:Agent 框架绑死了模型。 你选了 Claude Code,就只能用 Claude 模型;选了 Codex,就只能用 OpenAI 模型。公司要求数据不出内网、要用私有部署的模型,这些闭源工具直接罢工。想同时用多个模型做对比测试?得在五六个工具之间来回切。
场景三:想扩展功能比登天还难。 你想给 Agent 加一个"查询公司内部数据库"的工具,或者加一个"自动生成周报并发送到飞书"的技能。闭源工具的插件体系要么没有,要么只能通过 MCP 协议做有限扩展,连 Agent 的主循环逻辑都碰不到。想改个权限策略?对不起,源码不在你手里。
场景四:出了问题无法追溯。 Agent 跑了一个复杂任务,中间调了十几个工具、改了五六个文件,最后结果不对。你想回看它每一步看到了什么、想了什么、调了什么工具、返回了什么结果——闭源工具只给你一个最终答案,中间过程是个黑盒。
场景五:企业级需求无人满足。 你需要 RBAC 权限控制、操作审计日志、沙箱隔离、离线部署、自定义模型网关。市面上的 Agent 工具要么是个人玩具,要么是 SaaS 订阅,没有一个能真正装进企业内网、按企业规则运行。
如果你中了以上任意一条,DeepSeek Harness 就是为你准备的。
一、DeepSeek Harness 是什么
专业解释
DeepSeek Harness(命令行工具名 dsh)是由 DeepSeek AI 开发的开源 Agent 运行时框架,采用 MIT 许可证开源。它基于"一切皆插件"(Everything is a Plugin)的架构原则,底层由 Cordis 微内核驱动,模型、工具、技能、会话、沙箱、存储、调度、UI 甚至 Agent 主循环本身全部以插件形式存在,可自由替换、灵活重组。
当前处于开发者预览版(Developer Preview),最新版本为 v0.1.0-rc.8,官方明确警告会有破坏性变更。
大白话
你可以把大模型想象成一个超级聪明的大脑,但这个大脑没有手、没有脚、没有记忆、没有工具。它能告诉你"应该怎么做",但自己做不了。
Harness 就是给这个大脑装上的"身体"——它负责读文件、敲命令、上网查资料、管理记忆、拆解任务、纠错重试。官方公式 Model + Harness = Agent,翻译过来就是:大脑 + 身体 = 能干活的人。
而 DeepSeek Harness 最特别的地方在于,这个身体的每一个零件都是可插拔的。你不想要它的手?换一只。你想给它加个翅膀?插一个。你想把整个大脑换成别家的?拔下来换一个就行,身体不用动。
生活案例
想象你去一家餐厅吃饭。
- 模型是厨师,负责思考怎么做菜。
- Harness 是整个餐厅的运营体系——传菜员、采购员、收银员、洗碗工、菜单系统、库存管理。
没有 Harness 的模型,就像一个站在空厨房里的厨师,他知道菜谱,但没有食材、没有锅碗瓢盆、没有人帮他传菜,只能干巴巴地念菜谱。
普通的 Agent 框架(如 Claude Code),就像一家品牌连锁餐厅——厨师、菜单、装修、服务流程全是品牌方定好的,你只能在固定菜单里点菜,想加一道自家特色菜?对不起,不支持。
DeepSeek Harness 则像一个共享厨房空间——你可以自带任何厨师(任意模型)、自带任何食材和工具(任意插件)、自己定服务流程(自定义 Agent Loop)、自己管账(自定义存储和审计)。整个空间的每一个区域都可以重新装修,没有任何一面墙是焊死的。
核心架构总览

如上图所示,Cordis 微内核处于中心位置,所有能力(模型适配器、工具注册表、会话日志、沙箱、Agent Loop、Web UI)都作为插件挂载到内核上,通过服务依赖和事件总线彼此协作。
二、为什么要用 DeepSeek Harness
痛点一:模型锁定的解决方案
痛点: 现有 Agent 工具与特定模型厂商深度绑定,企业无法自由选择模型。
解决方案: DeepSeek Harness 的模型适配器本身就是一个插件。你可以在配置文件中切换模型提供商,从 DeepSeek 换到 OpenAI、Anthropic、OpenRouter,甚至指向你自己部署的本地模型,不需要改任何业务代码。
# config.yaml - 模型配置示例
models:
default: deepseek-v4-pro
providers:
deepseek:
baseUrl: https://api.deepseek.com
apiKey: ${DEEPSEEK_API_KEY}
openai:
baseUrl: https://api.openai.com/v1
apiKey: ${OPENAI_API_KEY}
internal:
baseUrl: http://192.168.1.100:8080/v1
apiKey: ${INTERNAL_MODEL_KEY}
痛点二:功能扩展受限的解决方案
痛点: 闭源 Agent 工具只能通过 MCP 做有限扩展,无法触及核心逻辑。
解决方案: 在 DeepSeek Harness 中,连 Agent 主循环、会话日志、沙箱策略都是插件。你可以替换推理循环、自定义沙箱安全边界、更换存储后端,所有扩展不需要修改 Harness 源码,通过配置文件组合即可。
// 自定义 Agent Loop 插件示例
import type { Context } from '@deepseek-ai/cordis'
export const name = 'custom-agent-loop'
export const inject = ['llm', 'tools', 'session']
export function apply(ctx: Context) {
ctx.agentLoop.register({
name: 'custom-loop',
async run(task, context) {
// 自定义任务拆解逻辑
const plan = await ctx.llm.plan(task)
for (const step of plan.steps) {
// 自定义执行与重试策略
const result = await executeWithRetry(step, context)
// 自定义结果验证
if (!validate(result)) {
await ctx.llm.reflect(step, result)
}
}
},
})
}
痛点三:可观测性缺失的解决方案
痛点: Agent 执行过程是黑盒,出了问题无法追溯。
解决方案: DeepSeek Harness 的每一次运行都记录在追加式会话日志中(append-only session log),包括系统提示、推理过程、工具调用及结果、子代理调度、每一次上下文注入。在 Trajectory 视图中可以按来源检查这些记录,支持恢复、分叉、搜索和重放。
# 查看会话轨迹
dsh trajectory list
dsh trajectory show <session-id>
dsh trajectory replay <session-id> --step 5
dsh trajectory fork <session-id> --step 12
痛点四:企业级部署的解决方案
痛点: 数据安全要求高,无法使用 SaaS 型 Agent 工具。
解决方案: DeepSeek Harness 是 MIT 开源项目,可 100% 离线部署在企业内网。模型 API 端点可指向内部网关,所有数据不出域。配合自定义权限插件和审计插件,可满足企业级安全合规要求。
三、它是怎么演进过来的

第一阶段:模型开源(2024-2025)
DeepSeek 从 2024 年开始陆续开源了 DeepSeek-V2、DeepSeek-V3、DeepSeek-R1 等大语言模型,在模型层面积累了强大的技术实力。但此时的 DeepSeek 只提供了"大脑",没有提供"身体"——开发者拿到模型后,还需要自己搭建 Agent 运行环境。
第二阶段:内部研发(2026.6.10 - 2026.8.13)
2026 年 6 月 10 日,DeepSeek Harness 仓库第一次提交。在接下来的 64 天里,这个项目完成了 12293 次提交,附带 683 篇设计笔记,连被否决的 11 条方案都摊在仓库里。团队选择了 Cordis 作为插件元框架,并将其源码整个拷进自己仓库,修改了 18 处。启动清单只有 129 行,Agent 主循环和计时器插件的格式一模一样,没有任何零件是焊死的。
第三阶段:开源发布(2026.8.13)
2026 年 8 月 13 日深夜,DeepSeek Harness v0.1.0-rc.1 以 MIT 协议开源。发布首日 GitHub Star 破 3 万,登顶 Hacker News 首页。Hacker News 主贴下有一条高赞评论:"这次它看起来相当原创。"一个长期被指责套壳的公司,第一次在那个社区被承认原创——靠的不是新模型,是一个开源的 Harness。
第四阶段:快速迭代(2026.8.17 - 2026.8.19)
- 8 月 17日 RC.7: 将 Codex 和 Claude Code 的子代理任务接入 Job Panel 统一管理,web_search 支持并发查询。
- 8 月 19日 RC.8: 原生看图能力上线,/goal、/plan 等核心命令支持图文混合输入;Claude Code 和 Codex 作为 Profile Bundle 可按需安装,在 Harness 工作流中当具体任务的执行者;Codex 支持非交互权限模式和多个命名实例;配套 reportDelivery 机制及时回传结果并唤醒等待中的父任务。
竞对的产品,变成了自己的零件。这就是 DeepSeek Harness 的野心——它要当 Agent 时代的"调度层",让所有模型、所有 Agent 工具都跑在自己的运行时之上。
四、核心架构:Cordis 与"一切皆插件"
Cordis 是什么
Cordis 是 DeepSeek Harness 底层的插件元框架,其设计理念发表在论文《A Programming Paradigm for Spatiotemporal Composability》中。Cordis 不关心你怎么实现工具,它只做三件事:
- 插件生命周期管理: 加载、初始化、卸载
- 依赖注入: 插件按依赖顺序启动
- 事件总线: 插件通过服务(service)和类型化事件(typed event)彼此协作
插件卸载时,它的所有注册会被反向撤销,不留孤儿状态。这意味着你可以在运行时热插拔插件,不需要重启整个系统。
"一切皆插件"意味着什么
在 DeepSeek Harness 中,以下所有能力都是插件:
| 能力类别 | 说明 | 可替换性 |
|---|---|---|
| 模型适配器 | 连接不同 LLM 提供商 | 可替换为任意模型 |
| 工具注册表 | 管理模型可调用的工具 | 可扩展任意工具 |
| 技能(Skill) | 给模型注入操作说明与资源 | 可自定义技能包 |
| 会话日志 | 记录所有运行轨迹 | 可更换存储后端 |
| 沙箱 | 隔离执行环境 | 可自定义安全策略 |
| Agent Loop | 主任务循环逻辑 | 可替换推理策略 |
| 调度器 | 子代理任务调度 | 可自定义调度算法 |
| Web UI | 用户界面 | 可自定义主题和功能 |
官方仓库自带 159 个插件包,用户插件与官方插件地位完全平等。这不是比喻——你可以在不碰其他部分的情况下替换推理循环,可以用自己的企业安全边界替换沙箱,可以接入 GPT-4、Claude 或任意开源模型。
插件的核心契约
一个最小的 Harness 插件只需要导出 apply(ctx) 函数:
// 最小插件示例
import type { Context } from '@deepseek-ai/cordis'
export const name = 'my-first-plugin'
export function apply(ctx: Context) {
// 在这里注册能力
ctx.on('ready', () => {
console.log('插件已加载')
})
}
如果插件依赖其他服务,通过 inject 声明:
export const inject = ['tools', 'llm']
export function apply(ctx: Context) {
// ctx.tools 和 ctx.llm 已就绪
}
五、四种运行模式

DeepSeek Harness 提供四种运行模式,适应不同场景:
Standard 模式(标准模式)
完整的编码 Agent,包含文件编辑、Shell、文件和网页搜索、技能、规划、目标、子代理和工作流。这是日常开发的默认模式。
dsh web --mode standard
Code 模式(代码模式)
在 Standard 模式基础上,通过 Code Mode SDK 将工具暴露给模型,使模型能够在一个 TypeScript 程序中组合多步操作。适合需要精细控制工具调用序列的复杂任务。
dsh web --mode code
Minimal 模式(极简模式)
仅保留持久化 Bash 和 str_replace_editor 两个工具的编码 Agent,用于在最小环境中对模型进行基准测试。适合模型评测和性能对比。
dsh web --mode minimal
Creator 模式(创作者模式)
用于创建自定义 Agent 预设,包含所有 Standard 模式能力,加上运行时检查、内存中测试 Cordis 插件、预设编写指导。适合插件开发者和需要自定义运行环境的高级用户。
dsh web --mode creator
六、怎么用:从安装到第一个插件
第一步:环境准备
DeepSeek Harness 基于 Node.js 运行,需要 Node.js 18 及以上版本(推荐 22.19+)。
# 检查 Node.js 版本
node --version
# 如果没有安装,使用 nvm 安装
nvm install 22
nvm use 22
第二步:一行命令启动
最简单的方式是通过 npx 直接运行:
npx @deepseek-ai/dsh web
这条命令会自动下载并启动 DeepSeek Harness 的 Web UI,默认监听 http://127.0.0.1:3080,并自动在浏览器中打开。
如果是 SSH 远程启动,不会自动打开浏览器,只会打印主机 URL。使用 --no-open 参数可以禁止自动打开浏览器。
# 不自动打开浏览器
npx @deepseek-ai/dsh web --no-open
# 指定端口
npx @deepseek-ai/dsh web --port 8080
第三步:全局安装(日常使用推荐)
npm install -g @deepseek-ai/dsh
# 验证安装
dsh --version
# 启动 Web UI
dsh web
第四步:源码构建(开发者/二次定制)
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness
# 启用 corepack 并安装依赖
corepack enable
pnpm install
# 构建
pnpm run build
# 启动
pnpm dsh web
第五步:配置 API Key
首次启动后,在 Web UI 的设置页面配置模型 API Key,或者通过环境变量配置:
# 配置 DeepSeek API Key
export DEEPSEEK_API_KEY="sk-xxxxxxxxxxxxxxxx"
# 配置 OpenAI API Key(可选)
export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxx"
# 启动
dsh web
也可以使用 YAML 配置文件:
# ~/.dsh/config.yaml
models:
default: deepseek-v4-pro
providers:
deepseek:
baseUrl: https://api.deepseek.com
apiKey: sk-xxxxxxxxxxxxxxxx
第六步:开发第一个工具插件

下面我们创建一个 text_stats 工具插件:输入任意文本,返回字符数、非空白字符数、行数和粗略 Token 估算。
创建插件目录:
mkdir -p my-plugin/src
编写插件代码 my-plugin/src/index.ts:
import type { Context } from '@deepseek-ai/cordis'
import { defineTool } from '@deepseek-ai/dsh-tools'
export const name = 'text-stats'
export const inject = ['tools']
export function apply(ctx: Context) {
ctx.tools.register(
defineTool({
name: 'text_stats',
description: 'Count characters and lines, then estimate token usage.',
parameters: {
text: {
type: 'string',
required: true,
description: 'The text to inspect.',
},
charsPerToken: {
type: 'number',
description: 'Positive estimation ratio; defaults to 4.',
},
},
output: {
schema: { type: 'string' },
render: (_args, value) => [{ type: 'text', text: value }],
},
async execute(args) {
const ratio = args.charsPerToken ?? 4
if (!Number.isFinite(ratio) || ratio <= 0) {
throw new Error('charsPerToken must be a positive number.')
}
const characters = [...args.text].length
const nonWhitespace = [...args.text].filter(
(char) => !/\s/u.test(char)
).length
const lines =
args.text.length === 0 ? 0 : args.text.split(/\r?\n/u).length
const estimatedTokens = Math.ceil(characters / ratio)
return JSON.stringify({
characters,
nonWhitespace,
lines,
estimatedTokens,
charsPerToken: ratio,
})
},
})
)
}
这里有四个不能省略的契约:
inject = ['tools']保证工具服务就绪后才执行apply。parameters会在execute前完成基础类型和必填项校验。execute返回值必须符合output.schema;基础设施故障应抛出异常。- 注册与插件 Fiber 绑定;插件卸载或热更新时,工具会自动注销。
创建 Patch 配置文件 my-plugin/cordis.yml:
- insert:
- id: text-stats
name: '/absolute/path/to/my-plugin/src/index.ts'
启动调试:
pnpm dsh web --patch ./my-plugin/cordis.yml
打开 Web UI 后输入:
请必须调用 text_stats,统计下面文本的字符数和行数:
DeepSeek Harness
Everything is a Plugin.
如果模型的调用记录中出现 text_stats,并返回包含 characters、lines 和 estimatedTokens 的 JSON,说明注册、参数校验、执行和渲染链路都已打通。
第七步:封装为 Bundle 并发布
当插件开发完成后,可以封装为 Bundle 分发:
{
"name": "dsh-bundle-text-stats",
"version": "1.0.0",
"dsh": {
"bundle": {
"plugins": ["./src/index.ts"],
"config": {
"defaultCharsPerToken": 4
}
}
}
}
发布到 npm 后,其他用户可以通过 Profile 安装:
dsh profile install dsh-bundle-text-stats
七、企业项目实战

场景一:企业内网代码审查 Agent
某科技公司需要一个能在内网环境中自动审查代码的 Agent,要求:
- 数据不出内网
- 连接公司内部 GitLab
- 审查结果自动提交到代码评审系统
- 所有操作有审计日志
部署架构:
# enterprise-config.yaml
models:
default: internal-deepseek-v3
providers:
internal:
baseUrl: http://model-gateway.internal:8080/v1
apiKey: ${INTERNAL_MODEL_KEY}
plugins:
- id: gitlab-tools
name: '@company/dsh-gitlab-tools'
config:
baseUrl: https://gitlab.internal.com
token: ${GITLAB_TOKEN}
- id: audit-logger
name: '@company/dsh-audit-logger'
config:
endpoint: http://audit.internal:9200
index: dsh-audit
sandbox:
mode: read-only
allowedPaths:
- /workspace/repos
- /tmp/dsh-work
自定义 GitLab 工具插件:
// gitlab-tools/src/index.ts
import type { Context } from '@deepseek-ai/cordis'
import { defineTool } from '@deepseek-ai/dsh-tools'
import axios from 'axios'
export const name = 'gitlab-tools'
export const inject = ['tools']
export function apply(ctx: Context) {
const gitlab = axios.create({
baseURL: ctx.config.gitlab.baseUrl,
headers: { 'PRIVATE-TOKEN': ctx.config.gitlab.token },
})
// 工具1:获取 Merge Request 变更
ctx.tools.register(
defineTool({
name: 'gitlab_get_mr_changes',
description: 'Get the diff changes of a GitLab merge request.',
parameters: {
projectId: { type: 'string', required: true },
mrIid: { type: 'string', required: true },
},
output: { schema: { type: 'string' } },
async execute(args) {
const { data } = await gitlab.get(
`/projects/${args.projectId}/merge_requests/${args.mrIid}/changes`
)
return JSON.stringify(data.changes)
},
})
)
// 工具2:提交代码审查评论
ctx.tools.register(
defineTool({
name: 'gitlab_post_review_comment',
description: 'Post a review comment on a GitLab merge request.',
parameters: {
projectId: { type: 'string', required: true },
mrIid: { type: 'string', required: true },
body: { type: 'string', required: true },
filePath: { type: 'string' },
},
output: { schema: { type: 'string' } },
async execute(args) {
const { data } = await gitlab.post(
`/projects/${args.projectId}/merge_requests/${args.mrIid}/notes`,
{ body: args.body }
)
return JSON.stringify({ id: data.id, url: data.web_url })
},
})
)
}
使用方式:
# 启动企业版 Agent
dsh web --config enterprise-config.yaml
# 在 Web UI 中输入:
# 请审查 projectId=123 的 MR !45,重点关注安全性和性能问题,
# 将审查意见通过 gitlab_post_review_comment 提交到对应文件。
场景二:多模型对比测试平台
某 AI 团队需要同时用多个模型执行同一组任务,对比输出质量和成本。
// multi-model-benchmark.ts
import type { Context } from '@deepseek-ai/cordis'
export const name = 'multi-model-benchmark'
export const inject = ['llm', 'session']
export function apply(ctx: Context) {
ctx.commands.register('benchmark', {
description: 'Run a task across multiple models and compare results.',
async execute(args: { task: string; models: string[] }) {
const results = []
for (const model of args.models) {
const start = Date.now()
const output = await ctx.llm.complete({
model,
messages: [{ role: 'user', content: args.task }],
})
const duration = Date.now() - start
results.push({
model,
output: output.content,
durationMs: duration,
tokens: output.usage,
})
}
return JSON.stringify(results, null, 2)
},
})
}
# 运行对比测试
dsh run benchmark --task "实现一个快速排序算法" --models "deepseek-v4-pro,claude-sonnet-4,gpt-4o"
场景三:自动化日报生成 Agent
某团队需要每天自动收集 Git 提交记录、CI/CD 状态、项目进度,生成日报并发送到飞书群。
// daily-report-agent/src/index.ts
import type { Context } from '@deepseek-ai/cordis'
import { defineTool } from '@deepseek-ai/dsh-tools'
export const name = 'daily-report'
export const inject = ['tools', 'scheduler', 'llm']
export function apply(ctx: Context) {
// 飞书消息发送工具
ctx.tools.register(
defineTool({
name: 'feishu_send_message',
description: 'Send a message to a Feishu group.',
parameters: {
webhookUrl: { type: 'string', required: true },
content: { type: 'string', required: true },
},
output: { schema: { type: 'string' } },
async execute(args) {
const res = await fetch(args.webhookUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
msg_type: 'text',
content: { text: args.content },
}),
})
return JSON.stringify({ status: res.status })
},
})
)
// 定时任务:每天 18:00 生成日报
ctx.scheduler.register('daily-report-cron', {
cron: '0 18 * * 1-5',
async run() {
const gitLog = await ctx.tools.call('shell_exec', {
command: 'git log --since="1 day ago" --pretty=format:"%h %s"',
})
const report = await ctx.llm.complete({
messages: [
{
role: 'system',
content: '你是一个项目日报生成器,根据Git提交记录生成简洁的日报。',
},
{ role: 'user', content: `今日Git提交记录:\n${gitLog}` },
],
})
await ctx.tools.call('feishu_send_message', {
webhookUrl: process.env.FEISHU_WEBHOOK,
content: report.content,
})
},
})
}
八、竞品对比

| 对比维度 | DeepSeek Harness | Claude Code | Codex CLI | OpenHands |
|---|---|---|---|---|
| 开源协议 | MIT | 闭源 | 闭源 | MIT |
| 模型绑定 | 任意模型(可插拔适配器) | 仅 Claude 系列 | 仅 OpenAI 系列 | 任意模型 |
| 插件架构 | 一切皆插件(含 Agent Loop) | MCP 扩展 | MCP 扩展 | 技能扩展 |
| 可观测性 | 完整追加式轨迹日志,支持分叉/重放 | 托管转录记录 | 托管转录记录 | 有限 |
| 企业离线部署 | 支持,100% 内网运行 | 不支持 | 不支持 | 支持 |
| 子代理调度 | 原生支持,可收编 Claude Code/Codex | 有限 | 有限 | 有限 |
| 运行模式 | 四种(Standard/Code/Minimal/Creator) | 单一 | 单一 | 单一 |
| 自定义 UI | 可替换(UI 是插件) | 固定 | 固定 | 固定 |
| 当前状态 | 开发者预览(v0.1.0-rc.8) | 正式版 | 正式版 | 正式版 |
| 内置工具数 | 53+ 个文档化工具 | 精选集 + MCP | 精选集 + MCP | 基础工具集 |
| 默认沙箱 | read-only(故障安全) | 权限提示 | 权限提示 | 容器隔离 |
| 社区生态 | 爆发式增长(一周 16 万 Star) | 成熟 | 成熟 | 中等 |
各产品适用场景
- DeepSeek Harness: 需要深度定制运行时、多模型混用、企业内网部署、插件生态建设的团队。如果你想把 Agent 运行时本身作为产品来做,dsh 是目前唯一的选择。
- Claude Code: 个人开发者在现有代码库中进行交互式编码,追求开箱即用和 Claude 模型的高质量输出。文档成熟、生态完善,但绑定 Anthropic 模型。
- Codex CLI: OpenAI 生态用户,适合可并行化、自包含的任务,偏好 PR 审查工作流而非直接文件修改。
- OpenHands: 开源社区驱动的 Agent 平台,适合需要基础开源方案但不需要深度插件定制的场景。
关键差异总结
DeepSeek Harness 的插件体系是结构性的——连 Agent Loop 和会话日志都是插件,其他框架的插件是功能性的——在固定核心上扩展功能。这个差异决定了:如果你需要一个可以深度定制的 Agent 平台底座,dsh 是唯一选择;如果你只是需要一个能写代码的工具,Claude Code 和 Codex 目前更成熟。
九、常用场景
场景 1:全栈开发助手
使用 Standard 模式,让 Agent 帮你创建项目、编写代码、运行测试、修复 Bug。支持文件编辑、Shell 执行、网页搜索、代码规划等完整工具集。
dsh web --mode standard
# 输入:帮我在当前目录创建一个 NestJS + Vue3 的全栈项目,
# 包含用户登录注册功能,使用 PostgreSQL 数据库。
场景 2:模型基准测试
使用 Minimal 模式,在最小工具环境中对不同模型进行编码能力基准测试,排除工具差异对结果的干扰。
dsh web --mode minimal
# 输入:请实现一个支持并发请求的 HTTP 客户端,要求连接池管理、超时重试、请求取消。
场景 3:复杂工作流编排
使用 Code 模式,让模型生成 TypeScript 代码来编排多轮工具调用,实现精细控制的复杂工作流。
dsh web --mode code
# 输入:编写一个工作流:1) 克隆仓库 2) 运行测试 3) 如果测试失败,
# 分析错误日志并修复 4) 重新运行测试 5) 生成修复报告。
场景 4:自定义 Agent 预设开发
使用 Creator 模式,在运行时检查当前环境、实验 Cordis 插件、组合自定义运行模式。
dsh web --mode creator
# 输入:检查当前加载的所有插件,创建一个只包含数据库查询和文件分析工具的自定义预设。
场景 5:多 Agent 协作
利用子代理调度能力,将 Claude Code 和 Codex 作为子代理收编到 Harness 中,各司其职。
# multi-agent-profile.yaml
bundles:
- name: claude-code-subagent
version: latest
- name: codex-subagent
version: latest
config:
instances:
- name: codex-frontend
model: gpt-4o
- name: codex-backend
model: gpt-4o
dsh web --profile multi-agent
# 输入:开发一个全栈应用。前端任务交给 codex-frontend,
# 后端任务交给 codex-backend,架构设计由主 Agent 协调。
十、面试官高频面试题
题目 1:DeepSeek Harness 和传统 Agent 框架(如 LangChain)有什么本质区别?
参考答案:
传统 Agent 框架(如 LangChain)是"库"的思路——你调用它的 API 来组装 Agent,核心逻辑在你的代码里,框架提供的是工具函数和抽象类。DeepSeek Harness 是"运行时"的思路——它本身就是一个完整的 Agent 执行环境,所有能力以插件形式挂载到 Cordis 微内核上,通过配置组合而非代码调用来组装 Agent。
最本质的区别在于可组合性的粒度:LangChain 你可以换 Chain、换 Memory,但 Agent 的主循环、工具调用协议、会话管理是框架定死的;而在 Harness 中,连 Agent Loop、会话日志、沙箱策略都是可替换的插件。这使得 Harness 适合作为企业级 Agent 平台的底座,而 LangChain 更适合快速原型开发。
题目 2:解释一下 Cordis 的"时空可组合性"是什么意思?
参考答案:
Cordis 的设计论文《A Programming Paradigm for Spatiotemporal Composability》提出了两个维度的可组合性:
- 空间可组合性(Spatial): 指在同一时刻,多个插件可以在共享上下文中并存,通过服务依赖和事件总线协作。插件之间没有硬编码的直接调用,而是通过内核提供的服务发现机制解耦。这意味着你可以在运行时添加或移除插件,不需要修改其他插件的代码。
- 时间可组合性(Temporal): 指插件的生命周期是可管理的——加载、初始化、卸载都有明确的时序。插件卸载时,它的所有注册(工具、事件监听、服务)会被反向撤销,不留孤儿状态。这使得插件可以在运行时热插拔、热更新,系统状态始终保持一致。
简单来说,空间可组合性解决"插件之间怎么共存"的问题,时间可组合性解决"插件怎么安全地来和走"的问题。
题目 3:DeepSeek Harness 的"一切皆插件"有什么优缺点?
参考答案:
优点:
- 极致的灵活性——任何能力都可以替换,从模型到 UI 没有任何焊死的零件。
- 独立演进——插件之间解耦,官方插件和社区插件可以独立开发、独立发布、独立版本管理。
- 企业友好——可以用自定义插件替换沙箱、权限、审计等安全相关组件,满足企业合规要求。
- 生态可扩展——第三方开发者可以开发插件、Bundle、Profile,形成完整的生态系统。
缺点:
- 复杂性高——插件之间的依赖关系和事件流比单体架构更难理解和调试。
- 兼容性风险——大量开发者自由定制后,插件之间的兼容性可能出问题,生态碎片化是这个路线自带的风险。
- 性能开销——插件通过服务发现和事件总线通信,相比直接函数调用有一定的性能开销。
- 文档滞后——当前处于开发者预览版,每天几百次提交,文档和最佳实践还在快速变化中。
题目 4:如何在企业环境中安全地部署 DeepSeek Harness?
参考答案:
企业安全部署需要关注以下几个层面:
-
网络隔离: 将 Harness 部署在企业内网,模型 API 端点指向内部模型网关,所有数据不出域。禁止直接访问外部 API,必要时通过企业代理白名单访问。
-
沙箱隔离: 使用 read-only 模式作为默认沙箱策略,明确指定允许写入的目录。对于需要执行命令的场景,使用容器化沙箱(如 Docker 或 Landlock)限制系统调用。
-
权限控制: 开发自定义 RBAC 插件,按角色限制可使用的工具和可访问的资源。敏感操作(如删除文件、执行系统命令)需要人工审批。
-
审计日志: 利用 Harness 的追加式会话日志,将所有操作(工具调用、文件修改、命令执行)同步到企业审计系统(如 ELK、Splunk),支持事后追溯和合规审查。
-
插件治理: 建立企业内部插件仓库,对第三方插件进行安全审查后才能使用。禁止直接从公共 npm 安装未审核的插件。
-
数据加密: 会话存储使用加密数据库,API Key 使用企业密钥管理服务(KMS)管理,不硬编码在配置文件中。
题目 5:DeepSeek Harness 如何实现子代理调度?它和多 Agent 框架有什么不同?
参考答案:
DeepSeek Harness 的子代理调度是通过插件化的调度器实现的。主 Agent 可以将任务分解后分配给子代理执行,子代理可以是 Harness 自身的另一个 Agent 实例,也可以是外部 Agent 工具(如 Claude Code、Codex)通过 Profile Bundle 包装后接入。
调度机制的核心是 reportDelivery——子代理完成任务后及时回传结果并唤醒等待中的父任务,多 Agent 协作不需要干等。Codex 还支持非交互权限模式和多个命名实例,一个任务里可以同时挂好几个 Codex 干不同的活。
和传统多 Agent 框架(如 AutoGen、CrewAI)的不同在于:
- 传统多 Agent 框架的 Agent 都是框架内部定义的,而 Harness 可以收编外部的闭源 Agent 工具作为子代理。
- 传统框架的调度逻辑是框架定死的,而 Harness 的调度器本身是插件,可以自定义调度策略。
- Harness 的子代理共享同一个会话日志和轨迹系统,所有子代理的执行过程统一可追溯,而传统框架的 Agent 之间状态隔离,追溯困难。
题目 6:DeepSeek Harness 当前处于开发者预览版,生产环境使用有哪些风险?
参考答案:
-
破坏性变更: 官方明确警告"THERE WILL BE COMPATIBILITY-BREAKING CHANGES",插件 API、配置格式、数据结构都可能在后续版本中不兼容。RC.8 就有 SQLite 数据结构的不兼容变更,升级前需要备份数据。
-
文档滞后: 每天几百次提交的仓库,文档和实际代码之间存在差距。很多功能没有文档,需要读源码理解。
-
生态不成熟: 虽然 Star 数增长很快,但插件生态还在早期,很多企业需要的插件(如数据库工具、CI/CD 集成、监控告警)还需要自己开发。
-
遥测问题: 有开发者发现跑起来后本机会生成 UUID 随每次请求发送,遥测开关并不影响它。企业环境需要注意数据泄露风险。
-
稳定性: 开发者预览版意味着可能存在未发现的 Bug,长时间运行的稳定性没有经过生产环境验证。
建议: 生产环境可以在非关键业务中试点使用,锁定具体版本号,做好数据备份和回滚方案。等正式版发布后再大规模推广。
十一、总结与展望
DeepSeek Harness 是 Agent 领域的一个标志性项目。它不是又一个"套壳"的 AI 编程工具,而是一套从底层设计上就追求极致可组合性的 Agent 运行时。"一切皆插件"不是营销口号,而是真正落到了代码层面——连 Agent 主循环和会话日志都是可替换的插件。
它的出现填补了市场上的一个空白:企业级、开源、模型无关、深度可定制的 Agent 平台底座。在它之前,你要么用闭源的 Claude Code/Codex(绑模型、不能定制、数据出域),要么用 LangChain 这类库(需要自己写大量工程代码、没有运行时)。DeepSeek Harness 给了第三条路:一个可以装进企业内网、按企业规则运行、自由扩展能力的 Agent 运行时。
当然,它还很年轻。开发者预览版意味着破坏性变更、文档滞后、生态不成熟。但它的发展速度令人瞩目——64 天 12293 次提交、一周 16 万 Star、两天一个 RC 版本。如果这个节奏能保持,"我该用哪套 Harness 把 Claude Code、Codex、DeepSeek 一起用起来"这个问题,答案的天平会一天天倾斜。
Agent 时代的入口之争,这才刚开打。而 DeepSeek Harness,已经站在了牌桌上。
转载声明:本文为原创文章,如需转载,请联系作者获得授权,并注明出处。
更多推荐


所有评论(0)