DeepSeek Harness 开源项目深度介绍

1. What:这是什么项目

项目定位

DeepSeek Harness(简称 dsh)是由 DeepSeek AI 开发的开源智能体框架(Agent Harness),项目仓库位于 github.com/deepseek-ai/deepseek-harness,采用 MIT 许可证开源。

其核心定位是:一个以"一切皆插件"为架构原则的 AI Agent 运行时框架。它不是单一编码助手,而是一个可组装、可替换、可扩展的智能体基础设施,用于构建各类 LLM 驱动的自主任务执行系统。

框架底层由 Cordis 插件框架驱动,Cordis 的设计理念参见论文《A Programming Paradigm for Spatiotemporal Composability》。

核心能力与主要特性

  • 全插件架构:模型适配器、工具注册表、会话日志、Agent 循环本身均为插件,所有组件均可通过配置替换,不存在特权核心。
  • 多模型适配:内置 DeepSeek 模型适配器(支持 deepseek-v4-pro / deepseek-v4-flash),支持 OpenAI 兼容端点扩展,可配置多模型路由。
  • 工具执行管道:结构化的工具调用流水线,支持前置策略拦截、沙箱守卫、审批流程、超时重试、结果规范化、后置处理等完整链路。
  • 会话持久化:追加写入的 SessionEvent 日志模型,支持会话分叉(fork)、恢复(resume)、上下文压缩(compaction)和回放重放。
  • 子代理委托:支持 spawn(全新子会话)和 fork(继承历史分叉)两种子代理模式,支持后台任务和工作流编排。
  • 沙箱安全策略:文件系统写入隔离、进程执行限制、审批策略分级(workspace-write / read-only / danger-full-access)。
  • Web UI 与无头模式:内置浏览器交互界面(默认端口 3080),也支持 headless 一次性任务执行和 ACP(Agent Client Protocol)自动化服务。
  • ** Capability Seam 设计**:每个能力由三角色构成——Service Definition(接口声明)、Service Provider(实现)、Consumer(消费方),角色可独立演进。
  • 跨平台支持:POSIX 系统提供 bash 沙箱执行链,Windows 系统通过 ACL 受限令牌实现等价安全策略。
  • Python SDK:提供 Python SDK 和捆绑运行时,支持通过 Python 调用框架能力。

适用场景

  • 编码助手平台搭建:构建可读写文件、执行命令、运行测试的 AI 编码智能体。
  • 自动化任务编排:通过子代理委托和工作流引擎实现多步骤、多代理协作的复杂任务自动化。
  • LLM 应用基础设施:作为底层运行时,为上层 LLM 应用提供会话管理、工具调用、安全沙箱等基础设施。
  • Agent 协议对接:通过 ACP(Agent Client Protocol)JSON-RPC 接口,将 Agent 能力暴露为标准化服务。
  • 插件生态开发:开发自定义工具、模型适配器、能力提供者,扩展框架功能边界。

2. Why:为什么选择这个项目

现存痛点与诞生背景

当前 AI Agent 领域面临几个核心痛点:

  1. 框架耦合严重:多数 Agent 框架将模型调用、工具执行、会话管理硬编码在核心循环中,扩展新能力需要修改框架本体,维护成本高。
  2. 能力替换困难:切换模型提供商、更换沙箱策略、替换文件系统实现时,往往需要 fork 框架或编写大量适配代码。
  3. 会话状态管理粗放:缺乏精确的会话事件日志,难以实现可靠的回放、分叉、上下文压缩等关键操作。
  4. 安全边界模糊:工具执行缺乏统一的安全策略管道,沙箱隔离与审批流程实现各自为政。
  5. 多代理协作缺乏基础设施:子代理委托、工作流编排等能力需要开发者从零构建。

DeepSeek Harness 正是为解决这些问题而生:通过 Cordis 插件框架的"一切皆插件"理念,将每个能力拆解为可独立替换的插件单元,同时提供完整的工具执行管道、会话日志模型和安全沙箱策略。

项目优势与差异点

