Add marketing automation templates and broadcast functionality

This commit is contained in:
Rodrigo Rodriguez (Pragmatismo) 2026-03-16 08:15:46 -03:00
parent 1c026e3dcd
commit d95f154c18
11 changed files with 516 additions and 2 deletions

View file

@ -0,0 +1,47 @@
PARAM topic AS STRING LIKE "Novo produto de skincare" DESCRIPTION "Tema ou produto para ideation"
PARAM platform AS STRING LIKE "instagram" DESCRIPTION "Plataforma alvo: instagram, facebook, whatsapp, email" OPTIONAL
PARAM count AS INTEGER LIKE 5 DESCRIPTION "Quantidade de ideias a gerar" OPTIONAL
DESCRIPTION "Gera ideias de conteúdo de marketing usando IA para campanhas."
IF NOT topic THEN
TALK "Qual é o tema ou produto para gerar ideias?"
HEAR topic AS STRING
END IF
platforms = IIF(platform, platform, "várias plataformas (Instagram, WhatsApp, Email)")
num_ideas = IIF(count, count, 5)
TALK "🤖 Gerando " + num_ideas + " ideias de conteúdo para: **" + topic + "**"
TALK "Plataforma: " + platforms
TALK ""
prompt = "Gere " + num_ideas + " ideias de conteúdo de marketing criativas e engagement para o tema: " + topic + ". "
prompt = prompt + "Para cada ideia, forneça: headline, mensagem-chave, call-to-action e hashtags relevantes. "
prompt = prompt + "Responda em formato de lista numerada."
ideas = LLM prompt
TALK "💡 **Ideias Geradas:**"
TALK ideas
TALK "Quer que eu salve algumas dessas ideias para usar depois?"
HEAR save_ideas AS BOOLEAN
IF save_ideas THEN
TALK "Quais números das ideias quer salvar? (ex: 1,3,5)"
HEAR selected AS STRING
saved_count = 0
FOR EACH num IN SPLIT(selected, ",")
idea_entry = POST "/api/marketing/ideas", #{
topic: topic,
platform: platform,
idea_number: VAL(TRIM(num)),
saved_at: NOW()
}
saved_count = saved_count + 1
NEXT
TALK "✅ " + saved_count + " ideia(s) salva(s)!"
END IF

View file

@ -0,0 +1,68 @@
PARAM message AS STRING DESCRIPTION "Mensagem com variáveis (ex: Olá {name}!)"
PARAM list_id AS STRING DESCRIPTION "ID da lista de contatos"
PARAM template_file AS STRING DESCRIPTION "URL da imagem de cabeçalho (opcional)" OPTIONAL
PARAM filter AS STRING DESCRIPTION "Filtro adicional (opcional)" OPTIONAL
DESCRIPTION "Envia broadcast WhatsApp em massa para uma lista de contatos."
IF NOT message THEN
TALK "Qual é a mensagem para o broadcast?"
HEAR message AS STRING
END IF
TALK "🤖 Verificando aprovação do template..."
approval_check = LLM "Esta mensagem será aprovada pelo WhatsApp META como Template? Responda OK se sim, ou explique o problema: " + message
IF approval_check <> "OK" THEN
TALK "⚠️ **Atenção:** " + approval_check
TALK "Deseja ajustar a mensagem ou continuar mesmo assim?"
HEAR proceed AS BOOLEAN
IF NOT proceed THEN
RETURN
END IF
ELSE
TALK "✅ Mensagem aprovada para template WhatsApp!"
END IF
IF NOT list_id THEN
TALK "Qual lista de contatos devo usar?"
HEAR list_name AS STRING
lists = GET "/api/marketing/lists?search=" + list_name
IF UBOUND(lists) = 0 THEN
TALK "Lista não encontrada."
RETURN
END IF
list_id = FIRST(lists).id
END IF
list_info = GET "/api/marketing/lists/" + list_id
TALK "📤 **Broadcast Preview:**"
TALK "Mensagem: " + message
IF template_file THEN
TALK "Imagem: " + template_file
END IF
TALK "Destinatários: " + list_info.contact_count + " contatos"
TALK "Lista: " + list_info.name
TALK "Confirmar envio?"
HEAR confirm AS BOOLEAN
IF NOT confirm THEN
TALK "Broadcast cancelado."
RETURN
END IF
TALK "🚀 Enviando broadcast..."
result = POST "/api/marketing/broadcast", #{
message: message,
list_id: list_id,
template_file: template_file,
filter: filter
}
TALK "✅ **Broadcast Enviado!**"
TALK "ID: " + result.broadcast_id
TALK "Status: " + result.status
TALK "Acompanhe as métricas em alguns minutos."

