DeepSeek AI · 开源项目 · 开发者预览

DeepSeek
Harness

由内而外理解 Agent 框架

面向 Agent 开发者的系统性学习指南。从设计哲学到架构细节,从核心概念到插件开发, 全面拆解 DeepSeek 开源的"一切皆插件"Agent 框架。

—  §  —
100%
插件化
MIT
开源协议
TS
主语言
Cordis
底层框架
01 — Overview

项目概览

DeepSeek Harness(dsh)是 DeepSeek AI 推出的开源 Agent 运行框架,核心理念是"一切皆插件"。

DeepSeek Harness(简称 dsh)是由 DeepSeek AI 开发的开源 Agent Harness 框架。 它采用 "一切皆插件" 的架构设计,基于 Cordis 框架 构建—— Cordis 源自论文 "A Programming Paradigm for Spatiotemporal Composability"(一种时空可组合性的编程范式), 提供了强大的依赖注入、服务注册和事件驱动能力。

通俗类比 — 超级助理的办公桌

想象你雇了一个非常聪明的助手(AI 模型),但他需要一张办公桌才能干活。这张桌子上摆着文件柜(文件系统)、 电话(网络搜索)、计算器(代码执行),还有一本工作日志(会话记录)。DeepSeek Harness 就是这张办公桌—— 它本身不"思考",但它为 AI 模型提供了所有工作所需的工具和空间。

开发者DeepSeek AI
项目状态Developer Preview(开发者预览)
主要语言TypeScript 97.1%
开源协议MIT
运行环境Node.js 22.19+
底层框架Cordis
npm 包名@deepseek-ai/dsh

快速启动

只需一条命令即可启动带 Web UI 的本地 Agent 服务:

terminal
npx @deepseek-ai/dsh web

启动后访问 http://127.0.0.1:3080 即可使用完整的 Web UI 界面。

它能做什么

No. 01
Web UI 交互

内置完整 Web 界面,支持会话管理、文件浏览、终端交互、模型配置等全功能开发体验。

No. 02
Python SDK

提供 deepseek-harness-sdk,以 Python Context Manager 方式集成到自动化脚本和流水线中。

No. 03
Headless 模式

无界面命令行模式,适合 CI/CD、批处理、嵌入式场景,通过 JSON-RPC 标准输入输出驱动。

No. 04
插件生态

所有能力皆为插件:模型适配器、工具、沙箱、存储、审批——全部可替换、可组合、可扩展。

02 — Philosophy

设计思想与原则

理解 dsh 的五大核心设计原则,是掌握其架构能力的关键。

DeepSeek Harness 的每一个设计决策,都围绕一个中心思想:让一切都可以被替换、组合和扩展。以下五大原则构成了框架的哲学基石。

—  §  —
原则 01 一切皆插件
dsh 中没有任何特权核心。模型适配器、工具注册表、会话日志、Agent 循环——所有组件都是插件, 都可以通过配置替换。无需 patch 核心代码,无需 fork 仓库。这意味着你可以用一行配置替换默认行为, 而不是修改框架源码。
通俗类比 — 餐厅厨房

像一家餐厅的厨房。灶台、冰箱、切菜台、洗碗机——每一件设备都是独立的、可以随时换掉的。 不喜欢这个冰箱?搬走换一个新的,其他设备完全不受影响。Harness 里没有什么是"焊死"的, 一切都可以像厨房设备一样独立替换。

原则 02 Cordis 驱动的时空可组合性
dsh 构建于 Cordis 框架之上,继承了五个核心概念:
  • Plugin = 服务对象,以 apply 函数为入口
  • Context = 服务容器,通过 ctx.<key> 访问注册的能力
  • inject = 声明依赖,框架自动注入所需服务
  • Typed Events = 类型安全的事件系统,插件间松耦合通信
  • Reactive Registration = 注册是可逆的副作用,插件卸载时自动清理
通俗类比 — 厨房的管理制度

Cordis 就像这个厨房的"管理制度"——规定了设备怎么摆放、谁先谁后、坏了怎么自动断电。 它不是厨房本身,而是让厨房有序运转的规则。没有管理制度,厨房里的设备再好也会乱套; 有了 Cordis,所有插件才能井然有序地协作。