对比维度DeepSeek HarnessLangChainAutoGPTClaude Code
架构模式全插件架构,无特权核心链式调用,模块化单体应用封闭产品
能力替换配置文件替换,零代码修改需要编写适配代码修改源码不支持
会话模型追加写入事件日志,可回放分叉内存状态为主简单持久化封闭
安全策略结构化沙箱管道,分级审批无内置安全策略内置但封闭
插件开发Cordis 标准化插件协议自由格式无标准不支持
子代理spawn/fork 双模式需自行实现
开源协议MITMITMIT闭源

核心差异点:

  • Registration as Effect:所有注册(工具、提示段落、适配器、监听器)都是可逆副作用,插件卸载时自动回滚,保证干净的运行时状态。
  • Typed Events:通过 TypeScript 声明合并定义类型化事件,支持 emit / waterfall / parallel / serial 四种分发模式,事件契约即文档。
  • Capability Seam:每个能力由 Service Definition / Provider / Consumer 三角色构成完整链路,一个 Provider 替换即可改变整条能力链。
  • Model-Visible ⟺ Logged:任何到达模型请求的内容都必须可从会话日志重建,运行时不变量强制保证。

适合人群与不适合场景

适合:

  • 需要构建可定制 AI Agent 平台的工程团队
  • 对插件化架构和可组合性有要求的 LLM 应用开发者
  • 需要精确控制工具执行安全策略的场景
  • 希望基于 DeepSeek 模型构建 Agent 能力的开发者

不适合:

  • 只需简单 LLM 问答、不需要工具调用的场景(过重)
  • 对 TypeScript / Node.js 技术栈不熟悉的团队(框架基于 Node.js 22+ / TypeScript 6)
  • 需要生产级稳定性的场景(项目目前处于 Developer Preview 阶段,明确声明会有破坏性变更)
  • 需要接受外部 PR 贡献的开源协作者(项目当前不接受外部 Pull Request)

3. How:核心工作原理

DeepSeek Harness 的运行时由 Cordis 插件框架驱动,其核心工作原理可以归纳为以下几个层次:

插件与上下文

框架启动时,根据 Profile(配置组合)加载有序的 Bundle 层,构建插件树。每个插件是一个实现 Service 接口的对象,通过 apply(ctx) 方法挂载到共享上下文(Context)。插件通过 inject 声明依赖的服务键(如 ctx.toolsctx.llm),框架按服务依赖关系自动排序加载,无需手动编排启动顺序。

事件驱动通信

插件间通信通过类型化事件完成。事件分为四种分发模式:

  • emit:观察型广播,监听者依次接收,无返回值。
  • waterfall:环绕中间件,监听者通过 next() 委托给下一个,可拦截或包装结果。
  • parallel:并行通知所有监听者。
  • serial:串行有序执行,有返回值。

分发模式是事件公共契约的一部分,在生成的目录中通过 @mode 标签声明并校验。

Agent 循环

Agent 的核心执行流程分为 Turn(轮次)和 Step(步骤)两个层级:

  • Turn:一次输入消费周期,从获取第一条输入开始,到模型和工具都停止或策略干预时结束。
  • Step:一次模型请求加其引发的工具调用,一个 Turn 包含零或多个 Step。

执行流程:用户输入 → turn/start → 声明待处理输入 → agent/pre-step(waterfall,可拒绝或改写)→ step/start → 组装系统提示和工具 schema → agent/requestllm/stream(模型流式响应)→ assistant/chunk*assistant/messagetool/call* → 工具执行管道 → tool/result*step/end → 判断是否需要下一步 → turn/end

工具执行管道

工具调用经过结构化流水线:tools/pre-execute(前置策略、权限、沙箱)→ 单调守卫(deny/abstain)→ ctx.approval(一次性审批提示)→ tools/execute(超时、重试、指标)→ 工具执行体 → 文件系统守卫 → tools/post-execute(接受/阻止/替换/追加上下文)→ 结果规范化 → finalizeContenttools/result(不可变结果通知)。

会话日志

会话日志是模型可见内容的唯一真相来源。deriveMessages() 从日志事件投影出模型历史。所有模型可见内容必须被记录(Model-Visible ⟺ Logged),这是运行时不变量强制保证的。分叉、恢复、压缩、遥测都从此事件流派生。


4. 总体架构

持久化层

工具消费层

能力提供者层

