feat(secretaria): botão "Usar este modelo" nos modelos de ajuda
Cada modelo do modal de ajuda ganha um botão que cria o nó correspondente no Cérebro (persona/knowledge/rules/calendar/escalation) já preenchido com o conteúdo de exemplo. Desabilitado se nenhum agente estiver selecionado. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1410,9 +1410,9 @@ function NewSlotModal({
|
|||||||
|
|
||||||
// ─── Modal de Ajuda ─────────────────────────────────────────────────────────
|
// ─── Modal de Ajuda ─────────────────────────────────────────────────────────
|
||||||
|
|
||||||
const HELP_MODELOS: { titulo: string; icon: React.ElementType; cor: string; descricao: string; exemplo: string }[] = [
|
const HELP_MODELOS: { titulo: string; type: BrainNodeType; icon: React.ElementType; cor: string; descricao: string; exemplo: string }[] = [
|
||||||
{
|
{
|
||||||
titulo: 'Persona', icon: Sparkles, cor: 'text-purple-400',
|
titulo: 'Persona', type: 'persona', icon: Sparkles, cor: 'text-purple-400',
|
||||||
descricao: 'Identidade, tom de voz e personalidade da secretária — a base de como ela se comunica.',
|
descricao: 'Identidade, tom de voz e personalidade da secretária — a base de como ela se comunica.',
|
||||||
exemplo: `Você é a Ana, atendente da Clínica X. Seu jeito: calorosa, paciente e direta — nunca robótica.
|
exemplo: `Você é a Ana, atendente da Clínica X. Seu jeito: calorosa, paciente e direta — nunca robótica.
|
||||||
Adapte o tom ao do cliente. Use o nome dele com naturalidade, não em toda mensagem.
|
Adapte o tom ao do cliente. Use o nome dele com naturalidade, não em toda mensagem.
|
||||||
@@ -1420,7 +1420,7 @@ Quando o cliente estiver frustrado, reconheça o sentimento antes de resolver.
|
|||||||
Nunca use linguagem corporativa ("prezado", "informamos que"). Varie as respostas.`,
|
Nunca use linguagem corporativa ("prezado", "informamos que"). Varie as respostas.`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
titulo: 'Conhecimento', icon: BookOpen, cor: 'text-blue-400',
|
titulo: 'Conhecimento', type: 'knowledge', icon: BookOpen, cor: 'text-blue-400',
|
||||||
descricao: 'Fatos que a secretária precisa saber: horários, serviços, preços, endereço, políticas.',
|
descricao: 'Fatos que a secretária precisa saber: horários, serviços, preços, endereço, políticas.',
|
||||||
exemplo: `Horário: Seg a Sex, 08h–18h. Sáb 08h–12h.
|
exemplo: `Horário: Seg a Sex, 08h–18h. Sáb 08h–12h.
|
||||||
Endereço: Rua X, 123 — Centro. Estacionamento gratuito.
|
Endereço: Rua X, 123 — Centro. Estacionamento gratuito.
|
||||||
@@ -1429,7 +1429,7 @@ Convênios: Unimed, Bradesco Saúde. Não atendemos outros convênios.
|
|||||||
Política: remarcação com 24h de antecedência.`,
|
Política: remarcação com 24h de antecedência.`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
titulo: 'Regras', icon: ShieldCheck, cor: 'text-orange-400',
|
titulo: 'Regras', type: 'rules', icon: ShieldCheck, cor: 'text-orange-400',
|
||||||
descricao: 'Comportamentos obrigatórios e proibições. Numere para a IA seguir à risca.',
|
descricao: 'Comportamentos obrigatórios e proibições. Numere para a IA seguir à risca.',
|
||||||
exemplo: `1. Sempre confirme nome completo e telefone antes de agendar.
|
exemplo: `1. Sempre confirme nome completo e telefone antes de agendar.
|
||||||
2. Nunca invente preços ou horários — se não souber, diga que vai verificar.
|
2. Nunca invente preços ou horários — se não souber, diga que vai verificar.
|
||||||
@@ -1438,7 +1438,7 @@ Política: remarcação com 24h de antecedência.`,
|
|||||||
5. Para cobrança/estorno, encaminhe para um humano.`,
|
5. Para cobrança/estorno, encaminhe para um humano.`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
titulo: 'Agenda', icon: Calendar, cor: 'text-green-400',
|
titulo: 'Agenda', type: 'calendar', icon: Calendar, cor: 'text-green-400',
|
||||||
descricao: 'Autoriza consultar horários e agendar. Cadastre os horários na aba "Agenda".',
|
descricao: 'Autoriza consultar horários e agendar. Cadastre os horários na aba "Agenda".',
|
||||||
exemplo: `Você pode consultar a agenda e oferecer horários livres.
|
exemplo: `Você pode consultar a agenda e oferecer horários livres.
|
||||||
Ao agendar, confirme data, horário e nome, e repita o resumo:
|
Ao agendar, confirme data, horário e nome, e repita o resumo:
|
||||||
@@ -1446,7 +1446,7 @@ Ao agendar, confirme data, horário e nome, e repita o resumo:
|
|||||||
Ofereça opções concretas ("tenho 14h ou 16h"), não pergunte de forma vaga.`,
|
Ofereça opções concretas ("tenho 14h ou 16h"), não pergunte de forma vaga.`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
titulo: 'Escalada', icon: AlertTriangle, cor: 'text-red-400',
|
titulo: 'Escalada', type: 'escalation', icon: AlertTriangle, cor: 'text-red-400',
|
||||||
descricao: 'Quando e como passar o atendimento para um humano.',
|
descricao: 'Quando e como passar o atendimento para um humano.',
|
||||||
exemplo: `Transfira para humano quando:
|
exemplo: `Transfira para humano quando:
|
||||||
- O cliente pedir explicitamente.
|
- O cliente pedir explicitamente.
|
||||||
@@ -1456,7 +1456,11 @@ Como: "Vou chamar a equipe que resolve isso melhor pra você, um momento."`,
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
function HelpModal({ onClose }: { onClose: () => void }) {
|
function HelpModal({ onClose, onUseModel, canUse }: {
|
||||||
|
onClose: () => void
|
||||||
|
onUseModel: (type: BrainNodeType, title: string, content: string) => void
|
||||||
|
canUse: boolean
|
||||||
|
}) {
|
||||||
return (
|
return (
|
||||||
<div className="fixed inset-0 z-[100] bg-black/70 flex items-center justify-center p-4" onClick={onClose}>
|
<div className="fixed inset-0 z-[100] bg-black/70 flex items-center justify-center p-4" onClick={onClose}>
|
||||||
<div
|
<div
|
||||||
@@ -1498,6 +1502,14 @@ function HelpModal({ onClose }: { onClose: () => void }) {
|
|||||||
</div>
|
</div>
|
||||||
<p className="text-xs text-slate-400 mb-2">{m.descricao}</p>
|
<p className="text-xs text-slate-400 mb-2">{m.descricao}</p>
|
||||||
<pre className="text-xs text-slate-300 bg-black/40 rounded-lg p-3 whitespace-pre-wrap font-mono leading-relaxed">{m.exemplo}</pre>
|
<pre className="text-xs text-slate-300 bg-black/40 rounded-lg p-3 whitespace-pre-wrap font-mono leading-relaxed">{m.exemplo}</pre>
|
||||||
|
<button
|
||||||
|
onClick={() => onUseModel(m.type, m.titulo, m.exemplo)}
|
||||||
|
disabled={!canUse}
|
||||||
|
title={canUse ? 'Cria um nó no Cérebro já preenchido com este modelo' : 'Selecione um agente primeiro'}
|
||||||
|
className="mt-3 inline-flex items-center gap-1.5 text-xs font-semibold rounded-lg bg-brand-500/20 hover:bg-brand-500/30 text-brand-300 px-3 py-1.5 disabled:opacity-40 disabled:cursor-not-allowed transition-colors"
|
||||||
|
>
|
||||||
|
<Plus size={13} /> Usar este modelo
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
@@ -1591,7 +1603,18 @@ export default function SecretariaPage() {
|
|||||||
{/* Thin Nav */}
|
{/* Thin Nav */}
|
||||||
<ThinNav active={activeTab} onChange={handleTabChange} onHelp={() => setShowHelp(true)} />
|
<ThinNav active={activeTab} onChange={handleTabChange} onHelp={() => setShowHelp(true)} />
|
||||||
|
|
||||||
{showHelp && <HelpModal onClose={() => setShowHelp(false)} />}
|
{showHelp && (
|
||||||
|
<HelpModal
|
||||||
|
onClose={() => setShowHelp(false)}
|
||||||
|
canUse={!!store.selectedAgent}
|
||||||
|
onUseModel={async (type, title, content) => {
|
||||||
|
if (!store.selectedAgent) return
|
||||||
|
await store.createNode(store.selectedAgent.id, { type, title, content, sort_order: store.nodes.length })
|
||||||
|
setShowHelp(false)
|
||||||
|
setActiveTab('brain')
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Left Panel */}
|
{/* Left Panel */}
|
||||||
<div className="w-[280px] h-full bg-[#0a0d15] border-r border-white/5 flex flex-col shrink-0">
|
<div className="w-[280px] h-full bg-[#0a0d15] border-r border-white/5 flex flex-col shrink-0">
|
||||||
|
|||||||
Reference in New Issue
Block a user