原则 03 能力分层(Capability Seams)
框架将能力分为三层角色:服务定义(interface 接口)、服务提供者(implementation 实现)、 消费者(usage 使用)。例如,将 fs/subprocess 提供者从本地切换为远程沙箱, Bash、PTY、LSP 等工具会自动迁移到沙箱中运行,无需修改工具代码。
通俗类比 — USB 接口

像 USB 接口。不管你插的是哪个品牌的键盘——罗技、雷蛇、还是杂牌——只要符合 USB 标准,电脑就能用。 Harness 里每个能力都有这样的"标准接口"。换一个文件系统,就像换个键盘,系统其他部分完全不用改, 因为它们只认"接口",不认具体品牌。

原则 04 模型可见即已记录
会话日志(Session Log)是模型上下文唯一的真实来源。deriveMessages() 方法将模型历史从日志中投影出来。 运行时不变式:模型可见的 = 日志记录的。这保证了会话的可回放、可分叉、可恢复。
通俗类比 — 飞机黑匣子

像飞机的黑匣子记录仪。每一步操作——用户说了什么、AI 回了什么、调用了什么工具——全部按顺序忠实地记录下来。 出了问题可以回放还原现场,想"穿越"到对话某个时间点重新开始也可以。模型"看到"的内容,永远等于黑匣子"记录"的内容。

原则 05 事件驱动扩展
扩展点通过事件系统暴露,分为三个层级:
  • Session Events:持久化事件,使用 emit 模式,写入会话日志
  • Agent Events:实时事件,使用 waterfall/serial 模式,驱动 Agent 循环
  • Capability Events:能力事件,可在不导入循环逻辑的情况下附加策略
通俗类比 — 不同的通知方式

像不同的通知方式:emit 像广播喇叭——喊一嗓子,大家听到就行,不需要回应; waterfall 像传阅文件——每个人看完签字,传给下一个; parallel 像群发邮件——同时发给所有人,各回各的; serial 像接力赛——一个人跑完,把棒交给下一个。

—  §  —

事件分派模式一览

dsh 提供四种事件分派模式,满足不同的扩展需求:

模式 是否 await 执行顺序 返回值 语义
emit 有序 观察 / 广播
waterfall 有序 有(传递) 中间件包装
parallel 并发 扇出
serial 有序 顺序执行
03 — Architecture

整体架构

从 Profile 组合到核心包,从事件流到能力接缝——理解 dsh 的完整运行时结构。

Profile 与 Bundle

运行中的 dsh 实例是一个在启动时由有序层(layers)组合而成的插件树

  • Profile = 命名组合,列出 bundles + cordis.patch.yml(web 和 headless 作为模板发布)
  • Bundle = Cordis 配置行的分发格式
通俗类比 — 点一份套餐

像点一份"套餐"。Profile 是你选的套餐(比如"川菜套餐"),Bundle 是套餐里的每道菜。 你可以换菜、加菜、去掉不想要的——组合完全自由。今天想吃辣的选川菜套餐,明天想清淡换粤菜套餐, 但具体每道菜怎么搭配,你可以自己微调。

组合层(从先到后)

dsh-base dsh-web-app / dsh-headless profile cordis.patch.yml home-level --patch overlay

dsh-base 是第一层,包含模型适配器、工具、持久化、沙箱、审批、设置、凭证、遥测等基础能力。 可以使用以下命令查看最终组合配置:

terminal
dsh --profile web --dump-config
—  §  —

核心包一览

职责 服务键
core/session SessionEvent 日志、会话生命周期 ctx.sessions
core/system-prompt 系统提示词组装 ctx.systemPrompt
core/tools 工具注册表 + 执行管线 ctx.tools
core/agent Agent 接口定义 ctx.agents
core/agent-loop 默认 Agent 驱动循环 ctx.agentLoop
core/scope 每 Agent 的作用域隔离
llm/llm 消息/流词汇表 + 适配器接缝 ctx.llm
—  §  —

Turn 执行流

Step = 一次模型请求 + 它调用的工具。Turn = 零个或多个 Step。 一个完整的 Turn 流程如下:

通俗类比 — 开会时的一轮发言

