Agente "Sobe Obras"¶
Objetivo: um agente conversacional que vive no Open WebUI (padrão Betão), usado por qualquer pessoa da equipe Bepex para publicar uma obra no site (CPT
projetos) a partir de: links do Dropbox com as fotos, imagem principal separada, respostas a um roteiro de perguntas, e a categorização por produto. O agente gera a descrição no modelo padrão, pega cidade/estado e publica no WordPress já categorizado.
Status: v0 — plano inicial (2026-07-07). Nenhuma sessão de build executada. Aguardando inputs
A+B do Rafael e a Sessão 0 (descoberta WP). Este README consolida o PLANO.md (fonte da verdade da
arquitetura) e o progress_control.md (estado) da pasta-fonte.
1. Fundação técnica já descoberta¶
1.1 Como o Open WebUI conecta no n8n (padrão Betão — reaproveitar)¶
- Open WebUI (
https://n8n-openwebui.fetrtm.easypanel.host/, self-hosted EasyPanel, v0.10.1) é só a casca de chat. Toda a inteligência mora no n8n. Pipes em/admin/functions. - A ponte é uma função tipo Pipe ("N8N Pipe" da comunidade, customizada pela Bepex). Cada pipe vira um "modelo" no seletor do Open WebUI.
- Pipes existentes → webhook n8n (host
n8n-hook.bepex.com.br): n8n_betao→/webhook/3dc7d59a-…(Betão Coach de Vendas)n8n_betao_v2→/webhook/betao2(Betão Análise de Negócio, timeout 360s)n8n_para_tudo→/webhook/v2/kowalski(Kowalski)- Contrato do pipe ↔ n8n: envia
body.chatInput+body.sessionId; recebe o campooutput(via Respond to Webhook). Bearer token compartilhado nas valves:${OPENWEBUI_N8N_BEARER}. - Workflow n8n típico do Betão:
chatTrigger+Webhook(auth credopenwebUI) →AI Agent(OpenRouter, ex.google/gemini-2.5-pro, credBetão Openrouter AgenteSESgn3rDg6E6qtJG) → memória Postgres (Postgres n8n v2/7F3gxDoPsQGjAbOW) →Respond to Webhook. UmSwitchdesvia mensagensQuery:(geração de título do Open WebUI) pra não gastar o agente.
1.2 Como o site trata "obras" (WordPress)¶
- Stack: JetEngine (Crocoblock) + Elementor + JetFormBuilder. Não é WooCommerce pra obras.
- "Obra" = CPT
projetos(rest_base: projetos). Ex.: obra id13734"Forum de Ipanema", URLhttps://bepex.com.br/projetos/<slug>/. - Categorização por produto = taxonomia
aplicacoes-do-projeto(uma obra pode ter várias). Termos:
| id | nome | slug | nº obras |
|---|---|---|---|
| 93 | Fachada Metálica | fachada-metalica | 26 |
| 92 | Brise Metálico | brise-metalico | 14 |
| 403 | Revestimento Interno | revestimento-interno | 5 |
| 94 | Forro Metálico | forro-metalico | 2 |
| 406 | Guarda Corpos | guarda-corpos | 1 |
| 405 | Brise Móvel | brise-movel | 0 |
| 404 | Divisórias e Biombos | divisorias-e-biombos | 0 |
- A página de obra exibe Cidade - Estado (ex. "Rio de Janeiro - RJ") acima do título, uma
galeria e uma imagem principal. Esses são campos meta do JetEngine e NÃO aparecem no
REST público (
metaeacfvêm vazios;content.renderedtambém vem vazio — a página é montada por template Elementor/JetEngine puxando os campos meta). - Outros CPTs de contexto:
tabela-de-materiais(taxonomiasaplicacoes,modelo-disponivel),tabelas-de-design,downloads. Páginas de produto sãopagecom taxonomiasmaterialeaplicacao.
1.3 O que ainda falta descobrir (só com login no wp-admin) — vira Sessão 0¶
- Slugs exatos dos campos meta JetEngine do CPT
projetos: galeria, imagem principal/destaque, cidade, estado (ou campo único "localização"), campo de descrição. - Formato de armazenamento das imagens (array de IDs de mídia? de URLs? string separada por vírgula? — JetEngine varia).
- Se a ligação obra↔produto é só a taxonomia
aplicacoes-do-projetoou também uma relação JetEngine comtabela-de-materiais/páginas de produto. - Método de escrita da meta: JetEngine por padrão NÃO expõe meta com
show_in_rest. Caminhos a validar: (a) registrar campos comshow_in_rest+POST /wp-json/wp/v2/projetos; (b) REST próprio do JetEngine; (c) endpoint custom (mu-plugin); (d) reaproveitar um JetFormBuilder existente de cadastro de obra. - Se já existe uma JetForm de "subir obra" — seria o caminho mais limpo (validação/curadoria já prontas) e o agente só alimentaria essa form.
- Como autenticar o n8n no WP: criar uma Application Password para um usuário editor/admin
dedicado e testar
POST /wp-json/wp/v2/media+ criarprojetosrascunho.
2. Arquitetura alvo¶
[Equipe Bepex]
│ (chat)
▼
[Open WebUI] modelo "Betão — Sobe Obras"
│ pipe n8n (chatInput/sessionId → output)
▼
[n8n · WF-Sobe-Obra] (novo workflow)
│
├─ AI Agent (OpenRouter) — intake conversacional guiado:
│ 1. coleta link(s) Dropbox da galeria
│ 2. coleta imagem principal (separada)
│ 3. roteiro de perguntas sobre a obra ← [PROMPT do Rafael, adaptado]
│ 4. cidade + estado
│ 5. produto(s) usado(s) → mapeia p/ termos `aplicacoes-do-projeto`
│ 6. gera descrição no modelo padrão ← [MODELO do Rafael]
│ 7. mostra resumo e pede confirmação
│
└─ (na confirmação) → Sub-flow determinístico de publicação:
a. Dropbox → baixa imagens (galeria + principal)
b. upload cada imagem → WP media (POST /wp-json/wp/v2/media, App Password)
c. cria post `projetos` (título, descrição, status, featured_media, taxonomia)
d. grava meta JetEngine (galeria, cidade, estado) — método definido na Sessão 0
e. devolve a URL da obra → agente responde "publicado ✅ <link>"
Decisões de design (confirmadas com Rafael 2026-07-07):
- Imagens são COPIADAS para a biblioteca de mídia do WP (não hotlink do Dropbox) — confiabilidade
- SEO. Dropbox é só transporte.
- Obra publicada DIRETO NO AR (
status: publish). Como não há revisão humana pós, a etapa de confirmação no chat é obrigatória e reforçada: o agente mostra resumo completo (título, cidade/estado, produto(s), descrição, nº de fotos + qual é a principal) e só publica após "confirmo". - Imagens do Dropbox via LINK DE PASTA: a pessoa cola 1 link de pasta e o agente lista/baixa todas as fotos. A imagem principal é indicada à parte.
- Escrita no WP via REST API + Application Password (Rafael loga o wp-admin; Claude gera as chaves na Sessão 0).
- Reaproveitar o padrão dos pipes Betão (nova pipe + novo webhook), não mexer nos existentes.
3. Inputs pendentes do Rafael¶
| # | Input | Bloqueia | Status |
|---|---|---|---|
| A | Prompt/roteiro de perguntas sobre a obra (pra adaptar) | Sessão 3 | ⏳ Rafael vai mandar |
| B | Modelo/template da descrição da obra | Sessão 3 | ⏳ Rafael vai montar |
| C | Acesso de escrita ao WP | Sessões 0,1,2 | ✅ Rafael loga wp-admin; Claude gera App Password |
| D | Publicar rascunho ou direto? | Sessão 2 | ✅ Direto no ar (status: publish) |
| E | Fonte das imagens | Sessão 1 | ✅ Link de pasta Dropbox |
4. Quebra em sessões (orquestração)¶
Sessão 0 — Descoberta WP + recibo de escrita (BLOQUEADOR). Loga no wp-admin; extrai slugs/tipos
dos campos meta JetEngine do CPT projetos; confere se produto é taxonomia e/ou relação; procura
JetForm de obra existente; cria uma App Password; valida na prática um POST de rascunho de
projetos via REST com imagem de teste + meta + taxonomia; apaga o rascunho. Entrega:
referencia-tecnica.md (mapa de campos + receita REST validada) + App Password. Skills:
wordpress-chrome-mcp + chrome-file-upload.
Sessão 1 — Pipeline Dropbox → WP Media. Sub-workflow n8n que recebe link(s) Dropbox, baixa as
imagens (link público ?dl=1 ou Dropbox API) e sobe cada uma em POST /wp-json/wp/v2/media; retorna
IDs + qual é a principal. Skills: n8n + n8n-bepex.
Sessão 2 — Sub-flow de publicação da obra. Caminho determinístico: cria projetos (título,
descrição, status, featured media, taxonomia) e grava a meta JetEngine pelo método da Sessão 0.
Devolve a URL. Skills: n8n + n8n-bepex.
Sessão 3 — Workflow do agente (conversa + intake) (precisa inputs A e B). Cria WF-Sobe-Obra
(chatTrigger + Webhook openwebUI + OpenRouter agent + memória Postgres + Switch Query:); escreve o
system prompt adaptando o roteiro (A); embute o modelo de descrição (B); dá ao agente a lista de
termos aplicacoes-do-projeto; conecta a tool do sub-flow de publicação; define o fluxo de
confirmação. Skills: n8n + n8n-bepex + n8n-bepex-teste-pipeline-e2e.
Sessão 4 — Pipe + modelo no Open WebUI. Clona a pipe n8n_betao → nova pipe apontando pro webhook
de WF-Sobe-Obra; cria o modelo "Betão — Sobe Obras"; define permissão para o grupo da equipe.
Skills: operação Open WebUI via Chrome + API (/api/v1/functions, /api/v1/models).
Sessão 5 — Teste E2E + handoff da equipe. Roda o fluxo completo com uma pasta Dropbox real,
publica, valida no site (cidade/estado, galeria, principal, categoria, descrição), corrige o que
faltar. Escreve doc operacional e registra o projeto. Skills: n8n-bepex-teste-pipeline-e2e +
documentacao-projetos.
Grafo de dependências¶
S0 (WP discovery + App Password) ── bloqueia ──▶ S1, S2
S1 (Dropbox→Media) ─┐
S2 (Publica obra) ─┴─ (S2 usa S1) ── vira tool ──▶ S3
A (prompt) + B (modelo) ─────────────────────────▶ S3
S3 (Agente) ──▶ S4 (Pipe/Modelo Open WebUI) ──▶ S5 (E2E + handoff)
Caminho crítico: S0 → S1 → S2 → S3 → S4 → S5. S3 também espera A+B. S0 pode começar assim que houver acesso WP; A+B podem ser preparados em paralelo por Rafael.
5. Riscos e mitigação¶
- JetEngine meta não escrevível via REST padrão → S0 testa e escolhe entre registrar
show_in_rest, endpoint custom, ou reaproveitar JetForm. Não avançar S2 sem recibo verde. - Imagens grandes / muitas fotos → limitar tamanho, processar em lote, timeout do pipe alto
(como
betao2usa 360s). - Qualquer um da equipe publicando → confirmação no chat obrigatória antes de publicar.
- Sessão do n8n / Betão OpenRouter key emprestada → usar cred própria; não bater em auth do n8n.
- Nunca subir arquivo via base64/DataTransfer no browser — no n8n é server-side (ok); em UI WP,
seguir
chrome-file-upload.
6. Lições acumuladas (a não repetir)¶
- REST público do WP NÃO revela meta JetEngine — precisa wp-admin logado (Sessão 0).
- Não mexer nos pipes/webhooks Betão existentes — criar novos.
list_workflows/get_workflowdo n8n estouram token → parsear via arquivo salvo + jq/python.
7. Log de decisões¶
- 2026-07-07 — Plano v0 criado. Descoberto: obra=CPT
projetos, produto=taxonomiaaplicacoes-do-projeto, campos são meta JetEngine (fora do REST público). Arquitetura = pipe Open WebUI → WF-Sobe-Obra (agente) → sub-flow de publicação. Pendências A–E abertas. - 2026-07-07 — Decisões Rafael: C = REST API + App Password; D = publicar direto no ar; E = link de pasta Dropbox. Reforçada a etapa de confirmação no chat (sem revisão pós-publicação). Faltam só A (prompt) e B (modelo descrição).
Segredo: o bearer compartilhado das valves Open WebUI ↔ n8n aparece como
${OPENWEBUI_N8N_BEARER}(Tier 1 → rotacionar; valor real no arquivo restrito de segredos).