Mirna

HaaS — Deploy Guide

Mission Control / Deploy Guide · HaaS v2.1
HaaS v2.1 · Guia Oficial
Mirna HaaS
Hermes as a Service — Plataforma de agentes AI da CondoConta

O que é Mirna HaaS?

Mirna HaaS (Hermes as a Service) é a plataforma de agentes AI da CondoConta, construída sobre o Hermes Agent — um framework open-source de orquestração de agentes AI.

Cada área da empresa recebe um agente AI dedicado com persona própria, acesso ao projeto Jira da área, skills especializadas e integração com Slack e/ou Telegram.

A Mirna é o hub nativo (roda direto no VPS sem Docker) e coordena todos os spokes. Ela é a gestora central — recebe pedidos de deploy, decide a porta, configura o ambiente e faz tudo acontecer.

Topologia Hub-and-Spoke

flowchart TD Mirna["🧠 Mirna — Hub · Gestora Central"] Eva["👩‍💼 Eva — Collection"]:::active OB2["🏦 OB2 — Tesouraria"]:::standby FINC["💰 FINC — Finance"]:::standby REV["📊 REV — Sales"]:::standby Mais["··· +6 Spokes"]:::future Mirna --> Eva Mirna --> OB2 Mirna --> FINC Mirna --> REV Mirna -.-> Mais style Mirna fill:#7c3aed,stroke:#6d28d9,color:#ffffff,font-weight:bold classDef active fill:#f0fdf4,stroke:#48bb78,color:#1e293b classDef standby fill:#fff7ed,stroke:#f97316,color:#1e293b classDef future fill:#f8fafc,stroke:#cbd5e1,color:#64748b,stroke-dasharray:5 5
Native (sem Docker) Docker Container Em standby

Hub (Mirna): Processo nativo no VPS, sem Docker. É a gestora central que coordena todos os spokes e recebe pedidos de deploy.

Spokes: Containers Docker isolados. Cada um com seu projeto Jira, persona, skills e canal de comunicação.

Pré-requisitos

Para pedir um novo agente, você só precisa ter claro:

  • Qual área da CondoConta o agente vai atender
  • Qual o projeto Jira da área
  • Quem é a usuária (pessoa responsável)
  • Qual a persona do agente (como ele deve agir)
  • Se precisa de Slack e/ou Telegram
Não se preocupe com infra: Porta, Docker, .env, deploy — a Mirna resolve tudo. Você só define o JSON de configuração e chama ela.
Criar Novo Agente
Defina o JSON e chame a Mirna — ela faz o resto

1 Criar o JSON de configuração

Monte um JSON com as informações do agente. Não inclua porta — a Mirna decide automaticamente a próxima porta disponível.

{
  "name": "eva",
  "team": "collection",
  "area": "Collection",
  "jira_project": "CAIX",
  "persona": "Cobrança empática. Foco na recuperação de inadimplência com tom profissional e humano.",
  "usuario": "Solange",
  "canais": ["slack", "telegram"],
  "skills": ["collection-queries", "eva-cartilha-collection"],
  "profiles": ["EVA"],
  "crons": [
    {
      "schedule": "0 8 * * *",
      "prompt": "Gere o report diário de acordos e envie no Slack #collection",
      "deliver": "slack:C028TDGD77V",
      "model": "google/gemini-2.5-flash",
      "enabled": true
    },
    {
      "schedule": "*/30 8-21 * * 1-5",
      "prompt": "Sincronize cache de acordos e massivos",
      "deliver": "local",
      "no_agent": true,
      "enabled": true
    }
  ]
}

Campos do JSON:

  • name — nome do agente (lowercase, sem espaços) ✓ obrigatório
  • team — time/área slugificado (ex: collection, finance) ✓ obrigatório
  • area — nome da área por extenso (ex: "Collection", "Customer Success") ✓ obrigatório
  • jira_project — key do projeto Jira (ex: CAIX, OB2, FINC) ✓ obrigatório
  • persona — descrição da personalidade e tom do agente ✓ obrigatório
  • usuario — nome da pessoa responsável pelo agente ✓ obrigatório
  • canais — canais de comunicação: "slack", "telegram" ou ambos opcional
  • skills — lista de skills para o agente opcional
  • profiles — lista de sub-agentes/profiles opcional
  • crons — tarefas agendadas opcional
    • schedule — expressão cron (ex: "0 8 * * *")
    • prompt — instrução que o agente executa
    • deliver — destino: "slack:CHANNEL_ID", "telegram:CHAT_ID" ou "local"
    • model — modelo LLM (default: mesmo do agente). Para tarefas mecânicas, use "google/gemma-4-26b-a4b-it"
    • no_agenttrue para tarefas mecânicas (zero tokens, só roda script)
    • enabledtrue (default) ou false
