# TOOLS.md — Modelos e Geração de Mídia

> A Léia lê este arquivo para saber como gerar imagens, vídeos e trocar de modelo.

---

## Modelos de Chat disponíveis

| Comando | Modelo | Tipo |
|---|---|---|
| "usa Plus" ou "usa codex" | `openai-codex/gpt-5.5` | ChatGPT Plus (Jéssica) — **padrão** |
| "usa GPT" | `openai/gpt-4.1-mini` | API key OpenAI |
| "usa Gemini" | `google/gemini-flash-latest` | Google AI Studio |

### Trocar modelo de chat
```bash
# ChatGPT Plus (padrão)
openclaw models set openai-codex/gpt-5.5

# GPT via API key
openclaw models set openai/gpt-4.1-mini

# Gemini
openclaw models set google/gemini-flash-latest
```

---

## Geração de Imagem

**Padrão:** `openai/gpt-image-2` (API key OpenAI — cobrado por uso)
**Fallback:** `google/gemini-3-pro-image-preview` (Gemini — quota diária gratuita)

### Trocar modelo de imagem
```bash
# GPT Image 2 (API key) — padrão
openclaw models set-image openai/gpt-image-2

# Gemini Image
openclaw models set-image google/gemini-3-pro-image-preview
```

### Como pedir imagem
- "Gera uma imagem de [descrição]"
- "Cria uma foto de [descrição]"
- "Faz uma arte de [descrição]"

### Pacotes de troca completa
**"usa GPT para tudo":**
```bash
openclaw models set openai/gpt-4.1-mini
openclaw models set-image openai/gpt-image-2
```

**"usa Gemini para tudo":**
```bash
openclaw models set google/gemini-flash-latest
openclaw models set-image google/gemini-3-pro-image-preview
```

---

## Geração de Vídeo

**Modelo:** `google/veo-3.1-fast-generate-preview` (Google Veo — requer créditos)

### Como pedir vídeo
- "Gera um vídeo de [descrição]"
- "Cria um vídeo com [descrição]"

> ⚠️ Vídeo consome créditos da API Google. Confirmar antes de gerar.

---

## Estado padrão (ao reiniciar o serviço)
- Chat: `openai-codex/gpt-5.5` (ChatGPT Plus)
- Imagem: `openai/gpt-image-2`
- Vídeo: `google/veo-3.1-fast-generate-preview`

## Serper.dev - Google Maps / Places

### Quando usar
Quando o Chefe pedir pesquisa de empresas, leads locais, listas de prospecção ou buscas no Google Maps.

### Configuração
- API key salva em `/root/.openclaw/.env` como `SERPER_API_KEY`
- Script: `/root/.openclaw/workspace/scripts/serper-places-search.sh`

### Como buscar
```bash
echo '{"q":"clínicas de psicologia em Florianópolis","num":20}' | bash /root/.openclaw/workspace/scripts/serper-places-search.sh
```

### Campos úteis retornados
- nome da empresa
- telefone
- endereço
- site
- categoria
- avaliação
- quantidade de reviews
- link/posição no Google Maps, quando disponível

### Uso futuro
Salvar resultados em CSV/JSON dentro da pasta do projeto ou enviar para o CRM.

## Deploy na Vercel

### Quando usar
Quando Emerson pedir para criar uma página, landing page, site ou app e publicar online.

### Processo padrão
```bash
# 1. Criar a pasta do projeto no workspace
mkdir -p /root/.openclaw/workspace/sites/NOME-DO-PROJETO

# 2. Criar os arquivos (HTML, CSS, JS, Next.js, etc.)
# Exemplo mínimo:
cat > /root/.openclaw/workspace/sites/NOME-DO-PROJETO/index.html << 'HTML'
<!DOCTYPE html><html><head><title>Título</title></head>
<body><h1>Conteúdo</h1></body></html>
HTML

# 3. Deploy com o helper (retorna a URL pública)
URL=$(vercel-deploy.sh /root/.openclaw/workspace/sites/NOME-DO-PROJETO "nome-do-projeto")
echo "Publicado em: $URL"
```

### Comando direto (alternativo)
```bash
cd /pasta/do/projeto
vercel deploy --token "$VERCEL_TOKEN" --scope emerson-crispim --prod --yes
```

### Verificar projetos publicados
```bash
vercel projects ls --token "$VERCEL_TOKEN" --scope emerson-crispim
```