View file

@ -0,0 +1,49 @@
PARAM name AS STRING LIKE "VIPs de São Paulo" DESCRIPTION "Nome da lista dinâmica"
PARAM filter AS STRING LIKE "Perfil=VIP AND cidade=São Paulo" DESCRIPTION "Condição de filtro (SQL-like)"
PARAM description AS STRING DESCRIPTION "Descrição da lista (opcional)" OPTIONAL
DESCRIPTION "Cria uma Lista Dinâmica baseada em filtros de contatos do CRM."
IF NOT filter THEN
TALK "Qual é a condição de filtro para esta lista?"
TALK "Exemplos:"
TALK "- Perfil=VIP"
TALK "- cidade=São Paulo AND compras>5"
TALK "- ultima_compra>2024-01-01"
HEAR filter AS STRING
END IF
TALK "🔍 Verificando quantos contatos matching o filtro..."
preview = GET "/api/crm/contacts/count?filter=" + filter
IF preview = 0 THEN
TALK "⚠️ Nenhum contato encontrada com este filtro!"
TALK "Deseja ajustar o filtro ou criar a lista mesmo assim?"
HEAR proceed AS BOOLEAN
IF NOT proceed THEN
RETURN
END IF
ELSE
TALK "✅ " + preview + " contatos matching o filtro."
TALK "Prosseguir com a criação da lista dinâmica?"
HEAR confirm AS BOOLEAN
IF NOT confirm THEN
RETURN
END IF
END IF
new_list = POST "/api/marketing/lists", #{
name: name,
filter: filter,
description: description,
type: "dynamic"
}
TALK "📋 **Lista Dinâmica Criada!**"
TALK "Nome: " + name
TALK "Filtro: " + filter
TALK "Contatos: " + preview + " (atualizado automaticamente)"
TALK "Tipo: Dinâmica (atualiza automaticamente)"
TALK "ID: " + new_list.id
TALK "Use esta lista em campanhas - ela será atualizada automaticamente!"

View file

@ -0,0 +1,53 @@
PARAM name AS STRING LIKE "Promoção de Páscoa" DESCRIPTION "Nome do template"
PARAM channel AS STRING LIKE "whatsapp" DESCRIPTION "Canal: whatsapp, email, sms, telegram"
PARAM content AS STRING DESCRIPTION "Conteúdo do template (corpo da mensagem ou HTML para email)"
PARAM header_image AS STRING DESCRIPTION "URL da imagem de cabeçalho (opcional)" OPTIONAL
PARAM ai_prompt AS STRING LIKE "Escreva uma mensagem amigável oferecendo 15% de desconto em nossos produtos" DESCRIPTION "Prompt para IA gerar o conteúdo (opcional)" OPTIONAL
PARAM meta_template_id AS STRING DESCRIPTION "ID do template approval pela META (para WhatsApp)" OPTIONAL
DESCRIPTION "Cria um Template de Marketing (email, WhatsApp, SMS) que pode ser usado em campanhas."
IF ai_prompt THEN
TALK "🤖 Gerando conteúdo com IA..."
generated_content = LLM ai_prompt
content = generated_content
TALK "✅ Conteúdo gerado:"
TALK generated_content
TALK "Deseja usar este conteúdo ou pedir para a IA gerar outro?"
HEAR use_content AS BOOLEAN
IF NOT use_content THEN
TALK "Por favor, forneça o conteúdo do template:"
HEAR content AS STRING
END IF
END IF
IF channel = "whatsapp" AND NOT meta_template_id THEN
TALK "⚠️ Para WhatsApp, você precisa de um template approval pela META."
TALK "Deseja proseguir salvando como rascunho (sem meta_template_id)?"
HEAR proceed AS BOOLEAN
IF NOT proceed THEN
RETURN
END IF
END IF
new_template = POST "/api/marketing/templates", #{
name: name,
channel: channel,
content: content,
header_image: header_image,
ai_prompt: ai_prompt,
meta_template_id: meta_template_id,
status: IIF(meta_template_id, "approved", "draft")
}
TALK "📝 **Template Criado!**"
TALK "Nome: " + name
TALK "Canal: " + UCASE(channel)
TALK "Status: " + IIF(meta_template_id, "Approved", "Draft")
TALK "ID: " + new_template.id
IF channel = "whatsapp" AND meta_template_id THEN
TALK "✅ Template pronto para uso em broadcasts WhatsApp!"
END IF
RETURN new_template.id