Sem porta no JSON! A Mirna aloca automaticamente a próxima porta disponível (8643–8652). O hub (Mirna) roda na 8642.

2 Chamar a Mirna

Envie o JSON para a Mirna com a instrução de deploy. Exemplo de mensagem:

Mirna, faz o deploy de um novo agente com essa config:

{
  "name": "eva",
  "team": "collection",
  "area": "Collection",
  "jira_project": "CAIX",
  "persona": "Cobrança empática. Foco na recuperação.",
  "usuario": "Solange",
  "canais": ["slack", "telegram"],
  "skills": ["collection-queries", "eva-cartilha-collection"],
  "profiles": ["EVA"],
  "crons": [
    {"schedule": "0 8 * * *", "prompt": "Report diário de acordos → Slack #collection", "deliver": "slack:C028TDGD77V", "enabled": true}
  ]
}

Fluxo automático que a Mirna executa:

flowchart LR A["📋 JSON do Usuário"] --> B["🔍 Valida Config"] B --> C["🔢 Aloca Porta"] C --> D["🐳 Gera Compose"] D --> E["📝 Cria .env"] E --> F["📦 Build + Up"] F --> G["❤️ Health Check"] G --> H["✅ Agente Online!"]
  • ✅ Aloca a próxima porta disponível
  • ✅ Gera o docker-compose.yml com project name correto
  • ✅ Cria o .env com todas as variáveis (Jira, Slack, Telegram)
  • ✅ Cria os volumes externos nomeados
  • ✅ Builda a imagem e sobe o container
  • ✅ Verifica health check
  • ✅ Atualiza o Architecture Diagram no portal
  • ✅ Configura os bots Slack/Telegram se solicitado

3 Verificar

Após o deploy, confirme com a Mirna que o agente está saudável:

Mirna, verifica se o agente Eva está online

Se precisar checar manualmente:

# Health check (porta alocada pela Mirna)
curl http://localhost:{porta}/health

# Logs
docker logs {name}-{team}-1

# Status geral
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

Exemplo completo — Agente de Finance

{
  "name": "finc",
  "team": "finance",
  "area": "Finance",
  "jira_project": "FINC",
  "persona": "Analista financeiro preciso e organizado. Foco em conciliação, relatórios e compliance.",
  "usuario": "Ricardo",
  "canais": ["slack"],
  "skills": ["databricks-query", "hubspot-query"],
  "profiles": ["FINC"],
  "crons": [
    {"schedule": "0 9 * * 1-5", "prompt": "Conciliação diária — alerte discrepâncias no Slack #finance", "deliver": "slack:C_FINANCE_ID", "enabled": true}
  ]
}
Convenção: COMPOSE_PROJECT_NAME = {name}-{team} (lowercase). Ex: eva-collection, finc-finance. Nunca criar containers sem isso — o Hostinger Docker Manager usa o project name como identificador.
Bot Slack
Como conectar seu agente ao Slack da CondoConta

1 Criar app no Slack

Acesse api.slack.com/apps e clique "Create New App""From scratch".

  • App Name: Nome do seu agente (ex: "Eva — Collection")
  • Workspace: CondoConta

2 Configurar OAuth & Permissions

Em OAuth & Permissions, adicione os scopes:

  • chat:write — enviar mensagens
  • channels:read — ler canais
  • groups:read — ler canais privados
  • im:write — enviar DMs
  • users:read — ler info de usuários
  • files:write — upload de arquivos (opcional)

Clique "Install to Workspace" e copie o Bot User OAuth Token (começa com xoxb-).

3 Ativar Socket Mode

Em Socket Mode, ative e gere um App-Level Token (começa com xapp-). Scopes necessários: connections:write

Socket Mode permite que o bot se conecte sem IP público ou HTTPS — ideal para VPS via Tailscale.

4 Configurar Event Subscriptions

Em Event Subscriptions, ative e inscreva nos eventos:

  • message.channels — mensagens em canais públicos
  • message.groups — mensagens em canais privados
  • message.im — mensagens em DMs

Com Socket Mode ativo, não precisa de Request URL.

5 Adicionar o bot aos canais

Para que o agente receba mensagens, ele precisa estar nos canais. Em cada canal desejado:

  • Digite @Eva (ou o nome do seu bot) e envie
  • O Slack vai sugerir "Invite to Channel" — confirme