### Regras
- Sempre retornar o link final para Emerson no Telegram
- Usar nome de projeto em kebab-case (ex: gtec-landing, curso-nr1)
- Projetos ficam em /root/.openclaw/workspace/sites/
- Não expor o VERCEL_TOKEN nas mensagens
- Confirmar com Emerson antes de publicar algo sensível



## Envio de Email (Brevo via gtec-gateway)

### Quando usar
Quando Emerson pedir para enviar um email (notificação, relatório, contato com lead/cliente, teste, etc.)

### Como enviar
Passe um JSON pelo stdin do script `send-email.sh`:

```bash
echo '{"to":"destino@exemplo.com","subject":"Assunto","html":"<p>Conteudo</p>","text":"Conteudo em texto"}' | bash /root/.openclaw/workspace/scripts/send-email.sh
```

### Campos aceitos no JSON
- `to` (obrigatório): string ou lista de `{"email":..,"name":..}`
- `subject` (obrigatório)
- `html` e/ou `text` (pelo menos um obrigatório)
- `replyTo`, `cc`, `bcc` (opcionais)

### Remetente
- Padrão: `leia@gtecservidor.com.br` (domínio verificado: SPF, DKIM, DMARC ok)
- Para mudar, adicionar `senderName`/`senderEmail` no JSON (precisa ser domínio verificado no Brevo)

### Regras
- Email para Emerson (testes, relatórios, notificações internas): pode enviar livremente
- Email para clientes/leads/terceiros: pedir OK do Emerson antes (REGRA DE OURO)
- Nunca expor o EMAIL_GATEWAY_KEY nas mensagens

## Recebimento de Email (Inbound)

### Como funciona
- Qualquer email enviado para um endereço `@in.gtecservidor.com.br` é encaminhado (via ImprovMX) para `gtecservidor@gmail.com`
- Um script (`check-inbound-email.py`) roda via cron a cada 5 minutos, verifica por IMAP os emails novos endereçados a `@in.gtecservidor.com.br` e os envia para o endpoint `/email/inbound` do gtec-gateway
- Esse endpoint notifica a Léia automaticamente no Telegram com remetente, assunto e corpo do email

### Endereço para receber respostas
- Para receber resposta de alguém em um email enviado, use `replyTo` com um endereço `@in.gtecservidor.com.br` (ex: `leia-respostas@in.gtecservidor.com.br`)
- A resposta chega automaticamente como notificação no Telegram

### Arquivos envolvidos
- `/root/.openclaw/workspace/scripts/check-inbound-email.py` - script de polling IMAP (Gmail)
- `/root/.openclaw/workspace/data/email_inbound_last_uid.txt` - estado (último UID processado)
- `/root/.openclaw/workspace/data/email_inbound.log` - log do cron
- `/root/projects/gtec-gateway/api/email-inbound.js` - endpoint que recebe e notifica Telegram
- Credenciais Gmail IMAP em `/root/.openclaw/.env` (GMAIL_IMAP_USER, GMAIL_IMAP_APP_PASSWORD)
- Cron: `*/5 * * * *` no usuário root da VPS

## Cloudflare DNS (gtecservidor.com.br)

### Quando usar
Quando Emerson pedir para criar, listar ou remover um (sub)domínio em `gtecservidor.com.br` (ex: apontar `app.gtecservidor.com.br` para um projeto novo).

### Como usar
Passe um JSON pelo stdin do script `cloudflare-dns.sh`:

```bash
# Criar/atualizar um registro A (aponta para um IP)
echo '{"action":"create","type":"A","name":"novo.gtecservidor.com.br","content":"62.146.226.166","ttl":3600,"proxied":false}' | bash /root/.openclaw/workspace/scripts/cloudflare-dns.sh

# Criar/atualizar um registro CNAME (aponta para outro domínio, ex: Vercel)
echo '{"action":"create","type":"CNAME","name":"app.gtecservidor.com.br","content":"meuapp.vercel.app","ttl":3600,"proxied":false}' | bash /root/.openclaw/workspace/scripts/cloudflare-dns.sh

# Listar registros (de um nome especifico ou todos)
echo '{"action":"list","name":"app.gtecservidor.com.br"}' | bash /root/.openclaw/workspace/scripts/cloudflare-dns.sh
echo '{"action":"list"}' | bash /root/.openclaw/workspace/scripts/cloudflare-dns.sh

# Apagar registro
echo '{"action":"delete","type":"A","name":"novo.gtecservidor.com.br"}' | bash /root/.openclaw/workspace/scripts/cloudflare-dns.sh
```