像开会时的"一轮发言"。你提出一个问题(输入),助手思考后可能需要去查资料(调用工具), 查完回来继续回答,可能还要再查一次。这一整个"提问→查资料→回答"的完整过程就是一个 Turn。 资料查一次是一个 Step,一次 Turn 里可以有多个 Step。

turn/start
→ claim input
→ assemble prompt
→ agent/pre-step(reject | enter)
→ step/start
→ append user/message
→ derive model history
→ agent/request
→ llm/stream
→ assistant/chunk ×(流式分块)
→ assistant/message
→ tool/call ×(工具调用)
→ tools/pre-execute
→ tools/execute
→ tools/post-execute
→ tool/result ×
→ step/end
→ next step(循环)
→ agent/turn-stopping
→ turn/end
关于 Waterfall 事件

所有 waterfall 类型的事件都需要显式调用 next() 才能继续流程。

—  §  —

能力接缝(Capability Seams)

以下是 dsh 暴露的主要能力接缝及其内置提供者。每个接缝都遵循"接口与实现分离"的原则,提供者可自由替换。

通俗类比 — 再看 USB 接口

每个能力接缝就像一个标准 USB 接口。下表左列是接口(比如 ctx.fs 文件系统接口), 右列是可以插进去的不同"设备"(比如本地文件系统 fs-local、沙箱文件系统 fs-sandbox、云端文件系统 fs-e2b)。 换一个提供者就像拔掉一个 U 盘换上另一个,电脑(框架)完全不用重启。

服务键(接口) 内置提供者(可替换的实现)
ctx.llmllm-deepseek, llm-pi-ai
ctx.fsfs-local, fs-sandbox, fs-e2b
ctx.shellbash-local, bash-sandbox, pwsh-local
ctx.subprocesssubprocess-local, subprocess-e2b
ctx.sandboxsandbox-local
ctx.webweb-search-exa, web-fetch-http
ctx.subagentssubagent-in-process, subagent-acp, subagent-codex
ctx.compactioncompaction-basic
ctx.skillsskill-filesystem
ctx.jobsjobs-local
ctx.storagestorage-json, storage-sqlite
ctx.approvalacp
—  §  —

Host / Client 双架构

dsh 采用隔离的 HostClient 双 TypeScript 聚合体:

通俗类比 — 餐厅的前厅与后厨

像餐厅的"前厅"和"后厨"。前厅(Client / 浏览器)负责接待客人、展示菜品、传递点单; 后厨(Host / 服务器)负责真正做菜。两边各干各的,通过订单(API)沟通。 客人不用关心菜怎么做的,厨师也不用管怎么摆盘上桌——分工明确,互不干扰。

Host
Host(服务端运行时)

负责会话管理、工具执行、模型请求等核心逻辑。所有 Agent 能力在 Host 侧运行——这是真正"做菜"的后厨。

Client
Client(浏览器端)

负责 UI 渲染和用户交互。业务服务使用 @Remote / @RemoteScope 装饰器实现跨端调用。

04 — Concepts

核心概念详解

深入理解事件分派、会话日志、工具管线、权限审批和上下文压缩。

本章是全文最核心的部分。我们将逐一拆解 DeepSeek Harness 的五大核心机制,每个概念都配有生活类比,帮助你在理解技术细节之前先建立直觉。

—  §  —

一、事件分派模式详解

通俗类比 — 四种通知方式

把事件分派想象成四种不同的通知方式:emit 像广播喇叭——喊一嗓子大家听到就行,不需要回应; waterfall 像传阅文件——每个人看完签字,可以修改内容,然后传给下一个; parallel 像群发邮件——同时发给所有人,各回各的; serial 像接力赛——一个人跑完,把棒交给下一个,必须按顺序来。

模式 语义 使用场景
emit 不 await,有序触发,无返回值。纯观察模式。 日志记录、遥测、UI 刷新
waterfall 不 await,有序传递,有返回值。中间件模式:每个监听器可修改并传递给下一个。 请求拦截、审批策略、提示词修改
parallel await 全部完成,并发执行,无返回值。扇出模式。 并行通知、多路副作用
serial await 逐个执行,有序,有返回值。串行模式。 顺序处理链、依赖前置步骤

Waterfall 语义与中间件模式

Waterfall 事件是 dsh 中最强大的扩展机制。它允许插件像中间件一样包装核心流程: 每个监听器收到当前值后,可以在调用 next() 前后插入自定义逻辑。

