DeepSeek Harness: 工具使用
最后更新:2026-08-31
工具是 Agent 的"手和脚"——没有工具,Agent 只能"纸上谈兵";有了工具,Agent 能读写文件、执行命令、搜索代码、制定计划。DSH 的工具系统基于 Cordis 插件架构,每个工具都是一个插件,可扩展、可替换、可组合。
📋 前置知识:已完成 05-modes.md,了解四种运行模式
1. 你将学到
- DSH 内置工具列表与功能
- 工具执行流水线的三个阶段
- 各工具的使用场景与示例
- 工具审批策略配置
- 自定义工具的创建方法
2. 内置工具一览
(1) 工具全景图
graph TB
subgraph DSHTools[DSH 内置工具]
FE[file_edit<br/>文件读写与编辑]
SH[shell<br/>Shell 命令执行]
SR[search<br/>代码与文件搜索]
SK[skills<br/>技能调用]
PL[plan<br/>计划制定与追踪]
SB[sandbox<br/>沙箱环境管理]
end
(2) 工具功能对比
| 工具 | 功能 | 安全等级 | 需要审批 |
|---|---|---|---|
| file_edit | 创建、读取、编辑、删除文件 | 🔴 高 | 是 |
| shell | 执行 Shell 命令 | 🔴 高 | 是 |
| search | 搜索文件和代码内容 | 🟢 低 | 否 |
| skills | 调用预定义技能模板 | 🟡 中 | 视情况 |
| plan | 制定和追踪执行计划 | 🟢 低 | 否 |
| sandbox | 管理沙箱环境 | 🟡 中 | 是 |
3. file_edit — 文件操作工具
(1) 支持的操作
file_edit 是最常用的工具,支持四种操作:
| 操作 | 说明 | 审批要求 |
|---|---|---|
read |
读取文件内容 | 无需审批 |
create |
创建新文件 | 需要审批 |
edit |
编辑已有文件 | 需要审批 |
delete |
删除文件 | 需要审批 |
(2) 读取文件
▶ 示例 1读取文件内容
// Agent 调用 file_edit 的参数
{
action: "read",
path: "src/config.ts",
encoding: "utf-8"
}
Agent 读取后会自动分析文件内容:
🤖 Agent:
🔍 Using tool: file_edit (read)
→ Path: src/config.ts
→ Size: 1.2KB
这个配置文件导出了三个配置项:
- DATABASE_URL:数据库连接字符串
- PORT:服务端口(默认 3000)
- LOG_LEVEL:日志级别(默认 info)
(3) 创建文件
▶ 示例 2创建新文件
// Agent 调用 file_edit 创建文件
{
action: "create",
path: "src/utils/logger.ts",
content: "export function log(level: string, msg: string) {\n const ts = new Date().toISOString();\n console.log(`[${ts}] [${level}] ${msg}`);\n}"
}
交互流程:
🤖 Agent: 正在创建文件 src/utils/logger.ts... ⚠️ Approval Required: Create file src/utils/logger.ts → Action: create → Path: src/utils/logger.ts → [Allow] [Always] [Deny] ✅ 用户批准 → 文件已创建⚠️ 你的实际审批流程会因配置而异,创建操作默认需要用户确认。
创建文件会触发审批弹窗,用户确认后才写入。
(4) 编辑文件
▶ 示例 3编辑文件(diff 模式)
DSH 的文件编辑采用 diff 模式,只修改需要变更的部分:
// Agent 调用 file_edit 编辑文件
{
action: "edit",
path: "src/app.ts",
changes: [
{
type: "insert",
line: 5,
content: "import { log } from './utils/logger';"
},
{
type: "replace",
line: 23,
oldContent: "console.log('Server started');",
newContent: "log('info', 'Server started');"
}
]
}
审批弹窗中会展示 diff 视图:
⚠️ Approval Required: Edit file src/app.ts
+5 | import { log } from './utils/logger';
-23| console.log('Server started');
+23| log('info', 'Server started');
[Allow] [Always] [Deny]
(5) 可逆编辑
file_edit 的所有修改都是可逆的。DSH 在编辑前自动保存文件快照:
graph LR
A[编辑前快照] --> B[应用编辑]
B --> C[编辑后状态]
C -->|回滚| A
4. shell — Shell 命令工具
(1) 基本用法
▶ 示例 4执行安全命令
// Agent 执行 ls 命令
{
command: "ls -la src/",
cwd: "/home/alice/project",
timeout: 30000
}
交互流程:
🤖 Agent: 正在查看项目目录结构... 🔧 Using tool: shell → Command: ls -la src/ → CWD: /home/alice/project → Output: 12 files, 3 directories⚠️ 你的实际输出取决于项目内容,但工具调用流程应相似。
(2) 命令安全分级
DSH 将 Shell 命令按危险程度分级:
| 等级 | 命令示例 | 审批策略 |
|---|---|---|
| 安全 | ls, cat, grep, head, wc |
自动允许 |
| 中等 | npm install, git add, mkdir |
需要审批 |
| 危险 | rm, chmod, sudo, dd |
需要审批 + 确认 |
| 禁止 | rm -rf /, mkfs, > /dev/sda |
自动拒绝 |
▶ 示例 5:执行中等风险命令
// Agent 执行 npm view(查看包信息,中等风险)
{
command: "npm view jsonwebtoken",
cwd: "/home/alice/project",
timeout: 120000
}
审批弹窗:
⚠️ Approval Required: Execute shell command
Command: npm view jsonwebtoken
Working directory: /home/alice/project
Estimated packages: 1
[Allow] [Always for npm] [Deny]
(3) 超时与中断
// shell 工具参数
interface ShellParams {
command: string;
cwd?: string;
timeout?: number; // 超时毫秒数,默认 30000
env?: Record<string, string>; // 额外环境变量
}
长时间运行的命令会被超时中断:
🤖 Agent:
🔧 Using tool: shell
→ Command: npm run build
→ Timeout: 120000ms
⏱️ Build completed in 45s
→ Output: Build successful. 15 files generated.
5. search — 搜索工具
(1) 搜索模式
search 工具支持多种搜索模式:
| 模式 | 说明 | 示例 |
|---|---|---|
| 文件搜索 | 按文件名/路径查找 | *.test.ts |
| 内容搜索 | 按内容正则搜索 | import.*from |
| 符号搜索 | 搜索函数/类定义 | class UserService |
▶ 示例 6搜索文件
// 搜索所有测试文件
{
pattern: "*.test.ts",
type: "file",
maxResults: 50
}
交互流程:
🤖 Agent: 正在搜索测试文件... 🔍 Using tool: search → Pattern: *.test.ts → Type: file → Results: 15 files found⚠️ 你的实际结果取决于项目内容,但工具调用流程应相似。
▶ 示例 7搜索代码内容
// 搜索所有 import 语句
{
pattern: "import.*from 'express'",
type: "content",
filePattern: "*.ts",
maxResults: 100
}
(2) 搜索结果展示
🤖 Agent:
🔍 Using tool: search
→ Pattern: import.*from 'express'
→ Type: content
→ Results: 8 matches
Found in:
src/app.ts:1 — import express from 'express';
src/routes/users.ts:3 — import express from 'express';
src/routes/auth.ts:2 — import express from 'express';
...
6. skills — 技能工具
(1) 技能的概念
Skills 是预定义的任务模板,封装了常见操作的完整流程:
graph LR
USER[用户请求] --> SK[Skill 模板]
SK --> T1[工具调用 1]
SK --> T2[工具调用 2]
SK --> T3[工具调用 3]
(2) 内置 Skills
| Skill | 说明 | 包含的操作 |
|---|---|---|
| add-test | 为函数添加测试 | search → file_edit (create) |
| refactor | 提取函数/类 | file_edit (read) → file_edit (edit × N) |
| debug | 调试错误 | search → shell → file_edit |
| document | 添加文档注释 | file_edit (read) → file_edit (edit) |
▶ 示例 8调用 skill
// 调用 add-test skill
{
skill: "add-test",
params: {
target: "src/utils/format.ts::formatDate",
framework: "jest"
}
}
交互流程:
🤖 Agent: 正在为函数添加测试... 🔧 Using tool: skills → Skill: add-test → Target: src/utils/format.ts::formatDate → Framework: jest 🔍 Using tool: search → 查找相关文件 📝 Using tool: file_edit (create) → 创建测试文件 ✅ 测试文件已创建⚠️ 你的实际输出取决于函数内容和模型选择,但技能调用流程应相似。
7. plan — 计划工具
(1) 计划的创建与追踪
plan 工具用于制定和追踪多步骤任务的执行计划:
▶ 示例 9创建执行计划
// 创建计划
{
action: "create",
steps: [
{ id: 1, desc: "Install dependencies", tool: "shell" },
{ id: 2, desc: "Create auth module", tool: "file_edit" },
{ id: 3, desc: "Update app.ts", tool: "file_edit" },
{ id: 4, desc: "Write tests", tool: "file_edit" },
{ id: 5, desc: "Run tests", tool: "shell" }
]
}
交互流程:
🤖 Agent: 正在制定执行计划... 📋 Using tool: plan (create) → Step 1: Install dependencies [shell] → Step 2: Create auth module [file_edit] → Step 3: Update app.ts [file_edit] → Step 4: Write tests [file_edit] → Step 5: Run tests [shell] ✅ 计划已创建,等待执行⚠️ 你的实际计划步骤会因任务而异,但工具调用流程应相似。
▶ 示例 10更新计划状态
// 标记步骤完成
{
action: "update",
stepId: 1,
status: "completed",
result: "Installed jsonwebtoken, bcryptjs"
}
交互流程:
🤖 Agent: 正在更新计划状态... 📋 Using tool: plan (update) → Step 1: Install dependencies → ✅ completed → Result: Installed jsonwebtoken, bcryptjs ✅ 计划状态已更新⚠️ 你的实际结果取决于安装的包,但工具调用流程应相似。
(2) 计划与 PTC 模式
plan 工具是 PTC 模式的底层支撑:
graph TD
PTC[PTC 模式] --> PLAN[plan 工具创建计划]
PLAN --> USER[用户审阅]
USER --> EXEC[按计划执行各步骤]
EXEC --> UPDATE[plan 工具更新状态]
UPDATE --> DONE{全部完成?}
DONE -->|否| EXEC
DONE -->|是| REPORT[输出总结]
8. 工具执行流水线
(1) 三阶段流水线
每个工具调用都经过三个阶段:
graph LR
PRE[pre-execute<br/>参数校验<br/>权限检查<br/>审批弹窗] --> EXEC[execute<br/>实际执行<br/>捕获输出] --> POST[post-execute<br/>记录日志<br/>触发事件<br/>更新状态]
▶ 示例 11流水线伪代码
async function executeToolPipeline(tool: Tool, params: Params): Promise<Result> {
// Stage 1: pre-execute
const preResult = await preExecute(tool, params);
if (preResult.denied) {
throw new ToolDeniedError(preResult.reason);
}
// Stage 2: execute
const result = await tool.execute(params);
// Stage 3: post-execute
await postExecute(tool, params, result);
ctx.emit('tool.executed', { tool: tool.name, params, result });
return result;
}
交互流程:
🔧 Tool pipeline executing... [1] pre-execute: ✅ 参数校验通过,权限检查通过 [2] execute: ✅ 工具执行完成 [3] post-execute:📝 日志已记录,事件已触发 ✅ Pipeline completed in 850ms⚠️ 实际流水线步骤和耗时因工具类型而异,但三阶段流程固定。
(2) pre-execute 阶段
pre-execute 负责校验和审批:
interface PreExecuteResult {
allowed: boolean;
reason?: string;
modifiedParams?: Params;
}
| 检查项 | 说明 |
|---|---|
| 参数校验 | 参数格式和类型是否正确 |
| 权限检查 | 用户是否有权限执行此操作 |
| 审批弹窗 | 危险操作是否需要用户确认 |
| 沙箱检查 | 操作是否在工作区范围内 |
(3) post-execute 阶段
post-execute 负责记录和通知:
interface PostExecuteAction {
log: boolean; // 记录到会话日志
emit: boolean; // 触发事件
updateTrajectory: boolean; // 更新 Trajectory
notifyUI: boolean; // 通知 Web UI 更新
}
9. 工具审批策略
(1) 策略配置
▶ 示例 12审批策略配置
# dsh.config.yaml
approval:
# 全局默认策略
default: ask
# 按工具设置
tools:
file_edit:
read: always # 读取始终允许
create: ask # 创建需要审批
edit: ask # 编辑需要审批
delete: ask_with_confirm # 删除需要二次确认
shell:
safe: always # 安全命令始终允许
moderate: ask # 中等命令需要审批
dangerous: deny # 危险命令自动拒绝
search:
default: always # 搜索始终允许
skills:
default: ask # 技能调用需要审批
plan:
default: always # 计划始终允许
输出:
TEXT 📖 仅展示✅ dsh.config.yaml validated 🔧 Approval: default=ask 📂 file_edit: read=always, create=ask, edit=ask, delete=ask_with_confirm 💻 shell: safe=always, moderate=ask, dangerous=deny 🔍 search: default=always
(2) 审批模式说明
| 模式 | 说明 | 适用 |
|---|---|---|
always |
始终允许,不弹窗 | 安全操作 |
ask |
需要审批,弹窗确认 | 危险操作 |
ask_with_confirm |
需要二次确认 | 极危险操作 |
deny |
自动拒绝 | 绝不允许的操作 |
10. 自定义工具简介
(1) 创建自定义工具
DSH 的工具就是 Cordis 插件,可以用 TypeScript 编写:
▶ 示例 13自定义 HTTP 请求工具
import { definePlugin } from '@deepseek-ai/dsh';
export default definePlugin({
name: 'tool-http-request',
version: '1.0.0',
contribute(ctx) {
ctx.registerTool({
name: 'http_request',
description: 'Make HTTP requests to external APIs',
parameters: {
type: 'object',
properties: {
url: { type: 'string', description: 'Request URL' },
method: { type: 'string', enum: ['GET', 'POST', 'PUT', 'DELETE'] },
headers: { type: 'object', description: 'Request headers' },
body: { type: 'string', description: 'Request body' }
},
required: ['url', 'method']
},
async execute(params) {
const response = await fetch(params.url, {
method: params.method,
headers: params.headers,
body: params.body
});
return {
status: response.status,
body: await response.text()
};
}
});
}
});
输出:
TEXT 📖 仅展示✅ Plugin 'tool-http-request' loaded 🔧 Tool registered: http_request 📋 Parameters: url (required), method (required), headers, body 🔒 Approval: ask (default)
(2) 注册自定义工具
将自定义工具插件放到项目的 .dsh/plugins/ 目录:
.dsh/
└── plugins/
└── tool-http-request/
├── index.ts
└── package.json
或在配置文件中指定:
# dsh.config.yaml
plugins:
- path: "./custom-tools/http-request"
- path: "./custom-tools/database-query"
(3) 自定义工具的审批
自定义工具也需要定义审批策略:
ctx.registerTool({
name: 'http_request',
// ...
approval: {
level: 'ask', // 默认需要审批
rules: [
{ match: { method: 'GET' }, level: 'always' }, // GET 请求自动允许
{ match: { method: 'POST' }, level: 'ask' }, // POST 需要审批
{ match: { method: 'DELETE' }, level: 'deny' } // DELETE 自动拒绝
]
}
});
❓ 常见问题
tools.disabled: ["shell"] 即可禁用指定工具。📖 小节
- DSH 内置六大工具:file_edit、shell、search、skills、plan、sandbox
- 工具执行三阶段流水线:pre-execute → execute → post-execute
- file_edit 支持读写创建编辑,所有修改可逆
- shell 按安全等级分级:安全/中等/危险/禁止
- search 支持文件名/内容/符号三种搜索模式
- 审批策略通过配置文件按工具和操作类型精细控制
- 自定义工具本质是 Cordis 插件,用 TypeScript 编写
📝 作业
1. ⭐ 基础题:使用 DSH Agent 完成以下操作:1) 用 search 工具搜索项目中的所有 TypeScript 文件;2) 用 file_edit 读取其中一个文件。记录两次工具调用的参数和结果。
2. ⭐⭐ 进阶题:配置审批策略,让 file_edit 的 read 操作自动允许,create/edit 操作需要审批,delete 操作需要二次确认。测试每种操作,验证审批策略是否生效。
3. ⭐⭐⭐ 挑战题:创建一个自定义工具插件,功能是查询当前 Git 仓库的最近 5 次提交记录(调用 git log -5 --oneline),注册到 DSH 中并让 Agent 成功调用。