Cordis 插件上下文 (Context)

前端与协议层

dsh-web-app
Web UI 服务
端口 3080

dsh-headless
无头一次性执行

dsh-acp-demo
ACP JSON-RPC 服务

Python SDK

Profile 配置组合层

dsh-base Bundle
模型适配器 / 工具 / 持久化 / 沙箱 / 策略

Mode Bundle
dsh-web-app / dsh-headless

用户 cordis.patch.yml

ctx.llm
LLM 适配器
模型流式调用

ctx.tools
工具注册表
执行管道

ctx.sessions
会话事件日志
追加写入存储

ctx.agents
Agent 注册表
活跃代理管理

ctx.agentLoop
默认驱动器
Turn/Step 循环

ctx.systemPrompt
提示段落组装
工具 Schema 汇编

ctx.fs
文件系统能力
读写策略

ctx.shell
Shell 执行能力
bash/pwsh

ctx.sandbox
沙箱策略
进程隔离

ctx.subagent
子代理能力
spawn/fork

ctx.approval
审批服务
交互策略

dsh-llm-deepseek
DeepSeek 模型适配器

dsh-bash-sandbox
本地 Bash 执行器

dsh-fs-sandbox
文件系统沙箱

dsh-sandbox-local
本地沙箱策略

dsh-subagent-spawn-in-process
spawn 子代理

dsh-subagent-fork-in-process
fork 子代理

dsh-tool-bash
Bash 工具

dsh-tool-fs
文件工具

dsh-tool-subagent
子代理委托工具

dsh-tool-todo
待办工具

dsh-tool-workflow
工作流工具

dsh-tool-ralph
Ralph 循环工具

dsh-session-persistence-jsonl
JSONL 事件日志

dsh-compaction-basic
上下文压缩

dsh-session-projection
会话投影

核心组件解析

ctx.llm(LLM 适配器)
模型调用抽象层。定义消息词汇表和流式响应接口,插件通过注册适配器接入不同模型提供商。内置 dsh-llm-deepseek 适配器支持 DeepSeek 系列模型,支持 thinking 模式和 reasoningEffort 调节。agent/requestllm/stream 两个 waterfall 事件允许插件拦截和包装模型请求与响应。

ctx.tools(工具注册表与执行管道)
管理所有模型可见工具的注册、schema 汇编和执行。工具注册时声明执行模式(并行/屏障)、UI 渲染意图(generic/terminal/diff)。执行管道串联 pre-execute → 守卫 → 审批 → execute → post-execute → finalize → result 全链路,每个环节可被插件拦截或增强。

ctx.sessions(会话事件日志)
追加写入的事件日志存储,是整个系统的真相来源。SessionEvent 包含 user/message、assistant/chunk、assistant/message、tool/call、tool/result、turn/start、turn/end、step/start、step/end 等类型。deriveMessages() 从日志投影模型历史,保证回放一致性。支持 zstd 压缩存储。

ctx.agentLoop(Agent 驱动器)
实现 Agent 接口的默认驱动器,执行 Turn/Step 循环。通过 agent/pre-step waterfall 决定模型可见内容,agent/turn-stopping serial 事件提供终止检查点。支持输入队列、上下文注入、目标轮次(goal round)等机制。

ctx.systemPrompt(系统提示组装)
负责在每次 Step 前组装系统提示段落和工具 schema。插件通过注册提示段落贡献者(prompt section contributor)向系统提示注入内容,工具 schema 在组装时自动汇总已注册工具。

ctx.fs / ctx.shell / ctx.sandbox(执行能力三件套)
文件系统、Shell 执行和沙箱策略构成工具执行的物理能力层。三者共享同一沙箱策略:workspace-write 限制写入到工作区和临时目录,read-only 禁止写入,danger-full-access 放开限制。文件系统守卫在 fs/write-intentfs/edit-intent 事件上实施写前检查。

ctx.subagent(子代理能力)
提供 spawn(全新子会话)和 fork(继承已完成历史分叉)两种子代理模式。spawn 模式子代理不继承父会话上下文,通过共享工作区和结构化报告(Ralph handoff)传递状态。fork 模式继承会话历史,适合延续性任务。