Importante: Sem adicionar o bot ao canal, ele não recebe mensagens — mesmo com tudo configurado corretamente.

6 Pedir ao agente para configurar

Envie os tokens para o seu agente:

Eva, configura o Slack com esses tokens:

Bot token: xoxb-xxxx
App token: xapp-xxxx
Canais: #collection, #mirna-sales-agent

O agente configura automaticamente:

  • ✅ Adiciona os tokens ao .env
  • ✅ Ativa o gateway Slack no config
  • ✅ Redeploya o container
Alternativa: Se o agente ainda não está online, envie os tokens para a Mirna que ela repassa na configuração.
Bot Telegram
Como conectar seu agente ao Telegram

1 Criar bot via BotFather

No Telegram, converse com @BotFather:

  • Envie /newbot
  • Dê um nome (ex: "Eva — Collection CondoConta")
  • Dê um username (ex: eva_condoconta_bot)
  • Copie o API Token retornado (formato: 123456:ABC-DEF...)

2 Personalizar o bot

Envie comandos ao BotFather para refinar:

  • /setdescription — descrição do agente
  • /setabouttext — texto "Sobre"
  • /setuserpic — avatar do agente
  • /setcommands — comandos disponíveis (ex: status — Verificar status do agente)
Dica: Use o mesmo avatar do agente no portal como foto do bot. Isso reforça a identidade visual.

3 Pedir ao agente para configurar

Envie o token para o seu agente:

Eva, configura o Telegram com esse token:

Token: 123456:ABC-DEF1234...

O agente configura automaticamente:

  • ✅ Adiciona o token ao .env
  • ✅ Ativa o gateway Telegram no config
  • ✅ Redeploya o container
Alternativa: Se o agente ainda não está online, envie o token para a Mirna.

4 Testar

Abra o bot no Telegram e envie uma mensagem. O agente deve responder com sua persona configurada.

Modo polling: O Hermes usa long polling por padrão no Telegram (sem necessidade de webhook ou IP público). Funciona perfeitamente com Tailscale.
Integração Jira
Credencial compartilhada e projeto por área

Como funciona

Todos os agentes Mirna HaaS compartilham a mesma credencial Jira (email + API token do Atlassian). Cada agente trabalha no projeto da sua área:

Área          Jira Project
─────────────────────────
Collection    CAIX
Tesouraria    OB2
Finance       FINC
Sales/Comerc  RAIX
CX            CX
CS            CS
Atendimento   ATD
People        PPL
Produto       PROD
AI Expert     COM
        
Serviço compartilhado: A credencial Jira é injetada automaticamente pela Mirna no deploy. Você só precisa informar o jira_project no JSON.

Adicionar Jira ao seu agente

Se o agente já está rodando e precisa de acesso Jira (ou trocar de projeto), peça direto a ele:

Eva, configura o Jira com o projeto CAIX

O agente configura automaticamente:

  • ✅ Adiciona a credencial Jira ao .env
  • ✅ Configura o projeto no profile
  • ✅ Redeploya o container
Alternativa: Se o agente ainda não está online, peça para a Mirna.

Trocar projeto Jira

Se o agente mudou de área ou precisa acessar outro projeto:

Eva, troca o projeto Jira de CAIX para OB2
Skills & Profiles
Como adicionar skills e sub-agentes ao agente

Skills

Skills são arquivos SKILL.md que ensinam o agente a executar tarefas específicas. Peça ao seu agente para adicionar:

Eva, adiciona essas skills:

- collection-queries
- eva-cartilha-collection
- databricks-query

O agente instala as skills no profile e redespliega se necessário.

Alternativa: Se o agente não está online, peça para a Mirna.

Profiles (Sub-agentes)

Profiles são sub-personalidades do agente principal. A Mirna, por exemplo, tem profiles como:

  • ada — Data Science
  • aixon — AI Expert Reports
  • lex — Product/PRD
  • cp — Content Producer

Para criar um novo profile para seu agente:

Eva, cria um profile "FINC".

Persona: Analista financeiro preciso. Foco em conciliação e compliance.
Skills: databricks-query, hubspot-query

O agente cria o diretório do profile, adiciona o SOUL.md com a persona, linka as skills e redespliega.

Alternativa: Se o agente não está online, peça para a Mirna.

Listar skills disponíveis

Eva, lista as skills disponíveis

O agente mostra todas as skills instaladas e as que podem ser adicionadas.