DeepSeek Harness: Uso de Ferramentas
Última atualização: 2026-08-31
Ferramentas são as "mãos e pés" do Agent — sem ferramentas, o Agent só pode "falar"; com ferramentas, o Agent pode ler/gravar arquivos, executar comandos, pesquisar código e fazer planos. O sistema de ferramentas do DSH é construído sobre a arquitetura de plugins Cordis — cada ferramenta é um plugin, extensível, substituível e combinável.
📋 Pré-requisitos: Ter completado 05-modes.md, familiarizado com os quatro modos de execução
1. O Que Você Vai Aprender
- Lista e funções das ferramentas integradas do DSH
- Os três estágios do pipeline de execução de ferramentas
- Casos de uso e exemplos de cada ferramenta
- Configuração de política de aprovação de ferramentas
- Métodos de criação de ferramentas customizadas
2. Visão Geral das Ferramentas Integradas
(1) Panorama das Ferramentas
graph TB
subgraph DSHTools[Ferramentas Integradas do DSH]
FE[file_edit<br/>Leitura/Gravação e Edição de Arquivos]
SH[shell<br/>Execução de Comandos Shell]
SR[search<br/>Busca de Código e Arquivos]
SK[skills<br/>Invocação de Habilidades]
PL[plan<br/>Criação e Acompanhamento de Planos]
SB[sandbox<br/>Gerenciamento de Ambiente Sandbox]
end
(2) Comparação de Funções das Ferramentas
| Ferramenta | Função | Nível de Segurança | Requer Aprovação |
|---|---|---|---|
| file_edit | Criar, ler, editar, excluir arquivos | 🔴 Alta | Sim |
| shell | Executar comandos Shell | 🔴 Alta | Sim |
| search | Pesquisar arquivos e conteúdo de código | 🟢 Baixa | Não |
| skills | Invocar templates de habilidades predefinidos | 🟡 Média | Depende |
| plan | Criar e acompanhar planos de execução | 🟢 Baixa | Não |
| sandbox | Gerenciar ambiente sandbox | 🟡 Média | Sim |
3. file_edit — Ferramenta de Operação de Arquivos
(1) Operações Suportadas
file_edit é a ferramenta mais usada, suportando quatro operações:
| Operação | Descrição | Aprovação Necessária |
|---|---|---|
read |
Ler conteúdo do arquivo | Sem aprovação necessária |
create |
Criar novo arquivo | Aprovação necessária |
edit |
Editar arquivo existente | Aprovação necessária |
delete |
Excluir arquivo | Aprovação necessária |
(2) Lendo Arquivos
▶ Exemplo 1:Lendo Conteúdo de Arquivo
// Parâmetros de chamada de file_edit do Agent
{
action: "read",
path: "src/config.ts",
encoding: "utf-8"
}
Após a leitura, o Agent analisa automaticamente o conteúdo do arquivo:
🤖 Agent:
🔍 Using tool: file_edit (read)
→ Path: src/config.ts
→ Size: 1.2KB
Este arquivo de configuração exporta três definições:
- DATABASE_URL: String de conexão com banco de dados
- PORT: Porta do serviço (padrão 3000)
- LOG_LEVEL: Nível de log (padrão info)
(3) Criando Arquivos
▶ Exemplo 2:Criando um Novo Arquivo
// Agent chama file_edit para criar um arquivo
{
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}"
}
Criar um arquivo aciona um popup de aprovação; o arquivo só é gravado após confirmação do usuário.
(4) Editando Arquivos
▶ Exemplo 3:Editando um Arquivo (modo diff)
A edição de arquivos do DSH usa modo diff, modificando apenas as partes que precisam mudar:
// Agent chama file_edit para editar um arquivo
{
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');"
}
]
}
O popup de aprovação exibe uma visualização diff:
⚠️ Aprovação Necessária: Editar arquivo src/app.ts
+5 | import { log } from './utils/logger';
-23| console.log('Server started');
+23| log('info', 'Server started');
[Permitir] [Sempre] [Negar]
(5) Edição Reversível
Todas as modificações de file_edit são reversíveis. DSH salva automaticamente um snapshot do arquivo antes de editar:
graph LR
A[Snapshot Pré-edição] --> B[Aplicar Edições]
B --> C[Estado Pós-edição]
C -->|Rollback| A
4. shell — Ferramenta de Comandos Shell
(1) Uso Básico
▶ Exemplo 4:Executando um Comando Seguro
// Agent executa comando ls
{
command: "ls -la src/",
cwd: "/home/alice/project",
timeout: 30000
}
(2) Classificação de Segurança de Comandos
DSH classifica comandos Shell por nível de perigo:
| Nível | Exemplos de Comandos | Política de Aprovação |
|---|---|---|
| Seguro | ls, cat, grep, head, wc |
Auto-permitir |
| Moderado | npm install, git add, mkdir |
Aprovação necessária |
| Perigoso | rm, chmod, sudo, dd |
Aprovação + confirmação necessária |
| Proibido | rm -rf /, mkfs, > /dev/sda |
Auto-negar |
▶ Exemplo 5:Executando um Comando de Risco Moderado
// Agent executa npm view (ver info do pacote, risco moderado)
{
command: "npm view jsonwebtoken",
cwd: "/home/alice/project",
timeout: 120000
}
Popup de aprovação:
⚠️ Aprovação Necessária: Executar comando shell
Command: npm view jsonwebtoken
Working directory: /home/alice/project
Estimated packages: 1
[Permitir] [Sempre para npm] [Negar]
(3) Timeout e Interrupção
// Parâmetros da ferramenta shell
interface ShellParams {
command: string;
cwd?: string;
timeout?: number; // Timeout em milissegundos, padrão 30000
env?: Record<string, string>; // Variáveis de ambiente adicionais
}
Comandos de longa duração serão interrompidos por timeout:
🤖 Agent:
🔧 Using tool: shell
→ Command: npm run build
→ Timeout: 120000ms
⏱️ Build completado em 45s
→ Output: Build successful. 15 files generated.
5. search — Ferramenta de Busca
(1) Modos de Busca
A ferramenta de busca suporta múltiplos modos:
| Modo | Descrição | Exemplo |
|---|---|---|
| Busca de Arquivos | Buscar por nome de arquivo/caminho | *.test.ts |
| Busca de Conteúdo | Buscar por regex de conteúdo | import.*from |
| Busca de Símbolos | Buscar definições de funções/classes | class UserService |
▶ Exemplo 6:Buscando Arquivos
// Buscar todos os arquivos de teste
{
pattern: "*.test.ts",
type: "file",
maxResults: 50
}
▶ Exemplo 7:Buscando Conteúdo de Código
// Buscar todas as declarações de import
{
pattern: "import.*from 'express'",
type: "content",
filePattern: "*.ts",
maxResults: 100
}
(2) Exibição de Resultados da Busca
🤖 Agent:
🔍 Using tool: search
→ Pattern: import.*from 'express'
→ Type: content
→ Results: 8 matches
Encontrado em:
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 — Ferramenta de Habilidades
(1) Conceito de Skills
Skills são templates de tarefas predefinidos que encapsulam fluxos de trabalho completos para operações comuns:
graph LR
USER[Requisição do Usuário] --> SK[Template de Skill]
SK --> T1[Chamada de Ferramenta 1]
SK --> T2[Chamada de Ferramenta 2]
SK --> T3[Chamada de Ferramenta 3]
(2) Skills Integradas
| Skill | Descrição | Operações Incluídas |
|---|---|---|
| add-test | Adicionar testes para uma função | search → file_edit (create) |
| refactor | Extrair funções/classes | file_edit (read) → file_edit (edit × N) |
| debug | Depurar erros | search → shell → file_edit |
| document | Adicionar comentários de documentação | file_edit (read) → file_edit (edit) |
▶ Exemplo 8:Invocando uma Skill
// Invocar skill add-test
{
skill: "add-test",
params: {
target: "src/utils/format.ts::formatDate",
framework: "jest"
}
}
7. plan — Ferramenta de Planejamento
(1) Criando e Acompanhando Planos
A ferramenta plan é usada para criar e acompanhar planos de execução para tarefas multi-passos:
▶ Exemplo 9:Criando um Plano de Execução
// Criar um plano
{
action: "create",
steps: [
{ id: 1, desc: "Instalar dependências", tool: "shell" },
{ id: 2, desc: "Criar módulo de autenticação", tool: "file_edit" },
{ id: 3, desc: "Atualizar app.ts", tool: "file_edit" },
{ id: 4, desc: "Escrever testes", tool: "file_edit" },
{ id: 5, desc: "Executar testes", tool: "shell" }
]
}
▶ Exemplo 10:Atualizando Status do Plano
// Marcar passo como completo
{
action: "update",
stepId: 1,
status: "completed",
result: "Installed jsonwebtoken, bcryptjs"
}
(2) Ferramenta plan e Modo PTC
A ferramenta plan é a base do modo PTC:
graph TD
PTC[Modo PTC] --> PLAN[Ferramenta plan Cria Plano]
PLAN --> USER[Usuário Revê]
USER --> EXEC[Executar Passos Conforme Plano]
EXEC --> UPDATE[Ferramenta plan Atualiza Status]
UPDATE --> DONE{Tudo Completo?}
DONE -->|Não| EXEC
DONE -->|Sim| REPORT[Exibir Resumo]
8. Pipeline de Execução de Ferramentas
(1) Pipeline de Três Estágios
Toda chamada de ferramenta passa por três estágios:
graph LR
PRE[pre-execute<br/>Validação de Parâmetros<br/>Verificação de Permissão<br/>Popup de Aprovação] --> EXEC[execute<br/>Execução Real<br/>Capturar Saída] --> POST[post-execute<br/>Registro de Log<br/>Emissão de Evento<br/>Atualização de Status]
▶ Exemplo 11:Pseudocódigo do Pipeline
async function executeToolPipeline(tool: Tool, params: Params): Promise<Result> {
// Estágio 1: pre-execute
const preResult = await preExecute(tool, params);
if (preResult.denied) {
throw new ToolDeniedError(preResult.reason);
}
// Estágio 2: execute
const result = await tool.execute(params);
// Estágio 3: post-execute
await postExecute(tool, params, result);
ctx.emit('tool.executed', { tool: tool.name, params, result });
return result;
}
(2) Estágio pre-execute
pre-execute lida com validação e aprovação:
interface PreExecuteResult {
allowed: boolean;
reason?: string;
modifiedParams?: Params;
}
| Item de Verificação | Descrição |
|---|---|
| Validação de parâmetros | Se o formato e tipos dos parâmetros estão corretos |
| Verificação de permissão | Se o usuário tem permissão para executar esta operação |
| Popup de aprovação | Se operações perigosas requerem confirmação do usuário |
| Verificação de sandbox | Se a operação está dentro do escopo do workspace |
(3) Estágio post-execute
post-execute lida com registro e notificação:
interface PostExecuteAction {
log: boolean; // Registrar no log de sessão
emit: boolean; // Emitir evento
updateTrajectory: boolean; // Atualizar Trajectory
notifyUI: boolean; // Notificar atualização da Web UI
}
9. Política de Aprovação de Ferramentas
(1) Configuração de Política
▶ Exemplo 12:Configuração de Política de Aprovação
# dsh.config.yaml
approval:
# Política padrão global
default: ask
# Configurações por ferramenta
tools:
file_edit:
read: always # Leituras sempre permitidas
create: ask # Criações requerem aprovação
edit: ask # Edições requerem aprovação
delete: ask_with_confirm # Exclusões requerem dupla confirmação
shell:
safe: always # Comandos seguros sempre permitidos
moderate: ask # Comandos moderados requerem aprovação
dangerous: deny # Comandos perigosos auto-negados
search:
default: always # Busca sempre permitida
skills:
default: ask # Chamadas de skill requerem aprovação
plan:
default: always # Planos sempre permitidos
(2) Descrições dos Modos de Aprovação
| Modo | Descrição | Caso de Uso |
|---|---|---|
always |
Sempre permitir, sem popup | Operações seguras |
ask |
Requer aprovação, confirmação via popup | Operações perigosas |
ask_with_confirm |
Requer dupla confirmação | Operações extremamente perigosas |
deny |
Auto-negar | Operações que nunca devem ser permitidas |
10. Introdução a Ferramentas Customizadas
(1) Criando Ferramentas Customizadas
Ferramentas DSH são plugins Cordis, escritas em TypeScript:
▶ Exemplo 13:Ferramenta Customizada de Requisição 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()
};
}
});
}
});
(2) Registrando Ferramentas Customizadas
Coloque plugins de ferramentas customizadas no diretório .dsh/plugins/ do projeto:
.dsh/
└── plugins/
└── tool-http-request/
├── index.ts
└── package.json
Ou especifique no arquivo de configuração:
# dsh.config.yaml
plugins:
- path: "./custom-tools/http-request"
- path: "./custom-tools/database-query"
(3) Aprovação de Ferramentas Customizadas
Ferramentas customizadas também precisam definir políticas de aprovação:
ctx.registerTool({
name: 'http_request',
// ...
approval: {
level: 'ask', // Padrão requer aprovação
rules: [
{ match: { method: 'GET' }, level: 'always' }, // Requisições GET auto-permitidas
{ match: { method: 'POST' }, level: 'ask' }, // POST requer aprovação
{ match: { method: 'DELETE' }, level: 'deny' } // DELETE auto-negado
]
}
});
❓ Perguntas Frequentes
tools.disabled: ["shell"] no arquivo de configuração para desabilitar ferramentas especificadas.📖 Resumo
- DSH tem seis ferramentas integradas: file_edit, shell, search, skills, plan, sandbox
- Execução de ferramentas tem um pipeline de três estágios: pre-execute → execute → post-execute
- file_edit suporta leitura/gravar/criar/editar; todas as modificações são reversíveis
- shell classifica comandos por nível de segurança: seguro/moderado/perigoso/proibido
- search suporta modos de busca por nome de arquivo/conteúdo/símbolo
- Políticas de aprovação são finamente controladas por ferramenta e tipo de operação através de configuração
- Ferramentas customizadas são essencialmente plugins Cordis, escritas em TypeScript
📝 Exercícios
1. ⭐ Básico: Use o Agent DSH para completar as seguintes operações: 1) Use a ferramenta search para encontrar todos os arquivos TypeScript no projeto; 2) Use file_edit para ler um deles. Registre os parâmetros e resultados de ambas as chamadas de ferramentas.
2. ⭐⭐ Intermediário: Configure políticas de aprovação para que operações de leitura do file_edit sejam auto-permitidas, operações de criar/editar exijam aprovação e operações de excluir exijam dupla confirmação. Teste cada operação para verificar se as políticas de aprovação estão funcionando.
3. ⭐⭐⭐ Desafio: Crie um plugin de ferramenta customizada que consulta os últimos 5 commits no repositório Git atual (chamando git log -5 --oneline), registre-o no DSH e faça o Agent invocá-lo com sucesso.