Clique em qualquer componente para expandir e entender em profundidade
Processo Node.js central. WebSocket server na porta 18789. Tudo passa por ele β mensagens, tool calls, crons, health checks. Γ o control plane ΓΊnico.
Componentes internos:
Protocolo WebSocket: 1. Gateway envia: connect.challenge (nonce + timestamp) 2. Cliente envia: connect (role, scope, assinatura Ed25519) 3. Gateway responde: hello-ok (protocol, policies, tick 15s) Frame types: req β client para server (method + params) res β server para client (payload | error) event β push assΓncrono (agent, presence, health) Bind modes: loopback | lan | tailnet | auto | custom Auth modes: token | password | trusted-proxy | none
O LLM NΓO interage com o gateway. O gateway chama o LLM via API HTTP. O LLM nΓ£o sabe que o gateway existe.
Cada agente = contexto de execuΓ§Γ£o 100% isolado: workspace prΓ³prio, auth prΓ³pria, sessions prΓ³prias, tool permissions prΓ³prias.
Soul-Based System β arquivos que definem o agente:
workspace/ βββ AGENTS.md # Regras operacionais (alta prioridade no prompt) βββ SOUL.md # Personalidade, tom, idioma βββ IDENTITY.md # Nome, emoji, avatar βββ USER.md # Perfil do humano (nome, timezone) βββ TOOLS.md # Notas sobre tools locais βββ MEMORY.md # MemΓ³ria curada de longo prazo βββ HEARTBEAT.md # Tarefas periΓ³dicas (cron-like leve) βββ BOOTSTRAP.md # Guia inicial (1x, auto-deleta)
ComposiΓ§Γ£o do system prompt:
PI Core (base) β AGENTS.md β SOUL.md β Skills β Memory β Tool defs O OpenClaw monta tudo isso como um prompt gigante e envia ao LLM. O LLM "Γ©" o agente porque leu essas instruΓ§Γ΅es β mas se trocar o SOUL.md, a personalidade muda, mesmo com o mesmo LLM.
Routing de mensagens (quem responde):
Multi-agent: vΓ‘rios agentes no mesmo gateway. Cada um responde por routing bindings. Isolamento total β um nΓ£o vΓͺ as sessions do outro.
O loop principal de execuΓ§Γ£o do agente. O LLM raciocina, chama tools, observa resultados, repete.
ββββββββββββββββββββββββββββββββββββββββββββββββ β ReAct Loop β β β β ββββββββββββ ββββββββββββ βββββββββββ β β π REASON ββββββ β‘ ACT ββββββ π OBS ββ β β (LLM) β β (tool) β β(result)ββ β ββββββ²ββββββ ββββββββββββ βββββ¬ββββββ β β β β β ββββββββββββββββββββββββββββββββ β β repete atΓ© concluir β ββββββββββββββββββββββββββββββββββββββββββββββββ Quem faz o quΓͺ: REASON β LLM decide o que fazer (inferΓͺncia) ACT β OpenClaw intercepta tool call, executa no host OBSERVE β OpenClaw devolve resultado ao LLM REPEAT β OpenClaw verifica se LLM quer outra tool call O OpenClaw Γ© o "maestro". O LLM Γ© o "mΓΊsico".
Exemplo concreto (youtube-summary):
exec("yt-dlp --dump-single-json URL")exec("yt-dlp --write-auto-subs --skip-download...")read("/tmp/subs.vtt")Capacidades que o agente pode usar. O OpenClaw intercepta tool calls do LLM e executa no host. O LLM pede, o OpenClaw faz.
Shell: bash, exec Filesystem: read, write, edit, apply_patch Browser: browser_* (Playwright/Chrome CDP) Web: web_search (Brave), web_fetch Media: image, tts Control: gateway, cron, message Sessions: sessions_list, sessions_send, sessions_history, sessions_spawn Memory: memory_search Outros: nodes, canvas, elevated
Tool Permissions (narrowing β sΓ³ restringe, nunca expande):
Tool Profile β Global Policy β Agent Policy β Sandbox Policy Cada camada pode REMOVER acesso, nunca adicionar. Profiles: coding β ler, escrever, executar analysis β ler, explorar (nΓ£o escreve) verification β ler, executar (nΓ£o escreve) messaging β set restrito para assistentes
O LLM vΓͺ: uma lista de tools disponΓveis no prompt. Ele "chama" uma tool gerando JSON com name + args. O OpenClaw intercepta, executa, e devolve o resultado como a prΓ³xima mensagem.
SKILL.md = runbooks em Markdown. NΓ£o sΓ£o plugins executΓ‘veis. SΓ£o instruΓ§Γ΅es que ensinam o LLM a orquestrar tools para uma tarefa.
PrecedΓͺncia (alta β baixa): 1. Workspace: <workspace>/skills/ (maior) 2. Managed: ~/.openclaw/skills/ 3. Bundled: dentro do pacote OpenClaw 4. Extra: via skills.load.extraDirs
Lazy-loading: O prompt inclui apenas um registry compacto (nome + descriΓ§Γ£o). O SKILL.md completo sΓ³ Γ© lido quando o LLM decide usar a skill (via tool read).
Formato SKILL.md:
---
name: youtube-summary
description: Resumo de vΓdeos YouTube
user-invocable: true
metadata: {"openclaw":{"emoji":"βΆοΈ","os":["linux"]}}
---
## What it does
## Inputs needed
## Workflow (passos numerados)
## Output format
## Guardrails
## Failure handling
Token impact: ~24 tokens por skill no registry. Skills com always: true sΓ£o sempre injetadas.
Agendador de jobs built-in no gateway. Dispara sessΓ΅es de agente em schedule.
openclaw cron add --name "job" --agent <id> \ --every 5m --session isolated \ --timeout-seconds 600 --message "prompt" openclaw cron list # Ver jobs ativos openclaw cron delete --id X # Remover job openclaw cron run --id X # ForΓ§ar execuΓ§Γ£o
Como funciona:
~/.openclaw/cron/jobs.json--session isolated = sessΓ£o descartΓ‘vel (sem histΓ³rico)O LLM nΓ£o sabe que crons existem β ele sΓ³ recebe uma sessΓ£o nova com um prompt. NΓ£o sabe se veio de cron, WhatsApp ou CLI.
HistΓ³rico de conversa persistido em disco. JSONL append-only. O OpenClaw carrega no prompt para dar continuidade. O LLM Γ© stateless β sessions sΓ£o a "memΓ³ria de curto prazo".
Formato: ~/.openclaw/agents/<id>/sessions/<key>.jsonl Session keys (encode security boundaries): agent:main:main β sessΓ£o principal agent:main:dm:whatsapp:+5561... β DM WhatsApp agent:main:group:discord:123 β grupo Discord Cada linha JSONL = um turno: user message | agent thought | tool call | tool result | response dmScope (isolamento): main β todos DMs na mesma sessΓ£o per-peer β isolado por sender per-channel-peer β isolado por canal + sender (recomendado)
Maintenance:
daily (reset Γ s 4h), idle (apΓ³s N min), manualrotateBytes: "10mb" β arquivo novo quando grandepruneAfter: "7d" β remove sessions velhasO LLM Γ© stateless. Toda memΓ³ria persistente Γ© gerenciada pelo OpenClaw. 4 camadas, da mais efΓͺmera Γ mais permanente.
CAMADA 4 β Git History (permanente) βββββββββββββββββββββββββββββββββββββββββββ β Versionamento do workspace (.git/) β β Tudo que Γ© escrito em arquivo tem β β histΓ³rico. Nunca perde. β β Dono: OpenClaw β βββββββββββββββββββββββββββββββββββββββββββ CAMADA 3 β MEMORY.md (longo prazo curada) βββββββββββββββββββββββββββββββββββββββββββ β Arquivo Markdown no workspace β β O agente escreve o que quer lembrar β β Carregado apenas na sessΓ£o principal β β NΓO carregado em grupo/DM sandboxed β β Dono: OpenClaw (persiste e carrega) β β Quem escreve: LLM (via tool write) β βββββββββββββββββββββββββββββββββββββββββββ CAMADA 2 β Notas DiΓ‘rias (mΓ©dio prazo) βββββββββββββββββββββββββββββββββββββββββββ β memory/YYYY-MM-DD.md β β Auto-load: hoje + ontem no inΓcio β β AcessΓveis via memory_search β β Dono: OpenClaw β βββββββββββββββββββββββββββββββββββββββββββ CAMADA 1 β Session Transcript (curto prazo) βββββββββββββββββββββββββββββββββββββββββββ β sessions/*.jsonl β β Carregado inteiro no prompt β β Compactado quando contexto enche β β Dono: OpenClaw β βββββββββββββββββββββββββββββββββββββββββββ
Vector Embeddings (busca semΓ’ntica):
DB: ~/.openclaw/memory/<agentId>.sqlite
GeraΓ§Γ£o: OpenClaw envia texto β LLM provider retorna vetor
(cascata: local β OpenAI β Gemini β disabled)
IndexaΓ§Γ£o: file watcher com 1.5s debounce (auto-reindex)
Busca HΓbrida (2 algoritmos):
BM25 (keyword) β match textual exato
Vector (semΓ’ntico) β match por significado
Post-processing:
- MMR diversity re-ranking
- Temporal decay (recentes pesam mais)
Ciclo de Vida:
1. CRIAΓΓO β LLM chama write("MEMORY.md", ...)
2. PERSISTΓNCIA β OpenClaw grava no disco
3. INDEXAΓΓO β File watcher β embeddings β SQLite
4. RETRIEVAL β Auto-load (MEMORY.md + hoje/ontem)
ou memory_search (vector + BM25)
5. INJEΓΓO β OpenClaw coloca no prompt do LLM
6. USO β LLM "lΓͺ" como se soubesse
O LLM NΓO "lembra". Ele "lΓͺ" o que o OpenClaw colocou.
Se nΓ£o foi escrito em arquivo, estΓ‘ perdido.
Quando o contexto enche, OpenClaw sumariza a conversa antiga para liberar espaΓ§o. Permite conversas infinitas.
PASSO A PASSO: 1. DETECΓΓO (OpenClaw) Tokens se aproximam do limite do modelo Ex: 120k de 128k usados 2. MEMORY FLUSH (OpenClaw β LLM) β turno invisΓvel OpenClaw: "Antes de compactar, salve notas importantes em MEMORY.md" LLM escreve o que acha relevante (NO_REPLY) Isso preserva info crΓtica antes de sumarizar 3. SUMARIZAΓΓO (OpenClaw β LLM) OpenClaw: "Sumarize esta conversa preservando informaΓ§Γ΅es crΓticas e identificadores" LLM gera resumo compacto 4. SUBSTITUIΓΓO (OpenClaw) HistΓ³rico antigo β substituΓdo pelo sumΓ‘rio Marker de compaction gravado no JSONL Contexto volta a ter espaΓ§o (~70% liberado) 5. CONTINUAΓΓO PrΓ³xima mensagem: [sumΓ‘rio] + [msgs recentes] Continuidade semΓ’ntica mantida O LLM NΓO sabe que foi compactado identifierPolicy: "strict" β preserva IDs opacos no sumΓ‘rio (default) "off" β nΓ£o preserva "custom" β instruΓ§Γ΅es customizadas
O "cΓ©rebro". O ΓΊnico componente que nΓ£o Γ© do OpenClaw. Pode ser trocado a qualquer momento β a plataforma Γ© agnΓ³stica.
Providers suportados (20+):
Fallback: Se o primary falhar, OpenClaw tenta o prΓ³ximo da lista automaticamente.
O modelo NΓO sabe: que Γ© um "agente", que existe WhatsApp, que tem ferramentas reais, que tem memΓ³ria persistente. Ele sΓ³ vΓͺ um prompt enorme e responde.
O LLM recebe um prompt montado pelo OpenClaw e gera uma resposta. Stateless β cada chamada Γ© independente. NΓ£o existe "sessΓ£o" no LLM.
Chamada tΓpica (simplificada):
POST https://api.openai.com/v1/chat/completions
{
"model": "gpt-5.4",
"messages": [
{"role": "system", "content": "[PROMPT GIGANTE DO OPENCLAW]"},
{"role": "user", "content": "Resuma este vΓdeo..."},
{"role": "assistant", "content": "Vou executar yt-dlp...",
"tool_calls": [{"function":{"name":"exec","arguments":"..."}}]},
{"role": "tool", "content": "[resultado do exec]"},
...
],
"tools": [...lista de tools...],
"stream": true
}
O OpenClaw constrΓ³i TODA a lista de messages. O LLM sΓ³ processa e responde. NΓ£o gerencia estado.
O LLM pode "pedir" para executar uma ferramenta. Ele gera um JSON com nome + argumentos. O OpenClaw intercepta, executa no host, e devolve o resultado.
1. LLM gera na resposta:
{"tool_calls": [{
"function": {
"name": "exec",
"arguments": "{\"command\": \"free -h\"}"
}
}]}
2. OpenClaw intercepta (NΓO vai pro usuΓ‘rio)
3. OpenClaw verifica permissΓ΅es (tool policy)
4. OpenClaw executa no host: free -h
5. OpenClaw devolve resultado ao LLM como nova mensagem:
{"role": "tool", "content": "total: 7.8Gi used: 1.1Gi..."}
6. LLM continua raciocinando com o resultado
O LLM NΓO executa nada. Ele sΓ³ diz "quero rodar X".
O OpenClaw decide se pode e executa.
Tudo que o LLM "vΓͺ" a cada chamada. 100% montado pelo OpenClaw. O LLM nΓ£o escolhe o que entra.
βββββββββββββββββββββββββββββββββββββββββββββββ β CONTEXT WINDOW DO LLM β β β β βββ System Prompt (OpenClaw) βββββββββββββββ β β β’ Tool definitions (~25 tools) ββ β β β’ Skills registry (nome+desc only) ββ β β β’ Runtime metadata (host, OS, hora) ββ β β β’ AGENTS.md (regras operacionais) ββ β β β’ SOUL.md (personalidade) ββ β β β’ MEMORY.md (memΓ³ria curada) ββ β β β’ Notas de hoje + ontem ββ β ββββββββββββββββββββββββββββββββββββββββββββ β β β βββ HistΓ³rico de conversa ββββββββββββββββββ β β user β assistant β tool β result β ... ββ β β (ou sumΓ‘rio pΓ³s-compaction) ββ β ββββββββββββββββββββββββββββββββββββββββββββ β β β βββ Mensagem atual βββββββββββββββββββββββββ β β "Resuma este vΓdeo: https://..." ββ β ββββββββββββββββββββββββββββββββββββββββββββ β β β Bootstrap cap: 150k chars total β β Per-file limit: 20k chars β βββββββββββββββββββββββββββββββββββββββββββββββ O QUE O LLM NΓO VΓ: β Qual canal (WhatsApp, Telegram...) β Outros agentes no gateway β Cron jobs em background β Sessions de outros usuΓ‘rios β MemΓ³ria nΓ£o injetada no prompt β Conversas anteriores (se nΓ£o estΓ£o no histΓ³rico) β OAuth tokens, API keys, credentials
Via Baileys (implementaΓ§Γ£o WhatsApp Web em Node.js). Single-device por host β apenas 1 gateway por conta.
openclaw channels login --channel whatsapp)pairing (default) β desconhecidos recebem cΓ³digo de 6 dΓgitos, expira em 1hrequireMention: true β sΓ³ responde se mencionadomediaMaxMb)O LLM nΓ£o sabe que WhatsApp existe. Ele recebe uma mensagem formatada pelo OpenClaw: [WhatsApp +5561... 16:01 UTC] Resuma este vΓdeo...
Via grammY framework. Bot token. Suporta grupos com mention patterns customizΓ‘veis.
TELEGRAM_BOT_TOKEN)["@bot", "bot"]Cada canal tem adapter prΓ³prio, auth especΓfica, e polΓticas configurΓ‘veis. O LLM nΓ£o sabe qual canal estΓ‘ sendo usado.
WhatsApp β Baileys Signal β signal-cli Telegram β grammY iMessage β imsg (macOS) Discord β discord.js Matrix β matrix-js-sdk Slack β Slack SDK Google Chat β Google API MS Teams β Bot Framework + muitos outros
Routing: Cada canal pode ser roteado para um agente diferente via bindings.
ConfiguraΓ§Γ£o principal. JSON5 (suporta comentΓ‘rios). Hot-reload β mudanΓ§as seguras aplicadas sem restart.
Root-level keys: agents β defaults, lista, model, workspace, concurrency channels β WhatsApp, Telegram, Discord, Slack... gateway β port, bind, auth, reload session β dmScope, reset, pruning, maintenance cron β jobs, retention, concurrency tools β permissions, exec, fs, elevated, sandbox skills β entries, load, extra dirs browser β headless, SSRF policy env β vars, secrets, shell env Hot-reload modes: hybrid β hot-apply seguras, restart para crΓticas (default) hot β apenas seguras restart β restart para tudo off β manual
~/.openclaw/ βββ openclaw.json # Config principal βββ agents/<id>/agent/ # Auth por agente β βββ auth-profiles.json # OAuth tokens β βββ models.json # Model overrides βββ workspace/ # Workspace main (git repo) β βββ AGENTS.md / SOUL.md / ... # Soul-based files β βββ memory/ # Notas diΓ‘rias β βββ skills/ # Skills (maior precedΓͺncia) βββ workspaces/ # Workspaces adicionais βββ skills/ # Skills gerenciadas βββ memory/<id>.sqlite # Vector embeddings βββ cron/jobs.json # Cron jobs βββ credentials/ # Secrets (0600) βββ browser/ # Perfil Chrome βββ identity/device.json # Ed25519 keypair βββ logs/ media/ devices/ # Auxiliares
OAuth tokens, API keys, secrets. PermissΓ£o 0600. Nunca compartilhar entre agentes.
{ access, refresh, expires, accountId }openclaw models auth login --provider openai-codex (TTY interativo){"source":"env","id":"VAR"} ou {"source":"file","id":"/path"}O LLM nunca vΓͺ credentials. O OpenClaw injeta auth nos headers da API call. Secrets sΓ£o redacted nos logs.