ctx.approval(审批服务)
工具执行前的交互式审批机制。在 tools/pre-execute 之后、单调守卫之前触发,支持 one-shot 审批提示。策略可配置为 never(不审批)或 ask(逐次询问)。

数据流转流程

  1. 用户输入 → 进入 Agent inbox 队列
  2. Turn 启动 → 驱动器声明待处理输入,触发 turn/start 事件
  3. Pre-step 拦截agent/pre-step waterfall 链处理,可拒绝或改写消息
  4. Step 启动 → 写入 user/message 事件,组装系统提示和工具 schema
  5. 模型请求agent/requestllm/stream waterfall → 模型流式响应 → assistant/chunk*assistant/message 事件
  6. 工具调用 → 模型响应中包含 tool-call → tool/call 事件 → 工具执行管道 → tool/result 事件
  7. Step 结束 → 判断是否需要下一步(工具欠请求 or 新输入到达)
  8. Turn 结束turn/end 事件 → Agent 状态转为 idle
  9. 持久化 → 全程事件写入 JSONL 日志,支持回放、分叉、压缩

5. 部署与安装

前置环境要求

依赖版本要求说明
Node.js^22.19.0 或 >=24.0.0CI 覆盖 22.19、24、26 版本
pnpm11.7.0通过 Corepack 启用:corepack enable
Git>=2.26支持 worktree 特定配置扩展
DEEPSEEK_API_KEY可选Web UI、headless、ACP demo 和真实 API e2e 测试需要

方式一:通过 npx 快速启动(推荐新手)

# 安装 Node.js 22+ 后直接运行,无需克隆源码
npx @deepseek-ai/dsh web

# 该命令会自动安装并启动 Web UI,默认地址 http://127.0.0.1:3080
# 首次启动后在 Settings → Models 中配置 DeepSeek API Key

方式二:从源码构建运行

# 1. 克隆仓库
git clone https://github.com/deepseek-ai/deepseek-harness.git
cd deepseek-harness

# 2. 启用 Corepack 并安装依赖
corepack enable
pnpm install
# postinstall 会自动配置 Lefthook Git hooks

# 3. 构建项目(tsc 类型检查 → tsdown 打包 → Web 前端构建)
pnpm run build

# 4. 启动 Web UI
pnpm dsh web
# 默认地址 http://127.0.0.1:3080

# 5. 启动 Headless 一次性任务(需要 API Key)
export DEEPSEEK_API_KEY=sk-your-key-here
pnpm dsh --profile headless "summarize this workspace"

# 6. 启动 ACP 自动化服务(需要 API Key)
pnpm run demo:acp

方式三:开发模式

# 克隆并安装依赖后,运行类型检查确认环境就绪
pnpm run typecheck

# 开发模式启动 Web UI(热更新)
pnpm run dev:web

# 运行单元测试
pnpm run test

# 运行覆盖率测试(CI 标准:每个文件 100%)
pnpm run test:coverage

# 运行 e2e 测试(需要 DEEPSEEK_API_KEY,无 Key 自动跳过)
pnpm run test:e2e

# 代码检查
pnpm run lint

# 完整检查套件
pnpm run check:all

方式四:Python SDK

# 参考 docs/user/guide/python-sdk.md 安装 Python SDK
# 项目包含 python/ 目录,提供 Python SDK 和捆绑运行时
cd python/
# 具体安装步骤参见 python/README.md

环境变量配置

# 必需:DeepSeek API Key(Web/headless/ACP demo 使用)
export DEEPSEEK_API_KEY=sk-your-key-here

# 可选:自定义 API 端点(默认为官方 API)
export DEEPSEEK_BASE_URL=https://api.deepseek.com

# 可选:权限模式覆盖(默认 workspace-write)
export DSH_PERMISSION_MODE=danger-full-access

# 也可在仓库根目录创建 .env 文件(已被 .gitignore 忽略)
# .env 内容示例:
# DEEPSEEK_API_KEY=sk-your-key-here
# DEEPSEEK_BASE_URL=https://api.deepseek.com

部署后验证

# 1. 验证 Web UI 启动:浏览器访问 http://127.0.0.1:3080
#    应看到会话界面,进入 Settings → Models 配置 API Key

