Hermes, do jeito que funciona
Um agente com loop de ferramentas, memória persistente e skills que ele mesmo escreve. Este manual é o que eu queria ter lido no primeiro dia: o que cada peça faz, os comandos que importam e como pedir para acertar de primeira.
01Modelo mental
Hermes não é um chatbot que “sabe” coisas. É um loop: o modelo decide, as ferramentas executam, o resultado volta para o contexto, e ele decide de novo — até terminar.
Isso explica a regra mais importante do manual: tudo que é verificável é verificado na máquina. Data, versão, se o serviço está de pé, conteúdo de arquivo, soma — nada disso vem da memória do modelo. Se uma resposta depende de fato externo, o caminho é uma ferramenta.
🧠Modelo
O cérebro. Só texto-dentro, texto-e-pedidos-de-ferramenta-fora. Trocável a qualquer momento com /model.
🔧Ferramentas
Terminal, arquivos, browser, web, visão, geração de imagem, delegação, cron. É o que transforma intenção em efeito.
📚Skills
Procedimentos em markdown. Não ficam no contexto: só nome e descrição. O corpo carrega quando a tarefa bate.
💾Memória
Fatos permanentes sobre você e o ambiente, injetados em todo turno. É o que faz ele “já saber” onde ficam as coisas.
🚪Gateway
O processo que liga o mesmo agente a Telegram, Discord, API. Multiplexa todos os profiles num só serviço.
🗂️Sessões
Uma conversa = uma sessão, guardada em SQLite com busca full-text. /new abre outra sem perder a antiga.
02CLI essencial
O binário hermes sem argumento abre o chat interativo. Todo o resto é subcomando.
Todo dia
hermes # chat interativo
hermes chat -q "pergunta" # uma pergunta, resposta e sai
hermes -c # continua a sessão mais recente
hermes -c <id> # retoma sessão específica
hermes -p omega chat -q "..." # roda em outro profile
hermes doctor # checagem de saúde geral
hermes status --all # estado de todos os componentes
Configuração — sempre por comando, nunca editando o YAML na mão
hermes config get model.default
hermes config set display.skin synthwave
hermes config show # dump completo
hermes config check # valida o arquivo
hermes config edit # abre no $EDITOR
config.yaml manualmente enquanto o gateway roda. Uma indentação errada derruba o serviço inteiro. Use hermes config set CHAVE VALOR.Skills e ferramentas
hermes skills list # instaladas
hermes skills browse # catálogo
hermes skills search docker
hermes skills install ID # id do hub ou URL de SKILL.md
hermes tools list # toolsets e estado
hermes tools enable video
hermes bundles # pacotes de skills
Serviço, logs, sessões
hermes gateway status
hermes gateway restart
hermes logs -f # acompanha ao vivo
hermes logs errors # só erros
hermes sessions list
hermes sessions browse
hermes sessions export out.md
hermes sessions prune --older 30d
Agendamento e profiles
hermes cron list
hermes cron create "every day 9am" --prompt "..." # via CLI
hermes cron pause f1cda980daab
hermes cron run f1cda980daab
hermes profile list
hermes profile show code-gates
hermes profile create meunome --clone --description "escopo"
Flags que salvam o dia
| Flag | Para que serve |
|---|---|
-w | Roda em git worktree isolado — dois agentes no mesmo repo sem conflito |
--yolo | Pula aprovação de comando perigoso. Só em ambiente descartável |
--safe-mode | Desliga TODAS as customizações — isola se o problema é config/skill |
-t web,terminal | Restringe toolsets nesta execução |
-m alias | Sobrescreve modelo só nesta chamada |
-z "prompt" | One-shot para script: imprime só a resposta final |
03Comandos na conversa
Funcionam no chat, no Telegram e no TUI. /help sempre mostra a lista real — o registro muda com frequência.
Controle de sessão
/new
Começa do zero. Use quando o assunto muda de verdade — contexto limpo pensa melhor.
/compact
Comprime o histórico. Quando o custo sobe e as respostas ficam lentas.
/undo [N]
Volta N turnos e re-pergunta. Melhor que “esquece o que eu disse”.
/retry
Reenvia a última mensagem. Útil quando o modelo travou num caminho ruim.
/branch
Bifurca a sessão: testa um caminho alternativo sem perder o original.
/status
Modelo, tokens, contexto usado. Seu primeiro reflexo quando algo parece estranho.
Durante uma tarefa longa
/btw pergunta
Dúvida lateral sem interromper o trabalho em andamento. O melhor truque da lista.
/queue texto
Enfileira a próxima instrução em vez de atropelar a atual.
/steer texto
Corrige o rumo na próxima ferramenta, sem matar a execução.
/bg prompt
Joga a tarefa numa sessão paralela e continua conversando aqui.
/agents
Quem está rodando agora — subagentes e processos.
/stop
Mata os processos em background que o agente abriu.
Configuração em tempo real
| Comando | Efeito |
|---|---|
/model nome | Troca de modelo só nesta sessão. --global grava no config |
/reasoning high | Mais esforço de raciocínio (none → xhigh/max/ultra) |
/busy steer | Como mensagens se comportam enquanto ele trabalha |
/memory | Revisa o que ele quer gravar na memória permanente |
/learn fonte | Aprende uma skill a partir de pasta, URL ou desta conversa |
/cron | Gerencia agendamentos sem sair do chat |
/usage, /insights | Tokens, custo, análise de uso por período |
/approve / /deny | Autoriza ou recusa comando perigoso pendente (gateway) |
/reload | Recarrega .env sem reiniciar sessão |
04Como pedir bem
Esta é a seção que muda o resultado mais do que qualquer comando. O agente faz exatamente o que é verificável — então dê a ele algo verificável.
A anatomia de um bom pedido
1. RESULTADO → o que deve existir no fim (arquivo, URL, serviço de pé)
2. CONTEXTO → caminhos absolutos, comando exato, erro cru
3. CRITÉRIO → como saber que funcionou (teste, curl, systemctl)
4. LIMITES → o que NÃO tocar
Compare:
✗ Vago
- “me ajuda com o bot do telegram”
- “dá uma olhada no site, acho que caiu”
- “como faço pra subir isso no nginx?”
- “melhora esse código”
✓ Acionável
- “o @LF_XDown_bot parou de responder; rode
systemctl --user status hermes-gatewaye me diga a causa” - “
curl -I https://siteretornou 502; ache o erro e conserte, depois confirme com novo curl” - “sobe
/root/appemapp.dominiocom nginx + certbot, me devolve a URL funcionando” - “revisa
bot.pyprocurando token em log e falta de retry; liste e aplique”
Sete padrões que funcionam sempre
| Padrão | Como escrever |
|---|---|
| Peça execução | “faça e me mostre a saída” — não “como eu faria”. O agente tem terminal; deixe ele usar |
| Peça artefato | “um arquivo em /root/x” > “me explique como criar o arquivo” |
| Exija prova | “confirme com curl antes de dizer que está no ar” |
| Encadeie condicional | “tenta A; se falhar, faz B e me diz qual caminho foi” |
| Delimite | “não mexa no .env” / “só neste diretório” |
| Peça o diff | “antes de aplicar, mostre o que vai mudar” |
| Feche com memória | “guarde isso como skill” — transforma trabalho em ativo reutilizável |
/goal para fixar o objetivo entre turnos.05Skills
Uma skill é um SKILL.md com frontmatter e um procedimento. O sistema mostra ao modelo apenas nome + descrição (~uma linha); o corpo inteiro só entra no contexto quando a tarefa combina. É por isso que ter 100 skills não custa 100 prompts.
O que merece virar skill
✅Vira skill
Procedimento que você repete: publicar site, criar bot, revisar PR, gerar relatório. Passos + armadilhas + comandos exatos.
❌Não vira skill
Fato único (“meu IP é X”) → memória. Estado temporário (“estou no passo 3”) → sessão. Nada disso é procedimento.
# criar a partir do que acabou de funcionar
/learn esta conversa
hermes skills install https://exemplo/SKILL.md
hermes skills check # valida frontmatter
hermes skills update
# manutenção automática (só mexe em skills criadas pelo agente)
hermes curator status
hermes curator pin minha-skill # nunca arquivar
A descrição é o que decide se a skill carrega. Ela começa com o gatilho: “Use quando <situação>. <comportamento em uma linha>.” Descrição genérica = skill que nunca aparece.
06Memória
Três camadas diferentes, com propósitos diferentes:
| Camada | Guarda | Custo |
|---|---|---|
Memóriamemories/ | Fatos que valem para toda sessão: quem você é, onde ficam as coisas, convenções. Injetada em cada turno. | Ocupa contexto sempre — por isso tem teto e precisa ser enxuta |
| Honcho | Histórico semântico de todas as conversas. Buscado por similaridade quando relevante. | Zero no contexto até ser consultado |
Sessõesstate.db | Transcrições completas, com busca full-text. | Lido sob demanda (session_search) |
Regra de alocação
- Fato estável sobre você / ambiente → memória
- Procedimento repetível → skill
- Detalhe de um projeto específico → arquivo do projeto (
AGENTS.mdou doc) - Estado de agora → nada, vive na sessão
/memory # revisa escritas pendentes
hermes memory status
hermes memory setup
hermes config get memory.enabled
Contexto de projeto
Um AGENTS.md (ou .hermes.md) no diretório é carregado automaticamente quando o agente trabalha ali. É o lugar certo para “como este repo funciona”, “não use Y”, “testes rodam com Z”. Escopo local, sem poluir a memória global.
07Profiles
Profile = uma instância independente: config, .env, skills, sessões e memória próprios. Serve para separar domínios — não para separar assuntos.
Sua máquina hoje:
| Profile | Modelo | Papel |
|---|---|---|
default | deepseek-flash | conversa principal, dia a dia |
code-gates | deepseek-flash | apps, código, deploy |
nightwatcher | deepseek-flash | automação residencial |
omega | deepseek-flash | domínio marítimo |
namorada | solar-pro4:free | instância separada de outra pessoa |
hermes profile list
hermes profile create meu-escopo --clone --description "o que ele faz e o que recusa"
hermes profile show meu-escopo
hermes -p meu-escopo config set model.default deepseek-v4-pro
hermes -p meu-escopo chat -q "qual seu escopo?" # valide de verdade
O que faz um profile funcionar
- SOUL.md próprio — escopo dentro, escopo fora, regras de trabalho. Sem isso ele vira uma cópia do chat principal e a separação não compra nada.
- Modelo re-escolhido — o clone herda o modelo do pai, que quase nunca é o certo para o novo papel.
- Honcho configurado — o host do profile precisa existir no
honcho.jsondele, não só no global. - Bot próprio — token separado no
.envdo profile. Dois gateways no mesmo token colidem.
.env ou config mudam. Só reinicie se o log mostrar 0 adapter(s) connected com token válido.08Cron & delegação
Duas formas de trabalho fora do turno. A diferença é a durabilidade.
Cron — durável
Vive no banco, sobrevive a restart, entrega em qualquer plataforma. É o que você quer para rotina.
# via conversa: "todo dia às 8:50 me manda o check-in"
hermes cron list
hermes cron pause <id>
hermes cron run <id> # testa agora, sem esperar o horário
hermes cron remove <id>
- Agendas:
30m,every 2h,0 9 * * *,every monday 9am, timestamp ISO - Knobs: skills a pré-carregar, modelo próprio, script de coleta prévia,
context_from(encadeia a saída de um job no outro),workdir - Limite: 3 minutos de execução por run. Trabalho longo vai para
terminal(background=true) - Sempre teste com
cron runantes de confiar no horário
Delegação — paralela, não durável
delegate_task abre subagentes com contexto e terminal próprios. Cada um recebe só o que você passar — eles não sabem nada desta conversa.
✅Bom uso
Pesquisar 5 fontes em paralelo, revisar 3 arquivos independentes, comparar abordagens. Trabalho que se divide sem dependência.
❌Mau uso
Uma tarefa só (chame a ferramenta direto), trabalho que precisa perguntar algo (subagente não pergunta), coisa que deve durar horas (use cron).
09Telegram & gateway
O gateway (hermes-gateway.service, user unit) mantém todos os profiles conectados ao mesmo tempo. Cada DM ou thread é uma sessão separada.
hermes gateway status
hermes gateway restart
hermes gateway install # systemd, sobe no boot
journalctl --user -u hermes-gateway -f
hermes logs -f | grep -i adapter
Comandos exclusivos do gateway
| Comando | Efeito |
|---|---|
/sethome | Define este chat como home channel (destino de cron e mensagens proativas) |
/restart | Reinicia o gateway drenando runs ativos primeiro |
/platform pause|resume | Pausa uma plataforma que está falhando sem derrubar as outras |
/topic off | Desliga sessões por tópico em DM do Telegram |
/approve /deny | Libera ou barra comando perigoso pendente |
/footer on | Mostra metadados de execução (modelo, tokens) na resposta |
origin volta para o chat que criou o job; telegram vai para o home channel; local grava só em ~/.hermes/cron/output/.config.yaml. Vai no .env do profile. Se apareceu em uma conversa, considere comprometido e rotacione no @BotFather antes de qualquer outra coisa.10Modelos & custo
Trocar de modelo é uma linha, e é a alavanca mais direta de custo/qualidade.
/model # picker interativo, só nesta sessão
/model deepseek-v4-pro
/model opus --global # grava no config
hermes fallback list # cadeia de fallback quando um falha
hermes auth status # credenciais e pools
Aliases configurados aqui
| Alias | Modelo |
|---|---|
deepseek-flash | deepseek/deepseek-flash — rápido e barato, padrão atual |
deepseek-v4-pro | deepseek/deepseek-v4-pro — raciocínio pesado |
opus | nous/anthropic/claude-opus-5 |
openrouter-solar | openrouter/upstage/solar-pro4:free |
step5, laguna, longcat | modelos gratuitos via Nous |
Heurística de escolha
⚡Flash / mini
Conversa, resumo, comandos, rotina de cron. 90% do uso diário.
🧠Pro
Debug difícil, arquitetura, revisão de código, decisão com trade-off.
🎛️MoA
Vários modelos em paralelo + agregador. Qualidade máxima, custo máximo. Vale para uma pergunta crítica, não para o dia todo.
last failure em hermes cron list de vez em quando — job “ativo” pode estar falhando há semanas.11Segurança
O agente executa comandos reais na máquina. Trate como um operador com shell, porque é exatamente isso.
| Regra | Detalhe |
|---|---|
Segredos no .env | API keys, tokens de bot. Configuração vai no config.yaml; credencial vai no .env. Sem exceção. |
| Aprovação de comando | Comando destrutivo pede confirmação. /yolo desliga — use só em container |
| Redação de segredo | Chaves conhecidas são mascaradas em logs e mensagens. Ainda assim: não cole token no chat |
| Escopo de escrita | Diga o diretório permitido. “só dentro de /root/app” evita surpresa |
| Revisão antes do efeito | rm, DROP, docker compose down -v, rotação de chave: peça o plano antes |
| Backup | hermes backup / /snapshot antes de mexer em config crítica |
| Vault | Senhas e cartões passam pelo cofre, nunca digitados por ferramenta nem aceitos no chat |
--yolo na máquina de produção; (3) deixar .env com permissão aberta (chmod 600).hermes security status
chmod 600 ~/.hermes/.env
hermes secrets bitwarden # cofre externo opcional
hermes backup
12Receitas prontas
Pedidos que funcionam. Copie e adapte o caminho/nome.
Serviço sempre no ar
"O bot X precisa ficar online 24/7. Crie uma unit systemd de usuário com
Restart=always, RestartSec=3, enable --now, e confirme com systemctl --user
status que está active. Depois simule uma queda com kill e mostre que voltou."
Site estático com HTTPS
"Publique /root/site em https://app.72.61.27.32.sslip.io usando nginx +
certbot. No fim, me devolva o resultado de curl -I mostrando 200 e o
certificado válido. Não toque em nenhum outro vhost."
Pesquisa em paralelo com citações
"Pesquise X em 4 fontes independentes usando delegate_task em paralelo.
Cada subagente deve retornar trechos com URL de origem. Consolide em
/root/pesquisa.md com uma seção por fonte e uma conclusão citando os links."
Monitoramento com alerta
"Crie um cron diário às 9h que checa o preço de Y e me manda no Telegram
só se cair abaixo de Z. Rode uma vez agora com cron run para eu ver o formato."
Revisão antes de commitar
"Revise o diff de hoje procurando: segredo vazado, query sem índice,
falta de tratamento de erro em chamada externa, e código morto.
Liste por arquivo com linha. Não aplique nada ainda."
Transformar trabalho em ativo
"O que acabamos de fazer vai se repetir todo mês. Salve como skill
'subir-app-nginx' com os passos exatos, as armadilhas que encontramos
e o comando de verificação."
Recuperar contexto antigo
"Busque nas sessões antigas o que decidimos sobre a stack do app do
embarque e me resuma com a data de cada decisão."
Handoff para outro profile
hermes -p omega chat --query-file /root/handoff.txt
Contexto longo vai em arquivo, nunca colado no PTY — colagem grande trunca e trava o stream.
13Socorro
| Sintoma | Primeiro comando | Depois |
|---|---|---|
| Bot não responde | hermes gateway status | journalctl --user -u hermes-gateway -n 50 · /platform list |
| Resposta lenta / cara | /status | /compact e, se o assunto mudou, /new |
| Erro de crédito do modelo | /model | hermes fallback add · confira last failure do cron |
| Ferramenta sumiu | hermes tools list | hermes tools enable NOME · /reload |
Mudei o .env | /reload | se for o gateway: hermes gateway restart |
| Comportamento estranho sem causa | hermes --safe-mode | isola config/skill; depois hermes doctor --fix |
| Config corrompido | hermes config check | /snapshot restore · hermes doctor --fix |
| Skill não carrega | hermes skills check | revise a descrição — é ela que decide o match |
| Cron não dispara | hermes cron run ID | se roda manual e falha no horário: timezone ou .tick.lock |
| Subagente “limitado a N” | hermes config get delegation.max_concurrent_children | aqui está 10; acima disso o modelo está se auto-limitando |
| Tudo quebrado | hermes doctor | hermes logs errors · hermes update |
--safe-mode. (2) é o agente ou o serviço? → hermes chat -q "oi". (3) é este profile ou todos? → hermes -p default chat -q "oi".Higiene periódica
hermes doctor --fix # mensal
hermes sessions prune --older 60d
hermes curator status # skills paradas viram arquivo
hermes backup
hermes update
14Mapa de arquivos
| Caminho | O que é |
|---|---|
~/.hermes/config.yaml | Configuração. Nunca editar na mão com o gateway rodando |
~/.hermes/.env | Segredos: API keys, tokens de bot. chmod 600 |
~/.hermes/skills/ | Skills instaladas, por categoria |
~/.hermes/skills/.usage.json | Telemetria: uso, última atividade, estado |
~/.hermes/state.db | Sessões (SQLite + FTS5) |
~/.hermes/sessions/ | Índice de roteamento do gateway, transcrições .jsonl |
~/.hermes/logs/ | gateway.log, erros |
~/.hermes/auth.json | Tokens OAuth e pools de credencial |
~/.hermes/cron/ | Jobs e output/ das entregas locais |
~/.hermes/profiles/<nome>/ | Mesma estrutura, isolada por profile |
~/.hermes/skins/ | Temas customizados |
/usr/local/lib/hermes-agent/ | Código-fonte (instalação git) |
$HERMES_HOME — nunca hardcode ~/.hermes.As cinco regras que resumem tudo
- Peça resultado, não plano. O agente tem mãos.
- Dê contexto verificável. Caminho absoluto e erro cru valem mais que adjetivo.
- Exija prova. “Está no ar” só conta com
curl200. - Feche o ciclo. Tarefa que vai repetir vira skill; fato estável vira memória.
- Contexto limpo pensa melhor.
/newquando muda o assunto,/compactquando incha.