### Regras
- Domínio gerenciado: apenas `gtecservidor.com.br` (e seus subdomínios)
- `proxied: false` para a maioria dos casos (apontar para VPS direto, Vercel, etc.) - só usar `true` se Emerson pedir proxy/CDN do Cloudflare
- Antes de apagar um registro existente (que já estava em uso), confirmar com Emerson - pode quebrar algo em produção
- Nunca expor o CLOUDFLARE_API_TOKEN nas mensagens
- Para criar um novo subdomínio para um projeto (ex: site novo, app novo), pode criar livremente; para mexer em registros relacionados a email (SPF, DKIM, DMARC, MX) ou no domínio raiz `gtecservidor.com.br`, pedir confirmação antes



## Exec / Aprovações (atualizado)

Modo atual: `security: allowlist` + `ask: off` (sem prompts no Telegram para o dia a dia).

Liberados sem aprovação (allowlist permanente em /root/.openclaw/exec-approvals.json):
- vercel (deploy, logs, domains, alias, projects ls, etc.) e vercel-deploy.sh
- curl, node, dig, nslookup, psql, echo, cat, mkdir, cp, ls, mv, find, pdftotext, unzip, python3
  -> cobrem chamadas de API (Serper, Cloudflare, Vercel, Brevo, gateway), scripts node/python e diagnostico DNS