# 2. 验证 Headless 模式:
pnpm dsh --profile headless "echo hello"
# 应输出模型对任务的响应

# 3. 验证构建完整性:
pnpm run typecheck  # TypeScript 类型检查通过
pnpm run build      # 完整构建通过

# 4. 查看实际加载的插件树:
pnpm dsh --profile web --dump-config
# 输出当前 profile 组合的所有插件行及其配置

6. 快速上手使用实战

实战一:Web UI 编码助手

# 启动 Web UI
npx @deepseek-ai/dsh web

启动后操作步骤:

  1. 打开浏览器访问 http://127.0.0.1:3080
  2. 进入 Settings → Models,输入 DeepSeek API Key 并保存
  3. 点击 Choose workspace,添加并选择你的项目目录
  4. 新建会话,输入任务指令,例如:

    总结这个仓库并识别主要包结构

Agent 将能够读写工作区文件、执行命令、运行测试、委托子任务,在需要审批的操作前会询问用户。

实战二:Headless 一次性任务

# 设置 API Key
export DEEPSEEK_API_KEY=sk-your-key-here

# 在项目目录中执行一次性编码任务
pnpm dsh --profile headless "read package.json and list all workspace packages"

# 输出直接打印到 stdout,适合脚本集成

实战三:ACP 自动化服务

ACP(Agent Client Protocol)通过 JSON-RPC stdio 暴露 Agent 能力,适合与编辑器或 CI 集成。

# 启动 ACP 服务
pnpm run demo:acp

# 服务通过 stdio 接收 JSON-RPC 请求,创建并管理 Agent 会话

关键配置文件示例

Profile 配置(cordis.yml)

以下是一个完整的 headless agent 配置示例(基于 examples/headless-agent/cordis.yml):

# DeepSeek 模型适配器配置
- id: llm-deepseek
  name: '@deepseek-ai/dsh-llm-deepseek'
  config:
    thinking: enabled          # 启用思考模式
    reasoningEffort: max       # 推理强度:max
    models:
      - id: deepseek-v4-pro
        contextWindow: 128000
      - id: deepseek-v4-flash
        contextWindow: 128000

# 子进程管理(bash 执行器底层依赖)
- id: subprocess
  name: '@deepseek-ai/dsh-subprocess-local'

# Bash 执行器
- id: bash
  name: '@deepseek-ai/dsh-bash-local'
  config:
    timeoutMs: 60000           # 命令超时 60 秒

# Agent 骨架配置
- id: agent-spine
  name: '@deepseek-ai/dsh-agent-spine-demo'
  config:
    agents:
      - id: main
        provider: deepseek-official
        model: deepseek-v4-flash
        cwd: !!js process.cwd()
    workspaceContext:
      maxBytes: 65536           # 工作区上下文最大 64KB
    persona: |
      You are a coding assistant powered by the {{model}} model.
      Verify your work by running the code or tests. Keep answers brief.

# 会话持久化
- id: persistence
  name: '@deepseek-ai/dsh-session-persistence-jsonl'
  config:
    root: './.sessions'
    compression: zstd           # zstd 压缩存储

# 上下文压缩
- id: compaction-basic
  name: '@deepseek-ai/dsh-compaction-basic'
  config:
    thresholdRatio: 0.8         # 上下文窗口使用达 80% 触发压缩
    retainRatio: 0.16           # 保留最近 16% 内容
    maxTokens: 8192             # 压缩摘要最大 token 数
    compactionRetries: 1        # 压缩失败重试次数

# 子代理能力
- id: subagent
  name: '@deepseek-ai/dsh-subagent'
- id: subagent-spawn-in-process
  name: '@deepseek-ai/dsh-subagent-spawn-in-process'
  config:
    providerName: spawn

# 子代理委托工具
- id: tool-subagent
  name: '@deepseek-ai/dsh-tool-subagent'
  config:
    provider: spawn
    toolName: subagent
    backgroundMode: continuable  # 可继续的后台子代理
    maxDepth: 1                  # 最大委托深度

# 文件系统
- id: fs-local
  name: '@deepseek-ai/dsh-fs-local'
  config:
    cwd: !!js process.cwd()

