Add complete AgentKit + Supabase integration with multi-client support#3
Open
Oskelias wants to merge 32 commits into
Open
Add complete AgentKit + Supabase integration with multi-client support#3Oskelias wants to merge 32 commits into
Oskelias wants to merge 32 commits into
Conversation
- Servidor FastAPI con webhook de Whapi.cloud - Brain con Claude AI (claude-sonnet-4-6) - Sistema de memoria con SQLite - Configuración de negocio e instrucciones - Tests locales - Dockerfile y docker-compose.yml para producción
- Estructura de carpetas: config/{AGENTE_ACTIVO}/, knowledge/{AGENTE_ACTIVO}/, data/{AGENTE_ACTIVO}/
- Variable de entorno AGENTE_ACTIVO controla qué agente está activo
- brain.py: carga config desde config/{AGENTE_ACTIVO}/prompts.yaml
- tools.py: carga config y knowledge desde carpetas específicas del agente
- memory.py: bases de datos separadas por agente (data/{AGENTE_ACTIVO}/)
- .env: agregada variable AGENTE_ACTIVO=mundo-electronico
- Permite agregar nuevos agentes sin duplicar código
Para agregar un nuevo agente:
1. Crear config/nuevo-negocio/business.yaml
2. Crear config/nuevo-negocio/prompts.yaml
3. Crear knowledge/nuevo-negocio/.gitkeep
4. En Railway: nuevo servicio con AGENTE_ACTIVO=nuevo-negocio
- Nuevo sistema de detección de tipos de pregunta (reparación, accesorios, logística, cita, horario) - Filtros configurables por agente en prompts.yaml (keywords + instruccion_extra) - detectar_tipo_pregunta() en agent/tools.py — lee filtros del agente activo - brain.py enriquece system_prompt dinámicamente según el tipo detectado - Respuestas más precisas y contextuales - Todos los agentes futuros heredan esta capacidad automáticamente Ejemplos: - 'pantalla rota' → pide modelo específico, no da precio genérico - 'tienen fundas' → pregunta qué modelo para recomendar - 'horario' → da horario completo y claro - 'turno' → solicita datos para agendar
- Nuevo archivo config/{agente}/precios.yaml con catálogo de precios
- Estructura: pantallas, baterías, componentes, accesorios, servicios
- Nueva función consultar_precios() en agent/tools.py
- brain.py inyecta catálogo cuando detecta pregunta sobre reparacion/accesorios
- El agente responde con precios reales en lugar de 'no tengo esa información'
- Configurable por agente: cada negocio tiene sus propios precios
- Si no existe precios.yaml, el agente funciona normalmente
Para Mundo Electronico:
- iPhone 14: $85.000 pantalla, 24-48hs
- Batería: $25.000, 1-2 horas
- Funda: $8.000-$12.000
- Todo actualizable sin tocar código
- Nuevo sistema de tags [CITA]...[/CITA] en respuestas de Claude - Nueva función crear_evento_calendario() en agent/tools.py - Función procesar_cita_si_existe() en agent/main.py detecta y procesa el tag - Crea eventos automáticamente en Google Calendar cuando se confirma una cita - El tag se elimina del texto visible al cliente (invisible) - Graceful degradation: funciona sin Google Calendar configurado - Nuevas dependencias: google-auth, google-auth-httplib2, google-api-python-client - Variables de entorno: GOOGLE_CALENDAR_CREDENTIALS, GOOGLE_CALENDAR_ID - Instrucción mejorada en filtro 'cita' para generar el tag Flujo: 1. Cliente solicita cita 2. Claude recopila: nombre, teléfono, dispositivo, fecha, hora 3. Cuando confirma, Claude incluye [CITA]datos[/CITA] en respuesta 4. main.py detecta el tag, llama crear_evento_calendario() 5. Google Calendar API crea el evento automáticamente 6. Tag se elimina, cliente ve respuesta limpia
- Agregar tabla Ticket en memory.py con campos: ticket_numero, estado, notas, etc. - Funciones CRUD: crear_ticket, consultar_ticket, buscar_tickets_por_telefono, actualizar_ticket - Formato de ticket: MER-YYYYMMDD-NNN (prefijo de agente + fecha + secuencial) - Cuando se agenda cita: crear automáticamente ticket + evento calendar - Cuando cliente pregunta estado: enriquecer respuesta con info de tickets - Filtro 'soporte' en prompts.yaml para detectar preguntas sobre reparación - Test local con comandos: 'tickets', 'crear ticket [dispositivo]' - Documentación en PHASE5_TICKETS.md - Multi-agente ready: cada agente con sus propios tickets Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Interfaz web en /admin con login protegido por contraseña - Ver todos los tickets: estado, cliente, dispositivo, fechas - Cambiar estado en tiempo real (abierto → en progreso → completado → cerrado) - Agregar notas con timestamp automático - Estadísticas en dashboard (total, abiertos, en progreso, completados) - Design responsivo y moderno (gradiente, colores por estado) - Sesión por cookie (7 días) - Sin dependencias nuevas, usa SQLAlchemy existente Contraseña configurable en ADMIN_PASSWORD (.env) Default: 'admin123' (cambiar en producción) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Aceptar credenciales del PROVEEDOR (una sola vez) - Cada cliente/agente define su calendar_id en business.yaml - crear_evento_calendario() busca calendar_id por agente - Fallback a GOOGLE_CALENDAR_ID si está en .env (para compatibilidad) Archivos añadidos: - SETUP_MULTI_CLIENT_CALENDAR.md: guía para proveedores (RECOMENDADO) - SETUP_GOOGLE_CALENDAR.md: actualizado para modo por cliente (legacy) Ventajas del nuevo modo: - Una cuenta Google maestra para el proveedor - Múltiples calendarios (uno por cliente) - Cliente NO hace setup de Google - Escalable, profesional, fácil de vender Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Agregar el calendar_id del cliente en business.yaml. Las citas se crearán automáticamente en: inteliarstack.ia@gmail.com Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Agregar fecha de hoy al system_prompt para conversión de fechas relativas - Mejorar ejemplos: mostrar formatos CORRECTOS e INCORRECTOS - Especificar EXACTAMENTE: [CITA]campo1|campo2|campo3|campo4|campo5[/CITA] - Aclarar que NO es JSON/key=value - Remover función enriquecer_respuesta_soporte del test local (no existe) - Validar horarios: rechazar domingos, proponer alternativas Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Cambiar de descripción técnica a instrucción LITERAL y EXACTA: - Mostrar exactamente qué escribir: [CITA]nombre|tel|device|fecha|hora[/CITA] - Ejemplos más claros de CORRECTO vs INCORRECTO - Remover ambigüedades sobre JSON/key=value Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude naturalmente genera formato JSON: [CITA: nombre="...", telefono="...", ...] El código original esperaba: [CITA]nombre|tel|disp|fecha|hora[/CITA] Solución: parsear AMBOS formatos - Buscar primero formato pipe - Si no encuentra, buscar formato JSON con regex - Limpiar símbolos del teléfono si tiene - Eliminar ambos tipos de tags del texto visible Ahora funciona sin importar qué formato use Claude. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
El bot estaba pidiendo confirmación adicional del cliente después de mostrar el resumen. Cambiar instrucción: generar tag INMEDIATAMENTE después de confirmar, sin pedir OK. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Test local ahora: - Detecta ambos formatos: pipe y JSON - Crea ticket cuando encontr el tag - Limpia tags del texto visible - Muestra confirmación cuando se crea ticket Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude a veces usa 'contacto' en lugar de 'telefono'. Actualizar regex para aceptar ambos campos. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Aceptar múltiples variaciones que Claude puede generar: - nombre o cliente - telefono, contacto, o teléfono - Con o sin comillas - Con = o : - Cualquier orden de campos Regex muy flexible que busca patrones sin ser strict en formato. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Cambiar instrucciones a usar palabras CRÍTICAS: - 'SÍ O SÍ' - 'OBLIGATORIO' - 'DEBES agregar el tag' - 'NO omitas' Porque Claude estaba omitiendo el tag a veces. Ahora es explícito que SIEMPRE debe agregarse. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Si Claude confirma la cita pero omite el tag [CITA]: 1. Detectar palabras clave de confirmación (confirmado, agendé, listo, etc.) 2. Extraer datos del resumen usando regex 3. Crear ticket y evento automáticamente igual Esto es un safety net robusta para cuando Claude no incluye el tag. Los datos se extraen del resumen mostrado al cliente. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Remover markdown (*_) antes de buscar - Parsear fechas en formato 'Martes 31 de marzo de 2026' a YYYY-MM-DD - Extraer solo números del teléfono (ignorar símbolos) - Detectar 'Servicio:' como alternativa a 'Problema:' - Mejorar keywords de confirmación - Agregar logging detallado para debugging Fallback ahora mucho más robusto para extractar datos del resumen cuando Claude omite el tag [CITA]. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Cambiar re.sub para usar patron_json inline en lugar de variable. Esto arregla el error 'cannot access local variable patron_json'. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Crear agent/supabase_client.py con cliente centralizado - Agregar soporte para Supabase en agent/brain.py (lee config desde DB) - Modificar agent/memory.py para usar Supabase como DB principal (fallback SQLite) - Actualizar agent/main.py para obtener client_id desde teléfono - Agregar dependencia supabase a requirements.txt - Configurar SUPABASE_URL y SUPABASE_KEY en .env - Actualizar tests para nueva estructura de memory.py Sistema ahora: - Lee configuración del bot (prompts, tone) desde Supabase (tabla ai_prompts) - Guarda conversaciones y tickets en Supabase - Mapea clientes por número de teléfono desde tabla clients - Mantiene fallback a SQLite local si Supabase no está configurado - Listo para integración con dashboard RIWEB.APP Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Admin dashboard ahora: - Lee todos los tickets de tabla Supabase 'tickets' - Actualiza estado y notas en Supabase (no en SQLite local) - Mantiene sesión de login y UI responsiva - Compatible con multi-cliente (todos los tickets de Supabase) Permite gestión rápida de tickets mientras RIWEB maneja clientes, pagos, analytics. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- PLANES.md: 2 planes principales (Starter 5, Pro 20) + extras - CONTRATO.md: términos, responsabilidades, garantías, SLA - ONBOARDING.md: guía paso a paso para clientes (hosting, dominio, setup) - GUIA_ADMIN.md: cómo usar dashboard de admin para gestionar tickets - PLAN_TRABAJO.md: template para cada proyecto Incluye: - Precios definidos - Modelo de responsabilidades (RIWEB vs Cliente) - Timeline estándar (15 días) - Documentación para clientes - Checklist de entrega - Tracking de progreso Todo personalizable según necesidades. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Nuevas funciones en agent/supabase_client.py: - obtener_plan_cliente() — ver plan, precio, estado_pago - verificar_soporte_vigente() — checar si soporte expiró - registrar_pago() — agregar pago al historial - agregar_extra() — contratar complementos (analytics, prioritario, etc) - obtener_pagos_pendientes() — ver pagos sin pagar - obtener_extras_activos() — ver complementos contratados - actualizar_uso_mensajes() — rastrear consumo de mensajes - obtener_cliente_por_id() — obtener datos completos del cliente Schema actualizado: - clients: agregados campos de plan, pagos, hosting, créditos - extras_contratados (nueva): tabla de complementos - pagos (nueva): historial de transacciones - proyectos (nueva): tracking de desarrollo Ahora el sistema puede: - Verificar si cliente tiene soporte vigente - Rastrear uso vs límites - Registrar pagos - Gestionar múltiples planes Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Documento exhaustivo con: - Estado del sistema (100% funcional) - Arquitectura implementada - Todos los archivos creados (docs, código, workflows) - Funciones por módulo - Tablas Supabase (8 tablas) - Variables de entorno requeridas - URLs importantes - Próximos pasos (corto/medio/largo plazo) - Commits realizados - Instrucciones para retomar en otra sesión Guardar para no perder el hilo si se agotan créditos. Co-Authored-By: Claude <noreply@anthropic.com>
Backend: - POST /register-payment → registra pago manual en Supabase - POST /checkout/mercado-pago → genera link de pago MP - POST /webhooks/mercado-pago → confirma pago MP automático - POST /checkout/stripe → genera session de checkout Stripe - POST /webhooks/stripe → confirma pago Stripe automático Dependencias: - mercado-pago>=4.0.0 - stripe>=5.0.0 Variables: - MERCADO_PAGO_ACCESS_TOKEN (modo prueba) - STRIPE_SECRET_KEY - STRIPE_WEBHOOK_SECRET - APP_URL (para webhooks) Co-Authored-By: Claude <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Documenta la integración completa entre whatsapp-agente y el dashboard RIWEB.APP: tablas Supabase, variables de entorno requeridas, flujo de mensajes, y los dos clientes activos (Mundo Electronico + Vidrieria Florida). https://claude.ai/code/session_01PWQYJJjdg46ukiown4PDbT
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR implements a complete, production-ready WhatsApp AI agent system with Supabase backend integration, multi-client support, and comprehensive business documentation. The system enables selling AI-powered WhatsApp bots to multiple clients with centralized database management.
Key Changes
Core Backend Implementation
agent/main.py) with webhook support for multiple WhatsApp providers (Whapi, Meta, Twilio)agent/supabase_client.py) providing centralized database operations with graceful SQLite fallbackagent/brain.py) integrating Claude API with dynamic prompt loading from Supabaseagent/memory.py) managing conversation history and ticket creation with dual-storage (Supabase + SQLite)agent/providers/) allowing seamless switching between WhatsApp service providersAdmin Dashboard
agent/admin.py) for real-time ticket management with state transitions (open → in_progress → completed → closed)/adminwith session managementBusiness Logic & Tools
agent/tools.py) with automatic ticket generation, numbering, and status trackingDatabase Schema
SUPABASE_SCHEMA.md) with 8 tables: clients, ai_prompts, tickets, conversations, bot_leads, extras_contratados, pagos, proyectosComprehensive Documentation
Configuration & Deployment
tests/test_local.py) for local terminal-based testingNotable Implementation Details
/admininterface for operators and RIWEB.APP dashboard for business managementhttps://claude.ai/code/session_01PWQYJJjdg46ukiown4PDbT