View file

@ -0,0 +1,63 @@
PARAM prompt AS STRING DESCRIPTION "Descrição da imagem desejada"
PARAM style AS STRING LIKE "modern minimalist" DESCRIPTION "Estilo visual (opcional)" OPTIONAL
PARAM width AS INTEGER LIKE 1024 DESCRIPTION "Largura da imagem" OPTIONAL
PARAM height AS INTEGER LIKE 1024 DESCRIPTION "Altura da imagem" OPTIONAL
DESCRIPTION "Gera imagens de marketing usando IA."
IF NOT prompt THEN
TALK "Descreva a imagem que você quer gerar:"
HEAR prompt AS STRING
END IF
TALK "🎨 Gerando imagem..."
TALK "Prompt: " + prompt
enhanced_prompt = prompt
IF style THEN
enhanced_prompt = prompt + ", " + style + " style"
END IF
enhanced_prompt = enhanced_prompt + ", professional product photography, high quality, marketing material"
result = POST "/api/ai/image/generate", #{
prompt: enhanced_prompt,
width: IIF(width, width, 1024),
height: IIF(height, height, 1024)
}
TALK "✅ **Imagem Gerada!**"
TALK "URL: " + result.image_url
TALK "O que gostaria de fazer agora?"
TALK "1. Postar no Instagram"
TALK "2. Usar em um broadcast"
TALK "3. Baixar a imagem"
TALK "4. Gerar variações"
HEAR choice AS STRING
IF choice = "1" OR choice = "instagram" THEN
TALK "Qual legenda para o post?"
HEAR caption AS STRING
post_result = POST "/api/social/instagram/post", #{
image_url: result.image_url,
caption: caption
}
TALK "✅ Postado no Instagram! ID: " + post_result.post_id
ELSE IF choice = "2" OR choice = "broadcast" THEN
TALK "Qual lista para o broadcast?"
TALK "(Guarde a URL da imagem: " + result.image_url + ")"
ELSE IF choice = "3" OR choice = "baixar" THEN
TALK "Baixe a imagem em: " + result.image_url
ELSE IF choice = "4" OR choice = "variações" THEN
TALK "Gerando variações..."
variations = POST "/api/ai/image/variations", #{
original_url: result.image_url,
count: 3
}
TALK "✅ Variações geradas:"
FOR EACH v IN variations
TALK "- " + v.url
NEXT
END IF

View file

@ -0,0 +1,58 @@
PARAM search AS STRING DESCRIPTION "Termo de busca (opcional)" OPTIONAL
PARAM channel AS STRING LIKE "whatsapp" DESCRIPTION "Filtrar por canal: whatsapp, email, sms, telegram" OPTIONAL
PARAM status_filter AS STRING DESCRIPTION "Filtrar por status: draft, approved, active" OPTIONAL
DESCRIPTION "Lista todos os Templates de Marketing disponíveis, com opção de busca e filtro."
query = "/api/marketing/templates?"
has_param = FALSE
IF search THEN
query = query + "search=" + search
has_param = TRUE
END IF
IF channel THEN
IF has_param THEN
query = query + "&"
END IF
query = query + "channel=" + channel
has_param = TRUE
END IF
IF status_filter THEN
IF has_param THEN
query = query + "&"
END IF
query = query + "status=" + status_filter
END IF
templates = GET query
IF UBOUND(templates) = 0 THEN
TALK "Nenhum template encontrado."
IF search OR channel OR status_filter THEN
TALK "Tente remover os filtros ou usar outros termos."
END IF
RETURN
END IF
TALK "📋 **Templates Encontrados (" + UBOUND(templates) + "):**"
FOR EACH t IN templates
status_icon = IIF(t.status = "approved", "✅", IIF(t.status = "active", "🟢", "📝"))
TALK status_icon + " **" + t.name + "**"
TALK " Canal: " + UCASE(t.channel)
TALK " Status: " + UCASE(t.status)
IF t.content THEN
preview = LEFT(t.content, 80)
IF LEN(t.content) > 80 THEN
preview = preview + "..."
END IF
TALK " Preview: " + preview
END IF
TALK " ID: " + t.id
TALK ""
NEXT t
TALK "Para usar um template em uma campanha, anote o ID."

View file