waterfall-example.ts
// 中间件模式:拦截模型请求并修改
ctx.on('agent/request', (payload, next) => {
  // before:修改 payload
  const modified = { ...payload, temperature: 0.7 }

  return next(modified).then(result => {
    // after:处理返回结果
    return result
  })
})
—  §  —

二、会话日志系统(Session Log)

通俗类比 — 飞机的黑匣子

像飞机的黑匣子记录仪。对话中发生的每一件事——用户说了什么、AI 回了什么、调用了什么工具、工具返回了什么—— 全部按时间顺序忠实记录。出了问题可以完整回放还原现场,想"穿越"回某个时间点重新开始也可以。 最关键的是:AI 模型"看到"的对话,永远是从黑匣子记录中投影出来的,二者完全一致。

No. 01
deriveMessages()

从日志中投影出模型可见的消息序列。日志是唯一真实来源,消息是投影结果。

No. 02
回放保真度

assistant/chunk 事件逐 token 记录,保证流式输出的完整回放。

No. 03
Fork / Resume

通过 ctx.sessions.fork() 从任意历史点分叉出新的会话分支。

No. 04
持久化

支持 JSONL 和 SQLite 两种存储后端,通过 ctx.storage 接缝切换。

—  §  —

三、工具执行管线

通俗类比 — 机场安检流程

像机场安检的流程。你的行李先过 X 光机(pre-execute 预检),然后过安检门(execute 执行), 最后人工复查(post-execute 后检)。每一站都可以拦截或放行。如果你带了违禁品,预检就会拦下来; 如果一切正常,三站通过后行李才能上飞机(结果写入日志,对模型可见)。

每次工具调用都经过五个阶段的管线:

tools/pre-execute monotonic guard tools/execute tools/post-execute result observation
  • tools/pre-execute:执行前拦截,可用于审批、参数校验、沙箱策略注入
  • monotonic guard:单调性保护,防止重复执行或时序冲突
  • tools/execute:实际执行工具逻辑
  • tools/post-execute:执行后处理,可用于结果转换、日志记录
  • result observation:结果写入会话日志,对模型可见
—  §  —

四、权限与审批

通俗类比 — 公司的审批流程

像公司里的审批流程。普通操作(比如读一个文件)不需要审批,随手就能做; 但重要操作(比如删除文件、执行系统命令)需要经理签字。在自动模式下,这个"经理"就是预设的安全策略—— 它会根据规则自动批准或拒绝。如果你想更安全,可以设成"每个重要操作都要人工确认"。

权限系统基于 approval/request waterfall 事件实现。当工具需要审批时触发该事件, 审批策略监听器可以允许、拒绝或要求用户确认。

预设 A
workspace-write

工作区写入预设:允许在工作区目录内读写文件和执行命令,超出范围需审批。

预设 B
danger-full-access

完全访问预设:不推荐用于生产环境,适合隔离的实验场景。

—  §  —

五、上下文压缩(Context Compaction)

通俗类比 — 读书时的摘要笔记

像读书时的"摘要笔记"。对话太长了记不住,就把前面的内容压缩成摘要,只保留最重要的信息, 腾出空间继续往后读。Agent 自己不知道发生了压缩——对它来说,对话一直在继续, 只是前面的细节变成了精简版。这种"神不知鬼不觉"的处理方式,让长对话不会因为超长而中断。

当会话历史超过模型上下文窗口时,compaction-basic 插件自动压缩历史。 其中 toolResultPruner 负责裁剪过期的工具调用结果,以释放上下文空间。 压缩对模型是透明的——模型感知不到压缩发生,只看到正常的对话历史。

05 — Use Cases

使用场景

从编程助手到自修改系统,dsh 覆盖多种 Agent 应用场景。

DeepSeek Harness 不只是一个代码工具。得益于"一切皆插件"的架构,它能胜任从日常开发到复杂自动化、从单机协作到云端隔离的各种任务。

—  §  —

六大核心场景

No. 01
编程助手

读写文件、运行 Bash 命令、持久化 PTY 终端交互,支持多文件编辑和项目级重构。

No. 02
自动化运维

Headless 模式接入 CI/CD 流水线,自动排查问题、执行修复、生成报告。

