| name | chat-workflow |
| description | Use esta skill quando trabalhar com o sistema de chat IA para criação de artigos. Contém workflow completo, detecção de intenção, comandos naturais, e arquitetura técnica. |
| allowed-tools | Read, Edit, Write |
Chat Workflow Skill
⚠️ CRÍTICO: Use esta skill quando trabalhar com o sistema de chat IA (/dashboard/criar-artigo ou AdminChatSidebar).
🎯 Visão Geral do Sistema
Sistema de Criação com Chat IA
Localização: /dashboard/criar-artigo
Objetivo: Criar artigos completos via conversa natural com IA (sem formulários).
Modelo: Perplexity Sonar (acesso web em tempo real)
📊 Fluxo Completo de Criação
1️⃣ Modo Conversa Livre (sem tipo selecionado)
Usuário: "Qual o preço do Bitcoin hoje?"
↓
Frontend → /api/chat-perplexity (streaming)
↓
Perplexity busca web → Responde em tempo real
↓
Chat exibe resposta (streaming)
Características: Streaming ativado, busca web automática, perguntas sobre mercado
2️⃣ Modo Criação de Artigo (tipo selecionado)
Seleção de Tipo
// Botões no footer do chat
- [📰 Notícia] → selectedType = 'news'
- [📚 Educação] → selectedType = 'educational'
- [📦 Recurso] → selectedType = 'resource'
Fluxo de Geração
Usuário seleciona tipo + digita: "Bitcoin atinge $100k"
↓
Frontend → /api/chat-perplexity (JSON, não streaming)
↓
Perplexity gera artigo JSON + citations
↓
Frontend: detectJSON() → processArticleLocally() → validateProcessedArticle()
↓
setGeneratedArticle({ ...article, citations })
↓
Preview renderizado com ArticlePreview
Arquivo: criar-artigo/page.tsx:320-373
3️⃣ Processamento e Validação
processArticleLocally (instantâneo)
Local: lib/article-processor-client.ts
Responsabilidades:
- Gera slug único (
slugify + timestamp) - Calcula readTime (
Math.ceil(words / 200)) - Sanitiza conteúdo
- Define categoria, tags, sentiment/level
NÃO usa: Gemini (processamento local)
validateProcessedArticle
Valida: H1 duplicado, estrutura de seções (4-7), campos obrigatórios, tamanho
Retorna: { valid: boolean, score: 0-100, errors: [], warnings: [] }
4️⃣ Ferramentas Opcionais
| Ferramenta | Fluxo | Quando Usar |
|---|---|---|
| Refinar com Gemini | /api/process-gemini → Gemini melhora estrutura |
Artigo precisa de polish |
| Criar Capa com IA | /api/regenerate-cover → Gemini 2.0 Image gera PNG |
Capa personalizada |
| Refinar Manual | /api/refine-article → Perplexity aplica edição |
Mudança específica |
5️⃣ Publicação
[✅ Publicar Artigo]
↓
handlePublish() prepara dados:
- tags: stringifica se array
- factCheckSources: JSON.stringify(citations)
- published: true (exceto resources)
↓
POST /api/articles ou /api/resources
↓
Salvo no PostgreSQL (Prisma)
↓
Redirect: /dashboard/noticias/{slug} ou /educacao/{slug} ou /recursos/{slug}
Citations: Armazenadas em factCheckSources (JSON string) para fontes clicáveis.
🤖 AdminChatSidebar (Componente Reutilizável)
Características
Arquivo: components/admin/AdminChatSidebar.tsx
Props:
interface AdminChatSidebarProps {
pageData?: Record<string, any>; // Dados do artigo atual
model?: 'sonar' | 'sonar-pro'; // Modelo Perplexity
onApplyContent?: (content: string) => void; // Callback
}
Features:
- Estado inicial: Oculto (botão flutuante 🤖)
- Dimensões: 420px width
- Histórico persistente (localStorage, 50 msgs)
- Streaming de respostas
- Markdown rendering (ReactMarkdown + remarkGfm)
- Comandos rápidos (/create, /validate, /publish)
- Exportar histórico (JSON)
Uso em Layouts
import AdminChatSidebar from '@/components/admin/AdminChatSidebar';
import { AdminChatProvider } from '@/contexts/AdminChatContext';
<AdminChatProvider>
{children}
<AdminChatSidebar />
</AdminChatProvider>
🧠 Sistema de Detecção de Intenção
Arquivo: lib/intent-detector.ts
Função: Detectar intenção em linguagem natural (português brasileiro)
Intenções Principais
| Intenção | Padrões | Confiança | Exemplos |
|---|---|---|---|
| CREATE | crie, criar, gere, gerar, escreva | 0.9 | "Crie uma notícia sobre Bitcoin" |
| VALIDATE | valide, validar, verifique | 0.95 | "Valide este artigo" |
| PUBLISH | publique, publicar, envie, salve | 0.95 | "Publique o artigo" |
| LIST | liste, mostre, exiba | 0.8 | "Liste os últimos artigos" |
| SEARCH | busque, procure, encontre | 0.85 | "Busque artigos sobre Ethereum" |
| DELETE | delete, remova, apague | 0.9 | "Delete o artigo X" |
| EDIT | edite, corrija, mude, altere | 0.85 | "Edite o artigo X" |
| STATS | estatísticas, quantos, total | 0.8 | "Quantos artigos temos?" |
| RESEARCH | pesquise, qual, o que, como | 0.7 | "Qual o preço do Bitcoin?" |
Processamento de Intenções
Localização: app/api/admin-chat/route.ts:91-207
const intentResult = processIntent(lastMessage.content, pageData);
// String: resposta pronta (validação)
if (typeof intentResult === 'string') {
return JSON { content: intentResult, isDirectResponse: true };
}
// Objeto: ação especial (gerar artigo, listar, deletar)
if (intentResult?.action) {
return JSON { action: 'generate-article-request', data: {...} };
}
// null: conversa normal (IA responde)
🔧 Hook useAdminChat
Arquivo: hooks/useAdminChat.ts
Responsabilidades
- Gerenciar estado (messages, loading, error)
- Enviar mensagens →
/api/admin-chat - Processar respostas (streaming ou JSON)
- Detectar ações especiais:
generate-article-request→/api/generate-articlelist-articles→/api/articles?limit=10search-articles→/api/articles?query=...delete-article→ DELETE após confirmaçãoedit-article→ eventoopen-article-canvaspublish-article→ evento customizadoshow-stats→ calcula estatísticas
- Persistir histórico (localStorage, max 50)
- Exportar histórico (JSON download)
Eventos Customizados
window.dispatchEvent(new CustomEvent('article-generated', { detail: data }));
window.dispatchEvent(new CustomEvent('publish-article', { detail: data }));
window.dispatchEvent(new CustomEvent('article-published', { detail: result }));
window.dispatchEvent(new CustomEvent('open-article-canvas', { detail: { article } }));
window.dispatchEvent(new CustomEvent('apply-canvas-edit', { detail: { content } }));
window.dispatchEvent(new CustomEvent('canvas-article-changed', { detail: { article } }));
Edição de Artigos com Canvas
Fluxo Resumido:
- Usuário: "Edite o artigo sobre Bitcoin"
- Hook detecta
edit-articleaction - Busca artigo (
/api/articles/{slug}) - Dispara evento
open-article-canvas - Canvas abre à direita com editor
- Usuário edita manualmente OU digita instrução
- IA processa edição →
apply-canvas-edit - Canvas atualiza sem salvar
- Usuário clica "Salvar" quando satisfeito
Código: useAdminChat.ts:778-858
📡 API /api/admin-chat
Arquivo: app/api/admin-chat/route.ts
Segurança (4 Camadas)
// 1. Autenticação obrigatória
const session = await getServerSession(authOptions);
if (!session) return 401;
// 2. Permissão: ADMIN ou EDITOR
if (session.user.role !== 'ADMIN' && session.user.role !== 'EDITOR') return 403;
// 3. Rate limiting: 10 req/min (em memória)
if (!checkRateLimit(session.user.id)) return 429;
// 4. Validação de input
if (lastMessage.content.length > 4000) return 400;
Processamento
// 1. Detectar intenção
const intentResult = processIntent(lastMessage.content, pageData);
// 2. Se resposta direta → retorna JSON
// 3. Se ação especial → retorna JSON com action
// 4. Se conversa normal → adiciona contexto + chama Perplexity
// 5. Selecionar modelo otimizado
const modelConfig = selectOptimalModel(userMessage, intent);
// 6. Chamar Perplexity com streaming
const stream = await callPerplexityStreaming({
model: 'sonar',
messages: [systemPrompt, ...messages],
search_recency_filter: 'day' | 'week' | undefined,
return_citations: false // Desativa [1][2][3]
});
selectOptimalModel
Lógica (route.ts:17-54):
| Cenário | Modelo | Filtro | Motivo |
|---|---|---|---|
| Criar notícia | sonar | day | Busca info mais recente |
| Pesquisa atual (preço, hoje) | sonar | week | Info atualizada |
| Padrão | sonar | - | Conversação geral |
🎨 Sistema de Contexto Automático
Arquivo: lib/admin-chat-context.ts
Função: Adaptar prompt do sistema baseado na página
Prompts por Página
/dashboard/criar-artigo
**CONTEXTO ATUAL**: Dashboard - Área de Criação de Conteúdo
**O QUE VOCÊ PODE FAZER**:
- Criar artigos completos (notícias, educacionais, recursos)
- Validar conteúdo (score 0-100)
- Editar e melhorar textos
- Publicar no banco de dados
**REGRAS DE ESTRUTURA** (CRÍTICO):
- Notícias DEVEM começar com ## (H2), NÃO com parágrafo
- Artigos educacionais PODEM começar com parágrafo
- NUNCA incluir H1 no conteúdo
- NUNCA incluir fontes/referências
- Notícias: 5-6 seções H2 (mín 4, máx 7)
/dashboard (geral)
**CONTEXTO ATUAL**: Dashboard Principal
**O QUE VOCÊ PODE FAZER**:
- Criar conteúdo (notícias, artigos, recursos)
- Gerenciar artigos existentes (listar, buscar, deletar)
- Analisar estatísticas da plataforma
- Pesquisar informações atualizadas sobre crypto
**REGRA CRÍTICA - BANCO vs WEB**:
- "Listar artigos" → Sistema busca NO BANCO
- "Pesquisar sobre X na web" → Você busca NA WEB
Contexto do Artigo
Se há artigo em edição (pageData.content ou pageData.title), adiciona ao prompt:
**Artigo Atual**:
- Título: {title}
- Tipo: {type}
- Categoria: {category}
- Tags: {tags}
- Tamanho: {length} caracteres
**Conteúdo**:
"""
{content}
"""
💾 Persistência e Estado
localStorage
// Key: 'admin-chat-history'
// Max: 50 mensagens
// Estrutura:
[
{
id: 'user-1234567890',
role: 'user',
content: 'Crie uma notícia sobre Bitcoin',
timestamp: '2025-11-03T10:30:00.000Z'
},
{
id: 'assistant-1234567891',
role: 'assistant',
content: '✅ Artigo gerado!',
timestamp: '2025-11-03T10:30:15.000Z',
metadata: {
canvasArticle?: { slug, title, content },
instruction?: 'Remova as referências'
}
}
]
Context Provider
Arquivo: contexts/AdminChatContext.tsx
Função: Compartilhar pageData entre layout e páginas
const [pageData, setPageData] = useState<Record<string, any>>({});
// Página seta dados
setPageData({ title, content, type, category });
// Chat consome via context
🔍 Debugging
Logs de Development
const isDev = process.env.NODE_ENV === 'development';
if (isDev) {
console.log('🖼️ [DEBUG] coverImage:', generatedArticle.coverImage);
console.log('📝 Artigo detectado, processando...');
console.log('✅ Validação:', validation);
}
Problemas Comuns e Soluções
| Problema | Causa | Debug | Solução |
|---|---|---|---|
| Artigo não aparece no preview | generatedArticle não foi setado |
console.log antes/depois de setGeneratedArticle |
Verificar fluxo de detecção JSON |
| Citations não salvam | factCheckSources não stringificado |
Verificar JSON.stringify(citations) |
Stringificar antes do POST |
| Chat não responde (loading infinito) | Streaming quebrado ou erro | Network tab: erro 500/429/403 | Verificar auth, rate limit, API |
| Detecção de JSON falha | Perplexity retornou JSON malformado | Logs em detectJSON() |
Parser multi-camadas robusto já implementado |
Arquivo de Debug: criar-artigo/page.tsx:258-294
📋 Checklist de Criação de Artigo
Fluxo Ideal
- Selecionar tipo (Notícia, Educação ou Recurso)
- Digitar tópico claro: "Bitcoin atinge $100k após aprovação de ETF"
- Aguardar geração (10-30 segundos)
- Verificar preview renderizado
- (Opcional) Refinar com Gemini
- (Opcional) Gerar capa com IA
- (Opcional) Editar manualmente
- Publicar artigo
- Verificar redirect automático
Validação Antes de Publicar
- Score > 80 (bom), > 90 (excelente)
- Sem H1 duplicado no content
- 4-7 seções H2 (notícias)
- Conteúdo > 500 caracteres
- Tags relevantes
- Categoria definida
- Citations salvas (se houver)
🚀 Próximas Features (Sugeridas)
Fase 2 - UX
- Comandos de atalho (Ctrl+K)
- Voice input (Web Speech API)
- Markdown preview em tempo real
- Histórico de artigos gerados (banco)
Fase 3 - Avançado
-
/seo- Análise SEO do artigo -
/translate [idioma]- Traduzir -
/images- Sugerir imagens (Unsplash) - Modo batch (múltiplos artigos)
Fase 4 - Analytics
- Dashboard de custos
- Métricas de qualidade
- A/B testing de prompts
- Feedback loop para melhorar IA
📁 Arquivos Críticos da Implementação
# Core Chat
components/admin/AdminChatSidebar.tsx # UI sidebar
hooks/useAdminChat.ts # Lógica + eventos
app/api/admin-chat/route.ts # API endpoint
# Criação de Artigos
app/dashboard/criar-artigo/page.tsx # Interface principal
app/api/chat-perplexity/route.ts # Proxy Perplexity
# Processamento
lib/article-processor-client.ts # Processar + validar
lib/admin-chat-context.ts # Sistema de contexto
lib/intent-detector.ts # Detecção de intenção
lib/perplexity-client.ts # Cliente Perplexity
# Context
contexts/AdminChatContext.tsx # Context provider
# APIs auxiliares
app/api/generate-article/route.ts # Geração de artigos
app/api/process-gemini/route.ts # Refinar com Gemini
app/api/refine-article/route.ts # Refinamento manual
app/api/regenerate-cover/route.ts # Gerar capa com IA
💰 Custos Estimados
Perplexity Sonar:
- Mensagem chat: ~$0.002
- Gerar artigo: ~$0.007
- 500 mensagens: ~$1
- 140 artigos: ~$1
Gemini (opcional):
- Refinar artigo: ~$0.001
- Gerar capa: ~$0.05
⚠️ Limitações Conhecidas
Perplexity às vezes retorna JSON malformado
- Mitigação: Parser multi-camadas robusto implementado
Rate limit em memória
- Reseta ao reiniciar servidor
- Considerar Redis para produção
Histórico em localStorage
- Não sincroniza entre devices
- Considerar banco para histórico persistente
Citations em factCheckSources
- Schema atual não tem campo dedicado
- Usando campo genérico como workaround
Skill criada por: Claude Code Última atualização: 2025-11-04 Baseado em: Sistema completo de chat IA do Token Milagre Platform