@ -0,0 +1,54 @@
PARAM image_url AS STRING DESCRIPTION "URL da imagem ou caption"
PARAM caption AS STRING DESCRIPTION "Caption do post (opcional)" OPTIONAL
PARAM video_url AS STRING DESCRIPTION "URL do vídeo (para Reels, opcional)" OPTIONAL
DESCRIPTION "Posta conteúdo no Instagram."
IF NOT image_url AND NOT video_url THEN
TALK "Forneça a URL da imagem ou vídeo para postar:"
HEAR media_url AS STRING
ELSE
media_url = IIF(image_url, image_url, video_url)
END IF
IF NOT caption THEN
TALK "Qual é a caption do post?"
HEAR caption AS STRING
END IF
TALK "📸 **Preview do Post:**"
IF image_url THEN
TALK "Imagem: " + image_url
ELSE
TALK "Vídeo: " + video_url
END IF
TALK "Caption: " + caption
TALK "Postar no Instagram agora?"
HEAR confirm AS BOOLEAN
IF NOT confirm THEN
TALK "Post cancelado."
RETURN
END IF
TALK "Postando..."
IF video_url THEN
result = POST "/api/social/instagram/reel", #{
video_url: video_url,
caption: caption
}
TALK "🎬 **Reel postado!**"
ELSE
result = POST "/api/social/instagram/post", #{
image_url: media_url,
caption: caption
}
TALK "📸 **Postado no Instagram!**"
END IF
TALK "Post ID: " + result.post_id
TALK "Link: " + result.permalink
TALK ""
TALK "Acompanhe o engajamento em Analytics!"

View file

@ -0,0 +1,72 @@
PARAM text AS STRING DESCRIPTION "Texto principal do poster"
PARAM theme AS STRING LIKE "modern" DESCRIPTION "Tema: modern, vintage, minimal, bold"
PARAM primary_color AS STRING DESCRIPTION "Cor primária (hex, opcional)" OPTIONAL
PARAM secondary_color AS STRING DESCRIPTION "Cor secundária (hex, opcional)" OPTIONAL
PARAM logo_url AS STRING DESCRIPTION "URL do logo (opcional)" OPTIONAL
DESCRIPTION "Cria posters e materiais visuais de marketing."
IF NOT text THEN
TALK "Qual é o texto principal do poster?"
HEAR text AS STRING
END IF
IF NOT theme THEN
TALK "Qual tema visual? (modern, vintage, minimal, bold)"
HEAR theme AS STRING
END IF
TALK "🎨 Criando poster..."
TALK "Texto: " + text
TALK "Tema: " + theme
prompt = "Create a marketing poster with text: '" + text + "'. "
prompt = prompt + "Style: " + theme + " graphic design. "
prompt = prompt + "Professional, eye-catching, suitable for social media. "
IF primary_color THEN
prompt = prompt + "Primary color: " + primary_color + ". "
END IF
IF logo_url THEN
prompt = prompt + "Include logo at bottom. "
END IF
result = POST "/api/ai/image/generate", #{
prompt: prompt,
width: 1080,
height: 1080
}
TALK "✅ **Poster Criado!**"
TALK "URL: " + result.image_url
TALK ""
TALK "Opções:"
TALK "1. Baixar"
TALK "2. Postar no Instagram"
TALK "3. Criar versão alternativa"
HEAR choice AS STRING
IF choice = "1" OR choice = "baixar" THEN
TALK "Baixe em: " + result.image_url
ELSE IF choice = "2" OR choice = "instagram" THEN
TALK "Qual caption?"
HEAR caption AS STRING
post_result = POST "/api/social/instagram/post", #{
image_url: result.image_url,
caption: caption
}
TALK "✅ Postado! " + post_result.permalink
ELSE IF choice = "3" OR choice = "alternativa" THEN
TALK "Descreva o que gostaria de mudar:"
HEAR feedback AS STRING
new_prompt = prompt + " Modified based on: " + feedback
alt_result = POST "/api/ai/image/generate", #{
prompt: new_prompt,
width: 1080,
height: 1080
}
TALK "✅ Nova versão: " + alt_result.image_url
END IF

View file