No. 03
代码审查与分析

通过会话查询和全文搜索能力,对代码库进行深度分析和审查。

No. 04
多 Agent 协作

通过 ctx.subagents 将任务委派给子 Agent,实现并行处理和专业分工。

No. 05
研究与分析

通过 ctx.web 搜索和抓取网页,进行在线调研和数据分析。

No. 06
自修改系统

通过 tool-cordis 让 Agent 检查和修改自己的运行时插件状态。

通俗类比 — 能改造自己办公桌的助手

自修改系统就像一个能"自己改造自己办公桌"的助手。他觉得需要一把剪刀,就能自己从抽屉里变出一把来; 觉得电话不好用,就自己换一部新的。这是 Harness 最独特的能力——Agent 可以在运行时实时添加新的插件来扩展自己, 不需要重启,不需要人工干预。

使用模式对比

模式 Profile 适用场景
Web UI web 交互式开发,可视化操作
Python SDK 自定义组合 编程式集成,自动化脚本
Headless CLI headless 脚本驱动,CI/CD 集成
ACP Server acp JSON-RPC stdio,协议集成

沙箱场景

通俗类比 — 给小孩画的活动圈

像给小孩画的"活动圈"。在圈里怎么玩都行,但不能出圈。沙箱限制了 Agent 能碰哪些文件、能执行哪些命令, 防止它误伤你的系统。圈画得大一点,Agent 的自由度就高;画得小一点,就更安全。你可以根据需要调整。

方案 A
sandbox-local(Landlock)

使用 Linux Landlock 实现本地沙箱隔离,无需额外基础设施。

方案 B
E2B 云沙箱

通过 fs-e2b + subprocess-e2b 接入 E2B 云端沙箱,完全隔离执行环境。

策略组合

多个沙箱策略可以组合使用。例如本地 Landlock + E2B 云沙箱双重隔离,确保执行环境安全可控。

典型工作流时间线

步骤 01
启动配置

选择 Profile(web/headless/acp),加载 bundles 和 patch 配置,完成插件树组合。

步骤 02
选择工作区

设定工作目录,配置沙箱策略和文件系统提供者(local/sandbox/e2b)。

步骤 03
发起任务

通过 UI 或 API 发送用户输入,触发 turn/start,进入 Agent 循环。

步骤 04
审批执行

工具调用经过 pre-execute 审批策略,确保操作在授权范围内执行。

步骤 05
会话持久化

所有事件写入会话日志,支持后续 fork/resume/replay,可持久化到 JSONL 或 SQLite。

06 — Comparison

框架对比

将 DeepSeek Harness 与主流 Agent 框架进行全方位对比。

市面上的 Agent 框架各有侧重。选型时,关键不在于哪个"最好",而在于哪个最适合你的需求。下面用汽车来类比,帮你快速建立直觉。

通俗类比 — 四种车

DeepSeek Harness 像一辆可以换引擎、换轮胎、换座椅的改装车,什么都能定制,适合喜欢动手的人; LangChain 像一箱乐高积木,什么都能拼,但得自己拼,自由度最高但也最费功夫; Codex CLI 像一辆出厂调好的轿车,插上钥匙开就走,但不能改; Claude Code 像一辆品牌专享车,性能好但只能用原厂零件。

—  §  —

综合对比表

维度 DeepSeek Harness LangChain / LangGraph Codex CLI Claude Code
类型 Agent 运行框架 Agent 开发库 CLI 工具 CLI 工具
架构 全插件化 + Cordis 链 / 状态机 单体 CLI 单体 CLI
可扩展性 极高(一切皆插件) 高(组件库) 中(Hooks)
模型绑定 不绑定(模型无关) 不绑定 仅 OpenAI 仅 Anthropic
沙箱 多层(Landlock / E2B) 有限 有限
Web UI 内置
子 Agent ctx.subagents LangGraph 有限
协议 MIT MIT Apache 2.0 闭源
—  §  —

逐一详评

DS DeepSeek Harness 改装车 — 什么都能定制
优势
  • 极致插件化,一切皆可替换
  • 模型无关,支持任意 LLM 提供者
  • 内置 UI + SDK + Headless 三模式
  • 会话日志支持 fork/resume/replay
  • 多层沙箱隔离(Landlock / E2B)
  • 支持自修改运行时