- Tudo dentro de /root/.openclaw/workspace/scripts/**, /root/.openclaw/workspace/sites/** e /root/projects/**
  -> inclui serper-places-search.sh, cloudflare-dns.sh, send-email.sh, flush-conversation-to-db.sh, etc.
- bash .../openai-whisper-api/scripts/transcribe.sh <audio> --language pt --out <txt> (transcricao de audio)

Protegidos (bloqueados silenciosamente, sem mensagem no Telegram):
- rm e sudo
- alteracao de configuracao do OpenClaw (exec-approvals.json, openclaw.json)
- comandos fora de /root/.openclaw/workspace e /root/projects

Aprovacao via Telegram (fallback para casos fora da allowlist):
- channels.telegram.execApprovals.enabled = true
- approvers = ["466159033"] (Emerson)
- Como `ask: off`, isso so entra em jogo em casos especiais (heredoc, inline-eval, plano de
  allowlist indisponivel) - o fluxo normal nao gera prompts.

Se a Léia encontrar um comando novo bloqueado (allowlist-miss), ela deve pedir ao Emerson para
adicionar o padrao em /root/.openclaw/exec-approvals.json em vez de tentar de novo.

### Sobre o "cat" (leitura de arquivos)
`cat` esta liberado de forma ampla na allowlist (nao da pra restringir por pasta no
allowlist do OpenClaw - ele so reconhece o programa `cat`/`/usr/bin/cat`, nao o
caminho do arquivo passado como argumento). Por convencao, a Léia so deve usar `cat`
dentro de /root/.openclaw/workspace, /root/.openclaw/media/inbound e /root/projects -
nunca para ler arquivos de configuracao do sistema, credenciais (.env, exec-approvals.json,
openclaw.json) ou fora dessas pastas.

### Audio / Whisper - erro 429 != allowlist-miss
A transcricao automatica de audio (`[media-understanding]`) as vezes falha com
"Audio transcription failed (429)" - isso e rate-limit/instabilidade temporaria da
API da OpenAI, SEM RELACAO com allowlist ou aprovacao de exec. Quando isso acontecer:
- Nao reportar como "Exec denied: approval-timeout (allowlist-miss)" - esse erro
  especifico e sobre exec, nao sobre a transcricao automatica.
- Tentar de novo o `transcribe.sh` (ja esta na allowlist permanente, nao precisa
  aprovacao). Se falhar de novo com 429, esperar uns segundos e tentar mais uma vez.
- So reportar bloqueio de exec se a mensagem de erro do PROPRIO comando exec for
  "Exec denied: ..." (nao a falha de transcricao automatica).

### Aprovacao via Telegram pode demorar
Quando um comando precisa de aprovacao manual (fora da allowlist), o Emerson recebe
um pedido no Telegram e tem uma janela curta para responder (alguns segundos). Se ele
nao responder a tempo, da timeout e o comando e negado (approval-timeout). Nesse caso
a Léia NAO deve ficar repetindo o mesmo comando varias vezes - deve avisar o Emerson
uma vez e pedir para ele adicionar o comando na allowlist permanente.


## Dominio emersoncrispim.com.br (Vercel)

### Situacao
- Hoje a raiz `emersoncrispim.com.br` e `www.emersoncrispim.com.br` apontam para um
  site/funil antigo (129.80.154.173). Email continua ativo nesse dominio (MX para
  mail01.l4email.com) - **NUNCA mexer em `MX`/`TXT`/registro `*` sem confirmar com
  o Emerson**, isso pode derrubar o email.
- Subdominio de trabalho/teste: `leia.emersoncrispim.com.br` -> projeto Vercel
  `leia-emersoncrispim` (https://leia-emersoncrispim.vercel.app), com placeholder
  publicado em `/root/.openclaw/workspace/sites/leia-emersoncrispim`.

### AUTORIZADO: substituir o site principal (raiz) quando estiver pronto
O Emerson confirmou (2026-06-11): quando a Léia terminar o site novo (o site oficial
dele), ela esta AUTORIZADA a apontar a raiz `emersoncrispim.com.br` e `www` para a
Vercel, substituindo o site/funil atual em 129.80.154.173. Isso derruba o site velho
(esperado/ok) mas NAO afeta o email (MX e' separado).

Passo a passo para fazer a troca quando o site estiver pronto:
```bash
# 1. Build e deploy do site final num projeto Vercel (ex: "emersoncrispim")
URL=$(vercel-deploy.sh /root/.openclaw/workspace/sites/emersoncrispim "emersoncrispim")

# 2. Apagar os registros antigos da raiz e do www (apontam pro funil antigo)
echo '{"action":"delete","type":"A","name":"emersoncrispim.com.br"}' | bash /root/.openclaw/workspace/scripts/cloudflare-dns.sh
echo '{"action":"delete","type":"CNAME","name":"www.emersoncrispim.com.br"}' | bash /root/.openclaw/workspace/scripts/cloudflare-dns.sh

# 3. Criar os registros novos apontando para a Vercel
echo '{"action":"create","type":"A","name":"emersoncrispim.com.br","content":"76.76.21.21","ttl":3600,"proxied":false}' | bash /root/.openclaw/workspace/scripts/cloudflare-dns.sh
echo '{"action":"create","type":"CNAME","name":"www.emersoncrispim.com.br","content":"cname.vercel-dns.com","ttl":3600,"proxied":false}' | bash /root/.openclaw/workspace/scripts/cloudflare-dns.sh

# 4. Vincular os dominios ao projeto na Vercel
vercel domains add emersoncrispim.com.br emersoncrispim --token "$VERCEL_TOKEN" --scope "$VERCEL_SCOPE"
vercel domains add www.emersoncrispim.com.br emersoncrispim --token "$VERCEL_TOKEN" --scope "$VERCEL_SCOPE"
```

Antes de executar o passo 2 (apagar registros antigos), avisar o Emerson que a troca
vai acontecer agora (mensagem rapida no Telegram), pois e' o momento em que o site
antigo sai do ar.

### Como criar novos subdominios/sites neste dominio
Mesmo processo do gtecservidor.com.br, trocando o sufixo do dominio:

```bash
# 1. Criar a pasta do site
mkdir -p /root/.openclaw/workspace/sites/NOME-DO-PROJETO

# 2. Criar os arquivos (HTML, CSS, JS, Next.js, etc.)

# 3. Deploy (cria/atualiza o projeto na Vercel)
URL=$(vercel-deploy.sh /root/.openclaw/workspace/sites/NOME-DO-PROJETO "nome-do-projeto")

# 4. Apontar o subdominio desejado para a Vercel via Cloudflare
echo '{"action":"create","type":"CNAME","name":"sub.emersoncrispim.com.br","content":"cname.vercel-dns.com","ttl":3600,"proxied":false}' | bash /root/.openclaw/workspace/scripts/cloudflare-dns.sh

# 5. Vincular o subdominio ao projeto na Vercel
vercel domains add sub.emersoncrispim.com.br nome-do-projeto --token "$VERCEL_TOKEN" --scope "$VERCEL_SCOPE"
```

### cloudflare-dns.sh agora funciona com qualquer dominio da conta
O script detecta automaticamente a zona certa (gtecservidor.com.br, emersoncrispim.com.br,
jessicasc.com.br, acessomaisbr.com.br) a partir do dominio passado em "name". Sem "name"
(ex: list geral), o padrao continua sendo gtecservidor.com.br.
