diff --git a/src/config/skins/index.ts b/src/config/skins/index.ts index 1fcd587..bfa5273 100644 --- a/src/config/skins/index.ts +++ b/src/config/skins/index.ts @@ -219,11 +219,13 @@ export const SYSTEM_SKINS: SkinConfig[] = [ // Copy de resposta direta para tripwire/low-ticket: o objetivo é a COMPRA // de entrada barata, com o lucro vindo do funil (order bump/upsell). copy_rules: - 'Você escreve para um PRODUTO DE ENTRADA de ticket baixo (tripwire) voltado a pais e mães organizando festas infantis. Objetivo: gerar a COMPRA imediata, não cliques curiosos. ' + - 'Lidere pelo preço-âncora e pela facilidade ("R$X no Pix e recebe na hora"). Destaque Pix = acesso imediato e cartão parcelado quando houver. ' + - 'Use o contraste de valor (o que receberia vs. quanto custa), prova de praticidade ("pronto em minutos"), e uma urgência honesta (oferta de lançamento/bônus). ' + - 'Fale a língua de pai/mãe: economia de tempo, festa encantadora, criança feliz, sem dor de cabeça. ' + - 'Evite promessas impossíveis e clickbait. CTA de compra (SHOP_NOW ou GET_OFFER). Primary text curto, escaneável e específico — sem encher linguiça.', + 'PRODUTO: um ESTÚDIO self-service de IA para festas infantis (NÃO é kit pronto entregue por e-mail). Funciona em 3 passos: 1) a pessoa envia uma foto do filho; 2) a IA cria o avatar da criança em personagem 3D (grátis); 3) ela escolhe entre 33 tipos de artes (convites, topo de bolo, lembrancinhas, tags e mais) e GERA as que quiser, baixa na hora e imprime. Modelo: R$9,99 = 10 créditos, 1 crédito por arte, pagamento único, recarrega se quiser mais. ' + + 'TOM/REGRAS: É um produto de ENTRADA (tripwire) para pais/mães — objetivo é a COMPRA imediata. ' + + 'SEMPRE use verbos de criação ("você cria", "você gera", "monte", "personalize") — NUNCA "receba", "compre o kit", "entregamos", "kit pronto". A pessoa faz ela mesma. ' + + 'Use a mecânica única como gancho: foto → avatar 3D do filho (grátis) → escolher e gerar as artes. Isso é o diferencial, não "praticidade" genérica. ' + + 'Lidere pelo preço-âncora (R$9,99 = 10 artes) e pelo instantâneo ("gera e baixa na hora"). Mencione Pix/cartão quando houver. ' + + 'Urgência honesta (oferta de lançamento/avatar grátis), nunca falsa escassez. ' + + 'CTA de compra (SHOP_NOW ou GET_OFFER). Texto específico e escaneável — sem clichê, sem encher linguiça.', image_style: 'Festa infantil mágica e encantadora, cores vibrantes e alegres, elementos lúdicos (balões, estrelas, brilho), tema de aniversário, visual limpo com destaque para o produto/oferta, alto contraste para parar o feed', }, diff --git a/src/lib/ai/copywriter.ts b/src/lib/ai/copywriter.ts index 7a79922..7d85ec0 100644 --- a/src/lib/ai/copywriter.ts +++ b/src/lib/ai/copywriter.ts @@ -5,7 +5,9 @@ import { getAIClient } from './client'; import { scrapeWebsiteContext } from './scraper'; -const COPY_MODEL = 'gpt-5.4-mini'; +// Copy é o que mais sofre com modelo fraco — o "mini" gera texto genérico. +// Default no modelo full; pode sobrescrever por env sem mexer no código. +const COPY_MODEL = process.env.OPENAI_COPY_MODEL || 'gpt-5.4'; export interface AdCopyVariation { headline: string; @@ -92,6 +94,13 @@ REGRAS OBRIGATÓRIAS: - Foque em benefícios, não features - Use gatilhos mentais (escassez, prova social, autoridade) com honestidade - Evite clickbait ou promessas impossíveis + +PROIBIDO SER GENÉRICO (regra mais importante): +- Nada de clichê vazio: "a melhor escolha", "qualidade incrível", "não perca essa oportunidade", "transforme sua vida", "praticidade e economia". Se a frase serve pra qualquer produto, está errada. +- CADA frase precisa de um detalhe CONCRETO e específico do produto (número, mecânica, preço, o que a pessoa faz/recebe exatamente). Use os dados reais do contexto/oferta — não invente nem generalize. +- A primeira linha do Texto Principal tem que ser um "pattern interrupt": uma frase específica que faz a pessoa parar de rolar o feed (uma pergunta afiada, um número, uma cena concreta). Nunca comece com saudação ou frase morna. +- Escreva como gente fala, não como folheto. Concreto > adjetivo. Verbo de ação > descrição. +- As ${count} variações devem ser GENUINAMENTE diferentes entre si (ângulo, abertura e estrutura) — não a mesma ideia reescrita. ${directResponseRules} Gere ${count} variações de copy para um anúncio de Facebook Ads baseado no contexto abaixo: @@ -112,6 +121,8 @@ Retorne um JSON com a seguinte estrutura: const completion = await openai.chat.completions.create({ model: COPY_MODEL, + // Temperatura mais alta = copy menos engessada/repetitiva. + temperature: 0.9, messages: [{ role: 'user', content: prompt }], response_format: { type: 'json_object' }, });