Building Custom AI Agents with OpenClaw: Developer Guide

Complete developer guide for building custom AI agents with OpenClaw. Architecture patterns, skill definitions, deployment strategies, and integration blueprints.

E
ECOSIRE Research and Development Team
|19 de março de 202611 min de leitura2.5k Palavras|

Construindo Agentes de IA Personalizados com OpenClaw: Guia do Desenvolvedor

Construir um agente de IA pronto para produção não é o mesmo que escrever um chatbot. Os agentes devem perceber o contexto, raciocinar sobre informações incompletas, executar planos de várias etapas e se recuperar de falhas — tudo isso sem supervisão humana. OpenClaw é uma plataforma de agente empresarial de IA construída especificamente para esse nível de autonomia operacional, oferecendo aos desenvolvedores um tempo de execução estruturado, um modelo de composição de habilidades e observabilidade de primeira classe desde o primeiro dia.

Este guia foi escrito para engenheiros que desejam passar do zero a um agente OpenClaw implantado e monitorado. Cobrimos aspectos internos da arquitetura, criação de habilidades, gerenciamento de memória, ganchos de orquestração e os padrões de implantação que mantêm os agentes confiáveis ​​sob carga de produção.

Principais conclusões

  • Os agentes OpenClaw são compostos por Skills (capacidades atômicas), camadas de memória e um orquestrador que planeja sequências de execução.
  • O arquivo de manifesto do agente declara todas as dependências, permissões e vinculações de ferramentas antes do tempo de execução.
  • Habilidades são funções sem estado que aceitam entradas digitadas e emitem saídas digitadas – a testabilidade está integrada.
  • Os níveis de memória de trabalho, memória de episódios e memória de longo prazo atendem a diferentes necessidades de retenção e recuperação.
  • Ganchos (pré-execução, pós-execução, em caso de erro) permitem injetar monitoramento, limitação de taxa e lógica de fallback sem modificar o código de habilidade principal.
  • O modo Sandbox do OpenClaw permite reproduzir rastreamentos de produção localmente para depuração sem chamadas de API ao vivo.
  • As transferências multiagentes usam um barramento de mensagens digitado – nenhuma string bruta passando entre os agentes.
  • ECOSIRE fornece implementações gerenciadas de OpenClaw, bibliotecas de habilidades personalizadas e otimização contínua para equipes empresariais.

Compreendendo o modelo de agente OpenClaw

Cada agente OpenClaw é uma composição de quatro primitivos: Habilidades, Memória, Ferramentas e um Orquestrador.

Habilidades são as unidades atômicas da capacidade do agente. Uma habilidade é uma função que aceita um esquema de entrada digitado e retorna um esquema de saída digitado. As habilidades podem ser síncronas ou assíncronas e declaram explicitamente suas dependências externas. Exemplos: ParseInvoice, SendSlackMessage, QueryCRMContact, GenerateReport.

Ferramentas são ligações externas do sistema. OpenClaw vem com ferramentas integradas para APIs REST, bancos de dados, sistemas de arquivos, navegadores e filas de mensagens. Você registra ferramentas no Manifesto do Agente e as injeta em habilidades em tempo de execução por meio de injeção de dependência.

A memória é organizada em três níveis. A memória de trabalho mantém o estado atual da tarefa – o scratchpad do agente. A Memória de Episódios armazena históricos de tarefas concluídas que podem ser recuperadas por similaridade semântica na sessão atual. A memória de longo prazo persiste durante as sessões e armazena fatos aprendidos, preferências do usuário e conhecimento do domínio.

O Orquestrador é o núcleo do raciocínio. Ele recebe uma declaração de metas, consulta o registro de habilidades disponíveis, cria um plano de execução e monitora cada etapa. Quando uma habilidade falha, o orquestrador decide se tenta novamente, substitui uma habilidade alternativa ou escala para um humano.

O diagrama de arquitetura para um único agente é assim:

User Request
     ↓
[ Orchestrator ]
     ↓ plan
[ Skill Selector ] → [ Skill Registry ]
     ↓ execute
[ Skill Instance ]
     ↓ tool calls
[ Tool Layer ] → [ External Systems ]
     ↓ result
[ Memory Writer ]
     ↓ store
[ Working / Episode / Long-Term Memory ]
     ↓ next step or done
[ Orchestrator ] → response

Esse loop continua até que o orquestrador determine que a meta foi satisfeita ou que uma condição de parada seja alcançada.


Configurando seu ambiente de desenvolvimento

Antes de escrever sua primeira habilidade, você precisa do OpenClaw SDK e de um tempo de execução de agente local.