@ -4,6 +4,11 @@ ADD TOOL "send-campaign"
ADD TOOL "create-template" ADD TOOL "create-template"
ADD TOOL "list-templates" ADD TOOL "list-templates"
ADD TOOL "create-dynamic-list" ADD TOOL "create-dynamic-list"
ADD TOOL "add-new-idea"
ADD TOOL "broadcast"
ADD TOOL "get-image"
ADD TOOL "post-to-instagram"
ADD TOOL "poster"
SET CONTEXT "marketing" AS "You are a marketing automation assistant for General Bots. You help marketers create campaigns, design templates (email/WhatsApp), build contact lists (static or dynamic), and schedule or send messages. All features interact with the CRM contacts via the General Bots marketing REST API." SET CONTEXT "marketing" AS "You are a marketing automation assistant for General Bots. You help marketers create campaigns, design templates (email/WhatsApp), build contact lists (static or dynamic), and schedule or send messages. All features interact with the CRM contacts via the General Bots marketing REST API."
@ -11,8 +16,13 @@ CLEAR SUGGESTIONS
ADD SUGGESTION "newcamp" AS "Criar nova campanha" ADD SUGGESTION "newcamp" AS "Criar nova campanha"
ADD SUGGESTION "viewcamps" AS "Ver minhas campanhas" ADD SUGGESTION "viewcamps" AS "Ver minhas campanhas"
ADD SUGGESTION "lists" AS "Criar lista de contatos" ADD SUGGESTION "lists" AS "Criar lista dinâmica"
ADD SUGGESTION "send" AS "Enviar uma campanha" ADD SUGGESTION "send" AS "Enviar uma campanha"
ADD SUGGESTION "template" AS "Criar template"
ADD SUGGESTION "broadcast" AS "Enviar broadcast WhatsApp"
ADD SUGGESTION "ideas" AS "Gerar ideias de conteúdo"
ADD SUGGESTION "image" AS "Gerar imagem com IA"
ADD SUGGESTION "instagram" AS "Postar no Instagram"
BEGIN TALK BEGIN TALK
**Marketing Campanhas e Envio** **Marketing Campanhas e Envio**
@ -21,7 +31,10 @@ Posso ajudar com:
Criar Campanhas (WhatsApp, Email, SMS) Criar Campanhas (WhatsApp, Email, SMS)
Gerenciar Templates (com IA ou predefinidos) Gerenciar Templates (com IA ou predefinidos)
Construir Listas Dinâmicas (ex: VIPs, Clientes do Bairro X) Construir Listas Dinâmicas (ex: VIPs, Clientes do Bairro X)
Enviar campanhas em massa (Broadcast) Enviar campanhas em massa (Broadcast WhatsApp)
Gerar ideias de conteúdo com IA
Criar imagens e posters de marketing
Postar diretamente no Instagram
Ver métricas e estatísticas de aberturas Ver métricas e estatísticas de aberturas
O que quer divulgar hoje? O que quer divulgar hoje?

View file

@ -0,0 +1,14 @@
name,value
episodic-memory-history,2
episodic-memory-threshold,4
theme-color1,#E91E63
theme-color2,#FCE4EC
theme-logo,https://pragmatismo.com.br/icons/general-bots.svg
theme-title,Marketing Hub - General Bots
bot-name,Marketing Automation Assistant
welcome-message,Welcome to Marketing Hub! Create campaigns, templates, and broadcast messages.
instagram-account,
whatsapp-business-id,
default-channel,whatsapp
rate-limit,10
max-broadcast-size,1000
1 name,value
2 episodic-memory-history,2
3 episodic-memory-threshold,4
4 theme-color1,#E91E63
5 theme-color2,#FCE4EC
6 theme-logo,https://pragmatismo.com.br/icons/general-bots.svg
7 theme-title,Marketing Hub - General Bots
8 bot-name,Marketing Automation Assistant
9 welcome-message,Welcome to Marketing Hub! Create campaigns, templates, and broadcast messages.
10 instagram-account,
11 whatsapp-business-id,
12 default-channel,whatsapp
13 rate-limit,10
14 max-broadcast-size,1000

View file

@ -0,0 +1,23 @@
{
"name": "Marketing Campaign Workflow",
"description": "Multi-agent marketing campaign orchestration with audience analysis, content creation, and multi-channel distribution (email, social, ads)",
"version": "1.0.0",
"author": "General Bots",
"category": "marketing",
"keywords": ["marketing", "campaign", "multi-agent", "orchestration", "automation"],
"features": [
"Multi-step workflow orchestration",
"Audience segmentation and analysis",
"AI-powered content generation",
"Multi-channel distribution (email, social, WhatsApp)",
"Parallel execution",
"Event-driven optimization",
"Cross-bot memory sharing",
"Performance analytics"
],
"requirements": {
"tools": ["social-media-post", "email-sender", "analytics-tracker", "llm-generator"],
"knowledge_bases": ["brand-guidelines"],
"bots": ["audience-segmenter", "content-creator", "email-scheduler", "social-scheduler", "ad-manager", "performance-analyzer", "optimizer"]
}
}