不足
  • 开发者预览阶段,API 可能变化
  • 学习曲线较陡
  • 社区正在建设中
  • Windows 支持有限
LC LangChain / LangGraph 乐高积木 — 什么都能拼,但得自己拼
优势
  • 庞大的社区和生态
  • Python 原生,集成便捷
  • LangGraph 提供状态机能力
  • 文档和教程丰富
不足
  • 无运行时 / 无 Web UI
  • 无内置沙箱
  • 无会话日志系统
  • 抽象层较多,复杂度高
CX OpenAI Codex CLI 出厂轿车 — 开就走,但不能改
优势
  • 轻量级,零配置启动
  • 针对 OpenAI 模型优化
  • 开箱即用体验流畅
不足
  • 仅支持 OpenAI 模型
  • 几乎不可扩展
  • 无 Web UI / 无插件系统
  • 沙箱能力有限
CC Claude Code 品牌专享车 — 性能好但只能用原厂零件
优势
  • Claude 模型体验优秀
  • Hooks 扩展机制
  • 产品成熟度较高
不足
  • 仅支持 Anthropic 模型
  • 闭源
  • 无 Web UI
  • 可扩展性有限
  • 无自修改运行时
选型指南

快速 / 轻量使用 → Codex CLI 或 Claude Code
构建自定义 Agent 系统 → LangChain / LangGraph
开箱即用 + 可扩展 + 多模型 + 完整 UI → DeepSeek Harness

07 — Quickstart

快速上手

三种方式启动你的 DeepSeek Harness 之旅。

不需要复杂的安装过程。根据你的使用场景,选择最合适的一条路径即可开始。

—  §  —

路径一:npm 快速启动

最快的方式,无需克隆仓库,一行命令启动 Web UI:

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

# 启动后打开浏览器访问:
# http://127.0.0.1:3080

启动后的配置流程:

  1. Settings → Models 中配置 API Key
  2. 选择你要使用的工作区目录
  3. 在聊天框中输入任务,开始执行

路径二:源码构建

适合需要深度定制或参与开发的用户:

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

# 安装依赖
pnpm install

# 构建
pnpm run build

# 启动
pnpm dsh web

路径三:Python SDK

通俗类比 — 给你一个遥控器

Python SDK 相当于给你一个"遥控器"。你不用打开浏览器手动操作, 而是在代码里直接发指令:执行这个任务、用这个模型、结果存到这里。 就像用遥控器控制电视——按一下按钮,事情就自动完成了。

适合在 Python 脚本或自动化流水线中集成:

terminal
pip install deepseek-harness-sdk
minimal.py
from pathlib import Path
from deepseek_harness import DeepSeekHarness

with DeepSeekHarness(
    provider="deepseek-official",
    model="deepseek-v4-flash",
    max_tokens=49_152,
    cwd=str(workspace),
    session_root=str(sessions),
    cordis=str(config),
) as harness:
    result = harness.run("Fix the failing tests.", session_id="example-001")
    print(result.final_response)

环境变量

DEEPSEEK_API_KEYDeepSeek API 密钥
DEEPSEEK_BASE_URLAPI 基础 URL(可选,用于代理)
DSH_MODEL默认模型名称
DSH_SYSTEM_PROMPT自定义系统提示词
08 — Plugin Development

插件开发

从第一个插件到第一个工具——掌握 dsh 的扩展开发。

通俗类比 — 给厨房添置新设备

插件开发就像给厨房添置新设备。你想加一个烤箱,只需要写一份"烤箱使用说明"(apply 函数), 告诉厨房这个烤箱能做什么、需要接什么水电(inject 依赖),然后插上电源(注册到配置文件)就能用了。 不满意随时搬走,不影响其他设备。

什么是插件

插件是一个导出 apply 函数的 TypeScript 模块。框架在加载时调用 apply, 并传入 ctx 上下文对象。通过 ctx,插件可以注册服务、监听事件、声明依赖。

三种插件形式

形式签名说明
函数形式 export function apply(ctx) 最简单,适合无依赖的小插件
对象形式 export default { name, inject, apply } 可声明名称和依赖,推荐方式
类形式 extends Service 适合需要封装状态和方法的复杂服务

第一个插件:hello-plugin

