Skip to content

Add complete AgentKit + Supabase integration with multi-client support#3

Open
Oskelias wants to merge 32 commits into
Hainrixz:mainfrom
Inteliar-Stack-Agencia:claude/create-claude-md-yg1fs
Open

Add complete AgentKit + Supabase integration with multi-client support#3
Oskelias wants to merge 32 commits into
Hainrixz:mainfrom
Inteliar-Stack-Agencia:claude/create-claude-md-yg1fs

Conversation

@Oskelias
Copy link
Copy Markdown

@Oskelias Oskelias commented Apr 4, 2026

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

  • FastAPI server (agent/main.py) with webhook support for multiple WhatsApp providers (Whapi, Meta, Twilio)
  • Supabase client (agent/supabase_client.py) providing centralized database operations with graceful SQLite fallback
  • AI brain (agent/brain.py) integrating Claude API with dynamic prompt loading from Supabase
  • Memory system (agent/memory.py) managing conversation history and ticket creation with dual-storage (Supabase + SQLite)
  • Provider abstraction (agent/providers/) allowing seamless switching between WhatsApp service providers

Admin Dashboard

  • Admin interface (agent/admin.py) for real-time ticket management with state transitions (open → in_progress → completed → closed)
  • Password-protected dashboard accessible at /admin with session management
  • Ticket statistics and note-taking capabilities

Business Logic & Tools

  • Ticket system (agent/tools.py) with automatic ticket generation, numbering, and status tracking
  • Calendar integration support for appointment scheduling
  • Lead capture and conversation history management
  • Multi-agent support with per-business configuration

Database Schema

  • Supabase schema (SUPABASE_SCHEMA.md) with 8 tables: clients, ai_prompts, tickets, conversations, bot_leads, extras_contratados, pagos, proyectos
  • Row-level security (RLS) policies for multi-tenant data isolation
  • Optimized indexes for performance

Comprehensive Documentation

  • PLANES.md - Pricing structure (Starter $65, Pro $120, with extras)
  • CONTRATO.md - Service terms and SLA
  • ONBOARDING.md - 15-day client onboarding process
  • GUIA_ADMIN.md - Dashboard user guide
  • PLAN_TRABAJO.md - Project management template
  • ARQUITECTURA_FINAL.md - System architecture overview
  • STATUS.md - Implementation status checklist
  • Setup guides for Google Calendar, multi-client calendar, and adding new agents

Configuration & Deployment

  • Docker support with Dockerfile and docker-compose.yml
  • Environment configuration with .env.example including Supabase credentials
  • Multi-agent support with per-business config directories (config/{business-name}/)
  • Test suite (tests/test_local.py) for local terminal-based testing

Notable Implementation Details

  • Graceful degradation: System works with Supabase or falls back to local SQLite
  • Multi-provider support: Abstracted provider layer allows switching WhatsApp services without code changes
  • Automatic ticket generation: Cites are automatically converted to support tickets with unique numbering
  • Markdown-aware parsing: Extracts structured data from bot responses while handling formatting
  • Session management: Admin dashboard uses secure HTTP-only cookies
  • Dual-dashboard architecture: Separate /admin interface for operators and RIWEB.APP dashboard for business management

https://claude.ai/code/session_01PWQYJJjdg46ukiown4PDbT

Oskelias and others added 28 commits March 28, 2026 14:13
- 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>
@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

claude added 3 commits April 4, 2026 18:40
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants