Guia operacional

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.

versão 0.21.7+302 modelo deepseek-flash profiles 5 gateway ativo python 3.14.7

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.

contexto→ LLM→ tool call→ resultado real→ repete→ resposta

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.

Consequência prática: o agente é tão bom quanto o contexto que você dá. Nome de arquivo, caminho absoluto, comando exato, mensagem de erro crua — cada um desses corta um turno de tentativa e erro.

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
Nunca edite 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

FlagPara que serve
-wRoda em git worktree isolado — dois agentes no mesmo repo sem conflito
--yoloPula aprovação de comando perigoso. Só em ambiente descartável
--safe-modeDesliga TODAS as customizações — isola se o problema é config/skill
-t web,terminalRestringe toolsets nesta execução
-m aliasSobrescreve 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

ComandoEfeito
/model nomeTroca de modelo só nesta sessão. --global grava no config
/reasoning highMais esforço de raciocínio (none → xhigh/max/ultra)
/busy steerComo mensagens se comportam enquanto ele trabalha
/memoryRevisa o que ele quer gravar na memória permanente
/learn fonteAprende uma skill a partir de pasta, URL ou desta conversa
/cronGerencia agendamentos sem sair do chat
/usage, /insightsTokens, custo, análise de uso por período
/approve / /denyAutoriza ou recusa comando perigoso pendente (gateway)
/reloadRecarrega .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-gateway e me diga a causa”
  • “curl -I https://site retornou 502; ache o erro e conserte, depois confirme com novo curl”
  • “sobe /root/app em app.dominio com nginx + certbot, me devolve a URL funcionando”
  • “revisa bot.py procurando token em log e falta de retry; liste e aplique”

Sete padrões que funcionam sempre

PadrãoComo 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
Formato de saída: diga como quer a resposta. “tabela”, “só os comandos”, “explicação em 3 linhas”, “com caminhos absolutos”. Sem isso, o padrão é detalhado — bom para aprender, ruim quando você só quer executar.
Quando o pedido é grande demais: o loop se perde no meio. Quebre em etapas nomeadas (“primeiro X. pare. depois Y”) ou use /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.

tarefa chega→ match por descrição→ carrega SKILL.md→ segue o procedimento

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.

Regra de ouro: quando uma tarefa difícil termina, peça “salva isso como skill”. Na próxima vez ela custa 1 turno em vez de 15.

06Memória

Três camadas diferentes, com propósitos diferentes:

CamadaGuardaCusto
Memória
memories/
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
HonchoHistórico semântico de todas as conversas. Buscado por similaridade quando relevante.Zero no contexto até ser consultado
Sessões
state.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.md ou doc)
  • Estado de agora → nada, vive na sessão
/memory                  # revisa escritas pendentes
hermes memory status
hermes memory setup
hermes config get memory.enabled
Memória cheia é memória inútil. Se está no teto, o caminho é consolidar e remover entradas velhas — não cortar a nova informação. Memória com log de tarefas concluídas está sendo usada errado.

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:

ProfileModeloPapel
defaultdeepseek-flashconversa principal, dia a dia
code-gatesdeepseek-flashapps, código, deploy
nightwatcherdeepseek-flashautomação residencial
omegadeepseek-flashdomínio marítimo
namoradasolar-pro4:freeinstâ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.json dele, não só no global.
  • Bot próprio — token separado no .env do profile. Dois gateways no mesmo token colidem.
O gateway multiplexado reconcilia profiles sozinho quando .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 run antes 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).

Resultado de subagente é auto-relato, não fato verificado. Para efeito externo — upload, deploy, escrita remota — exija um handle verificável (URL, ID, caminho) e confira você mesmo.

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