npm install @openclaw/sdk @openclaw/runtime @openclaw/cli
npx openclaw init my-agent --template=typescript

O comando init gera um projeto com esta estrutura:

my-agent/
  agent.manifest.json   # Agent declaration
  skills/               # Skill implementations
  tools/                # Tool registrations
  memory/               # Memory adapter config
  tests/                # Skill and integration tests
  .openclaw/            # Local runtime state

O agent.manifest.json é o arquivo mais importante. Ele declara tudo que o OpenClaw precisa para inicializar seu agente:

{
  "name": "invoice-processor",
  "version": "1.0.0",
  "runtime": "node-20",
  "skills": [
    "skills/extract-line-items.ts",
    "skills/validate-vendor.ts",
    "skills/post-to-erp.ts"
  ],
  "tools": {
    "erp": { "type": "rest", "baseUrl": "${ERP_BASE_URL}", "auth": "bearer" },
    "storage": { "type": "s3", "bucket": "${DOCS_BUCKET}" }
  },
  "memory": {
    "working": { "ttl": 3600 },
    "episode": { "backend": "redis", "maxItems": 500 },
    "longTerm": { "backend": "postgres", "table": "agent_facts" }
  },
  "permissions": ["read:invoices", "write:erp", "read:vendors"]
}

Variáveis ​​de ambiente são injetadas em tempo de execução e nunca armazenadas no manifesto.


Escrevendo sua primeira habilidade

As habilidades seguem um contrato rígido. Eles aceitam um objeto input correspondente a um esquema declarado, recebem tools e memory injetados e retornam um objeto output ou lançam um SkillError digitado.

import { defineSkill, SkillError } from "@openclaw/sdk";
import { z } from "zod";

const ExtractLineItemsInput = z.object({
  documentUrl: z.string().url(),
  documentType: z.enum(["invoice", "receipt", "purchase-order"]),
});

const ExtractLineItemsOutput = z.object({
  lineItems: z.array(
    z.object({
      description: z.string(),
      quantity: z.number(),
      unitPrice: z.number(),
      total: z.number(),
    })
  ),
  confidence: z.number().min(0).max(1),
});

export const ExtractLineItems = defineSkill({
  name: "extract-line-items",
  description: "Extracts line items from a document using OCR and LLM parsing",
  input: ExtractLineItemsInput,
  output: ExtractLineItemsOutput,
  tools: ["storage"],
  async run({ input, tools, memory }) {
    const fileBuffer = await tools.storage.get(input.documentUrl);
    if (!fileBuffer) {
      throw new SkillError("DOCUMENT_NOT_FOUND", `No document at ${input.documentUrl}`);
    }

    // OCR + LLM extraction logic here
    const extracted = await runOcrPipeline(fileBuffer);

    await memory.working.set("lastExtraction", extracted);

    return {
      lineItems: extracted.items,
      confidence: extracted.confidence,
    };
  },
});

Principais regras de design para habilidades:

  • Sem efeitos colaterais na entrada: as habilidades não devem modificar seus objetos de entrada.
  • Erros de digitação: Sempre lance SkillError com um código legível por máquina, não Error genérico.
  • Declarar dependências de ferramentas: Somente ferramentas declaradas no array tools são injetadas. Ferramentas não declaradas causam um erro de validação de inicialização.
  • Gravar explicitamente na memória: as habilidades não persistem automaticamente no estado. Chame memory.working.set() deliberadamente.

Gerenciamento de memória na prática

As três camadas de memória atendem a propósitos diferentes, e escolher a camada certa é fundamental para a correção do agente.

Memória de trabalho é um armazenamento de valores-chave em processo que dura a execução de uma única tarefa. Use-o para transmitir resultados intermediários entre habilidades sem passar pela cadeia de produção. Ele é limpo automaticamente quando o orquestrador é concluído ou atinge o tempo limite.

// Skill A writes
await memory.working.set("vendorId", "VND-4521");

// Skill B reads
const vendorId = await memory.working.get("vendorId");

Episode Memory é um armazenamento de pesquisa semântica. Quando uma tarefa é concluída, o orquestrador grava opcionalmente um resumo incorporado na memória do episódio. Tarefas futuras podem recuperar episódios anteriores semelhantes para informar o seu raciocínio.

// Query past episodes
const relatedEpisodes = await memory.episode.search(
  "invoice from Acme Corp with disputed line items",
  { topK: 3, minScore: 0.75 }
);

Memória de longo prazo é a base de conhecimento persistente do seu agente. Use-o para fatos que devem sobreviver nas sessões: regras de categorização de fornecedores, preferências do usuário, restrições de domínio aprendidas.