- id: fs-observation-policy
  name: '@deepseek-ai/dsh-fs-observation-policy'

- id: tool-fs
  name: '@deepseek-ai/dsh-tool-fs'

常用命令

# 查看当前 profile 的插件组合树
pnpm dsh --profile web --dump-config

# 运行自引用 Cordis demo(Agent 可检查和修改自己的运行时插件)
pnpm run demo:cordis

# 运行 mock LLM 服务器(测试用)
pnpm run mock:llm

# 生成文档站点
pnpm run docs:build

# 清理构建产物
pnpm run clean

常见踩坑点

  1. Node.js 版本不匹配:框架要求 Node.js 22.19+ 或 24+,使用 Node 20 或更低版本会报错。通过 node --version 确认。

  2. pnpm 版本错误:仓库锁定 pnpm@11.7.0,未通过 Corepack 启用可能导致版本不一致。运行 corepack enable 后再 pnpm install

  3. API Key 未配置:Web UI 启动后如果未在 Settings → Models 中配置 Key,模型请求会失败。Headless 模式需要设置 DEEPSEEK_API_KEY 环境变量或根目录 .env 文件。

  4. 沙箱权限不足:默认 workspace-write 模式限制写入到工作区目录,如果 Agent 需要操作工作区外文件会收到 [sandbox: file access denied] 错误。这是策略行为而非 bug,可通过 DSH_PERMISSION_MODE 环境变量调整。

  5. Windows 平台 bash 不可用:bash 执行链在 Windows 上自动禁用(disabled: !!js process.platform === 'win32'),改用 pwsh 执行链。如需在 Windows 上使用 bash,需在 profile patch 中同时禁用 pwsh 行和启用 bash 行。

  6. 插件冲突:同时挂载 dsh-fs-localdsh-fs-sandbox 会因 ctx.fs 重复注册导致加载失败。框架设计为 fail-loud,会在启动时报错而非静默降级。

  7. 会话格式不兼容:项目处于 Developer Preview 阶段,SESSION_FORMAT_VERSION 保持为 0,不承诺向后兼容。升级版本后旧的会话日志可能无法加载。

  8. cordis.yml 中的 !!js 语法:仅 config 字段和 disabled 字段支持 !!js 表达式插值,其他元数据保持字面量。条件组合应使用 overlay 而非在非支持字段中使用表达式。


7. 总结与展望

项目价值总结

DeepSeek Harness 的核心价值在于提出了一种全插件化的 AI Agent 运行时范式

  • 架构层面:通过 Cordis 框架的 Service/Context/Event 模型,将 Agent 的每个能力拆解为可独立替换的插件单元,消除了传统框架中的核心耦合问题。
  • 工程层面:结构化的工具执行管道、追加写入的会话事件日志、分级沙箱策略、类型化事件契约等设计,为构建生产级 Agent 系统提供了扎实的工程基础。
  • 生态层面:Capability Seam 的三角色设计(Definition / Provider / Consumer)为插件生态提供了清晰的扩展契约,社区开发者可以针对任一角色贡献实现。

项目当前版本为 0.1.0-rc.5,处于 Developer Preview 阶段,由 DeepSeek AI 团队维护。

社区信息

版本与后续发展方向

  • 当前状态:Developer Preview(v0.1.0-rc.5),快速迭代中,明确声明会有破坏性兼容性变更
  • 会话格式SESSION_FORMAT_VERSION 保持 0,无兼容性承诺
  • 后续方向(基于项目文档和架构推断):
    • 稳定会话格式版本,提供向后兼容保证
    • 扩展模型适配器支持(更多 OpenAI 兼容端点)
    • 完善 Windows 平台支持(当前通过 ACL 实现沙箱)
    • 开放外部贡献通道
    • 丰富插件生态(社区插件通过 dsh-plugin 话题发现)
    • Python SDK 功能完善
    • 沙箱策略增强(E2B 远程沙箱 POC 已在 packages/e2b 中)

DeepSeek Harness 代表了一种"将 Agent 框架视为操作系统而非应用"的设计哲学——内核只提供调度和通信基础设施,所有能力由插件组装。对于需要构建可定制、可扩展 AI Agent 平台的工程团队,这是一个值得深入研究的架构参考实现。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