hello-plugin.ts
import type { Context } from '@deepseek-ai/cordis'

export const name = 'hello-plugin'

export function apply(ctx: Context) {
  console.log('[hello-plugin] plugin loaded!')
}

cordis.yml 中注册插件:

cordis.yml
plugins:
  hello-plugin:
    path: ./hello-plugin.ts

使用 patch 方式加载运行:

terminal
pnpm dsh web --patch ./cordis.yml
—  §  —

工具开发:greet 工具

使用 defineTool 定义类型安全的工具:

greet-tool.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 }
    },
    output: {
      schema: { type: 'string' },
      render: (_args, value) => [{ type: 'text', text: value }]
    },
    async execute(args) {
      return `Hello, ${args.name}!`
    }
  }))
}

关键概念

  • inject:声明依赖的服务键,框架在服务就绪后自动注入
  • defineTool:类型安全的工具定义辅助函数,提供参数/输出类型推导
  • ctx.effect():注册清理副作用,插件卸载时自动调用
  • 自动清理:所有通过 ctx 注册的资源在插件卸载时自动回收

新行为的归属指南

想添加的能力归属位置
添加模型提供者注册到 ctx.llm
添加工具注册到 ctx.tools
添加 Shell 执行注册 ctx.shell 后端
拦截请求 / 工具 / Turn使用 agent/*tools/* 事件
添加模型可见上下文调用 agent.inject()
修改系统提示词注册到 ctx.systemPrompt
添加存储后端注册到 ctx.storage
添加沙箱策略注册到 ctx.sandbox
09 — Advanced Topics

进阶主题

探索 dsh 的高级能力和学习路径。

掌握了基础概念和插件开发后,以下高级主题将帮助你更深入地发挥 Harness 的全部潜力。

—  §  —

Agent Presets

Agent Presets 是按会话作用域组合能力的机制。每个 preset 对应一个 cordis.yml, 挂载在 Agent 作用域下,为特定会话定制可用工具、模型和行为策略。

Skills 系统

ctx.skills 提供技能目录服务。tool-skill 插件将技能目录渲染为会话前缀, 让模型了解可用的技能集合。skill-filesystem 提供者从文件系统加载技能定义。

Goal Management

ctx.goals 从会话日志中折叠出带版本管理的目标状态。目标可以被 Agent 追踪、更新和完成, 为复杂任务提供结构化的进度追踪能力。

Workflow Engine

ctx.workflowEngine 提供工作流引擎。tool-workflowtool-ralph 插件支持结构化工作流,允许定义多步骤、有状态的复杂任务执行流程。

LSP 集成

ctx.lsp 提供语言服务器协议(LSP)集成。lsp-local 提供者在本地运行语言服务器, 为 Agent 提供代码补全、诊断、定义跳转等能力,大幅提升编程辅助体验。

遥测

ctx.sessionTelemetry 支持 OpenTelemetry 标准的遥测导出。可以将会话指标、工具调用延迟、 模型请求耗时等数据导出到可观测性平台。

自修改系统

通俗类比 — 能改造自己办公桌的助手

tool-cordis 允许 Agent 检查和修改自己的运行时插件状态。这是 dsh 最独特的能力之一—— Agent 可以在运行时加载、卸载插件,查看当前能力注册表,甚至修改自身配置。 就像一个助手觉得自己需要一把剪刀,就能自己从抽屉里变出一把来——这张办公桌是"活的",能根据需要自我进化。

—  §  —

推荐学习路径

步骤 01
从 Web UI 使用开始

先用 npx @deepseek-ai/dsh web 体验完整的交互式开发流程。

步骤 02
阅读 Cordis 入门

理解 Plugin、Context、inject、Events 和 Reactive Registration 五个核心概念。

步骤 03
学习架构文档

理解 Profile/Bundle 组合层、核心包职责和 Turn 执行流。

步骤 04
编写第一个插件

从 hello-plugin 开始,理解 apply 函数和 ctx 上下文。

步骤 05
编写第一个工具

使用 defineTool 注册自定义工具,理解工具执行管线。

继续深入:

  1. 探索能力接缝(Capability Seams)——尝试替换 ctx.fsctx.shell 提供者
  2. 构建自定义 Profile 组合——用 --patch 挂载你的插件配置

资源链接