// agno-section.jsx — Agno agents with RAG over the corpus const PERSONAS = [ { name: 'Legal Advisor', role: 'rrhh · contratos', glyph: '§', color: '#a1f75e', prompts: [ '¿Cuál es la política de vacaciones?', 'Dame el último contrato de proveedor', 'Resume las cláusulas de confidencialidad', ], }, { name: 'Tech Guide', role: 'engineering · arch', glyph: '◈', color: '#f9f9f9', prompts: [ 'Explícame la arquitectura del módulo de pagos', '¿Dónde se definen los hooks de Keycloak?', 'Compara las dos propuestas de caché', ], }, { name: 'Sales Buddy', role: 'gtm · playbook', glyph: '↗', color: '#a1f75e', prompts: [ 'Genera un pitch para el sector salud', '¿Qué objeciones hubo en la call de ayer?', 'Dame casos de éxito comparables', ], }, ]; const AgnoSection = () => { const ref = React.useRef(null); const inView = useInView(ref, { threshold: 0.15, once: true }); const [t, setT] = React.useState(0); useRaf((s) => setT(s), inView); const [selected, setSelected] = React.useState(0); React.useEffect(() => { if (!inView) return; const id = setInterval(() => { setSelected((s) => (s + 1) % PERSONAS.length); }, 4200); return () => clearInterval(id); }, [inView]); const persona = PERSONAS[selected]; // Typing animation for the current prompt const promptCycle = Math.floor(t * 0.7) % persona.prompts.length; const currentPrompt = persona.prompts[promptCycle]; const typePhase = (t * 0.7) % 1; const typedChars = Math.min(currentPrompt.length, Math.floor(typePhase * currentPrompt.length * 1.6)); const typed = currentPrompt.slice(0, typedChars); return (
{/* Faint grid pattern */}
06 · Agno Agents

Agentes configurables,
con memoria y RAG.

Define agentes desde Payload con su prompt, modelo y scopes de conocimiento. Cada conversación vive en el schema agno de Postgres, con sesiones persistentes, historial y tool-calling sobre tu índice RAG.

{/* Left: persona picker */}
payload · collections/agents
{PERSONAS.map((p, i) => { const active = i === selected; return ( ); })}
+ new agent
name · systemPrompt · model · taxonomy_scopes · tools
{/* Right: chat session */}
{/* Header */}
session · agno.sessions
{persona.name.toLowerCase().replace(' ', '_')}.chat
{/* Messages */}
{/* User typing */}
{typed}
{/* Tool call */}
▸ TOOL · search_collections
query: "{currentPrompt.slice(0, 40)}{currentPrompt.length > 40 ? '…' : ''}"
→ 4 chunks · tenant=acme · 182ms
{/* Agent answer */}
{persona.glyph} {persona.name}
Según los 4 fragmentos recuperados del corpus de tu tenant, la respuesta se construye citando posts/#p_8421 y books/handbook#ch-3. La sesión y el razonamiento quedan persistidos en agno.sessions.
{/* Footer stats */}
streaming tokens · 412 rag hits · 4 persisted · agno.sessions @zetesis/payload-agents-core
); }; Object.assign(window, { AgnoSection });