// Store a learned fact
await memory.longTerm.upsert({
  key: `vendor:${vendorId}:paymentTerms`,
  value: "NET-30",
  source: "invoice-2024-0312",
  confidence: 0.9,
});

Um erro comum é sobrescrever na memória de longo prazo. Guarde-o para fatos estáveis ​​e de alta confiança. O raciocínio efêmero pertence à memória de trabalho.


Ganchos de ciclo de vida para observabilidade e controle

OpenClaw expõe quatro ganchos de ciclo de vida por execução de habilidade: preRun, postRun, onError e onTimeout. Registre ganchos no manifesto do agente ou programaticamente em seu arquivo de inicialização.

import { AgentRuntime } from "@openclaw/runtime";

const agent = new AgentRuntime({ manifest: "./agent.manifest.json" });

agent.useHook("preRun", async (ctx) => {
  ctx.metadata.startTime = Date.now();
  console.log(`[${ctx.skill}] starting with input keys: ${Object.keys(ctx.input)}`);
});

agent.useHook("postRun", async (ctx) => {
  const elapsed = Date.now() - ctx.metadata.startTime;
  metrics.record("skill.duration", elapsed, { skill: ctx.skill });
});

agent.useHook("onError", async (ctx) => {
  if (ctx.error.code === "RATE_LIMIT_EXCEEDED") {
    await sleep(ctx.error.retryAfterMs);
    return "retry";
  }
  alerting.send(`Skill ${ctx.skill} failed: ${ctx.error.message}`);
  return "escalate";
});

O valor de retorno do gancho onError controla o comportamento do orquestrador: "retry" aciona uma nova tentativa (até o máximo configurado), "escalate" roteia a tarefa para uma fila humana, "fail" encerra a tarefa imediatamente.


Testando habilidades isoladamente

Como as habilidades têm entradas e saídas digitadas, o teste unitário é simples. Os utilitários de teste do OpenClaw fornecem implementações simuladas de todas as interfaces de ferramentas.

import { testSkill } from "@openclaw/testing";
import { ExtractLineItems } from "../skills/extract-line-items";

describe("ExtractLineItems", () => {
  it("extracts items from a valid invoice", async () => {
    const result = await testSkill(ExtractLineItems, {
      input: {
        documentUrl: "s3://test-bucket/invoice-001.pdf",
        documentType: "invoice",
      },
      mocks: {
        storage: {
          get: jest.fn().mockResolvedValue(samplePdfBuffer),
        },
      },
    });

    expect(result.lineItems).toHaveLength(3);
    expect(result.confidence).toBeGreaterThan(0.8);
  });

  it("throws DOCUMENT_NOT_FOUND for missing file", async () => {
    await expect(
      testSkill(ExtractLineItems, {
        input: { documentUrl: "s3://test-bucket/missing.pdf", documentType: "invoice" },
        mocks: { storage: { get: jest.fn().mockResolvedValue(null) } },
      })
    ).rejects.toMatchObject({ code: "DOCUMENT_NOT_FOUND" });
  });
});

Use o modo Sandbox para testes de integração. O Sandbox reproduz os rastreamentos de produção registrados em relação ao seu código de habilidade atual, capturando regressões antes que elas cheguem aos sistemas ativos.

npx openclaw sandbox replay --trace=traces/invoice-20240315.json

Implantando na produção

Os agentes OpenClaw podem ser implantados como contêineres Docker, funções sem servidor ou processos de longa execução. O padrão recomendado para implantações empresariais é um pool de agentes em contêiner atrás de uma fila de tarefas.

FROM openclaw/runtime:node-20
WORKDIR /agent
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
COPY . .
RUN npx openclaw build
CMD ["npx", "openclaw", "serve", "--workers=4"]

Para cenários de alto rendimento, configure o pool de agentes com regras de escalonamento automático. O tempo de execução do OpenClaw expõe métricas do Prometheus em /metrics para profundidade da fila, percentis de latência de habilidade, taxas de erro e uso de memória – conecte-os à sua pilha de alertas.

Lista de verificação de produção antes da entrada em operação:

  • Todas as variáveis ​​de ambiente estão em um gerenciador de segredos (AWS Secrets Manager, HashiCorp Vault), e não em arquivos .env.
  • Os back-ends de memória (Redis, PostgreSQL) possuem pool de conexões configurado.
  • A configuração maxConcurrentTasks corresponde à capacidade da sua infraestrutura.
  • Os limites de taxa em chamadas de ferramentas externas correspondem aos limites da API do fornecedor.
  • Uma fila de devoluções é configurada para tarefas que esgotam as novas tentativas.
  • O rastreamento distribuído (OpenTelemetry) está ativado e os rastreamentos estão fluindo para sua plataforma de observabilidade.