ComandoEfeito
/sethomeDefine este chat como home channel (destino de cron e mensagens proativas)
/restartReinicia o gateway drenando runs ativos primeiro
/platform pause|resumePausa uma plataforma que está falhando sem derrubar as outras
/topic offDesliga sessões por tópico em DM do Telegram
/approve /denyLibera ou barra comando perigoso pendente
/footer onMostra metadados de execução (modelo, tokens) na resposta
Entrega agendada: origin volta para o chat que criou o job; telegram vai para o home channel; local grava só em ~/.hermes/cron/output/.
Token de bot é credencial. Nunca cole no chat, nunca no 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

AliasModelo
deepseek-flashdeepseek/deepseek-flash — rápido e barato, padrão atual
deepseek-v4-prodeepseek/deepseek-v4-pro — raciocínio pesado
opusnous/anthropic/claude-opus-5
openrouter-solaropenrouter/upstage/solar-pro4:free
step5, laguna, longcatmodelos 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.

Pool de credenciais: mais de uma chave por provider forma um pool que rotaciona sozinho e pula chave esgotada. É o que evita o job de cron morrer por falta de crédito às 3h da manhã.
Falha de crédito é silenciosa nos agendamentos. Confira o 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.

RegraDetalhe
Segredos no .envAPI keys, tokens de bot. Configuração vai no config.yaml; credencial vai no .env. Sem exceção.
Aprovação de comandoComando destrutivo pede confirmação. /yolo desliga — use só em container
Redação de segredoChaves conhecidas são mascaradas em logs e mensagens. Ainda assim: não cole token no chat
Escopo de escritaDiga o diretório permitido. “só dentro de /root/app” evita surpresa
Revisão antes do efeitorm, DROP, docker compose down -v, rotação de chave: peça o plano antes
Backuphermes backup / /snapshot antes de mexer em config crítica
VaultSenhas e cartões passam pelo cofre, nunca digitados por ferramenta nem aceitos no chat
Três coisas que nunca se faz: (1) colar token ou senha no chat; (2) rodar --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

SintomaPrimeiro comandoDepois
Bot não respondehermes gateway statusjournalctl --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/modelhermes fallback add · confira last failure do cron
Ferramenta sumiuhermes tools listhermes tools enable NOME · /reload
Mudei o .env/reloadse for o gateway: hermes gateway restart
Comportamento estranho sem causahermes --safe-modeisola config/skill; depois hermes doctor --fix
Config corrompidohermes config check/snapshot restore · hermes doctor --fix
Skill não carregahermes skills checkrevise a descrição — é ela que decide o match
Cron não disparahermes cron run IDse roda manual e falha no horário: timezone ou .tick.lock
Subagente “limitado a N”hermes config get delegation.max_concurrent_childrenaqui está 10; acima disso o modelo está se auto-limitando
Tudo quebradohermes doctorhermes logs errors · hermes update
Diagnóstico em 3 passos: (1) é config ou é contexto? → --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

CaminhoO que é
~/.hermes/config.yamlConfiguração. Nunca editar na mão com o gateway rodando
~/.hermes/.envSegredos: API keys, tokens de bot. chmod 600
~/.hermes/skills/Skills instaladas, por categoria
~/.hermes/skills/.usage.jsonTelemetria: uso, última atividade, estado
~/.hermes/state.dbSessões (SQLite + FTS5)
~/.hermes/sessions/Índice de roteamento do gateway, transcrições .jsonl
~/.hermes/logs/gateway.log, erros
~/.hermes/auth.jsonTokens 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)
Path seguro: com profile ativo, resolva sempre por $HERMES_HOME — nunca hardcode ~/.hermes.

As cinco regras que resumem tudo

  1. Peça resultado, não plano. O agente tem mãos.
  2. Dê contexto verificável. Caminho absoluto e erro cru valem mais que adjetivo.
  3. Exija prova. “Está no ar” só conta com curl 200.
  4. Feche o ciclo. Tarefa que vai repetir vira skill; fato estável vira memória.
  5. Contexto limpo pensa melhor. /new quando muda o assunto, /compact quando incha.