DeepSeek Harness: 工具使用

最后更新:2026-08-31

工具是 Agent 的"手和脚"——没有工具,Agent 只能"纸上谈兵";有了工具,Agent 能读写文件、执行命令、搜索代码、制定计划。DSH 的工具系统基于 Cordis 插件架构,每个工具都是一个插件,可扩展、可替换、可组合。

💡 提示:DSH 的工具系统采用三阶段流水线——pre-execute(校验审批)→ execute(实际执行)→ post-execute(日志记录)。理解这个流水线,你就掌握了工具行为的全部控制点。

📋 前置知识:已完成 05-modes.md,了解四种运行模式

1. 你将学到


2. 内置工具一览

工具调用流水线

(1) 工具全景图

100%
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读取文件内容

TYPESCRIPT
// Agent 调用 file_edit 的参数
{
  action: "read",
  path: "src/config.ts",
  encoding: "utf-8"
}

Agent 读取后会自动分析文件内容:

TEXT 📖 仅展示
🤖 Agent:
🔍 Using tool: file_edit (read)
  → Path: src/config.ts
  → Size: 1.2KB

这个配置文件导出了三个配置项:
- DATABASE_URL:数据库连接字符串
- PORT:服务端口(默认 3000)
- LOG_LEVEL:日志级别(默认 info)

(3) 创建文件

▶ 示例 2创建新文件

TYPESCRIPT
// 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 模式,只修改需要变更的部分:

TYPESCRIPT
// 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 视图:

TEXT 📖 仅展示
⚠️ 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 在编辑前自动保存文件快照:

100%
graph LR
    A[编辑前快照] --> B[应用编辑]
    B --> C[编辑后状态]
    C -->|回滚| A

4. shell — Shell 命令工具

(1) 基本用法

▶ 示例 4执行安全命令

TYPESCRIPT
// 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:执行中等风险命令

TYPESCRIPT
// Agent 执行 npm view(查看包信息,中等风险)
{
  command: "npm view jsonwebtoken",
  cwd: "/home/alice/project",
  timeout: 120000
}

审批弹窗:

TEXT 📖 仅展示
⚠️ Approval Required: Execute shell command

  Command: npm view jsonwebtoken
  Working directory: /home/alice/project
  Estimated packages: 1

  [Allow] [Always for npm] [Deny]

(3) 超时与中断

TYPESCRIPT
// shell 工具参数
interface ShellParams {
  command: string;
  cwd?: string;
  timeout?: number;      // 超时毫秒数,默认 30000
  env?: Record<string, string>;  // 额外环境变量
}

长时间运行的命令会被超时中断:

TEXT 📖 仅展示
🤖 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搜索文件

TYPESCRIPT
// 搜索所有测试文件
{
  pattern: "*.test.ts",
  type: "file",
  maxResults: 50
}

交互流程:

🤖 Agent: 正在搜索测试文件...
🔍 Using tool: search
  → Pattern: *.test.ts
  → Type: file
  → Results: 15 files found

⚠️ 你的实际结果取决于项目内容,但工具调用流程应相似。

▶ 示例 7搜索代码内容

TYPESCRIPT
// 搜索所有 import 语句
{
  pattern: "import.*from 'express'",
  type: "content",
  filePattern: "*.ts",
  maxResults: 100
}

(2) 搜索结果展示

TEXT 📖 仅展示
🤖 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 是预定义的任务模板,封装了常见操作的完整流程:

100%
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

TYPESCRIPT
// 调用 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创建执行计划

TYPESCRIPT
// 创建计划
{
  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更新计划状态

TYPESCRIPT
// 标记步骤完成
{
  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 模式的底层支撑:

100%
graph TD
    PTC[PTC 模式] --> PLAN[plan 工具创建计划]
    PLAN --> USER[用户审阅]
    USER --> EXEC[按计划执行各步骤]
    EXEC --> UPDATE[plan 工具更新状态]
    UPDATE --> DONE{全部完成?}
    DONE -->|否| EXEC
    DONE -->|是| REPORT[输出总结]

8. 工具执行流水线

(1) 三阶段流水线

每个工具调用都经过三个阶段:

100%
graph LR
    PRE[pre-execute<br/>参数校验<br/>权限检查<br/>审批弹窗] --> EXEC[execute<br/>实际执行<br/>捕获输出] --> POST[post-execute<br/>记录日志<br/>触发事件<br/>更新状态]

▶ 示例 11流水线伪代码

TYPESCRIPT
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 负责校验和审批:

TYPESCRIPT
interface PreExecuteResult {
  allowed: boolean;
  reason?: string;
  modifiedParams?: Params;
}
检查项 说明
参数校验 参数格式和类型是否正确
权限检查 用户是否有权限执行此操作
审批弹窗 危险操作是否需要用户确认
沙箱检查 操作是否在工作区范围内

(3) post-execute 阶段

post-execute 负责记录和通知:

TYPESCRIPT
interface PostExecuteAction {
  log: boolean;           // 记录到会话日志
  emit: boolean;          // 触发事件
  updateTrajectory: boolean;  // 更新 Trajectory
  notifyUI: boolean;      // 通知 Web UI 更新
}

9. 工具审批策略

(1) 策略配置

▶ 示例 12审批策略配置

YAML
# 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 请求工具

TYPESCRIPT
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/ 目录:

TEXT 📖 仅展示
.dsh/
└── plugins/
    └── tool-http-request/
        ├── index.ts
        └── package.json

或在配置文件中指定:

YAML
# dsh.config.yaml
plugins:
  - path: "./custom-tools/http-request"
  - path: "./custom-tools/database-query"

(3) 自定义工具的审批

自定义工具也需要定义审批策略:

TYPESCRIPT
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 自动拒绝
    ]
  }
});

❓ 常见问题

Q Agent 一次会调用多少个工具?
A 取决于任务复杂度。简单问答可能不调用任何工具,复杂任务可能连续调用 5-10 个工具。标准模式下无上限,极简模式限制为最多 1 次。
Q 工具调用失败怎么办?
A Agent 会收到错误信息,可以自动重试或调整策略。连续失败 3 次后,Agent 会向用户报告并请求指导。
Q 可以禁用某个工具吗?
A 可以。在配置文件中设置 tools.disabled: ["shell"] 即可禁用指定工具。
Q search 和 shell 中的 grep 有什么区别?
A search 是 DSH 内置的结构化搜索,理解项目目录结构,支持文件名/内容/符号三种模式。shell grep 是通用文本搜索。推荐优先使用 search。
Q 自定义工具能用 Python 写吗?
A 当前 DSH 插件系统仅支持 TypeScript。Python 工具可以通过 shell 工具间接调用 Python 脚本实现。
Q 工具执行有并发限制吗?
A DSH 默认串行执行工具(一个完成后再执行下一个)。这是因为工具之间可能有依赖关系。 ---

📖 小节


📝 作业

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 成功调用。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