Perguntas frequentes

Como o orquestrador OpenClaw decide qual habilidade executar em seguida?

O orquestrador usa uma combinação de decomposição de metas e correspondência de habilidades. Ele divide a meta de nível superior em submetas e, em seguida, consulta o registro de habilidades usando similaridade semântica com a descrição de cada submeta. As habilidades são classificadas por pontuação de relevância, disponibilidade de dependência e taxa histórica de sucesso. O orquestrador cria um gráfico acíclico direcionado de execuções de habilidades e resolve dependências antes de iniciar.

Uma habilidade pode chamar outra habilidade diretamente?

Não – as habilidades não devem chamar outras habilidades diretamente. A coordenação entre habilidades é responsabilidade do orquestrador. Se você precisar da saída da habilidade A antes da execução da habilidade B, declare a dependência no plano do orquestrador. Isso mantém as habilidades sem estado e testáveis ​​individualmente. A exceção são as habilidades compostas, que são explicitamente marcadas como primitivas de orquestração.

O que acontece quando uma API externa fica inativa durante a execução de uma habilidade?

O gancho onError intercepta a falha. Se o gancho retornar "retry", o orquestrador aguardará o intervalo de espera configurado e tentará novamente a habilidade. Após tentativas exaustivas, a tarefa passa para a fila de mensagens não entregues. Se você tiver uma habilidade de fallback registrada para a mesma capacidade, o orquestrador tentará antes de desistir. O estado parcial da tarefa é preservado na memória de trabalho para que a tarefa possa ser retomada a partir da última habilidade bem-sucedida.

Como você lida com os segredos que as habilidades precisam em tempo de execução?

As ferramentas declaradas no manifesto do agente são inicializadas com credenciais na inicialização, não por habilidade. Seu gerenciador de segredos preenche as variáveis ​​de ambiente referenciadas no manifesto (${ERP_BASE_URL}, ${DOCS_BUCKET}, etc.) na inicialização do contêiner. As habilidades nunca veem credenciais brutas – elas interagem com instâncias de ferramentas pré-autenticadas injetadas pelo tempo de execução.

Existe um limite para quantas habilidades um agente pode ter?

O registro de habilidades não tem limite rígido, mas a qualidade prática da orquestração diminui se você registrar centenas de habilidades com descrições sobrepostas. Agrupe habilidades relacionadas em pacotes de habilidades e use descrições claras e distintas. Para bibliotecas de habilidades muito grandes, considere dividir-se em agentes especializados e usar a orquestração multiagente para encaminhar tarefas para o agente certo.

Os agentes OpenClaw podem ser executados no local sem dependências da nuvem?

Sim. OpenClaw é independente da nuvem. O tempo de execução, os back-ends de memória e a camada de ferramentas podem ser configurados para usar a infraestrutura local. O Redis pode ser executado localmente, o backend de memória de longo prazo pode apontar para uma instância PostgreSQL local e as integrações de ferramentas podem ter como alvo APIs internas. A única chamada externa é para o provedor LLM para raciocínio do orquestrador — você pode configurar isso para usar um LLM local, se necessário.

Como você cria versões das habilidades do agente sem interromper as tarefas em execução?

As habilidades são versionadas no manifesto do agente com versionamento semântico. O tempo de execução dá suporte à execução de diversas versões de habilidades simultaneamente durante uma implantação contínua. As tarefas em andamento continuam usando a versão de habilidade com a qual começaram; novas tarefas escolhem a versão mais recente. As alterações significativas nos esquemas de entrada/saída de habilidades exigem um aumento de versão principal e um plano de migração para qualquer agente que consuma a saída dessa habilidade.


Próximas etapas

Construir agentes de IA de nível de produção requer mais do que um bom código: requer experiência operacional com modos de falha, padrões de escalabilidade e bibliotecas de habilidades específicas de domínio que levam meses para serem desenvolvidas e refinadas.

O serviço OpenClaw Custom Skills da ECOSIRE fornece desenvolvimento de agente ponta a ponta: análise de requisitos, arquitetura de habilidades, integração com seus sistemas existentes, testes, implantação e otimização contínua. Nossa equipe construiu agentes OpenClaw para processamento de documentos, automação de ERP, suporte ao cliente, análise financeira e muito mais.

Fale com um especialista em OpenClaw para discutir seus requisitos de automação e obter um roteiro de desenvolvimento personalizado.

E

Escrito por

ECOSIRE Research and Development Team

Construindo produtos digitais de nível empresarial na ECOSIRE. Compartilhando insights sobre integrações Odoo, automação de e-commerce e soluções de negócios com IA.

Converse no WhatsApp