Documentação oficial desta página · v0.20.6
SMS (Twilio)
O Hermes se conecta a SMS pela API da Twilio. As pessoas mandam mensagem para o seu número da Twilio e recebem respostas do agente — mesma experiência de conversa do Telegram ou do Discord, mas por mensagem de texto comum.
O gateway de SMS compartilha credenciais com a skill opcional de telefonia. Se você já configurou a
Twilio para chamadas de voz ou SMS avulsos, o gateway funciona com os mesmos
TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN e TWILIO_PHONE_NUMBER.
Pré-requisitos
- Conta na Twilio — cadastre em twilio.com (há teste gratuito)
- Um número da Twilio com capacidade de SMS
- Um servidor acessível pela internet — a Twilio manda webhooks para o seu servidor quando chega SMS
- aiohttp —
cd ~/.hermes/hermes-agent && uv pip install -e ".[sms]"
Passo 1: pegue suas credenciais
- Entre no console da Twilio
- Copie o Account SID e o Auth Token do painel
- Vá em Phone Numbers → Manage → Active Numbers — anote o número no formato E.164 (por
exemplo,
+5511999999999)
Passo 2: configure o Hermes
Configuração interativa (recomendada)
hermes gateway setup
Escolha SMS (Twilio) na lista de plataformas. O assistente pede as credenciais.
Configuração manual
Acrescente em ~/.hermes/.env:
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=seu_auth_token
TWILIO_PHONE_NUMBER=+5511999999999
# Segurança: restrinja a números específicos (recomendado)
SMS_ALLOWED_USERS=+5511988887777,+5511977776666
# Opcional: canal principal, para entrega de tarefas de cron
SMS_HOME_CHANNEL=+5511988887777
Passo 3: configure o webhook na Twilio
A Twilio precisa saber para onde mandar as mensagens que chegam. No console da Twilio:
- Vá em Phone Numbers → Manage → Active Numbers
- Clique no seu número
- Em Messaging → A MESSAGE COMES IN, defina:
- Webhook:
https://seu-servidor:8080/webhooks/twilio - HTTP Method:
POST
- Webhook:
Se você roda o Hermes localmente, use um túnel para expor o webhook:
# com cloudflared
cloudflared tunnel --url http://localhost:8080
# com ngrok
ngrok http 8080
Use a URL pública resultante como webhook na Twilio.
Defina o SMS_WEBHOOK_URL com a mesma URL que você configurou na Twilio. Isso é obrigatório
para a validação de assinatura — o adaptador se recusa a subir sem essa variável:
# Precisa bater com a URL do webhook no console da Twilio
SMS_WEBHOOK_URL=https://seu-servidor:8080/webhooks/twilio
A porta do webhook é 8080 por padrão. Troque com:
SMS_WEBHOOK_PORT=3000
Passo 4: suba o gateway
hermes gateway
Você deve ver:
[sms] Twilio webhook server listening on 127.0.0.1:8080, from: +1555***4567
Se aparecer Refusing to start: SMS_WEBHOOK_URL is required, defina o SMS_WEBHOOK_URL com a URL
pública configurada no console da Twilio (passo 3).
Mande uma mensagem para o seu número da Twilio — o Hermes responde por SMS.
Variáveis de ambiente
| Variável | Obrigatória | Descrição |
|---|---|---|
TWILIO_ACCOUNT_SID | Sim | Account SID da Twilio (começa com AC) |
TWILIO_AUTH_TOKEN | Sim | Auth Token (usado também na validação de assinatura) |
TWILIO_PHONE_NUMBER | Sim | Seu número da Twilio (formato E.164) |
SMS_WEBHOOK_URL | Sim | URL pública, para a validação de assinatura — precisa bater com a do console |
SMS_WEBHOOK_PORT | Não | Porta do webhook (padrão: 8080) |
SMS_WEBHOOK_HOST | Não | Endereço em que escuta (padrão: 127.0.0.1) |
SMS_INSECURE_NO_SIGNATURE | Não | true desliga a validação de assinatura (só desenvolvimento local — nunca em produção) |
SMS_ALLOWED_USERS | Não | Números E.164 autorizados, separados por vírgula |
SMS_ALLOW_ALL_USERS | Não | true libera qualquer pessoa (não recomendado) |
SMS_HOME_CHANNEL | Não | Número para entrega de cron e notificações |
SMS_HOME_CHANNEL_NAME | Não | Nome de exibição do canal principal (padrão: Home) |
Comportamento específico do SMS
- Só texto puro — o markdown é removido, porque o SMS o mostraria como caracteres literais
- Limite de 1600 caracteres — respostas maiores são divididas em várias mensagens, em pontos naturais (quebras de linha, depois espaços)
- Prevenção de eco — mensagens vindas do seu próprio número da Twilio são ignoradas, para evitar laços
- Números ocultos nos logs — os números de telefone são mascarados, por privacidade
Segurança
Validação de assinatura
O Hermes confere que os webhooks vêm mesmo da Twilio, verificando o cabeçalho X-Twilio-Signature
(HMAC-SHA1). Isso impede que um atacante injete mensagens forjadas.
O SMS_WEBHOOK_URL é obrigatório. Defina com a URL pública do console da Twilio. O adaptador se
recusa a subir sem ela.
Para desenvolvimento local, sem URL pública, dá para desligar a validação:
# Só desenvolvimento local — NÃO use em produção
SMS_INSECURE_NO_SIGNATURE=true
Listas de permissão
O gateway nega todos os usuários por padrão. Configure uma lista:
# Recomendado: restringir a números específicos
SMS_ALLOWED_USERS=+5511988887777,+5511977776666
# Ou liberar todo mundo (NÃO recomendado com bots que têm acesso ao terminal)
SMS_ALLOW_ALL_USERS=true
SMS não tem criptografia embutida. Não use SMS para operações sensíveis, a menos que você entenda as implicações. Para casos sensíveis, prefira Signal ou Telegram.
Resolução de problemas
Mensagens não chegam
- Confira se a URL do webhook está certa e acessível pela internet
- Confirme o
TWILIO_ACCOUNT_SIDe oTWILIO_AUTH_TOKEN - Olhe o console da Twilio em Monitor → Logs → Messaging, atrás de erros de entrega
- Garanta que o seu número está no
SMS_ALLOWED_USERS(ou useSMS_ALLOW_ALL_USERS=true)
Respostas não são enviadas
- Confira o
TWILIO_PHONE_NUMBER(formato E.164, com+) - Confirme que sua conta na Twilio tem números com capacidade de SMS
- Procure erros da API da Twilio nos logs do gateway
Conflito de porta do webhook
Se a porta 8080 já está em uso, troque:
SMS_WEBHOOK_PORT=3001
Atualize a URL do webhook no console da Twilio.