Mirna

HaaS — Deploy Guide

Mission Control / Deploy Guide · HaaS v3.0
HaaS v3.0 · 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 CC é o hub nativo (roda direto no VPS da CondoConta sem Docker) e coordena todos os spokes. Ela é a gestora central — recebe pedidos de deploy, decide a porta, configura o ambiente e executa o haas_deploy.py.

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 CC resolve tudo. Você só define o YAML de configuração e chama ela.
Criar Novo Agente
Defina o YAML e chame a Mirna CC — ela faz o resto

1 Criar o YAML de configuração

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

# config.yaml — Configuração do Agente HaaS
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
model: deepseek/deepseek-v4-pro
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 YAML:

  • 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 YAML! O haas_deploy.py aloca automaticamente a próxima porta disponível (8643–8652). A Mirna CC (hub nativo) roda na 8642.

2 Chamar a Mirna CC

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

Mirna CC, 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 CC executa:

flowchart LR
    A["📋 YAML 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 CC que o agente está saudável:

Mirna CC, verifica se o agente Eva está online

Se precisar checar manualmente:

# Health check (porta alocada pela Mirna CC)
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: container_name = haas-{name} (lowercase). Ex: haas-eva, haas-finc. O haas_deploy.py usa o nome do agente como identificador único nos volumes e containers.
Bot Slack
Como conectar seu agente ao Slack da CondoConta

🔀 Escolha o método

Manual
Criação Manual
Configure scopes, eventos e tokens na interface. 10 minutos.
Ir para Manual →

⭐ Método Manifest YAML (Recomendado)

1 Peça ao seu agente para gerar

Converse com seu agente HaaS:

@Eva, gere o YAML manifest do Slack.
Nome: Eva — Collection
Descrição: Responde dúvidas de inadimplência

O agente gera YAML com scopes, Socket Mode e eventos já configurados.

2 Crie o app

  1. api.slack.com/apps
  2. "Create New App" → "From a manifest"
  3. Escolha CondoConta
  4. Cole o YAML → "Create"

3 Instale e copie tokens

  1. "Install to Workspace"
  2. Copie Bot Token (xoxb-...)
  3. Basic Information → App-Level Tokens → copie (xapp-...)

4 Envie tokens para o agente

@Eva, configura o Slack:

Bot token: xoxb-xxxx
App token: xapp-xxxx
Canais: #collection

O agente adiciona ao .env e reinicia.


🔧 Método Manual (Alternativo)

1 Criar app

api.slack.com/apps"From scratch". Nome do agente, workspace CondoConta.

2 OAuth scopes

  • chat:write
  • channels:read + channels:history
  • groups:read + groups:history
  • im:write
  • users:read
  • files:write (opcional)

Instale e copie o Bot Token (xoxb-...).

3 Socket Mode

Ative e gere App-Level Token (xapp-...) com scope connections:write.

4 Event Subscriptions

Ative: message.channels, message.groups, message.im.

5 Envie tokens para o agente

@Eva, configura o Slack:

Bot token: xoxb-xxxx
App token: xapp-xxxx

📋 Canais e Comportamento

Criando canais

  1. + Add Channel na sidebar
  2. Nome descritivo (ex: #collection-eva)
  3. Adicione o time
  4. Adicione o bot: digite @nomedobot → "Invite to Channel"

Padrão de resposta

OndeQuando responde
Canal públicoApenas com @menção
Dentro de threadLivremente — sem @menção
DMTodas as mensagens

⚠️ Troubleshooting

🤖 Bot não responde a @menções
Causa #1: SLACK_CLIENT_ID no .env conflita com Socket Mode. Remova a linha SLACK_CLIENT_ID=.... O Socket Mode não usa Client ID — isso quebrou o Falai e outros bots.
📭 Online mas não recebe mensagens
Bot não foi adicionado ao canal. Digite @nomedobot no canal e aceite "Invite to Channel".
🔑 Erro invalid_auth
Token copiado errado ou expirado. Regenere em OAuth & Permissions.

✅ Checklist

App criado (manifest ou manual)
Tokens: xoxb-... e xapp-...
NÃO tem SLACK_CLIENT_ID no .env
Bot adicionado aos canais
Agente online
Teste: @bot oi no canal
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 CC.

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 CC no deploy. Você só precisa informar o jira_project no YAML.

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 CC.

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 CC.

👥 Profiles (Sub-agentes)

Profiles são sub-personalidades especializadas — cada uma com persona, skills e histórico isolados.

Por que usar?

VantagemExplicação
🎯 Especialização por pessoaCada membro do time tem seu próprio profile com tom de voz e skills específicos. Ex: "sol" foca em cobrança, "rod" em PRDs.
🔒 Isolamento de contextoHistórico separado por profile. O que você discute no seu não vaza para outros.
⚡ Skills por perfilCada profile carrega só as skills que precisa — economiza tokens e mantém o foco.
👤 Identidade individualNome, avatar e persona próprios. O time se relaciona com "seu" agente — aumenta adoção.

Exemplos na CondoConta

ProfileEspecialidadeSkillsMembro
adaData Sciencejupyter-live-kernel, data-vizCaju
aixonAI Expert Reportsaix-monthly-reviewCaju
lexProduct/PRDprd-creation, prd-to-clickupRodrigo
cpContent Producercontent-factory
solCollectioncollection-queries, eva-cartilhaSolange

Criar um profile

Eva, cria um profile "rod" para o Rodrigo:

Persona: Product Manager técnico, foco em clareza e execução.
Skills: prd-creation, jira-issue-manager, confluence-search

O agente cria o diretório, adiciona SOUL.md, linka skills e redespliega.

Dica: Use o nome da pessoa como profile (ex: "rod", "sol"). Acesse com /profile sol.

Listar skills disponíveis

Eva, lista as skills disponíveis

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