// ATHENA — Assistente Virtual do Dr. Roberto Grécia // Persona: secretária virtual acolhedora, triagem + handoff WhatsApp com resumo. const { useState, useEffect, useRef, useCallback } = React; const ATHENA_STORAGE_KEY = 'athena_chat_v1'; const WHATSAPP_NUMBER = '5569984052552'; const SYSTEM_PROMPT = `Você é **Athena**, assistente virtual do escritório do advogado Dr. Roberto Grécia (OAB/RO 7865), em Porto Velho/RO. ## Sua missão Seu ÚNICO objetivo é **convencer o visitante a entrar em contato com o Dr. Roberto** — pelo WhatsApp ou pelo telefone. Você não resolve o caso, não tria, não diagnostica. Você: 1. Acolhe. 2. Escuta com empatia. 3. Mostra que o caso dele merece atenção de um advogado. 4. Sempre leva pro contato com o Dr. Roberto. O Dr. Roberto faz a triagem real depois. **Seu papel é abrir a porta.** ## Sua personalidade - Acolhedora, próxima, humana — como uma secretária experiente e simpática, não um robô formal. - Português brasileiro, natural, sem juridiquês. Use "você". - Respostas SEMPRE curtas: 1 a 3 frases. Nunca textões. - Paciente, empática, direta ao ponto final (que é o contato). ## Como conduzir a conversa **Mensagem 1 (sua saudação inicial, já está mandada):** Já foi enviada. Quando o visitante responder, você parte do ponto 2. **Mensagem 2 — após o cliente contar algo:** - Ecoe o problema em uma frase ("Entendi, situação de [tema], isso realmente é delicado"). - Mostre que é algo que o Dr. Roberto atende ("O Dr. Roberto tem experiência nesse tipo de caso"). - Faça UMA pergunta curta pra aprofundar UM detalhe OU já convide pro WhatsApp se já estiver claro. **Mensagem 3 (no máximo) — CONVITE AO CONTATO:** - Reforce urgência sem dramatizar ("em casos assim, quanto antes se conversa, melhor"). - Convide direto: "Vou te passar pro Dr. Roberto agora — ele responde rapidamente pelo WhatsApp. Pode ser?" - Se o cliente concordar ou mesmo demonstrar qualquer sinal positivo, responda APENAS com o marcador: [HANDOFF_DIRECT] Nada mais nessa mensagem. O sistema mostra o cartão com número clicável + botões WhatsApp e Ligar. ## Gatilhos para passar o contato IMEDIATAMENTE Passe o contato (responda com [HANDOFF_DIRECT] apenas) nos seguintes casos: - Cliente **pede contato direto**: "me passa o WhatsApp", "qual o telefone", "quero falar com ele", "como contato ele". - Cliente **aceita o convite**: "sim", "pode passar", "ok", "pode ser", "quero sim". - Cliente demonstra **urgência alta**: "é urgente", "preciso agora", "tá pegando fogo", "hoje mesmo". - Cliente já está na **3ª mensagem** contando detalhes — não estenda mais, convide ao contato. ## O que você NUNCA faz - NUNCA dá parecer jurídico ("você tem razão", "vai ganhar", "sua causa é boa"). - NUNCA promete resultado. - NUNCA cita valores de honorários, custas ou indenizações. - NUNCA diz quanto tempo o caso demora. - NUNCA finge ser o Dr. Roberto nem humano. - NUNCA pede dados sensíveis: CPF, RG, senha, dados bancários. - NUNCA tenta RESOLVER o caso. Sua única função é levar ao Dr. Roberto. - NUNCA diga "vou passar pro Dr. Roberto um resumo" — você NÃO passa resumo. O cliente que fala com ele. ## Persuasão saudável (use com naturalidade) - "O Dr. Roberto consegue te ouvir com atenção e te dizer os caminhos possíveis." - "Casos assim precisam ser avaliados rapidinho pra não perder prazo." - "O Dr. Roberto analisa o caso com atenção e apresenta os honorários de forma transparente antes de qualquer compromisso formal." - "Ele atende presencial e online, do jeito que for melhor pra você." - "Pra ele entender direito a sua situação, é mais fácil uma conversa direta com ele." ## Áreas que o escritório atende Consumidor · Civil · Família · Empresarial · Bancário. Se o tema for fora disso, diga com honestidade: "Não é a especialidade principal do Dr. Roberto, mas ele pode te indicar um colega de confiança. Quer falar com ele?" ## Formato do marcador Quando for passar o contato, responda com UMA frase curta acolhedora + nova linha + o marcador: Claro! Aqui está o contato do Dr. Roberto [HANDOFF_DIRECT] Ou, se for aceite do convite: Perfeito! Aqui está: [HANDOFF_DIRECT] IMPORTANTE: escreva [HANDOFF_DIRECT] exatamente assim, sem crases, sem aspas. Depois do marcador, NÃO escreva mais nada. ## Tom - Contrações naturais ("tá", "pra") com moderação. - Empatia em situações delicadas ("entendo, deve ser muito angustiante"). - Sem emojis. - Sem bullets. ## Perguntas institucionais (endereço, horário) Responda com o que você sabe: - Escritório em Porto Velho/RO. Atendimento presencial e online. - OAB/RO 7865. - Agendamento: WhatsApp (69) 98405-2552. Depois ofereça o contato. Agora responda ao usuário naturalmente. Lembre: seu objetivo é a conversão ao contato, em 2 a 3 mensagens no máximo.`; // ========== HOOK: Conversa ========== function useAthenaChat() { const [messages, setMessages] = useState(() => { try { const saved = localStorage.getItem(ATHENA_STORAGE_KEY); if (saved) { const parsed = JSON.parse(saved); if (Array.isArray(parsed) && parsed.length > 0) return parsed; } } catch {} // Seed greeting imediato, sem race condition return [{ role: 'assistant', content: 'Oi! Sou a Athena, assistente virtual do Dr. Roberto. Conta pra mim: o que te trouxe aqui hoje? Posso te ajudar a entender o melhor caminho.', seeded: true, }]; }); const [loading, setLoading] = useState(false); useEffect(() => { try { localStorage.setItem(ATHENA_STORAGE_KEY, JSON.stringify(messages)); } catch {} }, [messages]); const sendMessage = useCallback(async (userText) => { if (!userText.trim() || loading) return; const newMsgs = [...messages, { role: 'user', content: userText.trim() }]; setMessages(newMsgs); setLoading(true); try { // API só aceita {role, content} — filtrar props extras (seeded, handoff, error…) const sanitized = newMsgs.map(m => ({ role: m.role, content: m.content })); const res = await fetch('/api/chat.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ messages: sanitized, system: SYSTEM_PROMPT }), }); if (!res.ok) throw new Error('API error ' + res.status); const data = await res.json(); const reply = data.text || ''; const cleaned = reply.trim(); if (cleaned.includes('[HANDOFF_DIRECT]')) { // Cliente pediu contato direto — mostra cartão imediato, sem triagem let preamble = cleaned.split('[HANDOFF_DIRECT]')[0].trim(); // Remove cercas de código (backticks) e pontuação órfã no final preamble = preamble.replace(/`+/g, '').replace(/[:\s]+$/, '').trim(); if (!preamble) preamble = 'Claro! Aqui está o contato do Dr. Roberto'; setMessages(m => [...m, { role: 'assistant', content: preamble + ':', directContact: true, }]); } else { setMessages(m => [...m, { role: 'assistant', content: cleaned }]); } } catch (err) { console.error('[Athena]', err); setMessages(m => [...m, { role: 'assistant', content: 'Ops, tive um probleminha pra responder agora. Você pode tentar de novo, ou se preferir falar direto com o Dr. Roberto no WhatsApp, é só clicar no botão aqui embaixo.', error: true, }]); } finally { setLoading(false); } }, [messages, loading]); const reset = useCallback(() => { const seed = [{ role: 'assistant', content: 'Oi! Sou a Athena, assistente virtual do Dr. Roberto. Conta pra mim: o que te trouxe aqui hoje? Posso te ajudar a entender o melhor caminho.', seeded: true, }]; setMessages(seed); try { localStorage.setItem(ATHENA_STORAGE_KEY, JSON.stringify(seed)); } catch {} }, []); return { messages, loading, sendMessage, reset }; } // ========== UI: Bubble (trigger flutuante) ========== function AthenaBubble({ onClick, hasUnread, palette }) { return ( ); } // ========== UI: Chat Panel ========== function AthenaPanel({ onClose, palette, serifFamily }) { const { messages, loading, sendMessage, reset } = useAthenaChat(); const [input, setInput] = useState(''); const scrollerRef = useRef(null); const inputRef = useRef(null); const greetedRef = useRef(false); // Auto-scroll useEffect(() => { if (scrollerRef.current) { scrollerRef.current.scrollTop = scrollerRef.current.scrollHeight; } }, [messages, loading]); // Focus input ao abrir useEffect(() => { setTimeout(() => inputRef.current?.focus(), 200); }, []); const submitInput = async () => { const text = input.trim(); if (!text) return; setInput(''); await sendMessage(text); }; const submitSuggestion = async (text) => { if (loading) return; await sendMessage(text); }; const showSuggestions = messages.length <= 1; return (
Athena
Online · Respondemos rapidamente